From 3b17422a0344ac8e47f46df408acb86397b7a4bf Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Fri, 22 May 2020 04:50:35 +0200 Subject: [PATCH 01/57] The idea, based on y-stack/ystack's Docker Hub setup --- README.md | 14 +++++ docker-compose.dev-overrides.yml | 17 +++++ docker-compose.test.yml | 105 +++++++++++++++++-------------- test.sh | 15 +++++ 4 files changed, 104 insertions(+), 47 deletions(-) create mode 100644 docker-compose.dev-overrides.yml create mode 100755 test.sh diff --git a/README.md b/README.md index 40fd3e5..2be616a 100644 --- a/README.md +++ b/README.md @@ -32,3 +32,17 @@ Per cluster, for example ``` kubectl -n monitoring apply -f storageclasses-gke/ ``` + +## CI test suite + +``` +./test.sh +``` + +## Development + +``` +compose='docker-compose -f docker-compose.test.yml -f docker-compose.dev-overrides.yml' +$compose up -d +kubie ctx -f ./admin/.kube/kubeconfig.yaml +``` diff --git a/docker-compose.dev-overrides.yml b/docker-compose.dev-overrides.yml new file mode 100644 index 0000000..17666ca --- /dev/null +++ b/docker-compose.dev-overrides.yml @@ -0,0 +1,17 @@ +version: '2.4' +services: + + server: + ports: + - 6443:6443 + + node: + ports: + - 80:30080 + - 443:30443 + mem_limit: 8589934592 + memswap_limit: 0 + + sut: + environment: + - KEEP_RUNNING=true diff --git a/docker-compose.test.yml b/docker-compose.test.yml index 818953a..2a27a30 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -1,57 +1,68 @@ version: '2.4' services: - kubernetes-mixin: - build: ./kubernetes-mixin - environment: - - DEBUG=true - entrypoint: - - sh - - -ce + server: + image: rancher/k3s:v1.17.5-k3s1@sha256:3025ecfa3c7c3a262a97435cb7c9c182d22b93d014bac767019d65bdce586786 command: - - | - cat << EOF > /kustomize-base/rules.yaml - apiVersion: monitoring.coreos.com/v1 - kind: PrometheusRule - metadata: - name: kubernetes-mixin-rules - spec: - EOF - cat prometheus_rules.yaml | gojsontoyaml | sed 's|^| |' >> /kustomize-base/rules.yaml - - cat << EOF > /kustomize-base/alerts.yaml - apiVersion: monitoring.coreos.com/v1 - kind: PrometheusRule - metadata: - name: kubernetes-mixin-alerts - spec: - EOF - cat prometheus_alerts.yaml | gojsontoyaml | sed 's|^| |' >> /kustomize-base/alerts.yaml - - cp -rv dashboards_out/* /dashboards-kustomize-base - rm /dashboards-kustomize-base/controller-manager.json - cat << EOF > /dashboards-kustomize-base/kustomization.yaml - # It should be possible to extend this set of dashboards using the "replace" behavior - # Meant to be used with kubectl create -k and kubectl replace -k - # (unless we learn how to get rid of last-applied-configuration with apply) - generatorOptions: - disableNameSuffixHash: true - configMapGenerator: - - name: kubernetes-mixin-grafana-dashboards - files: - EOF - find /dashboards-kustomize-base -name \*.json | sed 's|.*/\(.*\)| - \1=\1|' >> /dashboards-kustomize-base/kustomization.yaml + - server + - --disable-agent + - -v=0 + environment: + - K3S_TOKEN=somethingtotallyrandom + - K3S_KUBECONFIG_OUTPUT=/admin/.kube/kubeconfig.yaml + - K3S_KUBECONFIG_MODE=666 volumes: - - ./kubernetes-mixin:/kustomize-base - - ./kubernetes-mixin-dashboards:/dashboards-kustomize-base + - k3s-server:/var/lib/rancher/k3s + - admin:/admin + mem_limit: 300000000 + memswap_limit: 0 + + node: + image: rancher/k3s:v1.17.5-k3s1@sha256:3025ecfa3c7c3a262a97435cb7c9c182d22b93d014bac767019d65bdce586786 + tmpfs: + - /run + - /var/run + privileged: true + environment: + - K3S_URL=https://server:6443 + - K3S_TOKEN=somethingtotallyrandom + mem_limit: 1500000000 + memswap_limit: 0 sut: - image: golang:1.14.3-buster@sha256:6edcc1af51905a860d510a7d4bb0a83d9a0e381cf05c07f23722020a4c688e6f - #environment: - #- DEBUG=true + depends_on: + - server + - node + image: solsson/ystack-runner@sha256:95aff82cb5245e93c8f3193253b054a5628f6421ddc5f93b5dfff0cf38d1bbc7 + environment: + - PROMETHEUS_OPERATOR_BASE=github.com/coreos/prometheus-operator/?ref=9877ec897fc7ea4f50d947ca824ae0c30c185105 + - KUBECONFIG_WAIT=30 + - KEEP_RUNNING=false + volumes: + - admin:/admin entrypoint: - - bash - - -ce + - /bin/bash + - -cx command: - | - echo "No tests" + mkdir ~/.kube + until test -f /admin/.kube/kubeconfig.yaml; do + [ $$KUBECONFIG_WAIT -gt 0 ] || exit ${BULID_EXIT_CODE_ON_NO_CLUSTER:-0} + KUBECONFIG_WAIT=$$(( $$KUBECONFIG_WAIT - 1 )) + echo "Waiting for a kubeconfig ..." && sleep 1 + done + set -e + cat /admin/.kube/kubeconfig.yaml | sed 's|127.0.0.1|server|' > ~/.kube/config + kubectl-waitretry --for=condition=Ready node --all + kubectl get namespace monitoring 2>/dev/null || kubectl create namespace monitoring + kubectl apply -k $$PROMETHEUS_OPERATOR_BASE + if [ "$$KEEP_RUNNING" = "true" ]; then + echo "Will stay running for manual work" + sleep infinity + fi + mem_limit: 80000000 + memswap_limit: 0 + +volumes: + k3s-server: {} + admin: {} diff --git a/test.sh b/test.sh new file mode 100755 index 0000000..3760efb --- /dev/null +++ b/test.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# Note that to troubleshoot it's better to run docker-compose -f docker-compose.test.yml up + +# What we think Docker Hub is running +docker-compose -f docker-compose.test.yml up --build --abort-on-container-exit --exit-code-from sut sut +RESULT=$? + +echo "Other logs:" +docker-compose -f docker-compose.test.yml logs --no-color | grep -v '^sut_' + +docker-compose -f docker-compose.test.yml down --remove-orphans -v + +echo "Result: $RESULT" +exit $RESULT From e4f3cedb78987359ef32067773e335a2bcd6ab39 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Fri, 22 May 2020 06:14:25 +0200 Subject: [PATCH 02/57] A k3s concept, but it logs a lot of TLS errors --- README.md | 6 ++++-- docker-compose.dev-overrides.yml | 8 ++++++++ docker-compose.test.yml | 7 +++++++ test/.gitignore | 1 + 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 test/.gitignore diff --git a/README.md b/README.md index 2be616a..746838c 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,8 @@ kubectl -n monitoring apply -f storageclasses-gke/ ``` compose='docker-compose -f docker-compose.test.yml -f docker-compose.dev-overrides.yml' -$compose up -d -kubie ctx -f ./admin/.kube/kubeconfig.yaml +$compose down +docker volume rm kubernetes-monitoring_admin 2> /dev/null || true +$compose up -d node +kubie ctx -f ./test/.kube/kubeconfig.yaml ``` diff --git a/docker-compose.dev-overrides.yml b/docker-compose.dev-overrides.yml index 17666ca..2034833 100644 --- a/docker-compose.dev-overrides.yml +++ b/docker-compose.dev-overrides.yml @@ -15,3 +15,11 @@ services: sut: environment: - KEEP_RUNNING=true + +volumes: + admin: + driver: local + driver_opts: + type: none + device: $PWD/test + o: bind diff --git a/docker-compose.test.yml b/docker-compose.test.yml index 2a27a30..6c5b888 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -7,6 +7,10 @@ services: - server - --disable-agent - -v=0 + tmpfs: + - /run + - /var/run + privileged: true environment: - K3S_TOKEN=somethingtotallyrandom - K3S_KUBECONFIG_OUTPUT=/admin/.kube/kubeconfig.yaml @@ -18,6 +22,8 @@ services: memswap_limit: 0 node: + depends_on: + - server image: rancher/k3s:v1.17.5-k3s1@sha256:3025ecfa3c7c3a262a97435cb7c9c182d22b93d014bac767019d65bdce586786 tmpfs: - /run @@ -45,6 +51,7 @@ services: - -cx command: - | + tail -f /dev/null mkdir ~/.kube until test -f /admin/.kube/kubeconfig.yaml; do [ $$KUBECONFIG_WAIT -gt 0 ] || exit ${BULID_EXIT_CODE_ON_NO_CLUSTER:-0} diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 0000000..eb38640 --- /dev/null +++ b/test/.gitignore @@ -0,0 +1 @@ +.kube From 36ba3d8e03eefcda95ff98cd9d3e366bb91c1824 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Fri, 22 May 2020 06:14:47 +0200 Subject: [PATCH 03/57] These volumes seem to suprisingly preserve state --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 746838c..969880f 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ kubectl -n monitoring apply -f storageclasses-gke/ ## CI test suite ``` +docker volume rm kubernetes-monitoring_admin 2> /dev/null || true ./test.sh ``` @@ -44,7 +45,8 @@ kubectl -n monitoring apply -f storageclasses-gke/ ``` compose='docker-compose -f docker-compose.test.yml -f docker-compose.dev-overrides.yml' $compose down -docker volume rm kubernetes-monitoring_admin 2> /dev/null || true +docker volume rm kubernetes-monitoring_admin 2>/dev/null || true +docker volume rm kubernetes-monitoring_k3s-server 2>/dev/null || true $compose up -d node -kubie ctx -f ./test/.kube/kubeconfig.yaml +export KUBECONFIG=$PWD/test/.kube/kubeconfig.yaml ``` From e107830cd3c984ed0c4e7236a0d0eebdab301962 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Fri, 22 May 2020 06:50:22 +0200 Subject: [PATCH 04/57] Can't get kubectl top to work --- README.md | 2 +- docker-compose.dev-overrides.yml | 6 +++--- docker-compose.test.yml | 14 +++++++++++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 969880f..b7739a5 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,6 @@ compose='docker-compose -f docker-compose.test.yml -f docker-compose.dev-overrid $compose down docker volume rm kubernetes-monitoring_admin 2>/dev/null || true docker volume rm kubernetes-monitoring_k3s-server 2>/dev/null || true -$compose up -d node +$compose up -d agent export KUBECONFIG=$PWD/test/.kube/kubeconfig.yaml ``` diff --git a/docker-compose.dev-overrides.yml b/docker-compose.dev-overrides.yml index 2034833..3032e4b 100644 --- a/docker-compose.dev-overrides.yml +++ b/docker-compose.dev-overrides.yml @@ -5,10 +5,10 @@ services: ports: - 6443:6443 - node: + agent: ports: - - 80:30080 - - 443:30443 + - 80:80 + - 443:443 mem_limit: 8589934592 memswap_limit: 0 diff --git a/docker-compose.test.yml b/docker-compose.test.yml index 6c5b888..dbebc8b 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -6,7 +6,9 @@ services: command: - server - --disable-agent - - -v=0 + - --node-name=server + - --no-deploy=traefik + - --no-deploy=servicelb tmpfs: - /run - /var/run @@ -15,13 +17,17 @@ services: - K3S_TOKEN=somethingtotallyrandom - K3S_KUBECONFIG_OUTPUT=/admin/.kube/kubeconfig.yaml - K3S_KUBECONFIG_MODE=666 + expose: + - 6443 + - 8472 + - 10250 volumes: - k3s-server:/var/lib/rancher/k3s - admin:/admin mem_limit: 300000000 memswap_limit: 0 - node: + agent: depends_on: - server image: rancher/k3s:v1.17.5-k3s1@sha256:3025ecfa3c7c3a262a97435cb7c9c182d22b93d014bac767019d65bdce586786 @@ -32,13 +38,15 @@ services: environment: - K3S_URL=https://server:6443 - K3S_TOKEN=somethingtotallyrandom + expose: + - 8472 + - 10250 mem_limit: 1500000000 memswap_limit: 0 sut: depends_on: - server - - node image: solsson/ystack-runner@sha256:95aff82cb5245e93c8f3193253b054a5628f6421ddc5f93b5dfff0cf38d1bbc7 environment: - PROMETHEUS_OPERATOR_BASE=github.com/coreos/prometheus-operator/?ref=9877ec897fc7ea4f50d947ca824ae0c30c185105 From afdd24d0af2fded80dbe9f85e659584e035caa21 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Fri, 22 May 2020 06:53:25 +0200 Subject: [PATCH 05/57] helm istall traefik still doesn't work --- docker-compose.test.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/docker-compose.test.yml b/docker-compose.test.yml index dbebc8b..924156e 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -7,8 +7,6 @@ services: - server - --disable-agent - --node-name=server - - --no-deploy=traefik - - --no-deploy=servicelb tmpfs: - /run - /var/run From 0577ea775b7ee8b0cceeb0bb6ff7d9eaa83d582a Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Fri, 22 May 2020 06:58:08 +0200 Subject: [PATCH 06/57] Failed to get traefik to work in docker-compose: CI must use node ports This reverts commit e25c44caea5df553712c7569872ea1ad1af16a20. --- docker-compose.dev-overrides.yml | 5 +++-- docker-compose.test.yml | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docker-compose.dev-overrides.yml b/docker-compose.dev-overrides.yml index 3032e4b..bf8c426 100644 --- a/docker-compose.dev-overrides.yml +++ b/docker-compose.dev-overrides.yml @@ -7,8 +7,9 @@ services: agent: ports: - - 80:80 - - 443:443 + # Failed to get traefik to work in docker-compose, add predefined node ports here instead + #- 80:80 + #- 443:443 mem_limit: 8589934592 memswap_limit: 0 diff --git a/docker-compose.test.yml b/docker-compose.test.yml index 924156e..dbebc8b 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -7,6 +7,8 @@ services: - server - --disable-agent - --node-name=server + - --no-deploy=traefik + - --no-deploy=servicelb tmpfs: - /run - /var/run From b59fd6dc3500677f04815a55f3ef790c96258944 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Fri, 22 May 2020 13:14:12 +0200 Subject: [PATCH 07/57] Separated from other CI setups, if we maintain conventions --- README.md | 5 ++--- docker-compose.dev-overrides.yml | 3 ++- docker-compose.test.yml | 8 +++++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index b7739a5..5eba50a 100644 --- a/README.md +++ b/README.md @@ -44,9 +44,8 @@ docker volume rm kubernetes-monitoring_admin 2> /dev/null || true ``` compose='docker-compose -f docker-compose.test.yml -f docker-compose.dev-overrides.yml' -$compose down -docker volume rm kubernetes-monitoring_admin 2>/dev/null || true -docker volume rm kubernetes-monitoring_k3s-server 2>/dev/null || true +$compose down \ + ;docker volume rm kubernetes-monitoring_admin kubernetes-monitoring_k3s-server 2>/dev/null || true $compose up -d agent export KUBECONFIG=$PWD/test/.kube/kubeconfig.yaml ``` diff --git a/docker-compose.dev-overrides.yml b/docker-compose.dev-overrides.yml index bf8c426..3da914b 100644 --- a/docker-compose.dev-overrides.yml +++ b/docker-compose.dev-overrides.yml @@ -3,13 +3,14 @@ services: server: ports: - - 6443:6443 + - 17443:17443 agent: ports: # Failed to get traefik to work in docker-compose, add predefined node ports here instead #- 80:80 #- 443:443 + - "31770-31779:31770-31779" mem_limit: 8589934592 memswap_limit: 0 diff --git a/docker-compose.test.yml b/docker-compose.test.yml index dbebc8b..a0a59c8 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -5,10 +5,13 @@ services: image: rancher/k3s:v1.17.5-k3s1@sha256:3025ecfa3c7c3a262a97435cb7c9c182d22b93d014bac767019d65bdce586786 command: - server + - --https-listen-port=17443 - --disable-agent - --node-name=server - --no-deploy=traefik - --no-deploy=servicelb + - --kube-apiserver-arg + - service-node-port-range=31770-31779 tmpfs: - /run - /var/run @@ -18,7 +21,7 @@ services: - K3S_KUBECONFIG_OUTPUT=/admin/.kube/kubeconfig.yaml - K3S_KUBECONFIG_MODE=666 expose: - - 6443 + - 17443 - 8472 - 10250 volumes: @@ -36,7 +39,7 @@ services: - /var/run privileged: true environment: - - K3S_URL=https://server:6443 + - K3S_URL=https://server:17443 - K3S_TOKEN=somethingtotallyrandom expose: - 8472 @@ -59,7 +62,6 @@ services: - -cx command: - | - tail -f /dev/null mkdir ~/.kube until test -f /admin/.kube/kubeconfig.yaml; do [ $$KUBECONFIG_WAIT -gt 0 ] || exit ${BULID_EXIT_CODE_ON_NO_CLUSTER:-0} From 78eddbcee3a3b70388c243b47f4438c5e34242ce Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Sat, 23 May 2020 06:10:16 +0200 Subject: [PATCH 08/57] Towards CI based on y-stack/ystack#27 --- README.md | 3 ++- docker-compose.dev-overrides.yml | 6 +++--- docker-compose.test.yml | 9 +++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 5eba50a..72e25d7 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ docker volume rm kubernetes-monitoring_admin 2> /dev/null || true compose='docker-compose -f docker-compose.test.yml -f docker-compose.dev-overrides.yml' $compose down \ ;docker volume rm kubernetes-monitoring_admin kubernetes-monitoring_k3s-server 2>/dev/null || true -$compose up -d agent +sudo rm test/.kube/kubeconfig.yaml +$compose up -d sut export KUBECONFIG=$PWD/test/.kube/kubeconfig.yaml ``` diff --git a/docker-compose.dev-overrides.yml b/docker-compose.dev-overrides.yml index 3da914b..686a949 100644 --- a/docker-compose.dev-overrides.yml +++ b/docker-compose.dev-overrides.yml @@ -3,14 +3,14 @@ services: server: ports: - - 17443:17443 + - 17243:17243 agent: ports: - # Failed to get traefik to work in docker-compose, add predefined node ports here instead + # Failed to get traefik to work in docker-compose; using a predefined nodeport range instead #- 80:80 #- 443:443 - - "31770-31779:31770-31779" + - "31720-31729:31720-31729" mem_limit: 8589934592 memswap_limit: 0 diff --git a/docker-compose.test.yml b/docker-compose.test.yml index a0a59c8..c8314f1 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -5,13 +5,13 @@ services: image: rancher/k3s:v1.17.5-k3s1@sha256:3025ecfa3c7c3a262a97435cb7c9c182d22b93d014bac767019d65bdce586786 command: - server - - --https-listen-port=17443 + - --https-listen-port=17243 - --disable-agent - --node-name=server - --no-deploy=traefik - --no-deploy=servicelb - --kube-apiserver-arg - - service-node-port-range=31770-31779 + - service-node-port-range=31720-31729 tmpfs: - /run - /var/run @@ -21,7 +21,7 @@ services: - K3S_KUBECONFIG_OUTPUT=/admin/.kube/kubeconfig.yaml - K3S_KUBECONFIG_MODE=666 expose: - - 17443 + - 17243 - 8472 - 10250 volumes: @@ -39,7 +39,7 @@ services: - /var/run privileged: true environment: - - K3S_URL=https://server:17443 + - K3S_URL=https://server:17243 - K3S_TOKEN=somethingtotallyrandom expose: - 8472 @@ -50,6 +50,7 @@ services: sut: depends_on: - server + - agent image: solsson/ystack-runner@sha256:95aff82cb5245e93c8f3193253b054a5628f6421ddc5f93b5dfff0cf38d1bbc7 environment: - PROMETHEUS_OPERATOR_BASE=github.com/coreos/prometheus-operator/?ref=9877ec897fc7ea4f50d947ca824ae0c30c185105 From 8a6806f9e4a9e3ae500ad382e6c61cb27720f16a Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Sun, 24 May 2020 18:05:22 +0200 Subject: [PATCH 09/57] Quick init + 79 MB of libraries --- assertions-nodejs/.gitignore | 1 + assertions-nodejs/package-lock.json | 4767 +++++++++++++++++++++++++++ assertions-nodejs/package.json | 17 + 3 files changed, 4785 insertions(+) create mode 100644 assertions-nodejs/.gitignore create mode 100644 assertions-nodejs/package-lock.json create mode 100644 assertions-nodejs/package.json diff --git a/assertions-nodejs/.gitignore b/assertions-nodejs/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/assertions-nodejs/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/assertions-nodejs/package-lock.json b/assertions-nodejs/package-lock.json new file mode 100644 index 0000000..86f0c1c --- /dev/null +++ b/assertions-nodejs/package-lock.json @@ -0,0 +1,4767 @@ +{ + "name": "assertions-nodejs", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/core": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz", + "integrity": "sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.6", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.6", + "@babel/parser": "^7.9.6", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/generator": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", + "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", + "requires": { + "@babel/types": "^7.9.6", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" + }, + "@babel/helper-replace-supers": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz", + "integrity": "sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + }, + "@babel/helpers": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.6.tgz", + "integrity": "sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==", + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", + "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==" + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz", + "integrity": "sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz", + "integrity": "sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", + "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/traverse": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", + "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.6", + "@babel/helper-function-name": "^7.9.5", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", + "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" + }, + "@jest/console": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.0.1.tgz", + "integrity": "sha512-9t1KUe/93coV1rBSxMmBAOIK3/HVpwxArCA1CxskKyRiv6o8J70V8C/V3OJminVCTa2M0hQI9AWRd5wxu2dAHw==", + "requires": { + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "jest-message-util": "^26.0.1", + "jest-util": "^26.0.1", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.0.1.tgz", + "integrity": "sha512-Xq3eqYnxsG9SjDC+WLeIgf7/8KU6rddBxH+SCt18gEpOhAGYC/Mq+YbtlNcIdwjnnT+wDseXSbU0e5X84Y4jTQ==", + "requires": { + "@jest/console": "^26.0.1", + "@jest/reporters": "^26.0.1", + "@jest/test-result": "^26.0.1", + "@jest/transform": "^26.0.1", + "@jest/types": "^26.0.1", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.0.1", + "jest-config": "^26.0.1", + "jest-haste-map": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.0.1", + "jest-resolve-dependencies": "^26.0.1", + "jest-runner": "^26.0.1", + "jest-runtime": "^26.0.1", + "jest-snapshot": "^26.0.1", + "jest-util": "^26.0.1", + "jest-validate": "^26.0.1", + "jest-watcher": "^26.0.1", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.0.1.tgz", + "integrity": "sha512-xBDxPe8/nx251u0VJ2dFAFz2H23Y98qdIaNwnMK6dFQr05jc+Ne/2np73lOAx+5mSBO/yuQldRrQOf6hP1h92g==", + "requires": { + "@jest/fake-timers": "^26.0.1", + "@jest/types": "^26.0.1", + "jest-mock": "^26.0.1" + } + }, + "@jest/fake-timers": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.0.1.tgz", + "integrity": "sha512-Oj/kCBnTKhm7CR+OJSjZty6N1bRDr9pgiYQr4wY221azLz5PHi08x/U+9+QpceAYOWheauLP8MhtSVFrqXQfhg==", + "requires": { + "@jest/types": "^26.0.1", + "@sinonjs/fake-timers": "^6.0.1", + "jest-message-util": "^26.0.1", + "jest-mock": "^26.0.1", + "jest-util": "^26.0.1" + } + }, + "@jest/globals": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.0.1.tgz", + "integrity": "sha512-iuucxOYB7BRCvT+TYBzUqUNuxFX1hqaR6G6IcGgEqkJ5x4htNKo1r7jk1ji9Zj8ZMiMw0oB5NaA7k5Tx6MVssA==", + "requires": { + "@jest/environment": "^26.0.1", + "@jest/types": "^26.0.1", + "expect": "^26.0.1" + } + }, + "@jest/reporters": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.0.1.tgz", + "integrity": "sha512-NWWy9KwRtE1iyG/m7huiFVF9YsYv/e+mbflKRV84WDoJfBqUrNRyDbL/vFxQcYLl8IRqI4P3MgPn386x76Gf2g==", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.0.1", + "@jest/test-result": "^26.0.1", + "@jest/transform": "^26.0.1", + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.0.1", + "jest-resolve": "^26.0.1", + "jest-util": "^26.0.1", + "jest-worker": "^26.0.0", + "node-notifier": "^7.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^4.1.3" + } + }, + "@jest/source-map": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.0.0.tgz", + "integrity": "sha512-S2Z+Aj/7KOSU2TfW0dyzBze7xr95bkm5YXNUqqCek+HE0VbNNSNzrRwfIi5lf7wvzDTSS0/ib8XQ1krFNyYgbQ==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.0.1.tgz", + "integrity": "sha512-oKwHvOI73ICSYRPe8WwyYPTtiuOAkLSbY8/MfWF3qDEd/sa8EDyZzin3BaXTqufir/O/Gzea4E8Zl14XU4Mlyg==", + "requires": { + "@jest/console": "^26.0.1", + "@jest/types": "^26.0.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.0.1.tgz", + "integrity": "sha512-ssga8XlwfP8YjbDcmVhwNlrmblddMfgUeAkWIXts1V22equp2GMIHxm7cyeD5Q/B0ZgKPK/tngt45sH99yLLGg==", + "requires": { + "@jest/test-result": "^26.0.1", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.0.1", + "jest-runner": "^26.0.1", + "jest-runtime": "^26.0.1" + } + }, + "@jest/transform": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.0.1.tgz", + "integrity": "sha512-pPRkVkAQ91drKGbzCfDOoHN838+FSbYaEAvBXvKuWeeRRUD8FjwXkqfUNUZL6Ke48aA/1cqq/Ni7kVMCoqagWA==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.0.1", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.0.1", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + } + }, + "@jest/types": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.0.1.tgz", + "integrity": "sha512-IbtjvqI9+eS1qFnOIEL7ggWmT+iK/U+Vde9cGWtYb/b6XgKb3X44ZAe/z9YZzoAAZ/E92m0DqrilF934IGNnQA==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@kubernetes/client-node": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.12.0.tgz", + "integrity": "sha512-u57q5IaZl91f7YZoZOsgCa31hHyowHxFG88XZXd8arI8heSxbdHWHineo/8mLZbeSbHkge9Awae1stQZzuTnjg==", + "requires": { + "@types/js-yaml": "^3.12.1", + "@types/node": "^10.12.0", + "@types/request": "^2.47.1", + "@types/underscore": "^1.8.9", + "@types/ws": "^6.0.1", + "byline": "^5.0.0", + "execa": "1.0.0", + "isomorphic-ws": "^4.0.1", + "js-yaml": "^3.13.1", + "jsonpath-plus": "^0.19.0", + "openid-client": "2.5.0", + "request": "^2.88.0", + "rfc4648": "^1.3.0", + "shelljs": "^0.8.2", + "tslib": "^1.9.3", + "underscore": "^1.9.1", + "ws": "^6.1.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.24.tgz", + "integrity": "sha512-5SCfvCxV74kzR3uWgTYiGxrd69TbT1I6+cMx1A5kEly/IVveJBimtAMlXiEyVFn5DvUFewQWxOOiJhlxeQwxgA==" + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" + }, + "@sinonjs/commons": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.0.tgz", + "integrity": "sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==", + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@types/babel__core": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", + "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.11.tgz", + "integrity": "sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q==", + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "@types/graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.2.tgz", + "integrity": "sha512-rsZg7eL+Xcxsxk2XlBt9KcG8nOp9iYdKCOikY9x2RFJCyOdNj4MKPQty0e8oZr29vVAzKXr1BmR+kZauti3o1w==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/js-yaml": { + "version": "3.12.4", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.4.tgz", + "integrity": "sha512-fYMgzN+9e28R81weVN49inn/u798ruU91En1ZnGvSZzCRc5jXx9B2EDhlRaWmcO1RIxFHL8AajRXzxDuJu93+A==" + }, + "@types/node": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.5.tgz", + "integrity": "sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA==" + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" + }, + "@types/prettier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.1.tgz", + "integrity": "sha512-boy4xPNEtiw6N3abRhBi/e7hNvy3Tt8E9ZRAQrwAGzoCGZS/1wjo9KY7JHhnfnEsG5wSjDbymCozUM9a3ea7OQ==" + }, + "@types/request": { + "version": "2.48.5", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz", + "integrity": "sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==", + "requires": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + }, + "dependencies": { + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + } + } + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" + }, + "@types/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==" + }, + "@types/underscore": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.10.0.tgz", + "integrity": "sha512-ZAbqul7QAKpM2h1PFGa5ETN27ulmqtj0QviYHasw9LffvXZvVHuraOx/FOsIPPDNGZN0Qo1nASxxSfMYOtSoCw==" + }, + "@types/ws": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.4.tgz", + "integrity": "sha512-PpPrX7SZW9re6+Ha8ojZG4Se8AZXgf0GK6zmfqEuCsY49LFDNXO3SByp44X3dFEqtB73lkCDAdUazhAjVPiNwg==", + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" + }, + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==" + }, + "acorn": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==" + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "acorn-walk": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==" + }, + "aggregate-error": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-1.0.0.tgz", + "integrity": "sha1-iINE2tAiCnLjr1CQYRf0h3GSX6w=", + "requires": { + "clean-stack": "^1.0.0", + "indent-string": "^3.0.0" + } + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" + }, + "babel-jest": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.0.1.tgz", + "integrity": "sha512-Z4GGmSNQ8pX3WS1O+6v3fo41YItJJZsVxG5gIQ+HuB/iuAQBJxMTHTwz292vuYws1LnHfwSRgoqI+nxdy/pcvw==", + "requires": { + "@jest/transform": "^26.0.1", + "@jest/types": "^26.0.1", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.0.0.tgz", + "integrity": "sha512-+AuoehOrjt9irZL7DOt2+4ZaTM6dlu1s5TTS46JBa0/qem4dy7VNW3tMb96qeEqcIh20LD73TVNtmVEeymTG7w==", + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz", + "integrity": "sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw==", + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.0.0.tgz", + "integrity": "sha512-9ce+DatAa31DpR4Uir8g4Ahxs5K4W4L8refzt+qHWQANb6LhGcAEfIFgLUwk67oya2cCUd6t4eUMtO/z64ocNw==", + "requires": { + "babel-plugin-jest-hoist": "^26.0.0", + "babel-preset-current-node-syntax": "^0.1.2" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bintrees": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz", + "integrity": "sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + } + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-stack": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", + "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=" + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decimal.js": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", + "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" + }, + "diff-sequences": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.0.0.tgz", + "integrity": "sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg==" + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "expect": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.0.1.tgz", + "integrity": "sha512-QcCy4nygHeqmbw564YxNbHTJlXh47dVID2BUP52cZFpLU9zHViMFK6h07cC1wf7GYCTIigTdAXhVua8Yl1FkKg==", + "requires": { + "@jest/types": "^26.0.1", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.0.0", + "jest-matcher-utils": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-regex-util": "^26.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "requires": { + "bser": "2.1.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + } + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "optional": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" + }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + } + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "optional": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=" + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "jest": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.0.1.tgz", + "integrity": "sha512-29Q54kn5Bm7ZGKIuH2JRmnKl85YRigp0o0asTc6Sb6l2ch1DCXIeZTLLFy9ultJvhkTqbswF5DEx4+RlkmCxWg==", + "requires": { + "@jest/core": "^26.0.1", + "import-local": "^3.0.2", + "jest-cli": "^26.0.1" + }, + "dependencies": { + "jest-cli": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.0.1.tgz", + "integrity": "sha512-pFLfSOBcbG9iOZWaMK4Een+tTxi/Wcm34geqZEqrst9cZDkTQ1LZ2CnBrTlHWuYAiTMFr0EQeK52ScyFU8wK+w==", + "requires": { + "@jest/core": "^26.0.1", + "@jest/test-result": "^26.0.1", + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.0.1", + "jest-util": "^26.0.1", + "jest-validate": "^26.0.1", + "prompts": "^2.0.1", + "yargs": "^15.3.1" + } + } + } + }, + "jest-changed-files": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.0.1.tgz", + "integrity": "sha512-q8LP9Sint17HaE2LjxQXL+oYWW/WeeXMPE2+Op9X3mY8IEGFVc14xRxFjUuXUbcPAlDLhtWdIEt59GdQbn76Hw==", + "requires": { + "@jest/types": "^26.0.1", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz", + "integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==", + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + } + } + }, + "jest-config": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.0.1.tgz", + "integrity": "sha512-9mWKx2L1LFgOXlDsC4YSeavnblN6A4CPfXFiobq+YYLaBMymA/SczN7xYTSmLaEYHZOcB98UdoN4m5uNt6tztg==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.0.1", + "@jest/types": "^26.0.1", + "babel-jest": "^26.0.1", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.0.1", + "jest-environment-node": "^26.0.1", + "jest-get-type": "^26.0.0", + "jest-jasmine2": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.0.1", + "jest-util": "^26.0.1", + "jest-validate": "^26.0.1", + "micromatch": "^4.0.2", + "pretty-format": "^26.0.1" + } + }, + "jest-diff": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.0.1.tgz", + "integrity": "sha512-odTcHyl5X+U+QsczJmOjWw5tPvww+y9Yim5xzqxVl/R1j4z71+fHW4g8qu1ugMmKdFdxw+AtQgs5mupPnzcIBQ==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.0.0", + "jest-get-type": "^26.0.0", + "pretty-format": "^26.0.1" + } + }, + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.0.1.tgz", + "integrity": "sha512-OTgJlwXCAR8NIWaXFL5DBbeS4QIYPuNASkzSwMCJO+ywo9BEa6TqkaSWsfR7VdbMLdgYJqSfQcIyjJCNwl5n4Q==", + "requires": { + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "jest-get-type": "^26.0.0", + "jest-util": "^26.0.1", + "pretty-format": "^26.0.1" + } + }, + "jest-environment-jsdom": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.0.1.tgz", + "integrity": "sha512-u88NJa3aptz2Xix2pFhihRBAatwZHWwSiRLBDBQE1cdJvDjPvv7ZGA0NQBxWwDDn7D0g1uHqxM8aGgfA9Bx49g==", + "requires": { + "@jest/environment": "^26.0.1", + "@jest/fake-timers": "^26.0.1", + "@jest/types": "^26.0.1", + "jest-mock": "^26.0.1", + "jest-util": "^26.0.1", + "jsdom": "^16.2.2" + } + }, + "jest-environment-node": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.0.1.tgz", + "integrity": "sha512-4FRBWcSn5yVo0KtNav7+5NH5Z/tEgDLp7VRQVS5tCouWORxj+nI+1tOLutM07Zb2Qi7ja+HEDoOUkjBSWZg/IQ==", + "requires": { + "@jest/environment": "^26.0.1", + "@jest/fake-timers": "^26.0.1", + "@jest/types": "^26.0.1", + "jest-mock": "^26.0.1", + "jest-util": "^26.0.1" + } + }, + "jest-get-type": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==" + }, + "jest-haste-map": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.0.1.tgz", + "integrity": "sha512-J9kBl/EdjmDsvyv7CiyKY5+DsTvVOScenprz/fGqfLg/pm1gdjbwwQ98nW0t+OIt+f+5nAVaElvn/6wP5KO7KA==", + "requires": { + "@jest/types": "^26.0.1", + "@types/graceful-fs": "^4.1.2", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-serializer": "^26.0.0", + "jest-util": "^26.0.1", + "jest-worker": "^26.0.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7", + "which": "^2.0.2" + } + }, + "jest-jasmine2": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.0.1.tgz", + "integrity": "sha512-ILaRyiWxiXOJ+RWTKupzQWwnPaeXPIoLS5uW41h18varJzd9/7I0QJGqg69fhTT1ev9JpSSo9QtalriUN0oqOg==", + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.0.1", + "@jest/source-map": "^26.0.0", + "@jest/test-result": "^26.0.1", + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.0.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.0.1", + "jest-matcher-utils": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-runtime": "^26.0.1", + "jest-snapshot": "^26.0.1", + "jest-util": "^26.0.1", + "pretty-format": "^26.0.1", + "throat": "^5.0.0" + } + }, + "jest-leak-detector": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.0.1.tgz", + "integrity": "sha512-93FR8tJhaYIWrWsbmVN1pQ9ZNlbgRpfvrnw5LmgLRX0ckOJ8ut/I35CL7awi2ecq6Ca4lL59bEK9hr7nqoHWPA==", + "requires": { + "jest-get-type": "^26.0.0", + "pretty-format": "^26.0.1" + } + }, + "jest-matcher-utils": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.0.1.tgz", + "integrity": "sha512-PUMlsLth0Azen8Q2WFTwnSkGh2JZ8FYuwijC8NR47vXKpsrKmA1wWvgcj1CquuVfcYiDEdj985u5Wmg7COEARw==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.0.1", + "jest-get-type": "^26.0.0", + "pretty-format": "^26.0.1" + } + }, + "jest-message-util": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.0.1.tgz", + "integrity": "sha512-CbK8uQREZ8umUfo8+zgIfEt+W7HAHjQCoRaNs4WxKGhAYBGwEyvxuK81FXa7VeB9pwDEXeeKOB2qcsNVCAvB7Q==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.0.1", + "@types/stack-utils": "^1.0.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + } + }, + "jest-mock": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.0.1.tgz", + "integrity": "sha512-MpYTBqycuPYSY6xKJognV7Ja46/TeRbAZept987Zp+tuJvMN0YBWyyhG9mXyYQaU3SBI0TUlSaO5L3p49agw7Q==", + "requires": { + "@jest/types": "^26.0.1" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==" + }, + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==" + }, + "jest-resolve": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.0.1.tgz", + "integrity": "sha512-6jWxk0IKZkPIVTvq6s72RH735P8f9eCJW3IM5CX/SJFeKq1p2cZx0U49wf/SdMlhaB/anann5J2nCJj6HrbezQ==", + "requires": { + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.1", + "jest-util": "^26.0.1", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.0.1.tgz", + "integrity": "sha512-9d5/RS/ft0vB/qy7jct/qAhzJsr6fRQJyGAFigK3XD4hf9kIbEH5gks4t4Z7kyMRhowU6HWm/o8ILqhaHdSqLw==", + "requires": { + "@jest/types": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.0.1" + } + }, + "jest-runner": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.0.1.tgz", + "integrity": "sha512-CApm0g81b49Znm4cZekYQK67zY7kkB4umOlI2Dx5CwKAzdgw75EN+ozBHRvxBzwo1ZLYZ07TFxkaPm+1t4d8jA==", + "requires": { + "@jest/console": "^26.0.1", + "@jest/environment": "^26.0.1", + "@jest/test-result": "^26.0.1", + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.0.1", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.0.1", + "jest-jasmine2": "^26.0.1", + "jest-leak-detector": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-resolve": "^26.0.1", + "jest-runtime": "^26.0.1", + "jest-util": "^26.0.1", + "jest-worker": "^26.0.0", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + } + }, + "jest-runtime": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.0.1.tgz", + "integrity": "sha512-Ci2QhYFmANg5qaXWf78T2Pfo6GtmIBn2rRaLnklRyEucmPccmCKvS9JPljcmtVamsdMmkyNkVFb9pBTD6si9Lw==", + "requires": { + "@jest/console": "^26.0.1", + "@jest/environment": "^26.0.1", + "@jest/fake-timers": "^26.0.1", + "@jest/globals": "^26.0.1", + "@jest/source-map": "^26.0.0", + "@jest/test-result": "^26.0.1", + "@jest/transform": "^26.0.1", + "@jest/types": "^26.0.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.0.1", + "jest-haste-map": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-mock": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.0.1", + "jest-snapshot": "^26.0.1", + "jest-util": "^26.0.1", + "jest-validate": "^26.0.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.3.1" + } + }, + "jest-serializer": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.0.0.tgz", + "integrity": "sha512-sQGXLdEGWFAE4wIJ2ZaIDb+ikETlUirEOBsLXdoBbeLhTHkZUJwgk3+M8eyFizhM6le43PDCCKPA1hzkSDo4cQ==", + "requires": { + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.0.1.tgz", + "integrity": "sha512-jxd+cF7+LL+a80qh6TAnTLUZHyQoWwEHSUFJjkw35u3Gx+BZUNuXhYvDqHXr62UQPnWo2P6fvQlLjsU93UKyxA==", + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.0.1", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.0.1", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.0.1", + "jest-get-type": "^26.0.0", + "jest-matcher-utils": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-resolve": "^26.0.1", + "make-dir": "^3.0.0", + "natural-compare": "^1.4.0", + "pretty-format": "^26.0.1", + "semver": "^7.3.2" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + } + } + }, + "jest-util": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.0.1.tgz", + "integrity": "sha512-byQ3n7ad1BO/WyFkYvlWQHTsomB6GIewBh8tlGtusiylAlaxQ1UpS0XYH0ngOyhZuHVLN79Qvl6/pMiDMSSG1g==", + "requires": { + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "make-dir": "^3.0.0" + } + }, + "jest-validate": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.0.1.tgz", + "integrity": "sha512-u0xRc+rbmov/VqXnX3DlkxD74rHI/CfS5xaV2VpeaVySjbb1JioNVOyly5b56q2l9ZKe7bVG5qWmjfctkQb0bA==", + "requires": { + "@jest/types": "^26.0.1", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.0.0", + "leven": "^3.1.0", + "pretty-format": "^26.0.1" + }, + "dependencies": { + "camelcase": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==" + } + } + }, + "jest-watcher": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.0.1.tgz", + "integrity": "sha512-pdZPydsS8475f89kGswaNsN3rhP6lnC3/QDCppP7bg1L9JQz7oU9Mb/5xPETk1RHDCWeqmVC47M4K5RR7ejxFw==", + "requires": { + "@jest/test-result": "^26.0.1", + "@jest/types": "^26.0.1", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.0.1", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", + "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsdom": { + "version": "16.2.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.2.2.tgz", + "integrity": "sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg==", + "requires": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.0.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonpath-plus": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-0.19.0.tgz", + "integrity": "sha512-GSVwsrzW9LsA5lzsqe4CkuZ9wp+kxBb2GwNniaWzI2YFn5Ig42rSW8ZxVpWXaAfakXNrx5pgY5AbQq7kzX29kg==" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "node-forge": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.5.tgz", + "integrity": "sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q==" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-jose": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-1.1.4.tgz", + "integrity": "sha512-L31IFwL3pWWcMHxxidCY51ezqrDXMkvlT/5pLTfNw5sXmmOLJuN6ug7txzF/iuZN55cRpyOmoJrotwBQIoo5Lw==", + "requires": { + "base64url": "^3.0.1", + "browserify-zlib": "^0.2.0", + "buffer": "^5.5.0", + "es6-promise": "^4.2.8", + "lodash": "^4.17.15", + "long": "^4.0.0", + "node-forge": "^0.8.5", + "process": "^0.11.10", + "react-zlib-js": "^1.0.4", + "uuid": "^3.3.3" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" + }, + "node-notifier": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-7.0.1.tgz", + "integrity": "sha512-VkzhierE7DBmQEElhTGJIoiZa1oqRijOtgOlsXg32KrJRXsPy0NXFBqWGW/wTswnJlDCs5viRYaqWguqzsKcmg==", + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.1.1", + "semver": "^7.2.1", + "shellwords": "^0.1.1", + "uuid": "^7.0.3", + "which": "^2.0.2" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "optional": true + } + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "oidc-token-hash": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-3.0.2.tgz", + "integrity": "sha512-dTzp80/y/da+um+i+sOucNqiPpwRL7M/xPwj7pH1TFA2/bqQ+OK2sJahSXbemEoLtPkHcFLyhLhLWZa9yW5+RA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "openid-client": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-2.5.0.tgz", + "integrity": "sha512-t3hFD7xEoW1U25RyBcRFaL19fGGs6hNVTysq9pgmiltH0IVUPzH/bQV9w24pM5Q7MunnGv2/5XjIru6BQcWdxg==", + "requires": { + "base64url": "^3.0.0", + "got": "^8.3.2", + "lodash": "^4.17.11", + "lru-cache": "^5.1.1", + "node-jose": "^1.1.0", + "object-hash": "^1.3.1", + "oidc-token-hash": "^3.0.1", + "p-any": "^1.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "p-any": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-any/-/p-any-1.1.0.tgz", + "integrity": "sha512-Ef0tVa4CZ5pTAmKn+Cg3w8ABBXh+hHO1aV8281dKOoUHfX+3tjG2EaFcC+aZyagg9b4EYGsHEjz21DnEE8Og2g==", + "requires": { + "p-some": "^2.0.0" + } + }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" + }, + "p-each-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-some": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-some/-/p-some-2.0.1.tgz", + "integrity": "sha1-Zdh8ixVO289SIdFnd4ttLhUPbwY=", + "requires": { + "aggregate-error": "^1.0.0" + } + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "requires": { + "p-finally": "^1.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "pretty-format": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.0.1.tgz", + "integrity": "sha512-SWxz6MbupT3ZSlL0Po4WF/KujhQaVehijR2blyRDCzk9e45EaYMVhMBn49fnRuHxtkSpXTes1GxNpVmH86Bxfw==", + "requires": { + "@jest/types": "^26.0.1", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "prom-client": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-12.0.0.tgz", + "integrity": "sha512-JbzzHnw0VDwCvoqf8y1WDtq4wSBAbthMB1pcVI/0lzdqHGJI3KBJDXle70XK+c7Iv93Gihqo0a5LlOn+g8+DrQ==", + "requires": { + "tdigest": "^0.1.1" + } + }, + "prompts": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-zlib-js": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/react-zlib-js/-/react-zlib-js-1.0.4.tgz", + "integrity": "sha512-ynXD9DFxpE7vtGoa3ZwBtPmZrkZYw2plzHGbanUjBOSN4RtuXdektSfABykHtTiWEHMh7WdYj45LHtp228ZF1A==" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "requires": { + "lodash": "^4.17.15" + } + }, + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "requires": { + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rfc4648": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.3.0.tgz", + "integrity": "sha512-x36K12jOflpm1V8QjPq3I+pt7Z1xzeZIjiC8J2Oxd7bE1efTrOG241DTYVJByP/SxR9jl1t7iZqYxDX864jgBQ==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "optional": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "tdigest": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.1.tgz", + "integrity": "sha1-Ljyyw56kSeVdHmzZEReszKRYgCE=", + "requires": { + "bintrees": "1.0.1" + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "requires": { + "punycode": "^2.1.1" + } + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "underscore": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz", + "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "optional": true + }, + "v8-to-istanbul": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", + "integrity": "sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "requires": { + "makeerror": "1.0.x" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "whatwg-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz", + "integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==" + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/assertions-nodejs/package.json b/assertions-nodejs/package.json new file mode 100644 index 0000000..8ddea83 --- /dev/null +++ b/assertions-nodejs/package.json @@ -0,0 +1,17 @@ +{ + "name": "assertions-nodejs", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@kubernetes/client-node": "0.12.0", + "jest": "26.0.1", + "node-fetch": "2.6.0", + "prom-client": "12.0.0" + } +} From 1b70d5be456481449085f85f255c50660f703570 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Sun, 24 May 2020 18:07:42 +0200 Subject: [PATCH 10/57] A spec that fails on ./node_modules/.bin/jest --watch --- assertions-nodejs/src/example.spec.js | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 assertions-nodejs/src/example.spec.js diff --git a/assertions-nodejs/src/example.spec.js b/assertions-nodejs/src/example.spec.js new file mode 100644 index 0000000..6eb6c22 --- /dev/null +++ b/assertions-nodejs/src/example.spec.js @@ -0,0 +1,7 @@ +describe("example", () => { + + it("Runs a test", () => { + expect(true).toEqual(false); + }); + +}); From 1a17f3a3095bc19cdf9b41fcdcd56d5f726a4ddf Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Sun, 24 May 2020 18:39:39 +0200 Subject: [PATCH 11/57] A reporter with a service, meant for --watch runs --- assertions-nodejs/jest.config.js | 6 ++ .../kubernetes-assertions-reporter.js | 65 +++++++++++++++++++ assertions-nodejs/package.json | 4 +- 3 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 assertions-nodejs/jest.config.js create mode 100644 assertions-nodejs/kubernetes-assertions-reporter.js diff --git a/assertions-nodejs/jest.config.js b/assertions-nodejs/jest.config.js new file mode 100644 index 0000000..4859b8b --- /dev/null +++ b/assertions-nodejs/jest.config.js @@ -0,0 +1,6 @@ +module.exports = { + reporters: [ + "default", + ["/kubernetes-assertions-reporter.js", {}] + ] +}; diff --git a/assertions-nodejs/kubernetes-assertions-reporter.js b/assertions-nodejs/kubernetes-assertions-reporter.js new file mode 100644 index 0000000..a623add --- /dev/null +++ b/assertions-nodejs/kubernetes-assertions-reporter.js @@ -0,0 +1,65 @@ +console.log('Reporter loaded'); + + +const http2 = require('http2'); +const { + HTTP2_HEADER_METHOD, + HTTP2_HEADER_PATH, + HTTP2_HEADER_STATUS, + HTTP2_HEADER_CONTENT_TYPE +} = http2.constants; + +class MetricsServer { + + constructor({ port }) { + console.log('metrics server init', port); + this.port = port; + } + + start() { + this.server = http2.createServer(this.serverOptions); + this.server.on('stream', (stream, headers, flags) => { + const method = headers[HTTP2_HEADER_METHOD]; + const path = headers[HTTP2_HEADER_PATH]; + // ... + stream.respond({ + [HTTP2_HEADER_STATUS]: 200, + [HTTP2_HEADER_CONTENT_TYPE]: 'text/plain' + }); + stream.write('hello '); + stream.end('world'); + }); + this.server.listen(this.port); + } + +} + +class MyCustomReporter { + + constructor(globalConfig, options) { + this._globalConfig = globalConfig; + this._options = options; + //console.log('Reporter constructed'); + this.server = new MetricsServer({ port: 9090 }); + this.server.start(); + } + + onRunStart() { + //console.log('onRunStart', arguments); + } + + onTestStart() { + //console.log('onTestStart', arguments); + } + + onTestResult(test, testResult, aggregatedResult) { + console.log('onTestResult', testResult); + } + + onRunComplete(contexts, results) { + //console.log('Complete!', contexts, results); + // TODO exit server + } +} + +module.exports = MyCustomReporter; diff --git a/assertions-nodejs/package.json b/assertions-nodejs/package.json index 8ddea83..233cbaa 100644 --- a/assertions-nodejs/package.json +++ b/assertions-nodejs/package.json @@ -1,10 +1,10 @@ { - "name": "assertions-nodejs", + "name": "assertruntime-nodejs-jest", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "./node_modules/.bin/jest" }, "author": "", "license": "ISC", From 31a22d8f6eb480bab06fb7f9dd6cf0799517522a Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Sun, 24 May 2020 19:14:14 +0200 Subject: [PATCH 12/57] Reports test results on localhost:9090 --- .../kubernetes-assertions-reporter.js | 78 ++++++++++++------- 1 file changed, 48 insertions(+), 30 deletions(-) diff --git a/assertions-nodejs/kubernetes-assertions-reporter.js b/assertions-nodejs/kubernetes-assertions-reporter.js index a623add..db85e46 100644 --- a/assertions-nodejs/kubernetes-assertions-reporter.js +++ b/assertions-nodejs/kubernetes-assertions-reporter.js @@ -1,47 +1,62 @@ console.log('Reporter loaded'); +const http = require('http'); -const http2 = require('http2'); -const { - HTTP2_HEADER_METHOD, - HTTP2_HEADER_PATH, - HTTP2_HEADER_STATUS, - HTTP2_HEADER_CONTENT_TYPE -} = http2.constants; +const client = require('prom-client'); +const register = client.register; +const assertions_failed = new client.Counter({ + name: 'assertions_failed', + help: 'inc\'d for every onTestResult numFailingTests', +}); + +const tests_total = new client.Counter({ + name: 'tests_total', + help: 'inc\'d for every onRunComplete numTotalTests' +}) + +const test_suites_total = new client.Counter({ + name: 'test_suites_total', + help: 'inc\'d for every onRunComplete numTotalTestSuites' +}) + +/** + * TODO can we somehow exit on non-watch jest runs? + */ class MetricsServer { - constructor({ port }) { - console.log('metrics server init', port); + constructor({ port, getMetrics }) { + console.log('metrics server init', port, typeof getMetrics); this.port = port; + this.getMetrics = getMetrics; } start() { - this.server = http2.createServer(this.serverOptions); - this.server.on('stream', (stream, headers, flags) => { - const method = headers[HTTP2_HEADER_METHOD]; - const path = headers[HTTP2_HEADER_PATH]; - // ... - stream.respond({ - [HTTP2_HEADER_STATUS]: 200, - [HTTP2_HEADER_CONTENT_TYPE]: 'text/plain' - }); - stream.write('hello '); - stream.end('world'); + const getMetrics = this.getMetrics; + this.server = http.createServer((req, res) => { + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.end(getMetrics()); + }); + this.server.on('clientError', (err, socket) => { + socket.end('HTTP/1.1 400 Bad Request\r\n\r\n'); }); this.server.listen(this.port); } } -class MyCustomReporter { +const server = new MetricsServer({ + port: 9090, + getMetrics: () => register.metrics() +}); + +server.start(); + +class MetricsReporter { constructor(globalConfig, options) { this._globalConfig = globalConfig; this._options = options; - //console.log('Reporter constructed'); - this.server = new MetricsServer({ port: 9090 }); - this.server.start(); } onRunStart() { @@ -51,15 +66,18 @@ class MyCustomReporter { onTestStart() { //console.log('onTestStart', arguments); } + + onRunComplete(contexts, results) { + //console.log('onRunComplete', contexts, results); + test_suites_total.inc(results.numTotalTestSuites); + tests_total.inc(results.numTotalTests); + } onTestResult(test, testResult, aggregatedResult) { - console.log('onTestResult', testResult); + assertions_failed.inc(testResult.numFailingTests); + //console.log('onTestResult', testResult); } - onRunComplete(contexts, results) { - //console.log('Complete!', contexts, results); - // TODO exit server - } } -module.exports = MyCustomReporter; +module.exports = MetricsReporter; From c00248ffc704b96336b1b010902af1b6a86c91e2 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Sun, 24 May 2020 19:33:48 +0200 Subject: [PATCH 13/57] Many tests will want to execute shell commands --- assertions-nodejs/package-lock.json | 249 ++++++++++++++++++++++------ assertions-nodejs/package.json | 1 + 2 files changed, 196 insertions(+), 54 deletions(-) diff --git a/assertions-nodejs/package-lock.json b/assertions-nodejs/package-lock.json index 86f0c1c..d5c9f0e 100644 --- a/assertions-nodejs/package-lock.json +++ b/assertions-nodejs/package-lock.json @@ -582,6 +582,84 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.24.tgz", "integrity": "sha512-5SCfvCxV74kzR3uWgTYiGxrd69TbT1I6+cMx1A5kEly/IVveJBimtAMlXiEyVFn5DvUFewQWxOOiJhlxeQwxgA==" }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, "ws": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", @@ -1317,30 +1395,13 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "cssom": { @@ -1567,17 +1628,19 @@ "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz", + "integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==", "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, "exit": { @@ -1835,9 +1898,9 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" }, "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "requires": { "pump": "^3.0.0" } @@ -2223,9 +2286,9 @@ "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" }, "is-typedarray": { "version": "1.0.0", @@ -3202,11 +3265,11 @@ } }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "requires": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" } }, "nwsapi": { @@ -3424,9 +3487,9 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.6", @@ -3844,6 +3907,32 @@ } } }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -3865,6 +3954,14 @@ } } }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -3883,6 +3980,11 @@ } } }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -3911,6 +4013,37 @@ "remove-trailing-separator": "^1.0.1" } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", @@ -3919,6 +4052,14 @@ "is-number": "^3.0.0", "repeat-string": "^1.6.1" } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -3962,17 +4103,17 @@ } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "shelljs": { "version": "0.8.4", diff --git a/assertions-nodejs/package.json b/assertions-nodejs/package.json index 233cbaa..810b897 100644 --- a/assertions-nodejs/package.json +++ b/assertions-nodejs/package.json @@ -10,6 +10,7 @@ "license": "ISC", "dependencies": { "@kubernetes/client-node": "0.12.0", + "execa": "4.0.2", "jest": "26.0.1", "node-fetch": "2.6.0", "prom-client": "12.0.0" From 289b19e2cdfd4747fa6d4fd38880c34b79c30cc9 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Mon, 25 May 2020 06:15:26 +0200 Subject: [PATCH 14/57] This is a runtime --- assertions-runtime-nodejs/.dockerignore | 3 +++ .../.gitignore | 0 assertions-runtime-nodejs/Dockerfile | 20 +++++++++++++++++++ .../jest.config.js | 0 .../kubernetes-assertions-reporter.js | 0 .../package-lock.json | 2 +- .../package.json | 2 +- .../src/example.spec.js | 0 8 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 assertions-runtime-nodejs/.dockerignore rename {assertions-nodejs => assertions-runtime-nodejs}/.gitignore (100%) create mode 100644 assertions-runtime-nodejs/Dockerfile rename {assertions-nodejs => assertions-runtime-nodejs}/jest.config.js (100%) rename {assertions-nodejs => assertions-runtime-nodejs}/kubernetes-assertions-reporter.js (100%) rename {assertions-nodejs => assertions-runtime-nodejs}/package-lock.json (99%) rename {assertions-nodejs => assertions-runtime-nodejs}/package.json (89%) rename {assertions-nodejs => assertions-runtime-nodejs}/src/example.spec.js (100%) diff --git a/assertions-runtime-nodejs/.dockerignore b/assertions-runtime-nodejs/.dockerignore new file mode 100644 index 0000000..5907148 --- /dev/null +++ b/assertions-runtime-nodejs/.dockerignore @@ -0,0 +1,3 @@ +* +!package.json +!package-lock.json diff --git a/assertions-nodejs/.gitignore b/assertions-runtime-nodejs/.gitignore similarity index 100% rename from assertions-nodejs/.gitignore rename to assertions-runtime-nodejs/.gitignore diff --git a/assertions-runtime-nodejs/Dockerfile b/assertions-runtime-nodejs/Dockerfile new file mode 100644 index 0000000..1793391 --- /dev/null +++ b/assertions-runtime-nodejs/Dockerfile @@ -0,0 +1,20 @@ +FROM yolean/node@sha256:a0141027783eb712197efe3ac1b42726da0da1c72ecafed99991ddf511086427 + +# Jest watch depends on git +RUN git --version + +RUN set -e; \ + F=$(mktemp); \ + curl -SLs https://dl.k8s.io/v1.17.5/kubernetes-client-linux-amd64.tar.gz \ + | tee $F \ + | tar xzf - --strip-components=3 -C /usr/local/bin/; \ + echo "4cf67f972aad3425bccc48af83f8cb59ddcc96de49d3bb21cdbbcbbeee31718ef681e551d13343538a6e70c2a4ea0435e4540bc1f8cf1a91a2f73265f52b9429 $F" \ + | sha512sum -c -; \ + rm $F + +# Note that there's also a nouser 65534 user which has no writable home +RUN echo 'nonroot:x:65532:65534:nonroot:/home/nonroot:/usr/sbin/nologin' >> /etc/passwd && \ + mkdir -p /home/nonroot && touch /home/nonroot/.bash_history && chown -R 65532:65534 /home/nonroot +USER nonroot:nogroup + +WORKDIR /home/nonroot diff --git a/assertions-nodejs/jest.config.js b/assertions-runtime-nodejs/jest.config.js similarity index 100% rename from assertions-nodejs/jest.config.js rename to assertions-runtime-nodejs/jest.config.js diff --git a/assertions-nodejs/kubernetes-assertions-reporter.js b/assertions-runtime-nodejs/kubernetes-assertions-reporter.js similarity index 100% rename from assertions-nodejs/kubernetes-assertions-reporter.js rename to assertions-runtime-nodejs/kubernetes-assertions-reporter.js diff --git a/assertions-nodejs/package-lock.json b/assertions-runtime-nodejs/package-lock.json similarity index 99% rename from assertions-nodejs/package-lock.json rename to assertions-runtime-nodejs/package-lock.json index d5c9f0e..eb5676d 100644 --- a/assertions-nodejs/package-lock.json +++ b/assertions-runtime-nodejs/package-lock.json @@ -1,5 +1,5 @@ { - "name": "assertions-nodejs", + "name": "assertruntime-nodejs-jest", "version": "1.0.0", "lockfileVersion": 1, "requires": true, diff --git a/assertions-nodejs/package.json b/assertions-runtime-nodejs/package.json similarity index 89% rename from assertions-nodejs/package.json rename to assertions-runtime-nodejs/package.json index 810b897..4565cb6 100644 --- a/assertions-nodejs/package.json +++ b/assertions-runtime-nodejs/package.json @@ -1,5 +1,5 @@ { - "name": "assertruntime-nodejs-jest", + "name": "assertions-runtime-nodejs", "version": "1.0.0", "description": "", "main": "index.js", diff --git a/assertions-nodejs/src/example.spec.js b/assertions-runtime-nodejs/src/example.spec.js similarity index 100% rename from assertions-nodejs/src/example.spec.js rename to assertions-runtime-nodejs/src/example.spec.js From db953eb11ee22219038a41c2beb0522e5f0c99c1 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Mon, 25 May 2020 08:34:02 +0200 Subject: [PATCH 15/57] Explains why we renamed the repo --- README.md | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 72e25d7..f49d99c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ -# Basic Kubernetes monitoring +# Kubernetes Assert -... as Kustomize base. -The scope here is to set up basic monitoring using only `kubectl` as tooling. +This is our re-think of [build-contract](https://github.com/Yolean/build-contract) for Kubernetes. -## Apply +## Apply the example monitoring stack Assuming that Prometheus Operator is already installed, start from the example kustomize base: @@ -17,24 +16,26 @@ kubectl apply -k grafana Note how [Prometheus](./example-small/now-prometheus.yaml) will match rules and monitors using the label(s) that the [kustomization.yaml](./example-small/kustomization.yaml) adds. -## Re-generate stuff +## Kustomize -This repo needs to have some generated content, where upstream kustomize bases could not be found +A real stack would probably start from example-small but: -``` -docker-compose -f docker-compose.test.yml up --build kubernetes-mixin -``` +- Change the replicas count for prometheus and alertmanager +- Change the retention for prometheus `now` to a bit longer +- Add aggergation and long-term storage, presumably using [Thanos](https://thanos.io/) -## Storage classes +## Re-generate stuff -Per cluster, for example +This repo needs to have some generated content, where upstream kustomize bases could not be found ``` -kubectl -n monitoring apply -f storageclasses-gke/ +docker-compose -f docker-compose.test.yml up --build kubernetes-mixin ``` ## CI test suite +WIP + ``` docker volume rm kubernetes-monitoring_admin 2> /dev/null || true ./test.sh @@ -42,6 +43,9 @@ docker volume rm kubernetes-monitoring_admin 2> /dev/null || true ## Development +WIP. +We tend to use they [y-stack](https://github.com/y-stack/ystack) but when working with test (in particular failing ones) it might help to reuse the CI stack. + ``` compose='docker-compose -f docker-compose.test.yml -f docker-compose.dev-overrides.yml' $compose down \ From 54e447d0e61377bf3424898413f902a54a46ddff Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Mon, 25 May 2020 15:34:14 +0200 Subject: [PATCH 16/57] Closes server on non-watch results, fixing "Jest did not exit" --- .../kubernetes-assertions-reporter.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/assertions-runtime-nodejs/kubernetes-assertions-reporter.js b/assertions-runtime-nodejs/kubernetes-assertions-reporter.js index db85e46..816d220 100644 --- a/assertions-runtime-nodejs/kubernetes-assertions-reporter.js +++ b/assertions-runtime-nodejs/kubernetes-assertions-reporter.js @@ -43,6 +43,10 @@ class MetricsServer { this.server.listen(this.port); } + stop() { + this.server.close(); + } + } const server = new MetricsServer({ @@ -75,7 +79,11 @@ class MetricsReporter { onTestResult(test, testResult, aggregatedResult) { assertions_failed.inc(testResult.numFailingTests); - //console.log('onTestResult', testResult); + //console.log('onTestResult', testResult, aggregatedResult); + if (!this._globalConfig.watch && !this._globalConfig.watchAll) { + //console.log('Not a watch run. Exiting'); + server.stop(); + } } } From e33c50e881461e069da74531d3e04e9e524e9efe Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Mon, 25 May 2020 16:31:15 +0200 Subject: [PATCH 17/57] Supports skaffold dev --- assertions-runtime-nodejs/.dockerignore | 4 ++ assertions-runtime-nodejs/Dockerfile | 53 ++++++++++++++----- assertions-runtime-nodejs/jest.config.js | 3 ++ assertions-runtime-nodejs/kustomization.yaml | 6 +++ .../scrapeable-deployment.yaml | 24 +++++++++ assertions-runtime-nodejs/skaffold.yaml | 18 +++++++ assertions-runtime-nodejs/src/example.spec.js | 2 +- .../src/example2.spec.js | 7 +++ .../waiting-for-specs/no-tests-yest.spec.js | 7 +++ 9 files changed, 109 insertions(+), 15 deletions(-) create mode 100644 assertions-runtime-nodejs/kustomization.yaml create mode 100644 assertions-runtime-nodejs/scrapeable-deployment.yaml create mode 100644 assertions-runtime-nodejs/skaffold.yaml create mode 100644 assertions-runtime-nodejs/src/example2.spec.js create mode 100644 assertions-runtime-nodejs/waiting-for-specs/no-tests-yest.spec.js diff --git a/assertions-runtime-nodejs/.dockerignore b/assertions-runtime-nodejs/.dockerignore index 5907148..1433048 100644 --- a/assertions-runtime-nodejs/.dockerignore +++ b/assertions-runtime-nodejs/.dockerignore @@ -1,3 +1,7 @@ * +!.gitignore !package.json !package-lock.json +!waiting-for-specs +!*-reporter.js +!src diff --git a/assertions-runtime-nodejs/Dockerfile b/assertions-runtime-nodejs/Dockerfile index 1793391..cfd2cf6 100644 --- a/assertions-runtime-nodejs/Dockerfile +++ b/assertions-runtime-nodejs/Dockerfile @@ -1,20 +1,45 @@ -FROM yolean/node@sha256:a0141027783eb712197efe3ac1b42726da0da1c72ecafed99991ddf511086427 +FROM yolean/node@sha256:a0141027783eb712197efe3ac1b42726da0da1c72ecafed99991ddf511086427 as unittest + +# https://github.com/Yolean/docker-base/commit/5df42e26c7720527979f6ad83f1281424645fd3f +RUN grep 'nonroot:x:65532' /etc/passwd || \ + echo 'nonroot:x:65532:65534:nonroot:/home/nonroot:/usr/sbin/nologin' >> /etc/passwd && \ + mkdir -p /home/nonroot && touch /home/nonroot/.bash_history && chown -R 65532:65534 /home/nonroot +USER nonroot:nogroup + +ENV CI=true + +WORKDIR /usr/src/runtime + +COPY package*.json .gitignore ./ + +RUN git init && npm ci --ignore-scripts + +# Everything above should be identical to runtime build (next FROM), but now we need dev dependencies +RUN npm install --ignore-scripts -# Jest watch depends on git -RUN git --version +COPY *-reporter.js src ./ -RUN set -e; \ - F=$(mktemp); \ - curl -SLs https://dl.k8s.io/v1.17.5/kubernetes-client-linux-amd64.tar.gz \ - | tee $F \ - | tar xzf - --strip-components=3 -C /usr/local/bin/; \ - echo "4cf67f972aad3425bccc48af83f8cb59ddcc96de49d3bb21cdbbcbbeee31718ef681e551d13343538a6e70c2a4ea0435e4540bc1f8cf1a91a2f73265f52b9429 $F" \ - | sha512sum -c -; \ - rm $F +RUN npm test -# Note that there's also a nouser 65534 user which has no writable home -RUN echo 'nonroot:x:65532:65534:nonroot:/home/nonroot:/usr/sbin/nologin' >> /etc/passwd && \ +FROM yolean/node@sha256:a0141027783eb712197efe3ac1b42726da0da1c72ecafed99991ddf511086427 + +# https://github.com/Yolean/docker-base/commit/5df42e26c7720527979f6ad83f1281424645fd3f +RUN grep 'nonroot:x:65532' /etc/passwd || \ + echo 'nonroot:x:65532:65534:nonroot:/home/nonroot:/usr/sbin/nologin' >> /etc/passwd && \ mkdir -p /home/nonroot && touch /home/nonroot/.bash_history && chown -R 65532:65534 /home/nonroot USER nonroot:nogroup -WORKDIR /home/nonroot +ENV CI=true + +WORKDIR /usr/src/runtime + +COPY package*.json .gitignore ./ + +RUN git init && npm ci --ignore-scripts + +# We could copy from context but buildkit won't run the unittest stage unless we somehow depend on the result +COPY --from=unittest *-reporter.js ./ + +ENTRYPOINT [ "./node_modules/.bin/jest", "--watch" ] + +COPY waiting-for-specs src diff --git a/assertions-runtime-nodejs/jest.config.js b/assertions-runtime-nodejs/jest.config.js index 4859b8b..970fd9b 100644 --- a/assertions-runtime-nodejs/jest.config.js +++ b/assertions-runtime-nodejs/jest.config.js @@ -2,5 +2,8 @@ module.exports = { reporters: [ "default", ["/kubernetes-assertions-reporter.js", {}] + ], + testMatch: [ + "/src/**/*.js" ] }; diff --git a/assertions-runtime-nodejs/kustomization.yaml b/assertions-runtime-nodejs/kustomization.yaml new file mode 100644 index 0000000..d3e8f9f --- /dev/null +++ b/assertions-runtime-nodejs/kustomization.yaml @@ -0,0 +1,6 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: +- scrapeable-deployment.yaml +# TODO if many tests reuse this base, how do we manage podmonitor? +#- kustomize/scrapeable-podmonitor.yaml diff --git a/assertions-runtime-nodejs/scrapeable-deployment.yaml b/assertions-runtime-nodejs/scrapeable-deployment.yaml new file mode 100644 index 0000000..e4d6104 --- /dev/null +++ b/assertions-runtime-nodejs/scrapeable-deployment.yaml @@ -0,0 +1,24 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: test +spec: + replicas: 1 + selector: + matchLabels: + kubernetes-assert: metrics + template: + metadata: + labels: + kubernetes-assert: metrics + spec: + containers: + - name: runtime + #image: solsson/kubernetes-assert:runtime-nodejs + image: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert-runtime-nodejs + ports: + - containerPort: 9090 + name: prometheus + # TODO how to do composition at runtime, in Kubernetes, on a file system level? + # We need to keep the spec builds small, and rely on sync + # We must support both skaffold run (no file sync) and skaffold dev (with file sync) diff --git a/assertions-runtime-nodejs/skaffold.yaml b/assertions-runtime-nodejs/skaffold.yaml new file mode 100644 index 0000000..6677e7e --- /dev/null +++ b/assertions-runtime-nodejs/skaffold.yaml @@ -0,0 +1,18 @@ +apiVersion: skaffold/v2beta4 +kind: Config +metadata: + name: assertions-runtime-nodejs +build: + tagPolicy: + gitCommit: + variant: CommitSha + artifacts: + - image: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert-runtime-nodejs + context: ./ + custom: + buildCommand: y-build + dependencies: + dockerfile: + path: Dockerfile +deploy: + kustomize: {} diff --git a/assertions-runtime-nodejs/src/example.spec.js b/assertions-runtime-nodejs/src/example.spec.js index 6eb6c22..46b0b09 100644 --- a/assertions-runtime-nodejs/src/example.spec.js +++ b/assertions-runtime-nodejs/src/example.spec.js @@ -1,7 +1,7 @@ describe("example", () => { it("Runs a test", () => { - expect(true).toEqual(false); + expect(true).toEqual(true); }); }); diff --git a/assertions-runtime-nodejs/src/example2.spec.js b/assertions-runtime-nodejs/src/example2.spec.js new file mode 100644 index 0000000..b93abf6 --- /dev/null +++ b/assertions-runtime-nodejs/src/example2.spec.js @@ -0,0 +1,7 @@ +describe("example2", () => { + + it("Is just another test so we learn how to handle result reporting", () => { + expect(true).toEqual(true); + }); + +}); diff --git a/assertions-runtime-nodejs/waiting-for-specs/no-tests-yest.spec.js b/assertions-runtime-nodejs/waiting-for-specs/no-tests-yest.spec.js new file mode 100644 index 0000000..8118c84 --- /dev/null +++ b/assertions-runtime-nodejs/waiting-for-specs/no-tests-yest.spec.js @@ -0,0 +1,7 @@ +describe("Waiting for specs", () => { + + it("Waits here until specs have been copied to the runtime", () => { + expect(true).toEqual(false); + }); + +}); From 2393457a45aa2590097309f2e803c121ca6673d5 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Mon, 25 May 2020 20:21:35 +0200 Subject: [PATCH 18/57] Automatic sync fails with a tar File exists error --- assertions-runtime-nodejs/Dockerfile | 4 ++-- assertions-runtime-nodejs/skaffold.yaml | 2 ++ .../{no-tests-yest.spec.js => no-tests-yet.spec.js} | 0 3 files changed, 4 insertions(+), 2 deletions(-) rename assertions-runtime-nodejs/waiting-for-specs/{no-tests-yest.spec.js => no-tests-yet.spec.js} (100%) diff --git a/assertions-runtime-nodejs/Dockerfile b/assertions-runtime-nodejs/Dockerfile index cfd2cf6..c73a115 100644 --- a/assertions-runtime-nodejs/Dockerfile +++ b/assertions-runtime-nodejs/Dockerfile @@ -37,9 +37,9 @@ COPY package*.json .gitignore ./ RUN git init && npm ci --ignore-scripts +ENTRYPOINT [ "./node_modules/.bin/jest", "--watch" ] + # We could copy from context but buildkit won't run the unittest stage unless we somehow depend on the result COPY --from=unittest *-reporter.js ./ -ENTRYPOINT [ "./node_modules/.bin/jest", "--watch" ] - COPY waiting-for-specs src diff --git a/assertions-runtime-nodejs/skaffold.yaml b/assertions-runtime-nodejs/skaffold.yaml index 6677e7e..18d5f59 100644 --- a/assertions-runtime-nodejs/skaffold.yaml +++ b/assertions-runtime-nodejs/skaffold.yaml @@ -14,5 +14,7 @@ build: dependencies: dockerfile: path: Dockerfile + sync: + infer: ["**/*"] deploy: kustomize: {} diff --git a/assertions-runtime-nodejs/waiting-for-specs/no-tests-yest.spec.js b/assertions-runtime-nodejs/waiting-for-specs/no-tests-yet.spec.js similarity index 100% rename from assertions-runtime-nodejs/waiting-for-specs/no-tests-yest.spec.js rename to assertions-runtime-nodejs/waiting-for-specs/no-tests-yet.spec.js From 2e11e71ce9346fe8b8a015adb480422a0f50e914 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Mon, 25 May 2020 20:34:44 +0200 Subject: [PATCH 19/57] Fixes permissions for sync. We can probably do inferred too now, but it's interesting to see now that we can add more spec files through sync --- assertions-runtime-nodejs/Dockerfile | 2 +- assertions-runtime-nodejs/skaffold.yaml | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/assertions-runtime-nodejs/Dockerfile b/assertions-runtime-nodejs/Dockerfile index c73a115..5617532 100644 --- a/assertions-runtime-nodejs/Dockerfile +++ b/assertions-runtime-nodejs/Dockerfile @@ -42,4 +42,4 @@ ENTRYPOINT [ "./node_modules/.bin/jest", "--watch" ] # We could copy from context but buildkit won't run the unittest stage unless we somehow depend on the result COPY --from=unittest *-reporter.js ./ -COPY waiting-for-specs src +COPY --chown=nonroot waiting-for-specs src diff --git a/assertions-runtime-nodejs/skaffold.yaml b/assertions-runtime-nodejs/skaffold.yaml index 18d5f59..f59ceba 100644 --- a/assertions-runtime-nodejs/skaffold.yaml +++ b/assertions-runtime-nodejs/skaffold.yaml @@ -15,6 +15,9 @@ build: dockerfile: path: Dockerfile sync: - infer: ["**/*"] + manual: + # intentionally differs from the COPY source, so we test addition of spec files after start + - src: 'src/**' + dest: . deploy: kustomize: {} From 5b143f74248988ba7ff7d0e43779516b68cf4ba0 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Mon, 25 May 2020 20:37:07 +0200 Subject: [PATCH 20/57] There's promoted nonroot images now --- assertions-runtime-nodejs/Dockerfile | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/assertions-runtime-nodejs/Dockerfile b/assertions-runtime-nodejs/Dockerfile index 5617532..7b96cf0 100644 --- a/assertions-runtime-nodejs/Dockerfile +++ b/assertions-runtime-nodejs/Dockerfile @@ -1,10 +1,4 @@ -FROM yolean/node@sha256:a0141027783eb712197efe3ac1b42726da0da1c72ecafed99991ddf511086427 as unittest - -# https://github.com/Yolean/docker-base/commit/5df42e26c7720527979f6ad83f1281424645fd3f -RUN grep 'nonroot:x:65532' /etc/passwd || \ - echo 'nonroot:x:65532:65534:nonroot:/home/nonroot:/usr/sbin/nologin' >> /etc/passwd && \ - mkdir -p /home/nonroot && touch /home/nonroot/.bash_history && chown -R 65532:65534 /home/nonroot -USER nonroot:nogroup +FROM yolean/node:55fc6cce124e31a053b9eb57a3d0e9212a98bee0@sha256:870d8cb2f70fa6ab73b53e115bc4ed471534c4ce96ff1083f4475743697d4c55 as unittest ENV CI=true @@ -21,13 +15,7 @@ COPY *-reporter.js src ./ RUN npm test -FROM yolean/node@sha256:a0141027783eb712197efe3ac1b42726da0da1c72ecafed99991ddf511086427 - -# https://github.com/Yolean/docker-base/commit/5df42e26c7720527979f6ad83f1281424645fd3f -RUN grep 'nonroot:x:65532' /etc/passwd || \ - echo 'nonroot:x:65532:65534:nonroot:/home/nonroot:/usr/sbin/nologin' >> /etc/passwd && \ - mkdir -p /home/nonroot && touch /home/nonroot/.bash_history && chown -R 65532:65534 /home/nonroot -USER nonroot:nogroup +FROM yolean/node:55fc6cce124e31a053b9eb57a3d0e9212a98bee0@sha256:870d8cb2f70fa6ab73b53e115bc4ed471534c4ce96ff1083f4475743697d4c55 ENV CI=true From 3f6039c0c12c503835b4280da463ea1574fc6c20 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Tue, 26 May 2020 05:17:26 +0200 Subject: [PATCH 21/57] Documents some framework ideas --- README.md | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f49d99c..8548c86 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,62 @@ # Kubernetes Assert -This is our re-think of [build-contract](https://github.com/Yolean/build-contract) for Kubernetes. +### WIP status: Search for `?)` in this text to find pending decisions. Search for TODO to find pending work. + +Kubernetes Assert is our re-think of [build-contract](https://github.com/Yolean/build-contract), for Kubernetes. + +## What is a test + +The idea is that any container that exports an `assertions_failed` counter (OR gauge?) is a test. +Obviously the metric needs to be scraped, and your team must be alerted about any(?) non-zeroness. +Integration test results are inherently less binary than unit tests. You may want to tweak the parameters for alerting, maybe on a per test basis. + +## The dev loop + +There won't be any tests if the dev loop is unpleasant. +Our idea of a good dev loop is that while you're editing your specs, they re-run on save and you'll see the test output. + +The goal however is that tests run unattended, and reliably call for your attention when they fail. +At that point you'll want to know which test suite and test run that failed, and see the output. + +Assumptions: + +* Tests must run in-cluster. That's what they'll do during CI. + - Running them locally while developing would cause "works for me" issuess. +* Skaffold is a good enough dev loop tool. +* Because Skaffold is the dev loop tool, `skaffold run` is the CI tool. +* The test environment is one of: + - A local ephemeral cluster that starts empty when your test starts. + - A local dev cluster like [y-stack](https://github.com/y-stack/ystack). + - A temporary namespace in a test cluster with production-like backends. + - An ephemeral kubernetes-in-kubernetes cluster managed by your CI pipeline. Could be [kind](https://github.com/kubernetes-sigs/kind). +* ... so as the test author you should simply assume that whatever is in your [skaffold.yaml](https://skaffold.dev/docs/references/yaml/)'s `deploy` section has been applied (you'll do the waiting), and the given context's current namespace is all yours. + - TODO There'll be RBAC for read access, including access to logs. + +We recommend using a _runtime_ for tests to a) minimize bolerplate and b) aid "common code ownership" for specs by enforcing a structure. + +### The Node.js Jest runtime + +Our first runtime for Kubernets Assert is based on [Jest](https://jestjs.io/): + +* BDD style +* Specs don't need to be compiled, we can copy source to the runtime. +* The test runner will translate Jest results to `assertions_failed`. Specs are free to [export](https://www.npmjs.com/package/prom-client#counter) other metrics of any kind. + +How are specs delivered to the runtime? + +1. If your specs are a "project", i.e. have a package.json, you need a proper build step. Use the runtime as base image. Install to `/usr/src/specs`(?). See example TODO. + - Note that Jest `--watch` (i.e. the runtime's `skaffold dev`) requires source to be in a git repo. A `git init` with no commits is fine, but remember to include your `.gitignore`. +1. If your specs are fine with the [runtime's](./assertions-runtime-nodejs/package.json) `dependencies` + (feel free to have utility .js files alongside specs) they need to be mounted or copied to `/usr/src/runtime/src`(?) + +How to avoid boilerplate? + +* You still need yaml. But the actual workflow definition can be inherited from the runtime's [Kustomize base](./assertions-runtime-nodejs/base/) `- github.com/Yolean/kubernetes-assert/assertions-runtime-nodejs/base/?ref=[your choice]`. +* Create your [kustomization.yaml](https://kubectl.docs.kubernetes.io/pages/reference/kustomize.html) then run `skaffold init`. See example TODO. ## Apply the example monitoring stack -Assuming that Prometheus Operator is already installed, +Assuming that `github.com/coreos/prometheus-operator/?ref=[a recent revision]` is already installed, start from the example kustomize base: ``` @@ -16,9 +68,9 @@ kubectl apply -k grafana Note how [Prometheus](./example-small/now-prometheus.yaml) will match rules and monitors using the label(s) that the [kustomization.yaml](./example-small/kustomization.yaml) adds. -## Kustomize +## Your Kustomize base -A real stack would probably start from example-small but: +A real stack might start from example-small and then: - Change the replicas count for prometheus and alertmanager - Change the retention for prometheus `now` to a bit longer @@ -44,7 +96,7 @@ docker volume rm kubernetes-monitoring_admin 2> /dev/null || true ## Development WIP. -We tend to use they [y-stack](https://github.com/y-stack/ystack) but when working with test (in particular failing ones) it might help to reuse the CI stack. +We tend to use [y-stack](https://github.com/y-stack/ystack) but when working with test (in particular failing ones) it might help to reuse the CI stack. ``` compose='docker-compose -f docker-compose.test.yml -f docker-compose.dev-overrides.yml' From 0ebe171d6d88a0f1a8fa5689fa4e604454fd7980 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Tue, 26 May 2020 05:32:02 +0200 Subject: [PATCH 22/57] Dev is now a variation of the reusable ./kustomize base --- .../dev-ystack/kustomization.yaml | 9 +++++++++ .../dev-ystack/ystack-builds-registry.yaml | 10 ++++++++++ .../kubernetes-assertions-reporter.js | 5 ++--- .../{ => kustomize}/kustomization.yaml | 0 .../{ => kustomize}/scrapeable-deployment.yaml | 3 +-- assertions-runtime-nodejs/skaffold.yaml | 4 +++- 6 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 assertions-runtime-nodejs/dev-ystack/kustomization.yaml create mode 100644 assertions-runtime-nodejs/dev-ystack/ystack-builds-registry.yaml rename assertions-runtime-nodejs/{ => kustomize}/kustomization.yaml (100%) rename assertions-runtime-nodejs/{ => kustomize}/scrapeable-deployment.yaml (79%) diff --git a/assertions-runtime-nodejs/dev-ystack/kustomization.yaml b/assertions-runtime-nodejs/dev-ystack/kustomization.yaml new file mode 100644 index 0000000..f841142 --- /dev/null +++ b/assertions-runtime-nodejs/dev-ystack/kustomization.yaml @@ -0,0 +1,9 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namePrefix: runtime- +commonLabels: + sut: runtime +bases: +- ../kustomize +patchesStrategicMerge: +- ystack-builds-registry.yaml diff --git a/assertions-runtime-nodejs/dev-ystack/ystack-builds-registry.yaml b/assertions-runtime-nodejs/dev-ystack/ystack-builds-registry.yaml new file mode 100644 index 0000000..1ff2af3 --- /dev/null +++ b/assertions-runtime-nodejs/dev-ystack/ystack-builds-registry.yaml @@ -0,0 +1,10 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: test +spec: + template: + spec: + containers: + - name: runtime + image: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert-runtime-nodejs diff --git a/assertions-runtime-nodejs/kubernetes-assertions-reporter.js b/assertions-runtime-nodejs/kubernetes-assertions-reporter.js index 816d220..1c7049a 100644 --- a/assertions-runtime-nodejs/kubernetes-assertions-reporter.js +++ b/assertions-runtime-nodejs/kubernetes-assertions-reporter.js @@ -1,3 +1,5 @@ +// TODO a https://jestjs.io/docs/en/watch-plugins might be better suited to the task + console.log('Reporter loaded'); const http = require('http'); @@ -20,9 +22,6 @@ const test_suites_total = new client.Counter({ help: 'inc\'d for every onRunComplete numTotalTestSuites' }) -/** - * TODO can we somehow exit on non-watch jest runs? - */ class MetricsServer { constructor({ port, getMetrics }) { diff --git a/assertions-runtime-nodejs/kustomization.yaml b/assertions-runtime-nodejs/kustomize/kustomization.yaml similarity index 100% rename from assertions-runtime-nodejs/kustomization.yaml rename to assertions-runtime-nodejs/kustomize/kustomization.yaml diff --git a/assertions-runtime-nodejs/scrapeable-deployment.yaml b/assertions-runtime-nodejs/kustomize/scrapeable-deployment.yaml similarity index 79% rename from assertions-runtime-nodejs/scrapeable-deployment.yaml rename to assertions-runtime-nodejs/kustomize/scrapeable-deployment.yaml index e4d6104..f668004 100644 --- a/assertions-runtime-nodejs/scrapeable-deployment.yaml +++ b/assertions-runtime-nodejs/kustomize/scrapeable-deployment.yaml @@ -14,8 +14,7 @@ spec: spec: containers: - name: runtime - #image: solsson/kubernetes-assert:runtime-nodejs - image: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert-runtime-nodejs + image: solsson/kubernetes-assert:runtime-nodejs:todo-first-build-tag-and-sha ports: - containerPort: 9090 name: prometheus diff --git a/assertions-runtime-nodejs/skaffold.yaml b/assertions-runtime-nodejs/skaffold.yaml index f59ceba..faf93a0 100644 --- a/assertions-runtime-nodejs/skaffold.yaml +++ b/assertions-runtime-nodejs/skaffold.yaml @@ -20,4 +20,6 @@ build: - src: 'src/**' dest: . deploy: - kustomize: {} + kustomize: + paths: + - dev-ystack From a2f86ebfaaf3232abf6a6ada03926d397c6a9b4e Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Tue, 26 May 2020 05:44:04 +0200 Subject: [PATCH 23/57] The export and evaluation model is still up for debate --- .../kustomize/scrapeable-deployment.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assertions-runtime-nodejs/kustomize/scrapeable-deployment.yaml b/assertions-runtime-nodejs/kustomize/scrapeable-deployment.yaml index f668004..b974147 100644 --- a/assertions-runtime-nodejs/kustomize/scrapeable-deployment.yaml +++ b/assertions-runtime-nodejs/kustomize/scrapeable-deployment.yaml @@ -6,11 +6,11 @@ spec: replicas: 1 selector: matchLabels: - kubernetes-assert: metrics + kubernetes-assert: counter template: metadata: labels: - kubernetes-assert: metrics + kubernetes-assert: counter spec: containers: - name: runtime From 5a2d0ff1f05ad349809658b8d9d7824ed557d553 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Tue, 26 May 2020 08:04:52 +0200 Subject: [PATCH 24/57] Devvable, but oddly I get multiple replicasets --- README.md | 12 ++++++++++-- assertions-runtime-nodejs/.dockerignore | 2 +- assertions-runtime-nodejs/Dockerfile | 12 +++++++----- assertions-runtime-nodejs/jest.config.js | 2 +- ...r.js => jest.kubernetes-assertions-reporter.js} | 2 +- assertions-runtime-nodejs/skaffold.yaml | 4 ++++ .../structure-test/runtime-structure.yaml | 14 ++++++++++++++ assertions-runtime-nodejs/waiting-for-specs/.empty | 0 .../waiting-for-specs/no-tests-yet.spec.js | 7 ------- 9 files changed, 38 insertions(+), 17 deletions(-) rename assertions-runtime-nodejs/{kubernetes-assertions-reporter.js => jest.kubernetes-assertions-reporter.js} (97%) create mode 100644 assertions-runtime-nodejs/structure-test/runtime-structure.yaml create mode 100644 assertions-runtime-nodejs/waiting-for-specs/.empty delete mode 100644 assertions-runtime-nodejs/waiting-for-specs/no-tests-yet.spec.js diff --git a/README.md b/README.md index 8548c86..b288dac 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,14 @@ Kubernetes Assert is our re-think of [build-contract](https://github.com/Yolean/build-contract), for Kubernetes. +Summary: + +1. If you don't have a monitoring stack already, use the one from this repo. It's the Prometheus setup we use in dev clusters. +2. Arrange your specs like in [our example](./assertions-runtime-nodejs/example-specs/) with a [skaffold.yaml](./assertions-runtime-nodejs/example-specs/skaffold.yaml) and [kustomization.yaml](./assertions-runtime-nodejs/example-specs/kustomization.yaml). +3. Run `skaffold dev` +4. Make sure Prometheus will [scrape `assertions_failed`](./assertions_failed/). +5. Watch for Alerts using for example `kubectl -n monitoring exec alertmanager-main-0 -c alertmanager -- wget -qO- http://127.0.0.1:9093/api/v2/alerts | jq` or the web interface, or a pager. + ## What is a test The idea is that any container that exports an `assertions_failed` counter (OR gauge?) is a test. @@ -47,11 +55,11 @@ How are specs delivered to the runtime? 1. If your specs are a "project", i.e. have a package.json, you need a proper build step. Use the runtime as base image. Install to `/usr/src/specs`(?). See example TODO. - Note that Jest `--watch` (i.e. the runtime's `skaffold dev`) requires source to be in a git repo. A `git init` with no commits is fine, but remember to include your `.gitignore`. 1. If your specs are fine with the [runtime's](./assertions-runtime-nodejs/package.json) `dependencies` - (feel free to have utility .js files alongside specs) they need to be mounted or copied to `/usr/src/runtime/src`(?) + (feel free to have utility .js files alongside specs) they need to be mounted or copied to `/usr/src/specs/src`(?) How to avoid boilerplate? -* You still need yaml. But the actual workflow definition can be inherited from the runtime's [Kustomize base](./assertions-runtime-nodejs/base/) `- github.com/Yolean/kubernetes-assert/assertions-runtime-nodejs/base/?ref=[your choice]`. +* You still need yaml. But the actual workflow definition can be inherited from the runtime's [Kustomize base](./assertions-runtime-nodejs/base/) `- github.com/Yolean/kubernetes-assert/assertions-runtime-nodejs/kustomize/?ref=[your choice]`. * Create your [kustomization.yaml](https://kubectl.docs.kubernetes.io/pages/reference/kustomize.html) then run `skaffold init`. See example TODO. ## Apply the example monitoring stack diff --git a/assertions-runtime-nodejs/.dockerignore b/assertions-runtime-nodejs/.dockerignore index 1433048..94a659c 100644 --- a/assertions-runtime-nodejs/.dockerignore +++ b/assertions-runtime-nodejs/.dockerignore @@ -2,6 +2,6 @@ !.gitignore !package.json !package-lock.json +!jest.*.js !waiting-for-specs -!*-reporter.js !src diff --git a/assertions-runtime-nodejs/Dockerfile b/assertions-runtime-nodejs/Dockerfile index 7b96cf0..471142a 100644 --- a/assertions-runtime-nodejs/Dockerfile +++ b/assertions-runtime-nodejs/Dockerfile @@ -4,14 +4,16 @@ ENV CI=true WORKDIR /usr/src/runtime -COPY package*.json .gitignore ./ +COPY --chown=nonroot package*.json .gitignore ./ RUN git init && npm ci --ignore-scripts # Everything above should be identical to runtime build (next FROM), but now we need dev dependencies RUN npm install --ignore-scripts -COPY *-reporter.js src ./ +# Note that unlike our target audience's specs these are just unit tests +# but with skaffold dev the src folder will be synced to the running container, for experiments +COPY --chown=nonroot . . RUN npm test @@ -25,9 +27,9 @@ COPY package*.json .gitignore ./ RUN git init && npm ci --ignore-scripts -ENTRYPOINT [ "./node_modules/.bin/jest", "--watch" ] +ENTRYPOINT [ "./node_modules/.bin/jest", "--watchAll", "--passWithNoTests" ] # We could copy from context but buildkit won't run the unittest stage unless we somehow depend on the result -COPY --from=unittest *-reporter.js ./ +COPY --from=unittest /usr/src/runtime/jest.*.js ./ -COPY --chown=nonroot waiting-for-specs src +COPY --chown=nonroot waiting-for-specs ./src diff --git a/assertions-runtime-nodejs/jest.config.js b/assertions-runtime-nodejs/jest.config.js index 970fd9b..b8c721c 100644 --- a/assertions-runtime-nodejs/jest.config.js +++ b/assertions-runtime-nodejs/jest.config.js @@ -1,7 +1,7 @@ module.exports = { reporters: [ "default", - ["/kubernetes-assertions-reporter.js", {}] + ["/jest.kubernetes-assertions-reporter.js", {}] ], testMatch: [ "/src/**/*.js" diff --git a/assertions-runtime-nodejs/kubernetes-assertions-reporter.js b/assertions-runtime-nodejs/jest.kubernetes-assertions-reporter.js similarity index 97% rename from assertions-runtime-nodejs/kubernetes-assertions-reporter.js rename to assertions-runtime-nodejs/jest.kubernetes-assertions-reporter.js index 1c7049a..e2eca5f 100644 --- a/assertions-runtime-nodejs/kubernetes-assertions-reporter.js +++ b/assertions-runtime-nodejs/jest.kubernetes-assertions-reporter.js @@ -39,7 +39,7 @@ class MetricsServer { this.server.on('clientError', (err, socket) => { socket.end('HTTP/1.1 400 Bad Request\r\n\r\n'); }); - this.server.listen(this.port); + this.server.listen(this.port, '0.0.0.0'); } stop() { diff --git a/assertions-runtime-nodejs/skaffold.yaml b/assertions-runtime-nodejs/skaffold.yaml index faf93a0..eee4dbb 100644 --- a/assertions-runtime-nodejs/skaffold.yaml +++ b/assertions-runtime-nodejs/skaffold.yaml @@ -19,6 +19,10 @@ build: # intentionally differs from the COPY source, so we test addition of spec files after start - src: 'src/**' dest: . +test: +- image: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert-runtime-nodejs + structureTests: + - './structure-test/*' deploy: kustomize: paths: diff --git a/assertions-runtime-nodejs/structure-test/runtime-structure.yaml b/assertions-runtime-nodejs/structure-test/runtime-structure.yaml new file mode 100644 index 0000000..591e634 --- /dev/null +++ b/assertions-runtime-nodejs/structure-test/runtime-structure.yaml @@ -0,0 +1,14 @@ +schemaVersion: 2.0.0 + +fileExistenceTests: +- name: 'Runtime package.json' + path: '/usr/src/runtime/package.json' +- name: 'Runtime package locks' + path: '/usr/src/runtime/package-lock.json' +- name: 'Runtime source folder' + path: '/usr/src/runtime/src' +- name: 'Jest config' + path: '/usr/src/runtime/jest.config.js' +- name: 'No actual runtime source because runtime consists of jest extensions and the specs run as unit tests during build' + path: '/usr/src/runtime/src/**' + shouldExist: false diff --git a/assertions-runtime-nodejs/waiting-for-specs/.empty b/assertions-runtime-nodejs/waiting-for-specs/.empty new file mode 100644 index 0000000..e69de29 diff --git a/assertions-runtime-nodejs/waiting-for-specs/no-tests-yet.spec.js b/assertions-runtime-nodejs/waiting-for-specs/no-tests-yet.spec.js deleted file mode 100644 index 8118c84..0000000 --- a/assertions-runtime-nodejs/waiting-for-specs/no-tests-yet.spec.js +++ /dev/null @@ -1,7 +0,0 @@ -describe("Waiting for specs", () => { - - it("Waits here until specs have been copied to the runtime", () => { - expect(true).toEqual(false); - }); - -}); From 5cc514ccd172f8bd0ee0aedc8a7b5646d79fc067 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Tue, 26 May 2020 08:57:33 +0200 Subject: [PATCH 25/57] Adds image build (no integration tests) akin to Yolean/docker-base --- Dockerfile | 2 + README.md | 16 +++++-- hooks/build | 48 +++++++++++++++++++ .../.dockerignore | 0 .../.gitignore | 0 .../Dockerfile | 0 .../dev-ystack/kustomization.yaml | 0 .../dev-ystack/ystack-builds-registry.yaml | 0 .../jest.config.js | 0 .../jest.kubernetes-assertions-reporter.js | 0 .../kustomize/kustomization.yaml | 0 .../kustomize/scrapeable-deployment.yaml | 0 .../package-lock.json | 0 .../package.json | 2 +- .../skaffold.yaml | 4 +- .../src/example.spec.js | 0 .../src/example2.spec.js | 0 .../structure-test/runtime-structure.yaml | 0 .../waiting-for-specs/.empty | 0 19 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 Dockerfile create mode 100755 hooks/build rename {assertions-runtime-nodejs => runtime-nodejs}/.dockerignore (100%) rename {assertions-runtime-nodejs => runtime-nodejs}/.gitignore (100%) rename {assertions-runtime-nodejs => runtime-nodejs}/Dockerfile (100%) rename {assertions-runtime-nodejs => runtime-nodejs}/dev-ystack/kustomization.yaml (100%) rename {assertions-runtime-nodejs => runtime-nodejs}/dev-ystack/ystack-builds-registry.yaml (100%) rename {assertions-runtime-nodejs => runtime-nodejs}/jest.config.js (100%) rename {assertions-runtime-nodejs => runtime-nodejs}/jest.kubernetes-assertions-reporter.js (100%) rename {assertions-runtime-nodejs => runtime-nodejs}/kustomize/kustomization.yaml (100%) rename {assertions-runtime-nodejs => runtime-nodejs}/kustomize/scrapeable-deployment.yaml (100%) rename {assertions-runtime-nodejs => runtime-nodejs}/package-lock.json (100%) rename {assertions-runtime-nodejs => runtime-nodejs}/package.json (88%) rename {assertions-runtime-nodejs => runtime-nodejs}/skaffold.yaml (78%) rename {assertions-runtime-nodejs => runtime-nodejs}/src/example.spec.js (100%) rename {assertions-runtime-nodejs => runtime-nodejs}/src/example2.spec.js (100%) rename {assertions-runtime-nodejs => runtime-nodejs}/structure-test/runtime-structure.yaml (100%) rename {assertions-runtime-nodejs => runtime-nodejs}/waiting-for-specs/.empty (100%) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..46b941b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,2 @@ +# This is just a dummy while the actual builds are run by ./hooks/build +FROM ubuntu:20.04@sha256:8bce67040cd0ae39e0beb55bcb976a824d9966d2ac8d2e4bf6119b45505cee64 diff --git a/README.md b/README.md index b288dac..6c4162e 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,18 @@ ### WIP status: Search for `?)` in this text to find pending decisions. Search for TODO to find pending work. Kubernetes Assert is our re-think of [build-contract](https://github.com/Yolean/build-contract), for Kubernetes. +As usual we don't write tooling. We combine mainstream stuff that we find lean enough. Summary: -1. If you don't have a monitoring stack already, use the one from this repo. It's the Prometheus setup we use in dev clusters. -2. Arrange your specs like in [our example](./assertions-runtime-nodejs/example-specs/) with a [skaffold.yaml](./assertions-runtime-nodejs/example-specs/skaffold.yaml) and [kustomization.yaml](./assertions-runtime-nodejs/example-specs/kustomization.yaml). +1. If you don't have a monitoring stack already, use the one from this repo. + It's the Prometheus setup we use in dev clusters. +2. Arrange your specs like in [our example](./runtime-nodejs/example-specs/) with a [skaffold.yaml](./runtime-nodejs/example-specs/skaffold.yaml) and [kustomization.yaml](./runtime-nodejs/example-specs/kustomization.yaml). 3. Run `skaffold dev` 4. Make sure Prometheus will [scrape `assertions_failed`](./assertions_failed/). -5. Watch for Alerts using for example `kubectl -n monitoring exec alertmanager-main-0 -c alertmanager -- wget -qO- http://127.0.0.1:9093/api/v2/alerts | jq` or the web interface, or a pager. +5. Watch for Alerts using for example + `kubectl -n monitoring exec alertmanager-main-0 -c alertmanager -- wget -qO- http://127.0.0.1:9093/api/v2/alerts | jq` + or the web interface, or a pager. ## What is a test @@ -49,17 +53,19 @@ Our first runtime for Kubernets Assert is based on [Jest](https://jestjs.io/): * BDD style * Specs don't need to be compiled, we can copy source to the runtime. * The test runner will translate Jest results to `assertions_failed`. Specs are free to [export](https://www.npmjs.com/package/prom-client#counter) other metrics of any kind. +* By design we'll always run in [watch](https://jestjs.io/docs/en/cli#--watchall) mode. If specs are static that's equal to one test run but staying alive to keep exporting metrics. + - Success criterias and cleanup is implemented by the pipeline. How are specs delivered to the runtime? 1. If your specs are a "project", i.e. have a package.json, you need a proper build step. Use the runtime as base image. Install to `/usr/src/specs`(?). See example TODO. - Note that Jest `--watch` (i.e. the runtime's `skaffold dev`) requires source to be in a git repo. A `git init` with no commits is fine, but remember to include your `.gitignore`. -1. If your specs are fine with the [runtime's](./assertions-runtime-nodejs/package.json) `dependencies` +1. If your specs are fine with the [runtime's](./runtime-nodejs/package.json) `dependencies` (feel free to have utility .js files alongside specs) they need to be mounted or copied to `/usr/src/specs/src`(?) How to avoid boilerplate? -* You still need yaml. But the actual workflow definition can be inherited from the runtime's [Kustomize base](./assertions-runtime-nodejs/base/) `- github.com/Yolean/kubernetes-assert/assertions-runtime-nodejs/kustomize/?ref=[your choice]`. +* You still need yaml. But the actual workflow definition can be inherited from the runtime's [Kustomize base](./runtime-nodejs/base/) `- github.com/Yolean/kubernetes-assert/runtime-nodejs/kustomize/?ref=[your choice]`. * Create your [kustomization.yaml](https://kubectl.docs.kubernetes.io/pages/reference/kustomize.html) then run `skaffold init`. See example TODO. ## Apply the example monitoring stack diff --git a/hooks/build b/hooks/build new file mode 100755 index 0000000..ed7fcc0 --- /dev/null +++ b/hooks/build @@ -0,0 +1,48 @@ +#!/bin/bash +set -e + +export DOCKER_BUILDKIT=1 + +[ -z "$IMAGE_NAME" ] && echo "IMAGE_NAME is required" && exit 1; + +function imagename { + buildname=$1 + case $IMAGE_NAME in + *:latest) echo -n $IMAGE_NAME | sed "s|:latest|:$buildname|" ;; + *:*) echo -n $IMAGE_NAME | sed "s|:\(.*\)|:\1-$buildname|" ;; + *) echo $IMAGE_NAME:$buildname ;; + esac +} + +if [ "$YOLEAN_PROMOTE" != "true" ]; then + docker build -t $IMAGE_NAME . +else + YOLEAN_PROMOTE_TAG="$(curl -L 'https://hub.docker.com/api/audit/v1/build/?include_related=true&offset=0&limit=10&object=%2Fapi%2Frepo%2Fv1%2Frepository%2Fsolsson%2Fkubernetes-assert%2F' | jq -r '.objects[0].commit')" + echo "Latest build's git ref is $YOLEAN_PROMOTE_TAG, right?" + read -p "Verified? [y/n] " ok && [ "$ok" = "y" ] || exit 1 +fi + +CONTEXTS=" +runtime-nodejs +" + +PUSH="" + +for CONTEXT in $CONTEXTS; do + + CONTEXT_IMAGE_NAME=$(imagename $CONTEXT) + + if [ "$YOLEAN_PROMOTE" != "true" ]; then + docker build -t $CONTEXT_IMAGE_NAME ./$CONTEXT + PUSH="$PUSH $CONTEXT_IMAGE_NAME" + else + YOLEAN_PROMOTE_NAME=yolean/assert-$CONTEXT:$YOLEAN_PROMOTE_TAG + docker pull $CONTEXT_IMAGE_NAME + docker tag $CONTEXT_IMAGE_NAME $YOLEAN_PROMOTE_NAME + PUSH="$PUSH $YOLEAN_PROMOTE_NAME $YOLEAN_PROMOTE_NAME-root" + fi +done + +echo "PUSH list contains: $PUSH" +[ -z "$NOPUSH" ] || exit 0 +for P in $PUSH; do docker push $P; done diff --git a/assertions-runtime-nodejs/.dockerignore b/runtime-nodejs/.dockerignore similarity index 100% rename from assertions-runtime-nodejs/.dockerignore rename to runtime-nodejs/.dockerignore diff --git a/assertions-runtime-nodejs/.gitignore b/runtime-nodejs/.gitignore similarity index 100% rename from assertions-runtime-nodejs/.gitignore rename to runtime-nodejs/.gitignore diff --git a/assertions-runtime-nodejs/Dockerfile b/runtime-nodejs/Dockerfile similarity index 100% rename from assertions-runtime-nodejs/Dockerfile rename to runtime-nodejs/Dockerfile diff --git a/assertions-runtime-nodejs/dev-ystack/kustomization.yaml b/runtime-nodejs/dev-ystack/kustomization.yaml similarity index 100% rename from assertions-runtime-nodejs/dev-ystack/kustomization.yaml rename to runtime-nodejs/dev-ystack/kustomization.yaml diff --git a/assertions-runtime-nodejs/dev-ystack/ystack-builds-registry.yaml b/runtime-nodejs/dev-ystack/ystack-builds-registry.yaml similarity index 100% rename from assertions-runtime-nodejs/dev-ystack/ystack-builds-registry.yaml rename to runtime-nodejs/dev-ystack/ystack-builds-registry.yaml diff --git a/assertions-runtime-nodejs/jest.config.js b/runtime-nodejs/jest.config.js similarity index 100% rename from assertions-runtime-nodejs/jest.config.js rename to runtime-nodejs/jest.config.js diff --git a/assertions-runtime-nodejs/jest.kubernetes-assertions-reporter.js b/runtime-nodejs/jest.kubernetes-assertions-reporter.js similarity index 100% rename from assertions-runtime-nodejs/jest.kubernetes-assertions-reporter.js rename to runtime-nodejs/jest.kubernetes-assertions-reporter.js diff --git a/assertions-runtime-nodejs/kustomize/kustomization.yaml b/runtime-nodejs/kustomize/kustomization.yaml similarity index 100% rename from assertions-runtime-nodejs/kustomize/kustomization.yaml rename to runtime-nodejs/kustomize/kustomization.yaml diff --git a/assertions-runtime-nodejs/kustomize/scrapeable-deployment.yaml b/runtime-nodejs/kustomize/scrapeable-deployment.yaml similarity index 100% rename from assertions-runtime-nodejs/kustomize/scrapeable-deployment.yaml rename to runtime-nodejs/kustomize/scrapeable-deployment.yaml diff --git a/assertions-runtime-nodejs/package-lock.json b/runtime-nodejs/package-lock.json similarity index 100% rename from assertions-runtime-nodejs/package-lock.json rename to runtime-nodejs/package-lock.json diff --git a/assertions-runtime-nodejs/package.json b/runtime-nodejs/package.json similarity index 88% rename from assertions-runtime-nodejs/package.json rename to runtime-nodejs/package.json index 4565cb6..4351551 100644 --- a/assertions-runtime-nodejs/package.json +++ b/runtime-nodejs/package.json @@ -1,5 +1,5 @@ { - "name": "assertions-runtime-nodejs", + "name": "@yolean/assert-runtime-nodejs", "version": "1.0.0", "description": "", "main": "index.js", diff --git a/assertions-runtime-nodejs/skaffold.yaml b/runtime-nodejs/skaffold.yaml similarity index 78% rename from assertions-runtime-nodejs/skaffold.yaml rename to runtime-nodejs/skaffold.yaml index eee4dbb..d89749c 100644 --- a/assertions-runtime-nodejs/skaffold.yaml +++ b/runtime-nodejs/skaffold.yaml @@ -1,7 +1,9 @@ +# `skaffold dev` then add or edit specs under ./src +# `kubectl exec $(kubectl get pods -l sut=runtime -o name) -c runtime -- curl -s http://localhost:9090/metrics` apiVersion: skaffold/v2beta4 kind: Config metadata: - name: assertions-runtime-nodejs + name: assert-runtime-nodejs build: tagPolicy: gitCommit: diff --git a/assertions-runtime-nodejs/src/example.spec.js b/runtime-nodejs/src/example.spec.js similarity index 100% rename from assertions-runtime-nodejs/src/example.spec.js rename to runtime-nodejs/src/example.spec.js diff --git a/assertions-runtime-nodejs/src/example2.spec.js b/runtime-nodejs/src/example2.spec.js similarity index 100% rename from assertions-runtime-nodejs/src/example2.spec.js rename to runtime-nodejs/src/example2.spec.js diff --git a/assertions-runtime-nodejs/structure-test/runtime-structure.yaml b/runtime-nodejs/structure-test/runtime-structure.yaml similarity index 100% rename from assertions-runtime-nodejs/structure-test/runtime-structure.yaml rename to runtime-nodejs/structure-test/runtime-structure.yaml diff --git a/assertions-runtime-nodejs/waiting-for-specs/.empty b/runtime-nodejs/waiting-for-specs/.empty similarity index 100% rename from assertions-runtime-nodejs/waiting-for-specs/.empty rename to runtime-nodejs/waiting-for-specs/.empty From 3db548aed2ab8ecd32c49d781bec8a76699615f8 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Tue, 26 May 2020 10:02:47 +0200 Subject: [PATCH 26/57] Fixes failing Docker Hub autobuild, apparently buildkit isn't there --- hooks/build | 2 -- runtime-nodejs/Dockerfile | 15 ++++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/hooks/build b/hooks/build index ed7fcc0..cb7335c 100755 --- a/hooks/build +++ b/hooks/build @@ -1,8 +1,6 @@ #!/bin/bash set -e -export DOCKER_BUILDKIT=1 - [ -z "$IMAGE_NAME" ] && echo "IMAGE_NAME is required" && exit 1; function imagename { diff --git a/runtime-nodejs/Dockerfile b/runtime-nodejs/Dockerfile index 471142a..421c8a2 100644 --- a/runtime-nodejs/Dockerfile +++ b/runtime-nodejs/Dockerfile @@ -1,10 +1,11 @@ -FROM yolean/node:55fc6cce124e31a053b9eb57a3d0e9212a98bee0@sha256:870d8cb2f70fa6ab73b53e115bc4ed471534c4ce96ff1083f4475743697d4c55 as unittest +FROM yolean/node:55fc6cce124e31a053b9eb57a3d0e9212a98bee0@sha256:870d8cb2f70fa6ab73b53e115bc4ed471534c4ce96ff1083f4475743697d4c55 \ + as unittest ENV CI=true -WORKDIR /usr/src/runtime +COPY --chown=nonroot:nogroup package*.json .gitignore /usr/src/runtime/ -COPY --chown=nonroot package*.json .gitignore ./ +WORKDIR /usr/src/runtime/ RUN git init && npm ci --ignore-scripts @@ -13,7 +14,7 @@ RUN npm install --ignore-scripts # Note that unlike our target audience's specs these are just unit tests # but with skaffold dev the src folder will be synced to the running container, for experiments -COPY --chown=nonroot . . +COPY --chown=nonroot:nogroup . . RUN npm test @@ -21,9 +22,9 @@ FROM yolean/node:55fc6cce124e31a053b9eb57a3d0e9212a98bee0@sha256:870d8cb2f70fa6a ENV CI=true -WORKDIR /usr/src/runtime +COPY --chown=nonroot:nogroup package*.json .gitignore /usr/src/runtime/ -COPY package*.json .gitignore ./ +WORKDIR /usr/src/runtime/ RUN git init && npm ci --ignore-scripts @@ -32,4 +33,4 @@ ENTRYPOINT [ "./node_modules/.bin/jest", "--watchAll", "--passWithNoTests" ] # We could copy from context but buildkit won't run the unittest stage unless we somehow depend on the result COPY --from=unittest /usr/src/runtime/jest.*.js ./ -COPY --chown=nonroot waiting-for-specs ./src +COPY --chown=nonroot:nogroup waiting-for-specs ./src From 8b92aed9fd63f17181e2ff49dde3dd0f6b33dc3f Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Tue, 26 May 2020 10:14:02 +0200 Subject: [PATCH 27/57] Now we can skaffold dev a downstream project; TODO workdir issues --- .../dev-ystack/ystack-builds-registry.yaml | 2 +- runtime-nodejs/example-project/Dockerfile | 10 +++++++ .../example-project/kustomization.yaml | 12 +++++++++ .../example-project/package-lock.json | 27 +++++++++++++++++++ runtime-nodejs/example-project/package.json | 14 ++++++++++ runtime-nodejs/example-project/skaffold.yaml | 20 ++++++++++++++ .../src/kube-api-access.spec.js | 11 ++++++++ .../kustomize/scrapeable-deployment.yaml | 3 ++- runtime-nodejs/skaffold.yaml | 4 +-- 9 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 runtime-nodejs/example-project/Dockerfile create mode 100644 runtime-nodejs/example-project/kustomization.yaml create mode 100644 runtime-nodejs/example-project/package-lock.json create mode 100644 runtime-nodejs/example-project/package.json create mode 100644 runtime-nodejs/example-project/skaffold.yaml create mode 100644 runtime-nodejs/example-project/src/kube-api-access.spec.js diff --git a/runtime-nodejs/dev-ystack/ystack-builds-registry.yaml b/runtime-nodejs/dev-ystack/ystack-builds-registry.yaml index 1ff2af3..23da27d 100644 --- a/runtime-nodejs/dev-ystack/ystack-builds-registry.yaml +++ b/runtime-nodejs/dev-ystack/ystack-builds-registry.yaml @@ -7,4 +7,4 @@ spec: spec: containers: - name: runtime - image: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert-runtime-nodejs + image: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert/runtime-nodejs diff --git a/runtime-nodejs/example-project/Dockerfile b/runtime-nodejs/example-project/Dockerfile new file mode 100644 index 0000000..2a1ce7c --- /dev/null +++ b/runtime-nodejs/example-project/Dockerfile @@ -0,0 +1,10 @@ +# TODO public build, this is from ../ skaffold dev +FROM builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert/runtime-nodejs:3db548aed2ab8ecd32c49d781bec8a76699615f8-dirty + +WORKDIR /usr/src/specs + +COPY package*.json . + +RUN npm ci --ignore-scripts + +COPY . . diff --git a/runtime-nodejs/example-project/kustomization.yaml b/runtime-nodejs/example-project/kustomization.yaml new file mode 100644 index 0000000..906cdc4 --- /dev/null +++ b/runtime-nodejs/example-project/kustomization.yaml @@ -0,0 +1,12 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +bases: +#- github.com/Yolean/kubernetes-assert/runtime-nodejs/kustomize?ref= +- ../kustomize +namePrefix: example-project +commonLabels: + app: example-project +images: +- name: yolean/assert-runtime-nodejs + newName: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert/example-project + newTag: null diff --git a/runtime-nodejs/example-project/package-lock.json b/runtime-nodejs/example-project/package-lock.json new file mode 100644 index 0000000..9a5a45b --- /dev/null +++ b/runtime-nodejs/example-project/package-lock.json @@ -0,0 +1,27 @@ +{ + "name": "@yolean/assert-runtime-nodejs-example-project", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@fidm/asn1": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@fidm/asn1/-/asn1-1.0.4.tgz", + "integrity": "sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ==" + }, + "@fidm/x509": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@fidm/x509/-/x509-1.2.1.tgz", + "integrity": "sha512-nwc2iesjyc9hkuzcrMCBXQRn653XuAUKorfWM8PZyJawiy1QzLj4vahwzaI25+pfpwOLvMzbJ0uKpWLDNmo16w==", + "requires": { + "@fidm/asn1": "^1.0.4", + "tweetnacl": "^1.0.1" + } + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + } + } +} diff --git a/runtime-nodejs/example-project/package.json b/runtime-nodejs/example-project/package.json new file mode 100644 index 0000000..2f74354 --- /dev/null +++ b/runtime-nodejs/example-project/package.json @@ -0,0 +1,14 @@ +{ + "name": "@yolean/assert-runtime-nodejs-example-project", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@fidm/x509": "1.2.1" + } +} diff --git a/runtime-nodejs/example-project/skaffold.yaml b/runtime-nodejs/example-project/skaffold.yaml new file mode 100644 index 0000000..a94a3b1 --- /dev/null +++ b/runtime-nodejs/example-project/skaffold.yaml @@ -0,0 +1,20 @@ +apiVersion: skaffold/v2beta4 +kind: Config +metadata: + name: assert-runtime-nodejs-example-project +build: + tagPolicy: + gitCommit: + variant: CommitSha + artifacts: + - image: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert/example-project + context: ./ + custom: + buildCommand: y-build + dependencies: + dockerfile: + path: Dockerfile + sync: + infer: ["**/*"] +deploy: + kustomize: {} diff --git a/runtime-nodejs/example-project/src/kube-api-access.spec.js b/runtime-nodejs/example-project/src/kube-api-access.spec.js new file mode 100644 index 0000000..30bc1da --- /dev/null +++ b/runtime-nodejs/example-project/src/kube-api-access.spec.js @@ -0,0 +1,11 @@ +describe("kube api access", () => { + + xit("Uses a library in this project's package.json", () => { + // TODO + }); + + it("Can locate the pod's mounted credentials", () => { + expect(true).toEqual(false); + }); + +}); diff --git a/runtime-nodejs/kustomize/scrapeable-deployment.yaml b/runtime-nodejs/kustomize/scrapeable-deployment.yaml index b974147..c4ad008 100644 --- a/runtime-nodejs/kustomize/scrapeable-deployment.yaml +++ b/runtime-nodejs/kustomize/scrapeable-deployment.yaml @@ -14,7 +14,8 @@ spec: spec: containers: - name: runtime - image: solsson/kubernetes-assert:runtime-nodejs:todo-first-build-tag-and-sha + # We can't have a tag here because https://kubectl.docs.kubernetes.io/pages/reference/kustomize.html#images won't unset it, and Skaffold required no-tag URLs for build + image: yolean/assert-runtime-nodejs ports: - containerPort: 9090 name: prometheus diff --git a/runtime-nodejs/skaffold.yaml b/runtime-nodejs/skaffold.yaml index d89749c..cdc8fc1 100644 --- a/runtime-nodejs/skaffold.yaml +++ b/runtime-nodejs/skaffold.yaml @@ -9,7 +9,7 @@ build: gitCommit: variant: CommitSha artifacts: - - image: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert-runtime-nodejs + - image: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert/runtime-nodejs context: ./ custom: buildCommand: y-build @@ -22,7 +22,7 @@ build: - src: 'src/**' dest: . test: -- image: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert-runtime-nodejs +- image: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert/runtime-nodejs structureTests: - './structure-test/*' deploy: From 7985061d94db674e86f9a0d6b507ebd620f872e4 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Tue, 26 May 2020 12:03:17 +0200 Subject: [PATCH 28/57] Iterates on the workdir issue --- runtime-nodejs/Dockerfile | 26 +++++++------------ .../example-project/kustomization.yaml | 2 +- .../kustomize/scrapeable-deployment.yaml | 4 +++ 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/runtime-nodejs/Dockerfile b/runtime-nodejs/Dockerfile index 421c8a2..24b5034 100644 --- a/runtime-nodejs/Dockerfile +++ b/runtime-nodejs/Dockerfile @@ -2,33 +2,27 @@ FROM yolean/node:55fc6cce124e31a053b9eb57a3d0e9212a98bee0@sha256:870d8cb2f70fa6a as unittest ENV CI=true - COPY --chown=nonroot:nogroup package*.json .gitignore /usr/src/runtime/ - -WORKDIR /usr/src/runtime/ - -RUN git init && npm ci --ignore-scripts - -# Everything above should be identical to runtime build (next FROM), but now we need dev dependencies -RUN npm install --ignore-scripts +WORKDIR /usr/src/runtime +RUN [ "git", "init" ] +RUN [ "npm", "ci", "--ignore-scripts" ] +# The above should be identical to runtime stage (next FROM) # Note that unlike our target audience's specs these are just unit tests # but with skaffold dev the src folder will be synced to the running container, for experiments COPY --chown=nonroot:nogroup . . - -RUN npm test +RUN [ "npm", "test" ] FROM yolean/node:55fc6cce124e31a053b9eb57a3d0e9212a98bee0@sha256:870d8cb2f70fa6ab73b53e115bc4ed471534c4ce96ff1083f4475743697d4c55 ENV CI=true - COPY --chown=nonroot:nogroup package*.json .gitignore /usr/src/runtime/ +WORKDIR /usr/src/runtime +RUN [ "git", "init" ] +RUN [ "npm", "ci", "--ignore-scripts" ] +# The above should be identical to the unittest stage -WORKDIR /usr/src/runtime/ - -RUN git init && npm ci --ignore-scripts - -ENTRYPOINT [ "./node_modules/.bin/jest", "--watchAll", "--passWithNoTests" ] +ENTRYPOINT [ "/usr/src/runtime/node_modules/.bin/jest", "--projects=/usr/src/runtime", "--watchAll", "--passWithNoTests" ] # We could copy from context but buildkit won't run the unittest stage unless we somehow depend on the result COPY --from=unittest /usr/src/runtime/jest.*.js ./ diff --git a/runtime-nodejs/example-project/kustomization.yaml b/runtime-nodejs/example-project/kustomization.yaml index 906cdc4..1fadcd3 100644 --- a/runtime-nodejs/example-project/kustomization.yaml +++ b/runtime-nodejs/example-project/kustomization.yaml @@ -3,7 +3,7 @@ kind: Kustomization bases: #- github.com/Yolean/kubernetes-assert/runtime-nodejs/kustomize?ref= - ../kustomize -namePrefix: example-project +namePrefix: example-project- commonLabels: app: example-project images: diff --git a/runtime-nodejs/kustomize/scrapeable-deployment.yaml b/runtime-nodejs/kustomize/scrapeable-deployment.yaml index c4ad008..42c349a 100644 --- a/runtime-nodejs/kustomize/scrapeable-deployment.yaml +++ b/runtime-nodejs/kustomize/scrapeable-deployment.yaml @@ -19,6 +19,10 @@ spec: ports: - containerPort: 9090 name: prometheus + #command: + #- bash + #- -cex + #- echo "TEMP sleep" && sleep infinity # TODO how to do composition at runtime, in Kubernetes, on a file system level? # We need to keep the spec builds small, and rely on sync # We must support both skaffold run (no file sync) and skaffold dev (with file sync) From 44b487c8d252b1176ba0fd419fa805d1f7bb6920 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Tue, 26 May 2020 12:55:09 +0200 Subject: [PATCH 29/57] Avoids a potential backwards compatibility issue when we solve composition at runtime --- runtime-nodejs/Dockerfile | 2 ++ runtime-nodejs/skaffold.yaml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/runtime-nodejs/Dockerfile b/runtime-nodejs/Dockerfile index 24b5034..26d4a7b 100644 --- a/runtime-nodejs/Dockerfile +++ b/runtime-nodejs/Dockerfile @@ -28,3 +28,5 @@ ENTRYPOINT [ "/usr/src/runtime/node_modules/.bin/jest", "--projects=/usr/src/run COPY --from=unittest /usr/src/runtime/jest.*.js ./ COPY --chown=nonroot:nogroup waiting-for-specs ./src + +WORKDIR /usr/src/specs--must-be-set-explicitly-by-downstream-images--for-now diff --git a/runtime-nodejs/skaffold.yaml b/runtime-nodejs/skaffold.yaml index cdc8fc1..08123b5 100644 --- a/runtime-nodejs/skaffold.yaml +++ b/runtime-nodejs/skaffold.yaml @@ -20,7 +20,7 @@ build: manual: # intentionally differs from the COPY source, so we test addition of spec files after start - src: 'src/**' - dest: . + dest: /usr/src/runtime test: - image: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert/runtime-nodejs structureTests: From 64e9e32e5776eb7082488fc144c967ae11aef802 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Tue, 26 May 2020 14:24:33 +0200 Subject: [PATCH 30/57] Works better with jest config at the parent folder --- runtime-nodejs/Dockerfile | 12 ++++++------ runtime-nodejs/jest.config.js | 2 +- runtime-nodejs/skaffold.yaml | 2 +- runtime-nodejs/structure-test/runtime-structure.yaml | 10 +++++----- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/runtime-nodejs/Dockerfile b/runtime-nodejs/Dockerfile index 26d4a7b..849ac07 100644 --- a/runtime-nodejs/Dockerfile +++ b/runtime-nodejs/Dockerfile @@ -2,8 +2,8 @@ FROM yolean/node:55fc6cce124e31a053b9eb57a3d0e9212a98bee0@sha256:870d8cb2f70fa6a as unittest ENV CI=true -COPY --chown=nonroot:nogroup package*.json .gitignore /usr/src/runtime/ -WORKDIR /usr/src/runtime +COPY --chown=nonroot:nogroup package*.json .gitignore /usr/src/ +WORKDIR /usr/src RUN [ "git", "init" ] RUN [ "npm", "ci", "--ignore-scripts" ] # The above should be identical to runtime stage (next FROM) @@ -16,16 +16,16 @@ RUN [ "npm", "test" ] FROM yolean/node:55fc6cce124e31a053b9eb57a3d0e9212a98bee0@sha256:870d8cb2f70fa6ab73b53e115bc4ed471534c4ce96ff1083f4475743697d4c55 ENV CI=true -COPY --chown=nonroot:nogroup package*.json .gitignore /usr/src/runtime/ -WORKDIR /usr/src/runtime +COPY --chown=nonroot:nogroup package*.json .gitignore /usr/src/ +WORKDIR /usr/src RUN [ "git", "init" ] RUN [ "npm", "ci", "--ignore-scripts" ] # The above should be identical to the unittest stage -ENTRYPOINT [ "/usr/src/runtime/node_modules/.bin/jest", "--projects=/usr/src/runtime", "--watchAll", "--passWithNoTests" ] +ENTRYPOINT [ "/usr/src/node_modules/.bin/jest", "--projects=/usr/src", "--watchAll", "--passWithNoTests" ] # We could copy from context but buildkit won't run the unittest stage unless we somehow depend on the result -COPY --from=unittest /usr/src/runtime/jest.*.js ./ +COPY --from=unittest /usr/src/jest.*.js ./ COPY --chown=nonroot:nogroup waiting-for-specs ./src diff --git a/runtime-nodejs/jest.config.js b/runtime-nodejs/jest.config.js index b8c721c..65dde69 100644 --- a/runtime-nodejs/jest.config.js +++ b/runtime-nodejs/jest.config.js @@ -4,6 +4,6 @@ module.exports = { ["/jest.kubernetes-assertions-reporter.js", {}] ], testMatch: [ - "/src/**/*.js" + "/src/**/*.js","/specs/**/*.js" ] }; diff --git a/runtime-nodejs/skaffold.yaml b/runtime-nodejs/skaffold.yaml index 08123b5..1e7cc21 100644 --- a/runtime-nodejs/skaffold.yaml +++ b/runtime-nodejs/skaffold.yaml @@ -20,7 +20,7 @@ build: manual: # intentionally differs from the COPY source, so we test addition of spec files after start - src: 'src/**' - dest: /usr/src/runtime + dest: /usr/src test: - image: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert/runtime-nodejs structureTests: diff --git a/runtime-nodejs/structure-test/runtime-structure.yaml b/runtime-nodejs/structure-test/runtime-structure.yaml index 591e634..77f9098 100644 --- a/runtime-nodejs/structure-test/runtime-structure.yaml +++ b/runtime-nodejs/structure-test/runtime-structure.yaml @@ -2,13 +2,13 @@ schemaVersion: 2.0.0 fileExistenceTests: - name: 'Runtime package.json' - path: '/usr/src/runtime/package.json' + path: '/usr/src/package.json' - name: 'Runtime package locks' - path: '/usr/src/runtime/package-lock.json' + path: '/usr/src/package-lock.json' - name: 'Runtime source folder' - path: '/usr/src/runtime/src' + path: '/usr/src/src' - name: 'Jest config' - path: '/usr/src/runtime/jest.config.js' + path: '/usr/src/jest.config.js' - name: 'No actual runtime source because runtime consists of jest extensions and the specs run as unit tests during build' - path: '/usr/src/runtime/src/**' + path: '/usr/src/src/**' shouldExist: false From f49ff6965c13bf2484f722cd0a39a280f1746ede Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Tue, 26 May 2020 14:53:57 +0200 Subject: [PATCH 31/57] Test dev+watch+sync runs now, and in-cluster loop is good! --- .editorconfig | 7 +++++++ runtime-nodejs/example-project/Dockerfile | 6 +++--- .../example-project/src/kube-api-access.spec.js | 15 +++++++++++---- .../example-project/src/metrics.spec.js | 14 ++++++++++++++ runtime-nodejs/jest.config.js | 3 --- .../kustomize/scrapeable-deployment.yaml | 4 ---- runtime-nodejs/package.json | 2 +- runtime-nodejs/specs/.empty | 0 8 files changed, 36 insertions(+), 15 deletions(-) create mode 100644 .editorconfig create mode 100644 runtime-nodejs/example-project/src/metrics.spec.js create mode 100644 runtime-nodejs/specs/.empty diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..fa3df9b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,7 @@ +root = true + +[*] +charset = utf-8 +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 diff --git a/runtime-nodejs/example-project/Dockerfile b/runtime-nodejs/example-project/Dockerfile index 2a1ce7c..56db055 100644 --- a/runtime-nodejs/example-project/Dockerfile +++ b/runtime-nodejs/example-project/Dockerfile @@ -1,10 +1,10 @@ # TODO public build, this is from ../ skaffold dev -FROM builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert/runtime-nodejs:3db548aed2ab8ecd32c49d781bec8a76699615f8-dirty +FROM builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert/runtime-nodejs:64e9e32e5776eb7082488fc144c967ae11aef802-dirty WORKDIR /usr/src/specs -COPY package*.json . +COPY --chown=nonroot:nogroup package*.json . RUN npm ci --ignore-scripts -COPY . . +COPY --chown=nonroot:nogroup . . diff --git a/runtime-nodejs/example-project/src/kube-api-access.spec.js b/runtime-nodejs/example-project/src/kube-api-access.spec.js index 30bc1da..0bcc75c 100644 --- a/runtime-nodejs/example-project/src/kube-api-access.spec.js +++ b/runtime-nodejs/example-project/src/kube-api-access.spec.js @@ -1,11 +1,18 @@ +const fs = require('fs'); +const { Certificate } = require('@fidm/x509'); + +const credspath = '/run/secrets/kubernetes.io/serviceaccount'; + describe("kube api access", () => { - xit("Uses a library in this project's package.json", () => { - // TODO + it("Uses a library in this project's package.json", () => { + expect(Certificate).toBeDefined(); }); - it("Can locate the pod's mounted credentials", () => { - expect(true).toEqual(false); + it("Can locate the pod's mounted ca", async () => { + const crt = await fs.promises.readFile(`${credspath}/ca.crt`); + const ca = Certificate.fromPEM(crt); + expect(ca).toHaveProperty('publicKey'); }); }); diff --git a/runtime-nodejs/example-project/src/metrics.spec.js b/runtime-nodejs/example-project/src/metrics.spec.js new file mode 100644 index 0000000..6c81e28 --- /dev/null +++ b/runtime-nodejs/example-project/src/metrics.spec.js @@ -0,0 +1,14 @@ +const fetch = require('node-fetch'); + +describe("A sub-module", () => { + + it("Can use the runtime's default dependencies", () => { + expect(fetch).toBeDefined(); + }); + + it("Gets the metrics reporter despite having its own package.json", async () => { + const metrics = await fetch('http://localhost:9090/metrcs').then(res => res.text()); + expect(metrics).toMatch(/\bassertions_failed /); + }); + +}); diff --git a/runtime-nodejs/jest.config.js b/runtime-nodejs/jest.config.js index 65dde69..197f4c3 100644 --- a/runtime-nodejs/jest.config.js +++ b/runtime-nodejs/jest.config.js @@ -2,8 +2,5 @@ module.exports = { reporters: [ "default", ["/jest.kubernetes-assertions-reporter.js", {}] - ], - testMatch: [ - "/src/**/*.js","/specs/**/*.js" ] }; diff --git a/runtime-nodejs/kustomize/scrapeable-deployment.yaml b/runtime-nodejs/kustomize/scrapeable-deployment.yaml index 42c349a..c4ad008 100644 --- a/runtime-nodejs/kustomize/scrapeable-deployment.yaml +++ b/runtime-nodejs/kustomize/scrapeable-deployment.yaml @@ -19,10 +19,6 @@ spec: ports: - containerPort: 9090 name: prometheus - #command: - #- bash - #- -cex - #- echo "TEMP sleep" && sleep infinity # TODO how to do composition at runtime, in Kubernetes, on a file system level? # We need to keep the spec builds small, and rely on sync # We must support both skaffold run (no file sync) and skaffold dev (with file sync) diff --git a/runtime-nodejs/package.json b/runtime-nodejs/package.json index 4351551..1256b63 100644 --- a/runtime-nodejs/package.json +++ b/runtime-nodejs/package.json @@ -4,7 +4,7 @@ "description": "", "main": "index.js", "scripts": { - "test": "./node_modules/.bin/jest" + "test": "./node_modules/.bin/jest --testPathIgnorePatterns=example-.*" }, "author": "", "license": "ISC", diff --git a/runtime-nodejs/specs/.empty b/runtime-nodejs/specs/.empty new file mode 100644 index 0000000..e69de29 From cbc99173861e30a66c1903ef93419cc4022ce769 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Wed, 27 May 2020 06:16:42 +0200 Subject: [PATCH 32/57] We'll need to automate this, but it's good enough for now --- README.md | 12 ++++++++++++ hooks/build | 2 +- runtime-nodejs/example-project/Dockerfile | 2 +- runtime-nodejs/example-project/kustomization.yaml | 3 +-- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6c4162e..010788f 100644 --- a/README.md +++ b/README.md @@ -120,3 +120,15 @@ sudo rm test/.kube/kubeconfig.yaml $compose up -d sut export KUBECONFIG=$PWD/test/.kube/kubeconfig.yaml ``` + +## Releases + +``` +git push +# wait for https://hub.docker.com/r/solsson/kubernetes-assert, then +YOLEAN_PROMOTE=true IMAGE_NAME=solsson/kubernetes-assert:latest ./hooks/build +# update examples so that people get started from refs +grep -A 1 bases: runtime-nodejs/example-project/kustomization.yaml +grep FROM runtime-nodejs/example-project/Dockerfile +# validate examples +``` diff --git a/hooks/build b/hooks/build index cb7335c..7fa5ee3 100755 --- a/hooks/build +++ b/hooks/build @@ -37,7 +37,7 @@ for CONTEXT in $CONTEXTS; do YOLEAN_PROMOTE_NAME=yolean/assert-$CONTEXT:$YOLEAN_PROMOTE_TAG docker pull $CONTEXT_IMAGE_NAME docker tag $CONTEXT_IMAGE_NAME $YOLEAN_PROMOTE_NAME - PUSH="$PUSH $YOLEAN_PROMOTE_NAME $YOLEAN_PROMOTE_NAME-root" + PUSH="$PUSH $YOLEAN_PROMOTE_NAME" fi done diff --git a/runtime-nodejs/example-project/Dockerfile b/runtime-nodejs/example-project/Dockerfile index 56db055..8d7b6ea 100644 --- a/runtime-nodejs/example-project/Dockerfile +++ b/runtime-nodejs/example-project/Dockerfile @@ -1,5 +1,5 @@ # TODO public build, this is from ../ skaffold dev -FROM builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert/runtime-nodejs:64e9e32e5776eb7082488fc144c967ae11aef802-dirty +FROM yolean/assert-runtime-nodejs:f49ff6965c13bf2484f722cd0a39a280f1746ede@sha256:c16f4b42e50c22a8d49806e4883aee17678aca163d259ca0022eacad9570f0cd WORKDIR /usr/src/specs diff --git a/runtime-nodejs/example-project/kustomization.yaml b/runtime-nodejs/example-project/kustomization.yaml index 1fadcd3..88be80e 100644 --- a/runtime-nodejs/example-project/kustomization.yaml +++ b/runtime-nodejs/example-project/kustomization.yaml @@ -1,8 +1,7 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization bases: -#- github.com/Yolean/kubernetes-assert/runtime-nodejs/kustomize?ref= -- ../kustomize +- github.com/Yolean/kubernetes-assert/runtime-nodejs/kustomize?ref=f49ff6965c13bf2484f722cd0a39a280f1746ede namePrefix: example-project- commonLabels: app: example-project From f8b4fa71928c9ee13c4d25e693eb28aede71e055 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Wed, 27 May 2020 06:19:10 +0200 Subject: [PATCH 33/57] Let's push a :latest, for the daring --- hooks/build | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hooks/build b/hooks/build index 7fa5ee3..1a16f3b 100755 --- a/hooks/build +++ b/hooks/build @@ -37,7 +37,8 @@ for CONTEXT in $CONTEXTS; do YOLEAN_PROMOTE_NAME=yolean/assert-$CONTEXT:$YOLEAN_PROMOTE_TAG docker pull $CONTEXT_IMAGE_NAME docker tag $CONTEXT_IMAGE_NAME $YOLEAN_PROMOTE_NAME - PUSH="$PUSH $YOLEAN_PROMOTE_NAME" + docker tag $CONTEXT_IMAGE_NAME yolean/assert-$CONTEXT:latest + PUSH="$PUSH $YOLEAN_PROMOTE_NAME yolean/assert-$CONTEXT:latest" fi done From c7e7a8227b949b219dcf114e1cb935c5ecf2c931 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Wed, 27 May 2020 06:33:08 +0200 Subject: [PATCH 34/57] When developing examples you'll often want to inherit locally --- runtime-nodejs/example-project/kustomization.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runtime-nodejs/example-project/kustomization.yaml b/runtime-nodejs/example-project/kustomization.yaml index 88be80e..1fadcd3 100644 --- a/runtime-nodejs/example-project/kustomization.yaml +++ b/runtime-nodejs/example-project/kustomization.yaml @@ -1,7 +1,8 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization bases: -- github.com/Yolean/kubernetes-assert/runtime-nodejs/kustomize?ref=f49ff6965c13bf2484f722cd0a39a280f1746ede +#- github.com/Yolean/kubernetes-assert/runtime-nodejs/kustomize?ref= +- ../kustomize namePrefix: example-project- commonLabels: app: example-project From bc1a1ea8dcf9059dae699ed977feb4b3c47477e8 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Wed, 27 May 2020 11:27:39 +0200 Subject: [PATCH 35/57] I think watch is better than watchAll for infra tests, but how do we trigger an initial complete run? --- runtime-nodejs/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime-nodejs/Dockerfile b/runtime-nodejs/Dockerfile index 849ac07..1a95e96 100644 --- a/runtime-nodejs/Dockerfile +++ b/runtime-nodejs/Dockerfile @@ -22,7 +22,7 @@ RUN [ "git", "init" ] RUN [ "npm", "ci", "--ignore-scripts" ] # The above should be identical to the unittest stage -ENTRYPOINT [ "/usr/src/node_modules/.bin/jest", "--projects=/usr/src", "--watchAll", "--passWithNoTests" ] +ENTRYPOINT [ "/usr/src/node_modules/.bin/jest", "--projects=/usr/src", "--watch", "--passWithNoTests" ] # We could copy from context but buildkit won't run the unittest stage unless we somehow depend on the result COPY --from=unittest /usr/src/jest.*.js ./ From 520141bd8c41cab2b2e88782be0d2d1ab7fb3673 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Wed, 27 May 2020 11:32:26 +0200 Subject: [PATCH 36/57] Gets rid of the confusion with a src folder that has no actual src, and makes the runtime's own tests run from the same path that we recommend for downstream tests --- runtime-nodejs/.dockerignore | 2 +- runtime-nodejs/Dockerfile | 2 +- runtime-nodejs/skaffold.yaml | 4 ++-- runtime-nodejs/specs/.empty | 0 runtime-nodejs/specs/reporter.spec.js | 11 +++++++++++ runtime-nodejs/specs/the-second-test.spec.js | 5 +++++ runtime-nodejs/src/example.spec.js | 7 ------- runtime-nodejs/src/example2.spec.js | 7 ------- runtime-nodejs/structure-test/runtime-structure.yaml | 4 ++-- 9 files changed, 22 insertions(+), 20 deletions(-) delete mode 100644 runtime-nodejs/specs/.empty create mode 100644 runtime-nodejs/specs/reporter.spec.js create mode 100644 runtime-nodejs/specs/the-second-test.spec.js delete mode 100644 runtime-nodejs/src/example.spec.js delete mode 100644 runtime-nodejs/src/example2.spec.js diff --git a/runtime-nodejs/.dockerignore b/runtime-nodejs/.dockerignore index 94a659c..d7e7f87 100644 --- a/runtime-nodejs/.dockerignore +++ b/runtime-nodejs/.dockerignore @@ -3,5 +3,5 @@ !package.json !package-lock.json !jest.*.js +!specs !waiting-for-specs -!src diff --git a/runtime-nodejs/Dockerfile b/runtime-nodejs/Dockerfile index 849ac07..d2cd4c0 100644 --- a/runtime-nodejs/Dockerfile +++ b/runtime-nodejs/Dockerfile @@ -27,6 +27,6 @@ ENTRYPOINT [ "/usr/src/node_modules/.bin/jest", "--projects=/usr/src", "--watchA # We could copy from context but buildkit won't run the unittest stage unless we somehow depend on the result COPY --from=unittest /usr/src/jest.*.js ./ -COPY --chown=nonroot:nogroup waiting-for-specs ./src +COPY --chown=nonroot:nogroup waiting-for-specs ./specs WORKDIR /usr/src/specs--must-be-set-explicitly-by-downstream-images--for-now diff --git a/runtime-nodejs/skaffold.yaml b/runtime-nodejs/skaffold.yaml index 1e7cc21..6060cc8 100644 --- a/runtime-nodejs/skaffold.yaml +++ b/runtime-nodejs/skaffold.yaml @@ -18,8 +18,8 @@ build: path: Dockerfile sync: manual: - # intentionally differs from the COPY source, so we test addition of spec files after start - - src: 'src/**' + # at skaffold dev this is the runtime's specs, which is wy it differs from the COPY directive in the Dockerfile + - src: 'specs/**' dest: /usr/src test: - image: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert/runtime-nodejs diff --git a/runtime-nodejs/specs/.empty b/runtime-nodejs/specs/.empty deleted file mode 100644 index e69de29..0000000 diff --git a/runtime-nodejs/specs/reporter.spec.js b/runtime-nodejs/specs/reporter.spec.js new file mode 100644 index 0000000..8501b09 --- /dev/null +++ b/runtime-nodejs/specs/reporter.spec.js @@ -0,0 +1,11 @@ +//const reporter = require('../jest.kubernetes-assertions-reporter.js'); + +describe("MetricsReporter", () => { + + // TODO fix port conflict with the actual reporter while running, + // or find a way to mock server + xit("Exists, but it starts a server as soon as it's required here", () => { + expect(reporter).toBeDefined(); + }); + +}); diff --git a/runtime-nodejs/specs/the-second-test.spec.js b/runtime-nodejs/specs/the-second-test.spec.js new file mode 100644 index 0000000..788794a --- /dev/null +++ b/runtime-nodejs/specs/the-second-test.spec.js @@ -0,0 +1,5 @@ +describe("The second test", () => { + it("Is just another test to make sure reporting understands suites and runs", () => { + expect(true).toBeDefined(); + }); +}); diff --git a/runtime-nodejs/src/example.spec.js b/runtime-nodejs/src/example.spec.js deleted file mode 100644 index 46b0b09..0000000 --- a/runtime-nodejs/src/example.spec.js +++ /dev/null @@ -1,7 +0,0 @@ -describe("example", () => { - - it("Runs a test", () => { - expect(true).toEqual(true); - }); - -}); diff --git a/runtime-nodejs/src/example2.spec.js b/runtime-nodejs/src/example2.spec.js deleted file mode 100644 index b93abf6..0000000 --- a/runtime-nodejs/src/example2.spec.js +++ /dev/null @@ -1,7 +0,0 @@ -describe("example2", () => { - - it("Is just another test so we learn how to handle result reporting", () => { - expect(true).toEqual(true); - }); - -}); diff --git a/runtime-nodejs/structure-test/runtime-structure.yaml b/runtime-nodejs/structure-test/runtime-structure.yaml index 77f9098..c571050 100644 --- a/runtime-nodejs/structure-test/runtime-structure.yaml +++ b/runtime-nodejs/structure-test/runtime-structure.yaml @@ -5,8 +5,8 @@ fileExistenceTests: path: '/usr/src/package.json' - name: 'Runtime package locks' path: '/usr/src/package-lock.json' -- name: 'Runtime source folder' - path: '/usr/src/src' +- name: 'Specs folder (in source this is the spec for the reporter, at runtime it is the target specs)' + path: '/usr/src/specs' - name: 'Jest config' path: '/usr/src/jest.config.js' - name: 'No actual runtime source because runtime consists of jest extensions and the specs run as unit tests during build' From 479f2015030dd1d6b6c087164decc1575f1cfd8d Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Wed, 27 May 2020 11:37:03 +0200 Subject: [PATCH 37/57] Exports both gauges and counters --- .../jest.kubernetes-assertions-reporter.js | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/runtime-nodejs/jest.kubernetes-assertions-reporter.js b/runtime-nodejs/jest.kubernetes-assertions-reporter.js index e2eca5f..ade01a0 100644 --- a/runtime-nodejs/jest.kubernetes-assertions-reporter.js +++ b/runtime-nodejs/jest.kubernetes-assertions-reporter.js @@ -7,20 +7,35 @@ const http = require('http'); const client = require('prom-client'); const register = client.register; -const assertions_failed = new client.Counter({ +const assertions_failed = new client.Gauge({ name: 'assertions_failed', + help: 'current onTestResult numFailingTests', +}); + +const assertions_failed_total = new client.Counter({ + name: 'assertions_failed_total', help: 'inc\'d for every onTestResult numFailingTests', }); -const tests_total = new client.Counter({ - name: 'tests_total', +const tests_run = new client.Gauge({ + name: 'tests_run', + help: 'current onRunComplete numTotalTests' +}); + +const tests_run_total = new client.Counter({ + name: 'tests_run_total', help: 'inc\'d for every onRunComplete numTotalTests' -}) +}); + +const test_suites_run = new client.Gauge({ + name: 'test_suites_run', + help: 'current onRunComplete numTotalTestSuites' +}); -const test_suites_total = new client.Counter({ - name: 'test_suites_total', +const test_suites_run_total = new client.Counter({ + name: 'test_suites_run_total', help: 'inc\'d for every onRunComplete numTotalTestSuites' -}) +}); class MetricsServer { @@ -72,12 +87,15 @@ class MetricsReporter { onRunComplete(contexts, results) { //console.log('onRunComplete', contexts, results); - test_suites_total.inc(results.numTotalTestSuites); - tests_total.inc(results.numTotalTests); + test_suites_run.set(results.numTotalTestSuites); + test_suites_run_total.inc(results.numTotalTestSuites); + tests_run.set(results.numTotalTests); + tests_run_total.inc(results.numTotalTests); } onTestResult(test, testResult, aggregatedResult) { - assertions_failed.inc(testResult.numFailingTests); + assertions_failed.set(testResult.numFailingTests); + assertions_failed_total.inc(testResult.numFailingTests); //console.log('onTestResult', testResult, aggregatedResult); if (!this._globalConfig.watch && !this._globalConfig.watchAll) { //console.log('Not a watch run. Exiting'); From 0d1be7b9ce0abb7a4e7ceaaeadb8d1026b3d4974 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Wed, 27 May 2020 11:52:01 +0200 Subject: [PATCH 38/57] I thought Jest would run all tests on start because they're uncommitted but apparently it doesn't, it somehow detects actual changes. --- runtime-nodejs/structure-test/jest-watch.yaml | 11 +++++++++++ .../{runtime-structure.yaml => source-structure.yaml} | 0 2 files changed, 11 insertions(+) create mode 100644 runtime-nodejs/structure-test/jest-watch.yaml rename runtime-nodejs/structure-test/{runtime-structure.yaml => source-structure.yaml} (100%) diff --git a/runtime-nodejs/structure-test/jest-watch.yaml b/runtime-nodejs/structure-test/jest-watch.yaml new file mode 100644 index 0000000..83df4af --- /dev/null +++ b/runtime-nodejs/structure-test/jest-watch.yaml @@ -0,0 +1,11 @@ +schemaVersion: 2.0.0 + +fileExistenceTests: +- name: 'Must be a git repo for jest --watch to work' + path: '/usr/src/.git' + +commandTests: +- name: "Git log should be empty" + command: "git" + args: ["log"] + exitCode: 128 diff --git a/runtime-nodejs/structure-test/runtime-structure.yaml b/runtime-nodejs/structure-test/source-structure.yaml similarity index 100% rename from runtime-nodejs/structure-test/runtime-structure.yaml rename to runtime-nodejs/structure-test/source-structure.yaml From d3630d89f1babc4a17f95e89a249030b8b501043 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Wed, 27 May 2020 11:56:03 +0200 Subject: [PATCH 39/57] Still not unit testing the test framework --- runtime-nodejs/specs/reporter.spec.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/runtime-nodejs/specs/reporter.spec.js b/runtime-nodejs/specs/reporter.spec.js index 8501b09..999b231 100644 --- a/runtime-nodejs/specs/reporter.spec.js +++ b/runtime-nodejs/specs/reporter.spec.js @@ -8,4 +8,7 @@ describe("MetricsReporter", () => { expect(reporter).toBeDefined(); }); + it("Needs at least one actual it, to show up in jest's output", () => { + }); + }); From 71f16d3c817a1cd48df34d4fa12db0a89d9cc66b Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Wed, 27 May 2020 12:03:17 +0200 Subject: [PATCH 40/57] The current state of examples --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 010788f..7d11027 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,8 @@ Summary: 1. If you don't have a monitoring stack already, use the one from this repo. It's the Prometheus setup we use in dev clusters. -2. Arrange your specs like in [our example](./runtime-nodejs/example-specs/) with a [skaffold.yaml](./runtime-nodejs/example-specs/skaffold.yaml) and [kustomization.yaml](./runtime-nodejs/example-specs/kustomization.yaml). +2. Arrange your specs like in [our example](./runtime-nodejs/example-project/) with a [skaffold.yaml](./runtime-nodejs/example-project/skaffold.yaml) and [kustomization.yaml](./runtime-nodejs/example-project/kustomization.yaml). + - Our near term roadmap is to support "just put your spec files here" to run but we're not [there](./runtime-nodejs/example-specs/) yet. You need a [Dockerfile](./runtime-nodejs/example-project/Dockerfile). 3. Run `skaffold dev` 4. Make sure Prometheus will [scrape `assertions_failed`](./assertions_failed/). 5. Watch for Alerts using for example From 242962aac62f89b136c29cd71251e741018d6a79 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Wed, 27 May 2020 12:13:48 +0200 Subject: [PATCH 41/57] Adds example rbac for specs that need the kube-api, which shoud be common because you often need to wait for things, for example --- runtime-nodejs/kustomize/kustomization.yaml | 2 ++ .../kustomize/scrapeable-deployment.yaml | 1 + runtime-nodejs/rbac-readonly/assert-role.yaml | 27 +++++++++++++++++++ .../rbac-readonly/assert-rolebinding.yaml | 11 ++++++++ .../rbac-readonly/assert-serviceaccount.yaml | 4 +++ .../rbac-readonly/kustomization.yaml | 6 +++++ 6 files changed, 51 insertions(+) create mode 100644 runtime-nodejs/rbac-readonly/assert-role.yaml create mode 100644 runtime-nodejs/rbac-readonly/assert-rolebinding.yaml create mode 100644 runtime-nodejs/rbac-readonly/assert-serviceaccount.yaml create mode 100644 runtime-nodejs/rbac-readonly/kustomization.yaml diff --git a/runtime-nodejs/kustomize/kustomization.yaml b/runtime-nodejs/kustomize/kustomization.yaml index d3e8f9f..a6162d1 100644 --- a/runtime-nodejs/kustomize/kustomization.yaml +++ b/runtime-nodejs/kustomize/kustomization.yaml @@ -1,5 +1,7 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization +bases: +- ../rbac-readonly resources: - scrapeable-deployment.yaml # TODO if many tests reuse this base, how do we manage podmonitor? diff --git a/runtime-nodejs/kustomize/scrapeable-deployment.yaml b/runtime-nodejs/kustomize/scrapeable-deployment.yaml index c4ad008..e542a54 100644 --- a/runtime-nodejs/kustomize/scrapeable-deployment.yaml +++ b/runtime-nodejs/kustomize/scrapeable-deployment.yaml @@ -12,6 +12,7 @@ spec: labels: kubernetes-assert: counter spec: + serviceAccountName: assert containers: - name: runtime # We can't have a tag here because https://kubectl.docs.kubernetes.io/pages/reference/kustomize.html#images won't unset it, and Skaffold required no-tag URLs for build diff --git a/runtime-nodejs/rbac-readonly/assert-role.yaml b/runtime-nodejs/rbac-readonly/assert-role.yaml new file mode 100644 index 0000000..15c728f --- /dev/null +++ b/runtime-nodejs/rbac-readonly/assert-role.yaml @@ -0,0 +1,27 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: assert +rules: +- apiGroups: + - "" + resources: + - namespaces + - pods + - services + - endpoints + - events + - pods/log + verbs: + - get + - list + - watch +- apiGroups: + - apps + resources: + - statefulsets + - deployments + verbs: + - get + - list + - watch diff --git a/runtime-nodejs/rbac-readonly/assert-rolebinding.yaml b/runtime-nodejs/rbac-readonly/assert-rolebinding.yaml new file mode 100644 index 0000000..9306cb9 --- /dev/null +++ b/runtime-nodejs/rbac-readonly/assert-rolebinding.yaml @@ -0,0 +1,11 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: assert +subjects: +- kind: ServiceAccount + name: assert +roleRef: + kind: Role + name: assert + apiGroup: rbac.authorization.k8s.io diff --git a/runtime-nodejs/rbac-readonly/assert-serviceaccount.yaml b/runtime-nodejs/rbac-readonly/assert-serviceaccount.yaml new file mode 100644 index 0000000..1e2d538 --- /dev/null +++ b/runtime-nodejs/rbac-readonly/assert-serviceaccount.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: assert diff --git a/runtime-nodejs/rbac-readonly/kustomization.yaml b/runtime-nodejs/rbac-readonly/kustomization.yaml new file mode 100644 index 0000000..dd8613b --- /dev/null +++ b/runtime-nodejs/rbac-readonly/kustomization.yaml @@ -0,0 +1,6 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: +- assert-serviceaccount.yaml +- assert-role.yaml +- assert-rolebinding.yaml From e9c915ea2c8d35770f67203b656df8629340566a Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Wed, 27 May 2020 12:16:51 +0200 Subject: [PATCH 42/57] For downstream builds we actually do run all specs on start, and on change --- runtime-nodejs/example-project/Dockerfile | 3 +-- runtime-nodejs/example-project/kustomization.yaml | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/runtime-nodejs/example-project/Dockerfile b/runtime-nodejs/example-project/Dockerfile index 8d7b6ea..2b6eaaa 100644 --- a/runtime-nodejs/example-project/Dockerfile +++ b/runtime-nodejs/example-project/Dockerfile @@ -1,5 +1,4 @@ -# TODO public build, this is from ../ skaffold dev -FROM yolean/assert-runtime-nodejs:f49ff6965c13bf2484f722cd0a39a280f1746ede@sha256:c16f4b42e50c22a8d49806e4883aee17678aca163d259ca0022eacad9570f0cd +FROM yolean/assert-runtime-nodejs:d3630d89f1babc4a17f95e89a249030b8b501043@sha256:cb4ce7cddce3230420ae963c2ec5718b68254f98a8a00b6a0879d2aa672b9b56 WORKDIR /usr/src/specs diff --git a/runtime-nodejs/example-project/kustomization.yaml b/runtime-nodejs/example-project/kustomization.yaml index 1fadcd3..c05deab 100644 --- a/runtime-nodejs/example-project/kustomization.yaml +++ b/runtime-nodejs/example-project/kustomization.yaml @@ -1,8 +1,7 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization bases: -#- github.com/Yolean/kubernetes-assert/runtime-nodejs/kustomize?ref= -- ../kustomize +- github.com/Yolean/kubernetes-assert/runtime-nodejs/kustomize?ref=242962aac62f89b136c29cd71251e741018d6a79 namePrefix: example-project- commonLabels: app: example-project From a0d15012e178fe44a32b93166a4791430bcfae06 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Thu, 28 May 2020 06:33:18 +0200 Subject: [PATCH 43/57] Exemplifies kube api access --- README.md | 1 + .../src/kube-api-access.spec.js | 5 ++++ .../src/kube-client-access.spec.js | 25 +++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 runtime-nodejs/example-project/src/kube-client-access.spec.js diff --git a/README.md b/README.md index 7d11027..748e21e 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ Summary: It's the Prometheus setup we use in dev clusters. 2. Arrange your specs like in [our example](./runtime-nodejs/example-project/) with a [skaffold.yaml](./runtime-nodejs/example-project/skaffold.yaml) and [kustomization.yaml](./runtime-nodejs/example-project/kustomization.yaml). - Our near term roadmap is to support "just put your spec files here" to run but we're not [there](./runtime-nodejs/example-specs/) yet. You need a [Dockerfile](./runtime-nodejs/example-project/Dockerfile). + - You need a way to [build](https://skaffold.dev/docs/pipeline-stages/builders/) with Skaffold. Our examples use [y-stack](https://github.com/y-stack/ystack) which is completely local, but any build method is fine. 3. Run `skaffold dev` 4. Make sure Prometheus will [scrape `assertions_failed`](./assertions_failed/). 5. Watch for Alerts using for example diff --git a/runtime-nodejs/example-project/src/kube-api-access.spec.js b/runtime-nodejs/example-project/src/kube-api-access.spec.js index 0bcc75c..9f773ab 100644 --- a/runtime-nodejs/example-project/src/kube-api-access.spec.js +++ b/runtime-nodejs/example-project/src/kube-api-access.spec.js @@ -15,4 +15,9 @@ describe("kube api access", () => { expect(ca).toHaveProperty('publicKey'); }); + it("Can read pod's mounted bearer token", async () => { + const token = await fs.promises.readFile(`${credspath}/token`, 'utf8'); + expect(token).toMatch(/.+/); + }); + }); diff --git a/runtime-nodejs/example-project/src/kube-client-access.spec.js b/runtime-nodejs/example-project/src/kube-client-access.spec.js new file mode 100644 index 0000000..329abb6 --- /dev/null +++ b/runtime-nodejs/example-project/src/kube-client-access.spec.js @@ -0,0 +1,25 @@ +const fs = require('fs'); +const k8s = require('@kubernetes/client-node'); + +describe("Kubernets client (nodejs)", () => { + + let k; + + beforeAll(() => { + const kc = new k8s.KubeConfig(); + kc.loadFromDefault(); + k = kc.makeApiClient(k8s.CoreV1Api); + }); + + it("Can list pods", async () => { + // What's a simple way to use current namespace? + const namespace = await fs.promises.readFile(`/run/secrets/kubernetes.io/serviceaccount/namespace`, 'utf8'); + + const pods = await k.listNamespacedPod(namespace); + const names = pods.body.items.map(pod => pod.metadata.name); + + const podName = process.env.HOSTNAME; + expect(names).toContain(podName); + }); + +}); From f015a4f1f6408dddef80cdba9b734664c275b570 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Thu, 28 May 2020 06:35:21 +0200 Subject: [PATCH 44/57] Many specs will need this metadata --- .../kustomize/scrapeable-deployment.yaml | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/runtime-nodejs/kustomize/scrapeable-deployment.yaml b/runtime-nodejs/kustomize/scrapeable-deployment.yaml index e542a54..4117bd6 100644 --- a/runtime-nodejs/kustomize/scrapeable-deployment.yaml +++ b/runtime-nodejs/kustomize/scrapeable-deployment.yaml @@ -17,6 +17,27 @@ spec: - name: runtime # We can't have a tag here because https://kubectl.docs.kubernetes.io/pages/reference/kustomize.html#images won't unset it, and Skaffold required no-tag URLs for build image: yolean/assert-runtime-nodejs + env: + - name: POD_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_SERVICE_ACCOUNT + valueFrom: + fieldRef: + fieldPath: spec.serviceAccountName ports: - containerPort: 9090 name: prometheus From 7931a17896e83041f878d7da615f8ee9e764df1f Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Thu, 28 May 2020 06:40:59 +0200 Subject: [PATCH 45/57] Uses inherited Downward API envs for convenience --- runtime-nodejs/example-project/kustomization.yaml | 2 +- .../example-project/src/kube-client-access.spec.js | 4 +++- runtime-nodejs/example-project/src/metrics.spec.js | 9 ++++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/runtime-nodejs/example-project/kustomization.yaml b/runtime-nodejs/example-project/kustomization.yaml index c05deab..f8e82d0 100644 --- a/runtime-nodejs/example-project/kustomization.yaml +++ b/runtime-nodejs/example-project/kustomization.yaml @@ -1,7 +1,7 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization bases: -- github.com/Yolean/kubernetes-assert/runtime-nodejs/kustomize?ref=242962aac62f89b136c29cd71251e741018d6a79 +- github.com/Yolean/kubernetes-assert/runtime-nodejs/kustomize?ref=f015a4f1f6408dddef80cdba9b734664c275b570 namePrefix: example-project- commonLabels: app: example-project diff --git a/runtime-nodejs/example-project/src/kube-client-access.spec.js b/runtime-nodejs/example-project/src/kube-client-access.spec.js index 329abb6..548cdda 100644 --- a/runtime-nodejs/example-project/src/kube-client-access.spec.js +++ b/runtime-nodejs/example-project/src/kube-client-access.spec.js @@ -12,8 +12,10 @@ describe("Kubernets client (nodejs)", () => { }); it("Can list pods", async () => { - // What's a simple way to use current namespace? + // Can the client simply use the context's current namespace instead? const namespace = await fs.promises.readFile(`/run/secrets/kubernetes.io/serviceaccount/namespace`, 'utf8'); + expect(process.env.POD_NAMESPACE).toBeTruthy(); + expect(namespace).toEqual(process.env.POD_NAMESPACE); const pods = await k.listNamespacedPod(namespace); const names = pods.body.items.map(pod => pod.metadata.name); diff --git a/runtime-nodejs/example-project/src/metrics.spec.js b/runtime-nodejs/example-project/src/metrics.spec.js index 6c81e28..517733d 100644 --- a/runtime-nodejs/example-project/src/metrics.spec.js +++ b/runtime-nodejs/example-project/src/metrics.spec.js @@ -7,8 +7,15 @@ describe("A sub-module", () => { }); it("Gets the metrics reporter despite having its own package.json", async () => { - const metrics = await fetch('http://localhost:9090/metrcs').then(res => res.text()); + const metrics = await fetch('http://localhost:9090/metrics').then(res => res.text()); expect(metrics).toMatch(/\bassertions_failed /); }); + it("Exports results not only to localhost", async () => { + expect(process.env.POD_IP).toBeTruthy(); + const metrics = await fetch(`http://${process.env.POD_IP}:9090/metrics`).then(res => res.text()); + expect(metrics).toMatch(/\bassertions_failed /); + expect(metrics).toMatch(/\btests_run /); + }); + }); From 930ee2627ac53b7e356ce6a317226a010ffe3c8d Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Thu, 28 May 2020 06:42:42 +0200 Subject: [PATCH 46/57] The category is Prometheus metrics, no longer counters only --- runtime-nodejs/kustomize/scrapeable-deployment.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime-nodejs/kustomize/scrapeable-deployment.yaml b/runtime-nodejs/kustomize/scrapeable-deployment.yaml index 4117bd6..8d80334 100644 --- a/runtime-nodejs/kustomize/scrapeable-deployment.yaml +++ b/runtime-nodejs/kustomize/scrapeable-deployment.yaml @@ -6,11 +6,11 @@ spec: replicas: 1 selector: matchLabels: - kubernetes-assert: counter + kubernetes-assert: metrics template: metadata: labels: - kubernetes-assert: counter + kubernetes-assert: metrics spec: serviceAccountName: assert containers: From 6dae44cc7989adf12061f213db364a465cfdd44b Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Thu, 28 May 2020 07:01:18 +0200 Subject: [PATCH 47/57] Scrapes all pods that match the kubernetes-assert label --- .../kubernetes-assert-podmonitor.yaml | 14 ++++++++++++++ assertions_failed/kustomization.yaml | 4 ++++ base-label-prometheus-now/kustomization.yaml | 1 + runtime-nodejs/example-project/kustomization.yaml | 2 +- 4 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 assertions_failed/kubernetes-assert-podmonitor.yaml create mode 100644 assertions_failed/kustomization.yaml diff --git a/assertions_failed/kubernetes-assert-podmonitor.yaml b/assertions_failed/kubernetes-assert-podmonitor.yaml new file mode 100644 index 0000000..de1672b --- /dev/null +++ b/assertions_failed/kubernetes-assert-podmonitor.yaml @@ -0,0 +1,14 @@ +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + name: kubernetes-assert-metrics + # Note that this excludes labels; see ../base-label-prometheus-now/ +spec: + jobLabel: kubernetes-assert + namespaceSelector: + any: true + selector: + matchLabels: + kubernetes-assert: metrics + podMetricsEndpoints: + - port: prometheus diff --git a/assertions_failed/kustomization.yaml b/assertions_failed/kustomization.yaml new file mode 100644 index 0000000..82da7e8 --- /dev/null +++ b/assertions_failed/kustomization.yaml @@ -0,0 +1,4 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: +- kubernetes-assert-podmonitor.yaml diff --git a/base-label-prometheus-now/kustomization.yaml b/base-label-prometheus-now/kustomization.yaml index cbecfa8..75c8d92 100644 --- a/base-label-prometheus-now/kustomization.yaml +++ b/base-label-prometheus-now/kustomization.yaml @@ -7,3 +7,4 @@ bases: - ../node-exporter - ../kube-state-metrics - ../kubernetes-mixin +- ../assertions_failed diff --git a/runtime-nodejs/example-project/kustomization.yaml b/runtime-nodejs/example-project/kustomization.yaml index f8e82d0..cf9ff9c 100644 --- a/runtime-nodejs/example-project/kustomization.yaml +++ b/runtime-nodejs/example-project/kustomization.yaml @@ -1,7 +1,7 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization bases: -- github.com/Yolean/kubernetes-assert/runtime-nodejs/kustomize?ref=f015a4f1f6408dddef80cdba9b734664c275b570 +- github.com/Yolean/kubernetes-assert/runtime-nodejs/kustomize?ref=930ee2627ac53b7e356ce6a317226a010ffe3c8d namePrefix: example-project- commonLabels: app: example-project From 685baa861af035fce13eaa7b6cbe9b2428ec03fe Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Thu, 4 Jun 2020 06:03:17 +0200 Subject: [PATCH 48/57] Bumps --- grafana/grafana-deployment.yaml | 2 +- kube-state-metrics/kube-state-metrics-deployment.yaml | 2 +- runtime-nodejs/package-lock.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/grafana/grafana-deployment.yaml b/grafana/grafana-deployment.yaml index bae4924..7b8b69a 100644 --- a/grafana/grafana-deployment.yaml +++ b/grafana/grafana-deployment.yaml @@ -14,7 +14,7 @@ spec: spec: containers: - name: grafana - image: grafana/grafana:7.0.0-ubuntu@sha256:d4fe3f23dcf9e106419eed2573607fa09e5160475ac4e9ba9021f8f79073efba + image: grafana/grafana:7.0.3-ubuntu@sha256:1bfb488dce8b54c4e438f626648efc98c14ab64ca9a833e441b7200334376acc env: # Has to be a kustomization # - name: GF_SERVER_ROOT_URL diff --git a/kube-state-metrics/kube-state-metrics-deployment.yaml b/kube-state-metrics/kube-state-metrics-deployment.yaml index e040cda..ddad09a 100644 --- a/kube-state-metrics/kube-state-metrics-deployment.yaml +++ b/kube-state-metrics/kube-state-metrics-deployment.yaml @@ -20,7 +20,7 @@ spec: - --port=8081 - --telemetry-host=0.0.0.0 - --telemetry-port=8082 - image: quay.io/coreos/kube-state-metrics:v1.9.6@sha256:7baf75cfa9f70966f2d1f9e724edfb8970fd0ce817fc59887f650cf83b92a14d + image: quay.io/coreos/kube-state-metrics:v1.9.7@sha256:2f82f0da199c60a7699c43c63a295c44e673242de0b7ee1b17c2d5a23bec34cb name: kube-state-metrics ports: - name: web diff --git a/runtime-nodejs/package-lock.json b/runtime-nodejs/package-lock.json index eb5676d..72ea213 100644 --- a/runtime-nodejs/package-lock.json +++ b/runtime-nodejs/package-lock.json @@ -1,5 +1,5 @@ { - "name": "assertruntime-nodejs-jest", + "name": "@yolean/assert-runtime-nodejs", "version": "1.0.0", "lockfileVersion": 1, "requires": true, From d30fb1c0307fba41fc0a83d3c9609bde27a1dd7f Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Thu, 4 Jun 2020 06:05:05 +0200 Subject: [PATCH 49/57] Restores the kubernetes-mixin build, according to readme's command --- docker-compose.test.yml | 44 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/docker-compose.test.yml b/docker-compose.test.yml index c8314f1..d09bbb8 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -81,6 +81,50 @@ services: mem_limit: 80000000 memswap_limit: 0 + kubernetes-mixin: + build: ./kubernetes-mixin + environment: + - DEBUG=true + entrypoint: + - sh + - -ce + command: + - | + cat << EOF > /kustomize-base/rules.yaml + apiVersion: monitoring.coreos.com/v1 + kind: PrometheusRule + metadata: + name: kubernetes-mixin-rules + spec: + EOF + cat prometheus_rules.yaml | gojsontoyaml | sed 's|^| |' >> /kustomize-base/rules.yaml + + cat << EOF > /kustomize-base/alerts.yaml + apiVersion: monitoring.coreos.com/v1 + kind: PrometheusRule + metadata: + name: kubernetes-mixin-alerts + spec: + EOF + cat prometheus_alerts.yaml | gojsontoyaml | sed 's|^| |' >> /kustomize-base/alerts.yaml + + cp -rv dashboards_out/* /dashboards-kustomize-base + rm /dashboards-kustomize-base/controller-manager.json + cat << EOF > /dashboards-kustomize-base/kustomization.yaml + # It should be possible to extend this set of dashboards using the "replace" behavior + # Meant to be used with kubectl create -k and kubectl replace -k + # (unless we learn how to get rid of last-applied-configuration with apply) + generatorOptions: + disableNameSuffixHash: true + configMapGenerator: + - name: kubernetes-mixin-grafana-dashboards + files: + EOF + find /dashboards-kustomize-base -name \*.json | sed 's|.*/\(.*\)| - \1=\1|' >> /dashboards-kustomize-base/kustomization.yaml + volumes: + - ./kubernetes-mixin:/kustomize-base + - ./kubernetes-mixin-dashboards:/dashboards-kustomize-base + volumes: k3s-server: {} admin: {} From b820cd1534557600c38761cb318ad3fd7e0b8396 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Thu, 4 Jun 2020 06:06:54 +0200 Subject: [PATCH 50/57] The result of generating kubernetes-mixin now --- kubernetes-mixin/alerts.yaml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/kubernetes-mixin/alerts.yaml b/kubernetes-mixin/alerts.yaml index 2d34ec4..5567d6a 100644 --- a/kubernetes-mixin/alerts.yaml +++ b/kubernetes-mixin/alerts.yaml @@ -376,9 +376,7 @@ spec: sum(apiserver_request:burnrate5m) > (14.40 * 0.01000) for: 2m labels: - long: 1h severity: critical - short: 5m - alert: KubeAPIErrorBudgetBurn annotations: message: The API server is burning too much error budget @@ -389,9 +387,7 @@ spec: sum(apiserver_request:burnrate30m) > (6.00 * 0.01000) for: 15m labels: - long: 6h severity: critical - short: 30m - alert: KubeAPIErrorBudgetBurn annotations: message: The API server is burning too much error budget @@ -402,9 +398,7 @@ spec: sum(apiserver_request:burnrate2h) > (3.00 * 0.01000) for: 1h labels: - long: 1d severity: warning - short: 2h - alert: KubeAPIErrorBudgetBurn annotations: message: The API server is burning too much error budget @@ -415,9 +409,7 @@ spec: sum(apiserver_request:burnrate6h) > (1.00 * 0.01000) for: 3h labels: - long: 3d severity: warning - short: 6h - name: kubernetes-system-apiserver rules: - alert: KubeAPILatencyHigh From 75ce5b4725aeb7310d82e14b5de46ca8556e39eb Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Thu, 4 Jun 2020 08:32:58 +0200 Subject: [PATCH 51/57] It's really quite simple to start infa testing based on the README --- specs/Dockerfile | 9 +++++++++ specs/kustomization.yaml | 11 +++++++++++ specs/package-lock.json | 5 +++++ specs/package.json | 11 +++++++++++ specs/skaffold.yaml | 20 ++++++++++++++++++++ specs/src/now-prometheus-access.spec.js | 10 ++++++++++ 6 files changed, 66 insertions(+) create mode 100644 specs/Dockerfile create mode 100644 specs/kustomization.yaml create mode 100644 specs/package-lock.json create mode 100644 specs/package.json create mode 100644 specs/skaffold.yaml create mode 100644 specs/src/now-prometheus-access.spec.js diff --git a/specs/Dockerfile b/specs/Dockerfile new file mode 100644 index 0000000..2b6eaaa --- /dev/null +++ b/specs/Dockerfile @@ -0,0 +1,9 @@ +FROM yolean/assert-runtime-nodejs:d3630d89f1babc4a17f95e89a249030b8b501043@sha256:cb4ce7cddce3230420ae963c2ec5718b68254f98a8a00b6a0879d2aa672b9b56 + +WORKDIR /usr/src/specs + +COPY --chown=nonroot:nogroup package*.json . + +RUN npm ci --ignore-scripts + +COPY --chown=nonroot:nogroup . . diff --git a/specs/kustomization.yaml b/specs/kustomization.yaml new file mode 100644 index 0000000..41eacb1 --- /dev/null +++ b/specs/kustomization.yaml @@ -0,0 +1,11 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +bases: +- github.com/Yolean/kubernetes-assert/runtime-nodejs/kustomize?ref=930ee2627ac53b7e356ce6a317226a010ffe3c8d +namePrefix: kubernetes-assert-specs- +commonLabels: + app: kubernetes-assert +images: +- name: yolean/assert-runtime-nodejs + newName: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert-specs + newTag: null diff --git a/specs/package-lock.json b/specs/package-lock.json new file mode 100644 index 0000000..36bcffb --- /dev/null +++ b/specs/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@yolean/kubernetes-assert-specs", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/specs/package.json b/specs/package.json new file mode 100644 index 0000000..f36f91c --- /dev/null +++ b/specs/package.json @@ -0,0 +1,11 @@ +{ + "name": "@yolean/kubernetes-assert-specs", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} diff --git a/specs/skaffold.yaml b/specs/skaffold.yaml new file mode 100644 index 0000000..b61c029 --- /dev/null +++ b/specs/skaffold.yaml @@ -0,0 +1,20 @@ +apiVersion: skaffold/v2beta4 +kind: Config +metadata: + name: assert-runtime-nodejs-example-project +build: + tagPolicy: + gitCommit: + variant: CommitSha + artifacts: + - image: builds-registry.ystack.svc.cluster.local/yolean/kubernetes-assert-specs + context: ./ + custom: + buildCommand: y-build + dependencies: + dockerfile: + path: Dockerfile + sync: + infer: ["**/*"] +deploy: + kustomize: {} diff --git a/specs/src/now-prometheus-access.spec.js b/specs/src/now-prometheus-access.spec.js new file mode 100644 index 0000000..87e13d5 --- /dev/null +++ b/specs/src/now-prometheus-access.spec.js @@ -0,0 +1,10 @@ +const fetch = require('node-fetch'); + +describe('The Prometheus "now" instance', () => { + + it("Is accessible at prometheus-now.monitoring", async () => { + const root = await fetch('http://prometheus-now.monitoring:9090/').then(res => res.text()); + expect(root).toMatch(/Prometheus Time Series Collection and Processing Server/); + }); + +}); From 59ea6ed142c2c1cf1df8b977e137a2bd7d3fd531 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Thu, 4 Jun 2020 08:42:25 +0200 Subject: [PATCH 52/57] Assert existence of certain metrics --- specs/src/metrics-from-node-exporter.spec.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 specs/src/metrics-from-node-exporter.spec.js diff --git a/specs/src/metrics-from-node-exporter.spec.js b/specs/src/metrics-from-node-exporter.spec.js new file mode 100644 index 0000000..2eea3b3 --- /dev/null +++ b/specs/src/metrics-from-node-exporter.spec.js @@ -0,0 +1,18 @@ +const fetch = require('node-fetch'); + +const prom = 'http://prometheus-now.monitoring:9090'; + +describe("node-exporter", () => { + + [ + 'node_cpu_package_throttles_total', + 'node_cpu_core_throttles_total' + ].forEach(metric => { + it(`Has a metric ${metric}`, async () => { + const meta = await fetch(`${prom}/api/v1/metadata?metric=${metric}`).then(res => res.json()); + expect(meta).toHaveProperty('data'); + expect(meta.data).toHaveProperty(metric); + }); + }); + +}); From d8d886bca83c8156eba935923bb29b379c980aa1 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Thu, 4 Jun 2020 08:59:16 +0200 Subject: [PATCH 53/57] Assert that we have an alertmanager, and recognize it --- specs/src/metrics-from-node-exporter.spec.js | 1 + specs/src/now-prometheus-access.spec.js | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/specs/src/metrics-from-node-exporter.spec.js b/specs/src/metrics-from-node-exporter.spec.js index 2eea3b3..9ea4df3 100644 --- a/specs/src/metrics-from-node-exporter.spec.js +++ b/specs/src/metrics-from-node-exporter.spec.js @@ -10,6 +10,7 @@ describe("node-exporter", () => { ].forEach(metric => { it(`Has a metric ${metric}`, async () => { const meta = await fetch(`${prom}/api/v1/metadata?metric=${metric}`).then(res => res.json()); + expect(meta.status).toEqual('success'); expect(meta).toHaveProperty('data'); expect(meta.data).toHaveProperty(metric); }); diff --git a/specs/src/now-prometheus-access.spec.js b/specs/src/now-prometheus-access.spec.js index 87e13d5..b4059e4 100644 --- a/specs/src/now-prometheus-access.spec.js +++ b/specs/src/now-prometheus-access.spec.js @@ -7,4 +7,9 @@ describe('The Prometheus "now" instance', () => { expect(root).toMatch(/Prometheus Time Series Collection and Processing Server/); }); + it("Has an alertmanager", async () => { + const alertmanagers = await fetch('http://prometheus-now.monitoring:9090/api/v1/alertmanagers').then(res => res.json()); + expect(alertmanagers.data.activeAlertmanagers.length).toBeGreaterThanOrEqual(1); + }); + }); From b3027803f844fa7d9b1a0f0524715eab7608af67 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Thu, 4 Jun 2020 09:07:27 +0200 Subject: [PATCH 54/57] Start an alertmanager spec --- specs/src/main-alertmanager.spec.js | 20 ++++++++++++++++++++ specs/src/now-prometheus-access.spec.js | 4 ++-- 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 specs/src/main-alertmanager.spec.js diff --git a/specs/src/main-alertmanager.spec.js b/specs/src/main-alertmanager.spec.js new file mode 100644 index 0000000..a5b26e9 --- /dev/null +++ b/specs/src/main-alertmanager.spec.js @@ -0,0 +1,20 @@ +const fetch = require('node-fetch'); + +describe('Alertmanager "main"', () => { + + it("Is accessible on alertmanager-main.monitoring:9093", async () => { + const root = await fetch('http://alertmanager-main.monitoring:9093/').then(res => res.text()); + expect(root).toMatch(/Alertmanager/); + }); + + it("It reports status", async () => { + const status = await fetch('http://alertmanager-main.monitoring:9093/api/v2/status').then(res => res.json()); + expect(status.cluster.peers.length).toBeGreaterThanOrEqual(1); + }); + + it("Can list alerts", async () => { + const alerts = await fetch('http://alertmanager-main.monitoring:9093/api/v2/alerts').then(res => res.json()); + expect(alerts).toBeInstanceOf(Array); + }); + +}); diff --git a/specs/src/now-prometheus-access.spec.js b/specs/src/now-prometheus-access.spec.js index b4059e4..0310733 100644 --- a/specs/src/now-prometheus-access.spec.js +++ b/specs/src/now-prometheus-access.spec.js @@ -1,8 +1,8 @@ const fetch = require('node-fetch'); -describe('The Prometheus "now" instance', () => { +describe('Prometheus "now"', () => { - it("Is accessible at prometheus-now.monitoring", async () => { + it("Is accessible at prometheus-now.monitoring:9090", async () => { const root = await fetch('http://prometheus-now.monitoring:9090/').then(res => res.text()); expect(root).toMatch(/Prometheus Time Series Collection and Processing Server/); }); From d5f70a111cbca6248667de21101628d5c55a58e5 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Thu, 4 Jun 2020 09:21:52 +0200 Subject: [PATCH 55/57] Fixes build errors with classic docker build --- hooks/build | 1 + runtime-nodejs/example-project/Dockerfile | 2 +- specs/Dockerfile | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/hooks/build b/hooks/build index 1a16f3b..0b1bf5a 100755 --- a/hooks/build +++ b/hooks/build @@ -22,6 +22,7 @@ fi CONTEXTS=" runtime-nodejs +specs " PUSH="" diff --git a/runtime-nodejs/example-project/Dockerfile b/runtime-nodejs/example-project/Dockerfile index 2b6eaaa..11d27ae 100644 --- a/runtime-nodejs/example-project/Dockerfile +++ b/runtime-nodejs/example-project/Dockerfile @@ -2,7 +2,7 @@ FROM yolean/assert-runtime-nodejs:d3630d89f1babc4a17f95e89a249030b8b501043@sha25 WORKDIR /usr/src/specs -COPY --chown=nonroot:nogroup package*.json . +COPY --chown=nonroot:nogroup package*.json ./ RUN npm ci --ignore-scripts diff --git a/specs/Dockerfile b/specs/Dockerfile index 2b6eaaa..11d27ae 100644 --- a/specs/Dockerfile +++ b/specs/Dockerfile @@ -2,7 +2,7 @@ FROM yolean/assert-runtime-nodejs:d3630d89f1babc4a17f95e89a249030b8b501043@sha25 WORKDIR /usr/src/specs -COPY --chown=nonroot:nogroup package*.json . +COPY --chown=nonroot:nogroup package*.json ./ RUN npm ci --ignore-scripts From 1bc4ad69b81f5caee5e89930616d257238eab0d2 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Fri, 5 Jun 2020 06:21:13 +0200 Subject: [PATCH 56/57] These props generated by npm init are actually not required --- specs/package.json | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/specs/package.json b/specs/package.json index f36f91c..f2932e0 100644 --- a/specs/package.json +++ b/specs/package.json @@ -1,11 +1,4 @@ { "name": "@yolean/kubernetes-assert-specs", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC" + "version": "1.0.0" } From b2b9ac24eefd2446308212d1983bafe1f0856979 Mon Sep 17 00:00:00 2001 From: Staffan Olsson Date: Fri, 5 Jun 2020 06:22:09 +0200 Subject: [PATCH 57/57] These props generated by npm init are actually not required --- runtime-nodejs/example-project/package.json | 7 ------- 1 file changed, 7 deletions(-) diff --git a/runtime-nodejs/example-project/package.json b/runtime-nodejs/example-project/package.json index 2f74354..3065237 100644 --- a/runtime-nodejs/example-project/package.json +++ b/runtime-nodejs/example-project/package.json @@ -1,13 +1,6 @@ { "name": "@yolean/assert-runtime-nodejs-example-project", "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", "dependencies": { "@fidm/x509": "1.2.1" }