diff --git a/README.md b/README.md index 86e55f3..9924851 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,31 @@ In local machine: 35.202.107.80 argo.server ``` -**Install org0 and org1** +### 1. Prepare secrets file +Credentials, secrets, and passwords are re-located to `secrets.*.yaml`, in corresponding Helm chart directories. For example, +see `orgadmin/secrets.admin1-example.yaml`, `tlsca_caadmin` must be a base64 encoded value, and created as k8s Secret resource. + +```shell script +# encode ==> dGxzY2ExLWFkbWluCg== +echo -n 'tlsca1-admin' | base64 + +# decode => tlsca1-admin +echo -n 'dGxzY2ExLWFkbWluCg==' | base64 -d +``` + +`orgadmin/secrets.admin1-example.yaml` is an encoded yaml. You copy its file content into `orgadmin/secrets.admin1.yaml`; +and then run below command to perform sops encryption. `-i` means in-place replacement; the previous unencrypted/encoded +yaml will be replaced. Repeat the same steps for every `secrets.*.yaml`. The yaml property ending with "_unencrypted" will skip encryption. + +```shell script +# encrypt +sops -e -i orgadmin/secrets.admin1.yaml + +# decrypt +sops -d orgadmin/secrets.admin1.yaml +``` + +### 2. Install fabric-network - org0 and org1 The run may take 30+ minutes. In addition to CLI, you may also use GKE dashboard, *argocd* and *argo* web UI to monitor the live status. @@ -131,7 +155,47 @@ cd scripts # Bootstrap Org0 and Org1 ./bootstrap.org1.sh +``` +The successful deployment should show: + +```text +Name: bootstrap-channel-org1 +Namespace: n1 +ServiceAccount: workflow +Status: Succeeded +Conditions: + Completed True +Created: Tue Dec 22 14:11:15 +0800 (5 minutes ago) +Started: Tue Dec 22 14:11:15 +0800 (5 minutes ago) +Finished: Tue Dec 22 14:16:22 +0800 (now) +Duration: 5 minutes 7 seconds +ResourcesDuration: 10m54s*(1 cpu),10m54s*(100Mi memory) + +STEP TEMPLATE DURATION + ✔ bootstrap-channel-org1 main + ├-·-✔ sync-g1 argocd-cli/argocd-app-sync 1m + | └-✔ sync-p0o1 argocd-cli/argocd-app-sync 1m + ├---✔ dl-create-tlscacert download-and-create-secret/main + | ├---✔ retrieve retrieve-tmpl 6s + | ├---✔ delete-secret-tmpl secret-resource/delete-secret-tmpl 1s + | └---✔ create-secret-tmpl secret-resource/create-secret-1key-tmpl 2s + ├---✔ create-channel(0) create-channel/main 11s + ├---✔ join-channel(0) join-channel/main 20s + ├---✔ update-anchor-peer update-anchor-peer/main 18s + ├---✔ package-install-chaincode package-install-chaincode/main 13s + ├---✔ chaincode-id-resource chaincode-id-resource/main + | ├---✔ delete-ccid delete-ccid 2s + | └---✔ create-ccid create-ccid 2s + ├---✔ sync-chaincode argocd-cli/argocd-app-sync 1m + ├---✔ approve-chaincode approve-chaincode/main 11s + ├---✔ commit-chaincode commit-chaincode/main 13s + └---✔ smoke-test(0) smoke-test/main 21s +``` + +### 3. Install fabric-network - org2 + +```shell # Bootstrap Org2 ./bootstrap.orgx.sh org2 ``` @@ -186,44 +250,92 @@ STEP TEMPLATE └---✔ smoke-test smoke-test/main 13s ``` -### Tear-down -```shell script -cd scripts -./uninstall.argo.sh +### 4. Install redis, auth-server, gw-orgX, ui-control - org0 and org1 -./recreate-pvc.sh org1 +**Create tls secret to enable secure istio gateway** -./recreate-pvc.sh org2 +For org1, both *ui-control* and *gw-org* are required to expose to public internet. Here utilizes the secure gateway of +istio (see [istio v1.6 doc](https://istio.io/v1.6/docs/tasks/traffic-management/ingress/secure-ingress/)). As below code, +`https://web.org1.net` is exposed, and requiring the secret `peer0.org1.net-tls`. + +```yaml +# networking/istio-n1.yaml +- port: + number: 443 + name: https + protocol: HTTPS + tls: + mode: SIMPLE + credentialName: "peer0.org1.net-tls" + hosts: + - "web.org1.net" + - "gw.org1.net" ``` -Lastly, remove the 'fabric-cd-dev' storage bucket. +```shell +# delete existing tls cert +kubectl -n istio-system delete secret peer0.org1.net-tls +# retrieve tls cert from org1 +CERT="$(kubectl -n n1 get secret peer0.org1.net-tls -o=jsonpath='{.data.tls\.crt}' | base64 --decode)" +KEY="$(kubectl -n n1 get secret peer0.org1.net-tls -o=jsonpath='{.data.tls\.key}' | base64 --decode)" -### Prepare secrets file -Credentials, secrets, and passwords are re-located to `secrets.*.yaml`, in corresponding Helm chart directories. For example, -see `orgadmin/secrets.admin1-example.yaml`, `tlsca_caadmin` must be a base64 encoded value, and created as k8s Secret resource. +# create tls cert for Istio secure gateway +kubectl -n istio-system create secret generic peer0.org1.net-tls --from-literal=tls.crt="$CERT" --from-literal=tls.key="$KEY" -```shell script -# encode ==> dGxzY2ExLWFkbWluCg== -echo -n 'tlsca1-admin' | base64 +# Debugging step +kubectl logs -n istio-system "$(kubectl get pod -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].metadata.name}')" +# should return +# 2020-12-22T08:23:04.850277Z info Channel Connectivity change to READY +# 2020-12-22T08:45:28.961386Z info sds resource:peer0.org1.net-tls pushed key/cert pair to proxy +# 2020-12-22T08:45:28.961426Z info sds Dynamic push for secret peer0.org1.net-tls +``` +**Synchronize apps** -# decode => tlsca1-admin -echo -n 'dGxzY2ExLWFkbWluCg==' | base64 -d +```shell +argo submit -n n1 workflow/aoa-sync-re-au-gw-ui.n1.yaml --watch --request-timeout 900s ``` -`orgadmin/secrets.admin1-example.yaml` is an encoded yaml. You copy its file content into `orgadmin/secrets.admin1.yaml`; -and then run below command to perform sops encryption. `-i` means in-place replacement; the previous unencrypted/encoded -yaml will be replaced. Repeat the same steps for every `secrets.*.yaml`. The yaml property ending with "_unencrypted" will skip encryption. +It should return: +```text +Name: aoa-sync-gw-org1 +Namespace: n1 +ServiceAccount: workflow +Status: Succeeded +Conditions: + Completed True +Created: Tue Dec 22 14:39:24 +0800 (8 minutes ago) +Started: Tue Dec 22 14:39:24 +0800 (8 minutes ago) +Finished: Tue Dec 22 14:48:03 +0800 (now) +Duration: 8 minutes 39 seconds +ResourcesDuration: 16m57s*(1 cpu),16m57s*(100Mi memory) + +STEP TEMPLATE PODNAME DURATION MESSAGE + ✔ aoa-sync-gw-org1 main + ├---✔ sync-redis1 argocd-cli/argocd-app-sync aoa-sync-gw-org1-3775298967 1m + ├---✔ sync-auth1 argocd-cli/argocd-app-sync aoa-sync-gw-org1-3067430853 1m + ├---✔ sync-gw-org1 argocd-cli/argocd-app-sync aoa-sync-gw-org1-1951236881 3m + └---✔ sync-ui-org1 argocd-cli/argocd-app-sync aoa-sync-gw-org1-2916683662 2m +``` + + +### Tear-down ```shell script -# encrypt -sops -e -i orgadmin/secrets.admin1.yaml +cd scripts -# decrypt -sops -d orgadmin/secrets.admin1.yaml +./uninstall.argo.sh + +./recreate-pvc.sh org1 + +./recreate-pvc.sh org2 ``` +Lastly, remove the 'fabric-cd-dev' storage bucket. + + + ### For gitOps Contributors Please see [DEVELOPMENT](https://github.com/rtang03/fabric-cd/doc/DEVELOPMENT.md) diff --git a/auth-server/README.md b/app-of-app/README.md similarity index 100% rename from auth-server/README.md rename to app-of-app/README.md diff --git a/app-of-app/values-org1.yaml b/app-of-app/values-org1.yaml index b2664b1..7c4af9b 100644 --- a/app-of-app/values-org1.yaml +++ b/app-of-app/values-org1.yaml @@ -31,4 +31,12 @@ apps: file: values-org1.yaml - path: auth-server rel: auth-server1 + secret: secrets.org1.yaml + file: values-org1.yaml + - path: gw-org + rel: gw-org1 + secret: secrets.org1.yaml + file: values-org1.yaml + - path: ui-control + rel: ui-org1 file: values-org1.yaml diff --git a/app-of-app/values-org2.yaml b/app-of-app/values-org2.yaml index 45398dc..33ed7bc 100644 --- a/app-of-app/values-org2.yaml +++ b/app-of-app/values-org2.yaml @@ -29,3 +29,11 @@ apps: - path: redis rel: redis2 file: values-org2.yaml + - path: auth-server + rel: auth-server2 + secret: secrets.org2.yaml + file: values-org2.yaml + - path: gw-org + rel: gw-org2 + secret: secrets.org2.yaml + file: values-org2.yaml diff --git a/app-of-app/values-redis.yaml b/app-of-app/values-redis.yaml deleted file mode 100644 index 1595f15..0000000 --- a/app-of-app/values-redis.yaml +++ /dev/null @@ -1,10 +0,0 @@ -project: my-project -target: dev-0.2 -ns: n1 -server: https://kubernetes.default.svc -repoURL: git@github.com:rtang03/fabric-cd.git - -apps: - - path: redis - rel: redis1 - file: values-org1.yaml diff --git a/gupload/README.md b/argo-app/README.md similarity index 100% rename from gupload/README.md rename to argo-app/README.md diff --git a/argo-wf/durability-test.yaml b/argo-wf/durability-test.yaml new file mode 100755 index 0000000..5fa38d8 --- /dev/null +++ b/argo-wf/durability-test.yaml @@ -0,0 +1,19 @@ +{{- if .Values.durability.enabled }} +apiVersion: argoproj.io/v1alpha1 +kind: WorkflowTemplate +metadata: + name: durability-test +spec: + # should use very long active time + # activeDeadlineSeconds: 300 + ttlStrategy: + secondsAfterCompletion: 3600 + secondsAfterSuccess: 3600 + secondsAfterFailure: 3600 + serviceAccountName: workflow + entrypoint: main + + templates: + - name: main +{{ toYaml .Values.no_istio | indent 6 }} +{{- end }} diff --git a/argo-wf/templates/argocd-cli.yaml b/argo-wf/templates/argocd-cli.yaml index b5541e3..3e6993a 100644 --- a/argo-wf/templates/argocd-cli.yaml +++ b/argo-wf/templates/argocd-cli.yaml @@ -3,7 +3,7 @@ kind: WorkflowTemplate metadata: name: argocd-cli spec: - activeDeadlineSeconds: 300 + activeDeadlineSeconds: 900 ttlStrategy: secondsAfterCompletion: 3600 # Time to live after workflow is completed, replaces ttlSecondsAfterFinished secondsAfterSuccess: 3600 # Time to live after workflow is successful @@ -70,6 +70,7 @@ spec: exit $res fi set -x + argocd account get --server "${ARGOCD_SERVER}:80" --grpc-web --plaintext argocd app sync {{ .Values.alias.input_app | quote }} --server "${ARGOCD_SERVER}:80" --grpc-web --plaintext res=$? set +x @@ -78,7 +79,7 @@ spec: exit $res fi set -x - argocd app wait {{ .Values.alias.input_app | quote }} --server "${ARGOCD_SERVER}:80" --grpc-web --plaintext --timeout 300 + argocd app wait {{ .Values.alias.input_app | quote }} --server "${ARGOCD_SERVER}:80" --grpc-web --plaintext --timeout 600 res=$? set +x if [ $res -ne 0 ]; then diff --git a/argo-wf/templates/create-channel.yaml b/argo-wf/templates/create-channel.yaml index fd1badc..2d1f8e4 100644 --- a/argo-wf/templates/create-channel.yaml +++ b/argo-wf/templates/create-channel.yaml @@ -15,6 +15,12 @@ spec: templates: - name: main {{ toYaml .Values.no_istio | indent 6 }} + retryStrategy: + limit: 2 + backoff: + duration: "1m" + factor: 2 + maxDuration: "1m" inputs: parameters: - name: channelname @@ -52,6 +58,16 @@ spec: secret: secretName: {{ .secretName }} {{- end }} + initContainers: + - name: wait-for-orderer + image: jwilder/dockerize + imagePullPolicy: IfNotPresent + command: ["sh", "-c"] + args: + - |- + ORDERER_URL={{ .Values.ordererUrl }} + set -x + dockerize -wait tcp://$ORDERER_URL -timeout 60s && echo "$ORDERER_URL is ready" container: image: library/alpine:3.12.0 command: ["sh", "-c"] diff --git a/argo-wf/templates/join-channel.yaml b/argo-wf/templates/join-channel.yaml index 5725dab..54ebafa 100644 --- a/argo-wf/templates/join-channel.yaml +++ b/argo-wf/templates/join-channel.yaml @@ -15,6 +15,12 @@ spec: templates: - name: main {{ toYaml .Values.no_istio | indent 6 }} + retryStrategy: + limit: 2 + backoff: + duration: "1m" + factor: 2 + maxDuration: "1m" inputs: parameters: - name: channelname @@ -49,6 +55,7 @@ spec: workingDir: /var/hyperledger args: - |- + sleep 10s CHANNEL_NAME={{ .Values.alias.input_channelname | quote }} FABRIC_CFG_PATH=/etc/hyperledger CORE_PEER_TLS_ROOTCERT_FILE={{ .Values.joinChannel.corePeerTlsRootCert }} diff --git a/argo-wf/templates/smoke-test.yaml b/argo-wf/templates/smoke-test.yaml index 44d108b..66f102a 100644 --- a/argo-wf/templates/smoke-test.yaml +++ b/argo-wf/templates/smoke-test.yaml @@ -4,7 +4,7 @@ kind: WorkflowTemplate metadata: name: smoke-test spec: - activeDeadlineSeconds: 300 + activeDeadlineSeconds: 600 ttlStrategy: secondsAfterCompletion: 3600 secondsAfterSuccess: 3600 @@ -15,6 +15,12 @@ spec: templates: - name: main {{ toYaml .Values.no_istio | indent 6 }} + retryStrategy: + limit: 2 + backoff: + duration: "1m" + factor: 2 + maxDuration: "1m" inputs: parameters: - name: channelname @@ -50,6 +56,7 @@ spec: workingDir: /var/hyperledger args: - |- + sleep 10s CHANNEL_NAME={{ .Values.alias.input_channelname | quote }} ORDERER_URL={{ .Values.ordererUrl }} FABRIC_CFG_PATH=/etc/hyperledger diff --git a/argo/README.md b/argo/README.md new file mode 100644 index 0000000..e69de29 diff --git a/argo/values-argo.yaml b/argo/values-argo.yaml index cccff81..da1e67e 100644 --- a/argo/values-argo.yaml +++ b/argo/values-argo.yaml @@ -209,11 +209,15 @@ server: # PriorityClass: system-cluster-critical priorityClassName: "" + # Run the argo server in "secure" mode. Configure this value instead of + # "--secure" in extraArgs. See the following documentation for more details + # on secure mode: + # https://argoproj.github.io/argo/tls/#encrypted + secure: false + # Extra arguments to provide to the Argo server binary. extraArgs: - --auth-mode=client - # turn on tls -# - --secure ## Additional volumes to the server main container. volumeMounts: [] diff --git a/auth-server/.sops.yaml b/auth-server/.sops.yaml new file mode 100644 index 0000000..a36e47a --- /dev/null +++ b/auth-server/.sops.yaml @@ -0,0 +1,2 @@ +creation_rules: + - gcp_kms: projects/fdi-cd/locations/us-central1/keyRings/fdi/cryptoKeys/sops-key diff --git a/auth-server/Chart.yaml b/auth-server/Chart.yaml index dd8a14c..bb2168a 100644 --- a/auth-server/Chart.yaml +++ b/auth-server/Chart.yaml @@ -1,6 +1,6 @@ apiVersion: v2 # appVersion = RELEASE TARGET -appVersion: 0.7.0 +appVersion: 0.7.1 description: chart for auth-server name: auth-server sources: diff --git a/auth-server/sec.org1.example.yaml b/auth-server/sec.org1.example.yaml new file mode 100644 index 0000000..458b3ca --- /dev/null +++ b/auth-server/sec.org1.example.yaml @@ -0,0 +1,11 @@ +jwtSecret: c2VjcmV0 +rootClientApp: + clientSecret: c2VjcmV0 +# orgAdmin credentials +orgAdmin: + orgadmin: YWRtaW4tcGVlcjAub3JnMS5uZXQ= + orgadminpw: YWRtaW4tcGVlcjAub3JnMS5uZXRQVw== +# postgres connection +externalDatabase: + username: cG9zdGdyZXM= + password: cGFzc3dvcmQ= diff --git a/auth-server/sec.org2.example.yaml b/auth-server/sec.org2.example.yaml new file mode 100644 index 0000000..357f521 --- /dev/null +++ b/auth-server/sec.org2.example.yaml @@ -0,0 +1,11 @@ +jwtSecret: c2VjcmV0 +rootClientApp: + clientSecret: c2VjcmV0 +# orgAdmin credentials +orgAdmin: + orgadmin: YWRtaW4tcGVlcjAub3JnMi5uZXQ= + orgadminpw: YWRtaW4tcGVlcjAub3JnMS5uZXRQVw== +# postgres connection +externalDatabase: + username: cG9zdGdyZXM= + password: cGFzc3dvcmQ= diff --git a/auth-server/secrets.org1.yaml b/auth-server/secrets.org1.yaml new file mode 100644 index 0000000..3d98bdf --- /dev/null +++ b/auth-server/secrets.org1.yaml @@ -0,0 +1,22 @@ +jwtSecret: ENC[AES256_GCM,data:39OWaG83K1g=,iv:+LXKTejeUQWQ7y2FTYwiBAGgmPykZnlh+4sSJ41IKpE=,tag:jF38RFiVFyf0QjU6WEHYkw==,type:str] +rootClientApp: + clientSecret: ENC[AES256_GCM,data:/1mFfRCtdfk=,iv:nX+YzDdvxOQFlC7dPBATRLSyXfkJhq8HEuCoICWvqUg=,tag:cCQQUt6AwPVPhRyh+YDd6Q==,type:str] +orgAdmin: + orgadmin: ENC[AES256_GCM,data:Crb/BgMWZ+ZEWfEJPVA0dsdU04qk1euaE1TnxA==,iv:6tyd6QPS+VhFHpyJJhvv57T52fJEQ4GwwAxipi7RjTw=,tag:zX/dyStx6H44TmLq6APVlQ==,type:str] + orgadminpw: ENC[AES256_GCM,data:ZMNf7fIkF27+qcim44dNU/Do8iw3GTf7+Vy6XjILXsE=,iv:T6uQD5m2fHQqggSDnExPiZR6dlx1SPbZfcWyUSp0dO8=,tag:xTdO80zPB4uqn8rzpTjc5g==,type:str] +externalDatabase: + username: ENC[AES256_GCM,data:TnxoFTmro7O8B0px,iv:0jHReXpmHBwkL+D3BVEzBCKGNXxVrHd1zhiTSma3jx0=,tag:o3iLgkTB0vmwpFqOvacTrw==,type:str] + password: ENC[AES256_GCM,data:PSp8rkESBZGOXhtp,iv:PhKhiDr+3VKvYT9OTnWG/zM4ildhIkl5eTTteTP3s50=,tag:BKRB3hjUYGwvjXUmSbwbwA==,type:str] +sops: + kms: [] + gcp_kms: + - resource_id: projects/fdi-cd/locations/us-central1/keyRings/fdi/cryptoKeys/sops-key + created_at: '2020-12-13T14:58:10Z' + enc: CiQAkTrCxyuMzopMla8+Hk61AzMya6uRz0ikenmytYDjs4W0TA8SSQCRJBjuUGqVn6ViaGLmJc0drYVHj2eqsipxPzXg5Sqf8Mh51Ic88FRLszDbdhGSD06eh5HVFCDUP7NpaNRZohiX1GeUU8IMpvA= + azure_kv: [] + hc_vault: [] + lastmodified: '2020-12-13T14:58:12Z' + mac: ENC[AES256_GCM,data:xAduWQZJC6U9xl45ysO7mmtnOwlcd270v+5ARR/0b7/Z7Ehll1DTFkEAoih4aIYTUehhddk+L4qJMDEzs69RukPAfDnTXp6N+xO06Z4nYO0fS9PzKxQy9diqXbIqlxfaYJqeeqjbEz5ENa1MwZj/2KKvax3Lk6APrUrkUxpl2rs=,iv:mgZJKVYdu5epTE8fVACZ7etPoEApkMR3o3+cXVd5Alk=,tag:ZFdi/3w7/W7xhFkn3lawHA==,type:str] + pgp: [] + unencrypted_suffix: _unencrypted + version: 3.6.1 diff --git a/auth-server/secrets.org2.yaml b/auth-server/secrets.org2.yaml new file mode 100644 index 0000000..f6b4f14 --- /dev/null +++ b/auth-server/secrets.org2.yaml @@ -0,0 +1,22 @@ +jwtSecret: ENC[AES256_GCM,data:7BVRiuTWzXU=,iv:eVzNeoyv5Vz+YXExl8BrW3x8XIReY/o0X3bmOhlCWaw=,tag:pv1HtuTU3cpJCrnsMhxGWw==,type:str] +rootClientApp: + clientSecret: ENC[AES256_GCM,data:Bh0IAPfKW80=,iv:2IBE/9wfytnaL8xqrsIJadKfwt/bBEZSaIBdENtV7YE=,tag:0QPncRWwbbTmWGH9Qu/ctA==,type:str] +orgAdmin: + orgadmin: ENC[AES256_GCM,data:2r/PTrSDBwpzMZp/oAWDr5unM69rXXX5k4JBYQ==,iv:lfNpZDPRylB1wQhB7T9hJjG7L5G63UVeS/qHbST3gOs=,tag:ZxZoGzb5kR2/PE4g73WR3g==,type:str] + orgadminpw: ENC[AES256_GCM,data:oW4jnTDsoMiabKx+S/GpaUwCyc7p/NJPxzjoH/ELaos=,iv:nTBTfIW+QIBNd+YZOjQKyNF+FbtSlFgNNECHVVi2Inw=,tag:nPZa4Cyk130TdiCeHv0ZFA==,type:str] +externalDatabase: + username: ENC[AES256_GCM,data:opccI31tHbMo0IeR,iv:3AQaBZx2c/fevu2zKSkBVkxxyli0gUnYdiQ/Y+YjJoQ=,tag:pfg+lwRzYByZmQPKWVIfzw==,type:str] + password: ENC[AES256_GCM,data:iQI5DFL/Mk0/dDKt,iv:t5Db0qn89jp+lXlGXvJERghankpk74G2FfbGziXvfoo=,tag:fHJO6bEJSrQW+F8XIwUNoA==,type:str] +sops: + kms: [] + gcp_kms: + - resource_id: projects/fdi-cd/locations/us-central1/keyRings/fdi/cryptoKeys/sops-key + created_at: '2020-12-13T14:58:26Z' + enc: CiQAkTrCx8yv5VUetDkMCEQ1npnNhWVITKdxWgvqOXmTKhGw0Y0SSACRJBju4xrKRwhOq4M733HtrftnbIQsp+qnrEMp4AFR4+pc0ceRs915opJyy2I8e4GDcQ1M7T6yPRIF/W1HY3O1wtSgvy1CFg== + azure_kv: [] + hc_vault: [] + lastmodified: '2020-12-13T14:58:28Z' + mac: ENC[AES256_GCM,data:eD+c3Ru1Iscm084FEoDfuhj1rHQGaZ2/SacPoBRsJp5LJpxr1OikcQNu2/vKHqxU1bPxX1Wk2TZmC56XJRZsncBIeHp4oYz5eVkfxkW7fzj8//LkdWINK33SKvh28YdbyIhRSr7EQnMKwJAOH+1giajS01zvkmbb8iQF+fliohU=,iv:LhQcXqZVa6VSne0X9qqqV5rJWlI1ThXpqBq789jnXeU=,tag:OlQTQz4yvWc5cDzbBy/Xlg==,type:str] + pgp: [] + unencrypted_suffix: _unencrypted + version: 3.6.1 diff --git a/auth-server/templates/configmap.yaml b/auth-server/templates/configmap.yaml index c0b0190..6e8d9fb 100644 --- a/auth-server/templates/configmap.yaml +++ b/auth-server/templates/configmap.yaml @@ -6,21 +6,15 @@ metadata: {{- include "labels.standard" . | nindent 4 }} data: CLIENT_APPLICATION_NAME: "root_client" - CLIENT_SECRET: "password" JWT_EXP_IN_SECOND: {{ .Values.config.jwtExpInSecond | quote }} - JWT_SECRET: "secret" LOG_LEVEL: {{ .Values.global.logging | quote }} LOG_TARGET: "console" - ORG_ADMIN_EMAIL: "admin@org1.net" - ORG_ADMIN_ID: "admin-org1.net" - ORG_ADMIN_SECRET: "admin-org1.netPW" + ORG_ADMIN_EMAIL: {{ .Values.config.orgadminEmail | quote }} PORT: {{ .Values.config.port | quote }} REDIS_HOST: {{ .Values.config.redisHost | quote }} REDIS_PORT: {{ .Values.config.redisPort | quote }} REFRESH_TOKEN_EXP_IN_SEC: {{ .Values.config.refreshTokenExpInSec | quote }} TYPEORM_DATABASE: "auth_db" TYPEORM_HOST: {{ .Values.config.postgresHost | quote }} - TYPEORM_PASSWORD: "password" TYPEORM_PORT: {{ .Values.config.postgresPort | quote }} - TYPEORM_USERNAME: "postgres" TZ: {{ .Values.global.TZ | quote }} diff --git a/auth-server/templates/deployment.yaml b/auth-server/templates/deployment.yaml index a385f90..2d679c7 100644 --- a/auth-server/templates/deployment.yaml +++ b/auth-server/templates/deployment.yaml @@ -10,17 +10,75 @@ spec: matchLabels: app: {{ include "auth-server.name" . }} release: {{ .Release.Name }} + strategy: + rollingUpdate: + maxUnavailable: 1 template: metadata: + annotations: + sidecar.istio.io/proxyCPU: "10m" + sidecar.istio.io/proxyCPULimit: "50m" + sidecar.istio.io/rewriteAppHTTPProbers: "false" + # trace|debug|info|warning|error|critical|off + sidecar.istio.io/logLevel: "info" labels: {{ include "labels.standard" . | indent 8 }} spec: + initContainers: + - name: wait-for-db + image: jwilder/dockerize + imagePullPolicy: IfNotPresent + envFrom: + - configMapRef: + name: {{ include "auth-server.fullname" . }} + command: ["sh", "-c"] + args: + - |- + sleep 10s + set -x + dockerize -wait tcp://$REDIS_HOST:$REDIS_PORT -timeout 60s && echo "Redis $REDIS_HOST:$REDIS_PORT is ready" + dockerize -wait tcp://$TYPEORM_HOST:$TYPEORM_PORT -timeout 60s && echo "Psql $TYPEORM_HOST:$TYPEORM_PORT is ready" containers: - name: main image: {{ .Values.image.repository }}:{{ .Values.image.tag }} ports: - containerPort: 8080 protocol: TCP + name: http envFrom: - configMapRef: name: {{ include "auth-server.fullname" . }} + - secretRef: + name: {{ include "auth-server.fullname" . }} + livenessProbe: + successThreshold: 1 + failureThreshold: 3 + httpGet: + scheme: HTTP + path: /healthcheck + port: 8080 + initialDelaySeconds: 20 + periodSeconds: 10 + readinessProbe: + successThreshold: 1 + failureThreshold: 3 + httpGet: + scheme: HTTP + path: /healthcheck + port: 8080 + initialDelaySeconds: 20 + periodSeconds: 10 + resources: +{{ toYaml .Values.resources | indent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/auth-server/templates/sec.yaml b/auth-server/templates/sec.yaml new file mode 100644 index 0000000..4960c3e --- /dev/null +++ b/auth-server/templates/sec.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "auth-server.fullname" . }} + labels: +{{- include "labels.standard" . | nindent 4 }} +type: Opaque +data: + JWT_SECRET: {{ $.Values.jwtSecret }} + CLIENT_SECRET: {{ $.Values.rootClientApp.clientSecret }} + ORG_ADMIN_ID: {{ $.Values.orgAdmin.orgadmin }} + ORG_ADMIN_SECRET: {{ $.Values.orgAdmin.orgadminpw }} + TYPEORM_USERNAME: {{ $.Values.externalDatabase.username }} + TYPEORM_PASSWORD: {{ $.Values.externalDatabase.password }} diff --git a/auth-server/templates/virtual-service.yaml b/auth-server/templates/virtual-service.yaml index ac7bd5f..25037dd 100644 --- a/auth-server/templates/virtual-service.yaml +++ b/auth-server/templates/virtual-service.yaml @@ -1,9 +1,10 @@ - apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: {{ include "auth-server.fullname" . }} namespace: {{ .Release.Namespace }} + labels: +{{ include "labels.standard" . | indent 4 }} spec: hosts: - {{ include "auth-server.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local diff --git a/auth-server/values-org1.yaml b/auth-server/values-org1.yaml index fe62c22..06b8429 100644 --- a/auth-server/values-org1.yaml +++ b/auth-server/values-org1.yaml @@ -9,6 +9,7 @@ image: pullPolicy: IfNotPresent config: + orgadminEmail: admin@org1.net jwtExpInSecond: 3600 redisHost: redis1 redisPort: 6379 diff --git a/auth-server/values-org2.yaml b/auth-server/values-org2.yaml index e69de29..f4c22d1 100644 --- a/auth-server/values-org2.yaml +++ b/auth-server/values-org2.yaml @@ -0,0 +1,19 @@ +global: + TZ: Asia/Hong_Kong + mspId: Org2MSP + logging: info + +image: + repository: ghcr.io/rtang03/auth-server + tag: 0.7.1 + pullPolicy: IfNotPresent + +config: + orgadminEmail: admin@org2.net + jwtExpInSecond: 3600 + redisHost: redis2 + redisPort: 6379 + refreshTokenExpInSec: 86400 + port: 8080 + postgresHost: admin2-postgresql-0 + postgresPort: 5432 diff --git a/auth-server/values.yaml b/auth-server/values.yaml index fe62c22..7c3146f 100644 --- a/auth-server/values.yaml +++ b/auth-server/values.yaml @@ -9,6 +9,7 @@ image: pullPolicy: IfNotPresent config: + orgadminEmail: admin@org1.net jwtExpInSecond: 3600 redisHost: redis1 redisPort: 6379 @@ -16,3 +17,17 @@ config: port: 8080 postgresHost: admin1-postgresql-0 postgresPort: 5432 + +resources: + limits: + cpu: 200m + memory: 256Mi + requests: + cpu: 50m + memory: 128Mi + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/chaincode/fabric-es/.dockerignore b/chaincode/fabric-es/.dockerignore deleted file mode 100644 index c2658d7..0000000 --- a/chaincode/fabric-es/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ diff --git a/chaincode/fabric-es/.gitignore b/chaincode/fabric-es/.gitignore deleted file mode 100644 index c2658d7..0000000 --- a/chaincode/fabric-es/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ diff --git a/chaincode/fabric-es/Dockerfile b/chaincode/fabric-es/Dockerfile deleted file mode 100644 index c5470e3..0000000 --- a/chaincode/fabric-es/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM node:12.16.0-alpine - -LABEL org.opencontainers.image.source https://github.com/rtang03/fabric-cd - -ENV TIME_ZONE=Asia/Hong_Kong \ - ENV_NAME=production \ - NODE_ENV=production \ - NODE_CONFIG_ENV=production - -RUN mkdir /home/app/ \ - && chown -R node:node /home/app/ - -COPY --chown=node:node . /home/app/ - -RUN apk add --no-cache --virtual .build-deps tzdata \ - && cp /usr/share/zoneinfo/Asia/Hong_Kong /etc/localtime \ - && echo "Asia/Hong_Kong" > /etc/timezone \ - && cd /home/app \ - && npm install --production \ - && apk del .build-deps - -USER node - -WORKDIR /home/app/ - -CMD ["npm", "start"] diff --git a/chaincode/fabric-es/README.md b/chaincode/fabric-es/README.md deleted file mode 100644 index 3027a36..0000000 --- a/chaincode/fabric-es/README.md +++ /dev/null @@ -1,2 +0,0 @@ -### Fabric-es -Launch wth External Chaincode diff --git a/chaincode/fabric-es/dist/__tests__/__utils__/index.js b/chaincode/fabric-es/dist/__tests__/__utils__/index.js deleted file mode 100644 index 7ceda92..0000000 --- a/chaincode/fabric-es/dist/__tests__/__utils__/index.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("./utils"), exports); diff --git a/chaincode/fabric-es/dist/__tests__/__utils__/utils.js b/chaincode/fabric-es/dist/__tests__/__utils__/utils.js deleted file mode 100644 index 31ff747..0000000 --- a/chaincode/fabric-es/dist/__tests__/__utils__/utils.js +++ /dev/null @@ -1,5 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.toString = exports.parseResult = void 0; -exports.parseResult = input => JSON.parse(Buffer.from(JSON.parse(input)).toString()); -exports.toString = input => JSON.stringify(input).replace(/"/g, '\\"'); diff --git a/chaincode/fabric-es/dist/__tests__/lifecycle.unit.test.js b/chaincode/fabric-es/dist/__tests__/lifecycle.unit.test.js deleted file mode 100644 index af6800a..0000000 --- a/chaincode/fabric-es/dist/__tests__/lifecycle.unit.test.js +++ /dev/null @@ -1,184 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const __1 = require(".."); -const ledger_api_1 = require("../ledger-api"); -const ctx = { - stub: { - createCompositeKey: jest.fn(), - deleteState: jest.fn(), - getState: jest.fn(), - putState: jest.fn(), - setEvent: jest.fn(), - getStateByPartialCompositeKey: jest.fn(), - getCreator: jest.fn() - }, - clientIdentity: { getID: jest.fn() } -}; -const context = { - stateList: new ledger_api_1.StateList(ctx, 'entities'), - ...ctx -}; -const cc = new __1.EventStore(context); -describe('Create commit with normal events', () => { - const entityName = 'cc_test'; - const id = 'cc_01'; - const version = '0'; - const events = [{ type: 'mon', payload: { name: 'jun' } }]; - const commitId = '123'; - beforeAll(() => { - ctx.stub.createCompositeKey.mockResolvedValue('entities"en""entId""2019"'); - ctx.stub.putState.mockResolvedValue(Buffer.from('')); - ctx.stub.setEvent.mockImplementation((name, args) => console.log(`Event sent: ${name}: ${args}`)); - ctx.stub.getCreator.mockImplementation(() => { return { 'mspid': 'Org1MSP' }; }); - ctx.clientIdentity.getID.mockImplementation(() => 'Org1MSP'); - const value = JSON.stringify({ - key: '12345', - commitId, committedAt: '2019', version, - entityName, id, entityId: id, events - }); - ctx.stub.getStateByPartialCompositeKey.mockImplementation(() => { - let counter = 1; - return { - [Symbol.asyncIterator]: () => ({ - next: () => { - if (counter > 0) { - counter--; - return Promise.resolve({ value: { value }, done: false }); - } - else - return Promise.resolve({ done: true }); - } - }) - }; - }); - ctx.stub.getState.mockResolvedValue(value); - }); - it('should instantiate', async () => cc.Init(context).then(response => expect(response).toEqual('Init Done'))); - it('should createCommit', async () => cc.createCommit(context, entityName, id, version, JSON.stringify(events), commitId) - .then((response) => JSON.parse(response)[commitId]) - .then(result => expect((result.entityId === id) && (result.entityName === entityName)).toBeTruthy())); -}); -describe('Create commit with lifecycle starting events', () => { - const entityName = 'cc_test'; - const id = 'cc_02'; - const version = '0'; - const events = [{ type: 'mon', lifeCycle: 1, payload: { name: 'jun' } }]; - const commitId = '124'; - beforeAll(() => { - ctx.stub.createCompositeKey.mockResolvedValue('entities"en""entId""2019"'); - ctx.stub.putState.mockResolvedValue(Buffer.from('')); - ctx.stub.setEvent.mockImplementation((name, args) => console.log(`Event sent: ${name}: ${args}`)); - ctx.clientIdentity.getID.mockImplementation(() => 'Org1MSP'); - const value = JSON.stringify({ - key: '12346', - commitId, committedAt: '2019', version, - entityName, id, entityId: id, events - }); - ctx.stub.getStateByPartialCompositeKey.mockImplementation(() => { - let counter = 1; - return { - [Symbol.asyncIterator]: () => ({ - next: () => { - if (counter > 0) { - counter--; - return Promise.resolve({ value: { value }, done: false }); - } - else - return Promise.resolve({ done: true }); - } - }) - }; - }); - ctx.stub.getState.mockResolvedValue(value); - }); - it('should instantiate', async () => cc.Init(context).then(response => expect(response).toEqual('Init Done'))); - it('should reject create', async () => { - expect.assertions(1); - return cc.createCommit(context, entityName, id, version, JSON.stringify(events), commitId) - .catch((error) => expect(error.message).toBe(`Lifecycle of ${id} already started`)); - }); -}); -describe('Create commit with lifecycle ending events', () => { - const entityName = 'cc_test'; - const id = 'cc_03'; - const version = '0'; - const events = [{ type: 'mon', lifeCycle: 2, payload: { name: 'jun' } }]; - const commitId = '125'; - beforeAll(() => { - ctx.stub.createCompositeKey.mockResolvedValue('entities"en""entId""2019"'); - ctx.stub.putState.mockResolvedValue(Buffer.from('')); - ctx.stub.setEvent.mockImplementation((name, args) => console.log(`Event sent: ${name}: ${args}`)); - ctx.clientIdentity.getID.mockImplementation(() => 'Org1MSP'); - const value = JSON.stringify({ - key: '12347', - commitId, committedAt: '2019', version, - entityName, id, entityId: id, events - }); - ctx.stub.getStateByPartialCompositeKey.mockImplementation(() => { - let counter = 1; - return { - [Symbol.asyncIterator]: () => ({ - next: () => { - if (counter > 0) { - counter--; - return Promise.resolve({ value: { value }, done: false }); - } - else - return Promise.resolve({ done: true }); - } - }) - }; - }); - ctx.stub.getState.mockResolvedValue(value); - }); - it('should instantiate', async () => cc.Init(context).then(response => expect(response).toEqual('Init Done'))); - it('should reject create', async () => { - expect.assertions(1); - return cc.createCommit(context, entityName, id, version, JSON.stringify(events), commitId) - .catch((error) => expect(error.message).toBe(`Lifecycle of ${id} already ended`)); - }); -}); -describe('Create commit with lifecycle starting and ending events', () => { - const entityName = 'cc_test'; - const id = 'cc_04'; - const version = '0'; - const events = [ - { type: 'mon', lifeCycle: 1, payload: { name: 'jan' } }, - { type: 'yer', lifeCycle: 2, payload: { name: 'dec' } } - ]; - const commitId = '126'; - beforeAll(() => { - ctx.stub.createCompositeKey.mockResolvedValue('entities"en""entId""2019"'); - ctx.stub.putState.mockResolvedValue(Buffer.from('')); - ctx.stub.setEvent.mockImplementation((name, args) => console.log(`Event sent: ${name}: ${args}`)); - ctx.clientIdentity.getID.mockImplementation(() => 'Org1MSP'); - }); - it('should instantiate', async () => cc.Init(context).then(response => expect(response).toEqual('Init Done'))); - it('should create commit', async () => { - expect.assertions(1); - return cc.createCommit(context, entityName, id, version, JSON.stringify(events), commitId) - .catch((error) => expect(error.message).toBe(`Lifecycle of ${id} not started yet`)); - }); -}); -describe('Create commit with lifecycle ending then starting events', () => { - const entityName = 'cc_test'; - const id = 'cc_05'; - const version = '0'; - const events = [ - { type: 'mon', lifeCycle: 2, payload: { name: 'jan' } }, - { type: 'yer', lifeCycle: 1, payload: { name: 'dec' } } - ]; - const commitId = '127'; - beforeAll(() => { - ctx.stub.createCompositeKey.mockResolvedValue('entities"en""entId""2019"'); - ctx.stub.putState.mockResolvedValue(Buffer.from('')); - ctx.stub.setEvent.mockImplementation((name, args) => console.log(`Event sent: ${name}: ${args}`)); - ctx.clientIdentity.getID.mockImplementation(() => 'Org1MSP'); - }); - it('should instantiate', async () => cc.Init(context).then(response => expect(response).toEqual('Init Done'))); - it('should create commit', async () => { - expect.assertions(1); - return cc.createCommit(context, entityName, id, version, JSON.stringify(events), commitId) - .catch((error) => expect(error.message).toBe(`Cannot end ${id} before starting`)); - }); -}); diff --git a/chaincode/fabric-es/dist/__tests__/private.network.test.js b/chaincode/fabric-es/dist/__tests__/private.network.test.js deleted file mode 100644 index f2b6543..0000000 --- a/chaincode/fabric-es/dist/__tests__/private.network.test.js +++ /dev/null @@ -1,61 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const child_process_promise_1 = require("child-process-promise"); -const lodash_1 = require("lodash"); -const ledger_api_1 = require("../ledger-api"); -let commitId; -const entityName = 'private_entityName'; -const id = 'id_00001'; -const cli = `export EVENT_STR=$(echo "[{\\\"type\\\":\\\"testtype\\\"}]" | base64 | tr -d \\\\n) && docker exec \ --e CORE_PEER_LOCALMSPID=Org1MSP \ --e CORE_PEER_ADDRESS=peer0-org1:7051 \ --e CORE_PEER_TLS_ROOTCERT_FILE=/var/artifacts/crypto-config/Org1MSP/peer0.org1.net/tls-msp/tlscacerts/tls-0-0-0-0-5052.pem \ --e CORE_PEER_MSPCONFIGPATH=/var/artifacts/crypto-config/Org1MSP/admin/msp `; -const query = `${cli} cli peer chaincode query -C loanapp -n eventstore -c `; -const invoke = `${cli} cli peer chaincode invoke -o orderer0-org0:7050 --waitForEvent --tls -C loanapp -n eventstore --cafile /var/artifacts/crypto-config/Org1MSP/peer0.org1.net/assets/tls-ca/tls-ca-cert.pem -c `; -const cli2 = `docker exec \ --e CORE_PEER_LOCALMSPID=Org2MSP \ --e CORE_PEER_ADDRESS=peer0-org2:7251 \ --e CORE_PEER_TLS_ROOTCERT_FILE=/var/artifacts/crypto-config/Org2MSP/peer0.org2.net/tls-msp/tlscacerts/tls-0-0-0-0-5052.pem \ --e CORE_PEER_MSPCONFIGPATH=/var/artifacts/crypto-config/Org2MSP/admin/msp `; -const query2 = `${cli2} cli peer chaincode query -C loanapp -n eventstore -c `; -const parseResult = input => JSON.parse(Buffer.from(JSON.parse(input)).toString()); -describe('Chaincode private data: Network Test', () => { - it('should createCommit #1', async () => child_process_promise_1.exec(`${invoke} '{"Args":["privatedata:createCommit","${entityName}","${id}","0","${ledger_api_1.createCommitId()}"]}' --transient "{\\\"eventstr\\\":\\\"$EVENT_STR\\\"}"`).then(({ stderr }) => expect(stderr).toContain('result: status:200'))); - it('should createCommit #2', async () => child_process_promise_1.exec(`${invoke} '{"Args":["privatedata:createCommit","${entityName}","${id}","0","${ledger_api_1.createCommitId()}"]}' --transient "{\\\"eventstr\\\":\\\"$EVENT_STR\\\"}"`).then(({ stderr }) => expect(stderr).toContain('result: status:200'))); - it('should queryByEntityId #1', async () => child_process_promise_1.exec(`${query} '{"Args":["privatedata:queryByEntityId","${entityName}","${id}"]}'`) - .then(({ stdout }) => lodash_1.values(parseResult(stdout))[0]) - .then(commit => { - commitId = commit.commitId; - expect(commit.id).toEqual('id_00001'); - })); - it('should queryByEntityName #1', async () => child_process_promise_1.exec(`${query} '{"Args":["privatedata:queryByEntityName","${entityName}"]}'`) - .then(({ stdout }) => lodash_1.values(parseResult(stdout))) - .then(commits => commits.map(commit => lodash_1.pick(commit, 'entityName')).map(result => expect(result).toEqual({ entityName })))); - it('should queryByEntityIdCommitId', async () => child_process_promise_1.exec(`${query} '{"Args":["privatedata:queryByEntityIdCommitId","${entityName}","${id}","${commitId}"]}'`) - .then(({ stdout }) => lodash_1.values(parseResult(stdout))[0]) - .then(commit => expect(commit.commitId).toEqual(commitId))); - it('should fail to queryByEntityIdCommitId by unauthorized peer', async () => child_process_promise_1.exec(`${query2} '{"Args":["privatedata:queryByEntityIdCommitId","${entityName}","${id}","${commitId}"]}'`).catch(({ stderr }) => expect(stderr).toContain('does not have read access permission'))); - it('should deleteByEntityIdCommitId', async () => child_process_promise_1.exec(`${invoke} '{"Args":["privatedata:deleteByEntityIdCommitId","${entityName}","${id}","${commitId}"]}'`).then(({ stderr }) => expect(stderr).toContain('result: status:200'))); - it('should fail to deleteByEntityIdCommitId', async () => child_process_promise_1.exec(`${invoke} '{"Args":["privatedata:deleteByEntityIdCommitId","${entityName}","no such id","${commitId}"]}'`).catch(({ stderr }) => expect(stderr).toContain('commitId does not exist'))); - it('should deleteAll', async () => child_process_promise_1.exec(`${query} '{"Args":["privatedata:queryByEntityId","${entityName}","${id}"]}'`) - .then(({ stdout }) => parseResult(stdout)) - .then(commits => lodash_1.keys(commits)) - .then(async (commitIds) => { - for (const cid of commitIds) { - await child_process_promise_1.exec(`${invoke} '{"Args":["privatedata:deleteByEntityIdCommitId","${entityName}","${id}","${cid}"]}'`).then(({ stderr }) => expect(stderr).toContain('result: status:200')); - } - })); - /** - * This test fails, need to revisit later. - */ - // it('should queryByEntityName #2', async () => - // exec( - // `${query} '{"Args":["privatedata:queryByEntityName","${org1}","${entityName}"]}'` - // ) - // .then(({ stdout }) => parseResult(stdout)) - // .then(commits => expect(commits).toEqual({}))); - it('should fail to queryByEntityIdCommitId', async () => child_process_promise_1.exec(`${query} '{"Args":["privatedata:queryByEntityIdCommitId","${entityName}","${id}","${commitId}"]}'`) - .then(({ stdout }) => parseResult(stdout)) - .then(result => expect(result).toEqual({}))); -}); diff --git a/chaincode/fabric-es/dist/__tests__/public.network.test.js b/chaincode/fabric-es/dist/__tests__/public.network.test.js deleted file mode 100644 index 87a6332..0000000 --- a/chaincode/fabric-es/dist/__tests__/public.network.test.js +++ /dev/null @@ -1,111 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const execa_1 = __importDefault(require("execa")); -const lodash_1 = require("lodash"); -const ledger_api_1 = require("../ledger-api"); -const __utils__1 = require("./__utils__"); -const entityName = 'dev_entity'; -const id = 'ent_dev_1001'; -const eventStr = __utils__1.toString([{ type: 'mon', payload: { name: 'jun' } }]); -const base_args = [ - 'exec', - '-e', - 'CORE_PEER_LOCALMSPID=Org1MSP', - '-e', - 'CORE_PEER_ADDRESS=peer0-org1:7051', - '-e', - 'CORE_PEER_TLS_ROOTCERT_FILE=/var/artifacts/crypto-config/Org1MSP/peer0.org1.net/tls-msp/tlscacerts/tls-0-0-0-0-5052.pem', - '-e', - 'CORE_PEER_MSPCONFIGPATH=/var/artifacts/crypto-config/Org1MSP/admin/msp' -]; -const query_args = ['cli', 'peer', 'chaincode', 'query', '-C', 'loanapp', '-n', 'eventstore', '-c']; -const invoke_args = [ - 'cli', - 'peer', - 'chaincode', - 'invoke', - '-o', - 'orderer0-org0:7050', - '--waitForEvent', - '--tls=true', - '-C', - 'loanapp', - '-n', - 'eventstore', - '--cafile', - '/var/artifacts/crypto-config/Org1MSP/peer0.org1.net/assets/tls-ca/tls-ca-cert.pem', - '--peerAddresses', - 'peer0-org1:7051', - '--peerAddresses', - 'peer0-org2:7251', - '--tlsRootCertFiles', - '/var/artifacts/crypto-config/Org1MSP/peer0.org1.net/assets/tls-ca/tls-ca-cert.pem', - '--tlsRootCertFiles', - '/var/artifacts/crypto-config/Org2MSP/peer0.org2.net/assets/tls-ca/tls-ca-cert.pem', - '-c' -]; -let commitId; -describe('Chaincode Network Tests', () => { - it('should queryByEntityName #1', async () => execa_1.default('docker', [...base_args, ...query_args, `{"Args":["eventstore:queryByEntityName", "${entityName}"]}`]) - .then(({ stdout }) => lodash_1.values(__utils__1.parseResult(stdout))) - .then(commits => commits.map(commit => lodash_1.pick(commit, 'entityName')).map(result => expect(result).toEqual({ entityName })))); - it('should queryByEntityId', async () => execa_1.default('docker', [...base_args, ...query_args, `{"Args":["eventstore:queryByEntityId","${entityName}","${id}"]}`]) - .then(({ stderr, stdout }) => lodash_1.values(__utils__1.parseResult(stdout))) - .then(commits => commits - .map(commit => lodash_1.pick(commit, 'entityName', 'id')) - .map(result => expect(result).toEqual({ - entityName, - id - })))); - it('should createCommit #1', async () => execa_1.default('docker', [ - ...base_args, - ...invoke_args, - `{"Args":["eventstore:createCommit","${entityName}","id_00001","0","${eventStr}","${ledger_api_1.createCommitId()}"]}` - ]).then(({ stderr }) => expect(stderr).toContain('result: status:200'))); - it('should createCommit #2', async () => execa_1.default('docker', [ - ...base_args, - ...invoke_args, - `{"Args":["eventstore:createCommit","${entityName}","id_00001","0","${eventStr}","${ledger_api_1.createCommitId()}"]}` - ]).then(({ stderr }) => expect(stderr).toContain('result: status:200'))); - it('should queryByEntityId #2', async () => execa_1.default('docker', [...base_args, ...query_args, `{"Args":["eventstore:queryByEntityId","${entityName}","id_00001"]}`]) - .then(({ stdout }) => lodash_1.values(__utils__1.parseResult(stdout))[0]) - .then(commit => { - commitId = commit.commitId; - expect(commit.id).toEqual('id_00001'); - })); - it('should queryByEntityIdCommitId', async () => execa_1.default('docker', [ - ...base_args, - ...query_args, - `{"Args":["eventstore:queryByEntityIdCommitId","${entityName}","id_00001","${commitId}"]}` - ]) - .then(({ stdout }) => lodash_1.values(__utils__1.parseResult(stdout))[0]) - .then(commit => expect(commit.commitId).toEqual(commitId))); - it('should deleteByEntityIdCommitId', async () => execa_1.default('docker', [ - ...base_args, - ...invoke_args, - `{"Args":["eventstore:deleteByEntityIdCommitId","${entityName}","id_00001","${commitId}"]}` - ]).then(({ stderr }) => expect(stderr).toContain('result: status:200'))); - // bug: this has timming bug. Sometimes, when above two createCommit has not completed, before this test starts. - // Then, nothing can be deleted. This is testing bug; its underlying implementation works fine. - it('should deleteByEntityId', async () => execa_1.default('docker', [ - ...base_args, - ...invoke_args, - `{"Args":["eventstore:deleteByEntityId","${entityName}","id_00001"]}` - ]).then(({ stderr }) => expect(stderr).toContain('result: status:200'))); - it('should fail to queryByEntityId', async () => execa_1.default('docker', [...base_args, ...query_args, `{"Args":["eventstore:queryByEntityId","${entityName}","id_00001"]}`]) - .then(({ stdout }) => __utils__1.parseResult(stdout)) - .then(commits => expect(commits).toEqual({}))); - it('should fail to deleteByEntityIdCommitId', async () => execa_1.default('docker', [ - ...base_args, - ...invoke_args, - `{"Args":["eventstore:deleteByEntityIdCommitId","${entityName}","id_00001","${commitId}"]}` - ]).then(({ stderr }) => expect(stderr).toContain('Chaincode invoke successful'))); - it('should fail to createCommit', async () => execa_1.default('docker', [ - ...base_args, - ...invoke_args, - `{"Args":["eventstore:createCommit","${entityName}","","0","${eventStr}","${ledger_api_1.createCommitId()}"]}` - ]).catch(({ stderr }) => expect(stderr).toContain('null argument'))); -}); diff --git a/chaincode/fabric-es/dist/__tests__/public.unit.test.js b/chaincode/fabric-es/dist/__tests__/public.unit.test.js deleted file mode 100644 index ad122e4..0000000 --- a/chaincode/fabric-es/dist/__tests__/public.unit.test.js +++ /dev/null @@ -1,95 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const lodash_1 = require("lodash"); -const __1 = require(".."); -const ledger_api_1 = require("../ledger-api"); -const ctx = { - stub: { - createCompositeKey: jest.fn(), - deleteState: jest.fn(), - getState: jest.fn(), - putState: jest.fn(), - setEvent: jest.fn(), - getStateByPartialCompositeKey: jest.fn(), - getCreator: jest.fn() - }, - clientIdentity: { getID: jest.fn() } -}; -const context = { - stateList: new ledger_api_1.StateList(ctx, 'entities'), - ...ctx -}; -ctx.stub.createCompositeKey.mockResolvedValue('entities"en""entId""2019"'); -ctx.stub.putState.mockResolvedValue(Buffer.from('')); -ctx.stub.setEvent.mockImplementation((name, args) => console.log(`Event sent: ${name}: ${args}`)); -ctx.stub.getCreator.mockImplementation(() => { return { 'mspid': 'Org1MSP' }; }); -ctx.clientIdentity.getID.mockImplementation(() => 'Org1MSP'); -const cc = new __1.EventStore(context); -const entityName = 'cc_test'; -const id = 'cc_01'; -const entityId = id; -const version = '0'; -const events = [{ type: 'mon', payload: { name: 'jun' } }]; -const eventStr = JSON.stringify(events); -const commitId = '123'; -const committedAt = '2019'; -const value = JSON.stringify({ - key: '123', - commitId, - committedAt, - version, - entityName, - id, - entityId, - events -}); -ctx.stub.getStateByPartialCompositeKey.mockImplementation(() => { - let counter = 1; - return { - [Symbol.asyncIterator]: () => ({ - next: () => { - if (counter > 0) { - counter--; - return Promise.resolve({ value: { value }, done: false }); - } - else - return Promise.resolve({ done: true }); - } - }) - }; -}); -ctx.stub.getState.mockResolvedValue(value); -describe('Chaincode Tests', () => { - it('should instantiate', async () => cc.Init(context).then(response => expect(response).toEqual('Init Done'))); - it('should createCommit', async () => cc - .createCommit(context, entityName, id, version, eventStr, commitId) - .then((response) => lodash_1.values(JSON.parse(response))[0]) - .then(({ id, entityName, version, entityId }) => ({ - id, - entityName, - version, - entityId, - events - })) - .then(commit => expect(commit).toMatchSnapshot())); - it('should queryByEntityName', async () => cc - .queryByEntityName(context, entityName) - .then(response => JSON.parse(response)) - .then(response => expect(response).toMatchSnapshot())); - it('should queryByEntityId', async () => cc - .queryByEntityId(context, entityName, id) - .then((response) => JSON.parse(response)) - .then(response => expect(response).toMatchSnapshot())); - it('should queryByEntityIdCommitId', async () => cc - .queryByEntityIdCommitId(context, entityName, id, commitId) - .then((response) => JSON.parse(response)) - .then(response => expect(response).toMatchSnapshot())); - it('should deleteByEntityIdCommitId', async () => cc - .deleteByEntityIdCommitId(context, entityName, id, commitId) - .then((response) => JSON.parse(response)) - .then(({ status }) => expect(status).toBe('SUCCESS'))); - it('should deleteByEntityId', async () => cc - .deleteByEntityId(context, entityName, id) - .then((response) => JSON.parse(response)) - .then(({ status }) => expect(status).toBe('SUCCESS'))); -}); diff --git a/chaincode/fabric-es/dist/contract/eventstore.js b/chaincode/fabric-es/dist/contract/eventstore.js deleted file mode 100644 index 603228e..0000000 --- a/chaincode/fabric-es/dist/contract/eventstore.js +++ /dev/null @@ -1,225 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.EventStore = void 0; -const util_1 = __importDefault(require("util")); -const fabric_contract_api_1 = require("fabric-contract-api"); -const lodash_1 = require("lodash"); -const ledger_api_1 = require("../ledger-api"); -const myContext_1 = require("./myContext"); -let EventStore = /** @class */ (() => { - let EventStore = class EventStore extends fabric_contract_api_1.Contract { - constructor(context = new fabric_contract_api_1.Context()) { - super('eventstore'); - this.context = context; - } - createContext() { - return new myContext_1.MyContext(); - } - async Init(context) { - console.info('=== START : Initialize eventstore ==='); - // const commits: Commit[] = []; - // commits.push( - // createInstance({ - // id: 'ent_dev_1001', - // entityName: 'dev_entity', - // version: '0', - // mspId: 'x', - // events: [{ type: 'User Created', payload: { name: 'April' } }], - // commitId: '12345a' - // }) - // ); - // commits.push( - // createInstance({ - // id: 'ent_dev_1001', - // entityName: 'dev_entity', - // version: '0', - // mspId: 'x', - // events: [{ type: 'User Created', payload: { name: 'May' } }], - // commitId: '12345b' - // }) - // ); - // for (const commit of commits) { - // await context.stateList.addState(commit); - // } - console.info('=== END : Initialize eventstore ==='); - return 'Init Done'; - } - async createCommit(context, entityName, id, version, eventStr, commitId) { - if (!id || !entityName || !eventStr || !commitId || version === undefined) - throw new Error('createCommit problem: null argument'); - let events; - let commit; - try { - events = JSON.parse(eventStr); - } - catch (e) { - console.error(e); - throw new Error(util_1.default.format('fail to parse eventStr: %j', e)); - } - if (ledger_api_1.isEventArray(events)) { - commit = ledger_api_1.createInstance({ - id, - version, - entityName, - mspId: context.stub.getCreator().mspid, - events, - commitId - }); - } - else - throw new Error('eventStr is not correctly formatted'); - // /////////////////////////////////////////////////////////////////// - // Add the concept 'lifeCycle' to BaseEvent (../ledger-api/commit.ts) - // lifeCycle == 0 - NORMAL event, no restriction - // lifeCycle == 1 - BEGIN event, can only appear once at the begining of the event stream of an entity - // lifeCycle == 2 - END event, can only appear once at the end of the event stream of an entity - const lcBgn = events.findIndex(item => item.lifeCycle && (item.lifeCycle === 1)); - const lcEnd = events.findIndex(item => item.lifeCycle && (item.lifeCycle === 2)); - if ((lcBgn >= 0) || (lcEnd >= 0)) { - if ((lcBgn >= 0) && (lcEnd >= 0) && (lcBgn >= lcEnd)) { - // Both BEGIN and END events found in the stream, but in incorrect order (entity END before BEGIN) - throw new Error(`Cannot end ${id} before starting`); - } - const rslt = await context.stateList.getQueryResult([JSON.stringify(entityName), JSON.stringify(id)]); - if (lcBgn >= 0) { - if (rslt && (rslt.toString('utf8').includes(`"id":"${id}"`))) { - // Attempt to BEGIN an entity with the same {id} - throw new Error(`Lifecycle of ${id} already started`); - } - } - if (lcEnd >= 0) { - if (!rslt || (!rslt.toString('utf8').includes(`"id":"${id}"`))) { - // Attempt to END an non-existing entity - throw new Error(`Lifecycle of ${id} not started yet`); - } - else if (rslt.toString('utf8').includes('"lifeCycle":2')) { - // Attempt to END an already ended entity - throw new Error(`Lifecycle of ${id} already ended`); - } - } - } - // ///////////////////////////////////////////////////////////////////*/ - await context.stateList.addState(commit); - console.info(`Submitter: ${context.clientIdentity.getID()} - createCommit`); - const evt = lodash_1.omit(commit, 'key'); - evt.entityId = evt.id; - context.stub.setEvent('createCommit', Buffer.from(JSON.stringify(evt))); - return Buffer.from(JSON.stringify(ledger_api_1.toRecord(lodash_1.omit(commit, 'key', 'events')))); - } - async queryByEntityName(context, entityName) { - if (!entityName) - throw new Error('queryByEntityName problem: null argument'); - console.info(`Submitter: ${context.clientIdentity.getID()} - queryByEntityName`); - return context.stateList.getQueryResult([JSON.stringify(entityName)]); - } - async queryByEntityId(context, entityName, id) { - if (!id || !entityName) - throw new Error('queryByEntityId problem: null argument'); - console.info(`Submitter: ${context.clientIdentity.getID()} - queryByEntityId`); - return context.stateList.getQueryResult([JSON.stringify(entityName), JSON.stringify(id)]); - } - async queryByEntityIdCommitId(context, entityName, id, commitId) { - if (!id || !entityName || !commitId) - throw new Error('queryByEntityIdCommitId problem: null argument'); - console.info(`Submitter: ${context.clientIdentity.getID()} - queryByEntityIdCommitId`); - const key = ledger_api_1.makeKey([entityName, id, commitId]); - const commit = await context.stateList.getState(key); - const result = {}; - if (commit === null || commit === void 0 ? void 0 : commit.commitId) - result[commit.commitId] = lodash_1.omit(commit, 'key'); - return Buffer.from(JSON.stringify(result)); - } - async deleteByEntityIdCommitId(context, entityName, id, commitId) { - if (!id || !entityName || !commitId) - throw new Error('deleteEntityByCommitId problem: null argument'); - console.info(`Submitter: ${context.clientIdentity.getID()} - deleteByEntityIdCommitId`); - const key = ledger_api_1.makeKey([entityName, id, commitId]); - const commit = await context.stateList.getState(key); - if (commit === null || commit === void 0 ? void 0 : commit.key) { - await context.stateList.deleteState(commit); - return getSuccessMessage(`Commit ${commit.commitId} is deleted`); - } - else - return getSuccessMessage('commitId does not exist'); - } - async deleteByEntityId(context, entityName, id) { - if (!id || !entityName) - throw new Error('deleteByEntityId problem: null argument'); - console.info(`Submitter: ${context.clientIdentity.getID()} - deleteByEntityId`); - return context.stateList.deleteStateByEnityId([JSON.stringify(entityName), JSON.stringify(id)]); - } - }; - __decorate([ - fabric_contract_api_1.Transaction(), - fabric_contract_api_1.Returns('string'), - __metadata("design:type", Function), - __metadata("design:paramtypes", [myContext_1.MyContext]), - __metadata("design:returntype", Promise) - ], EventStore.prototype, "Init", null); - __decorate([ - fabric_contract_api_1.Transaction(), - fabric_contract_api_1.Returns('buffer'), - __metadata("design:type", Function), - __metadata("design:paramtypes", [myContext_1.MyContext, String, String, String, String, String]), - __metadata("design:returntype", Promise) - ], EventStore.prototype, "createCommit", null); - __decorate([ - fabric_contract_api_1.Transaction(false), - __metadata("design:type", Function), - __metadata("design:paramtypes", [myContext_1.MyContext, String]), - __metadata("design:returntype", Promise) - ], EventStore.prototype, "queryByEntityName", null); - __decorate([ - fabric_contract_api_1.Transaction(false), - __metadata("design:type", Function), - __metadata("design:paramtypes", [myContext_1.MyContext, String, String]), - __metadata("design:returntype", Promise) - ], EventStore.prototype, "queryByEntityId", null); - __decorate([ - fabric_contract_api_1.Transaction(false), - __metadata("design:type", Function), - __metadata("design:paramtypes", [myContext_1.MyContext, String, String, String]), - __metadata("design:returntype", Promise) - ], EventStore.prototype, "queryByEntityIdCommitId", null); - __decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [myContext_1.MyContext, String, String, String]), - __metadata("design:returntype", Promise) - ], EventStore.prototype, "deleteByEntityIdCommitId", null); - __decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [myContext_1.MyContext, String, String]), - __metadata("design:returntype", Promise) - ], EventStore.prototype, "deleteByEntityId", null); - EventStore = __decorate([ - fabric_contract_api_1.Info({ - title: 'smart contract for eventstore', - description: 'smart contract for eventstore' - }), - __metadata("design:paramtypes", [myContext_1.MyContext]) - ], EventStore); - return EventStore; -})(); -exports.EventStore = EventStore; -const getErrorMessage = method => Buffer.from(JSON.stringify({ - status: 'ERROR', - message: `${method} fails` -})); -const getSuccessMessage = message => Buffer.from(JSON.stringify({ - status: 'SUCCESS', - message -})); diff --git a/chaincode/fabric-es/dist/contract/myContext.js b/chaincode/fabric-es/dist/contract/myContext.js deleted file mode 100644 index 1e1dab1..0000000 --- a/chaincode/fabric-es/dist/contract/myContext.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MyContext = void 0; -const fabric_contract_api_1 = require("fabric-contract-api"); -const ledger_api_1 = require("../ledger-api"); -class MyContext extends fabric_contract_api_1.Context { - constructor() { - super(); - this.stateList = new ledger_api_1.StateList(this, 'entities'); - } -} -exports.MyContext = MyContext; diff --git a/chaincode/fabric-es/dist/contract/privateData.js b/chaincode/fabric-es/dist/contract/privateData.js deleted file mode 100644 index 9ee8a88..0000000 --- a/chaincode/fabric-es/dist/contract/privateData.js +++ /dev/null @@ -1,228 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PrivateData = void 0; -const util_1 = __importDefault(require("util")); -const fabric_contract_api_1 = require("fabric-contract-api"); -const lodash_1 = require("lodash"); -const ledger_api_1 = require("../ledger-api"); -class MyContext extends fabric_contract_api_1.Context { - constructor() { - super(); - this.stateList = new ledger_api_1.PrivateStateList(this, 'entities'); - } -} -/** - * see https://hyperledger-fabric.readthedocs.io/en/release-2.0/private-data-arch.html - */ -let PrivateData = /** @class */ (() => { - let PrivateData = class PrivateData extends fabric_contract_api_1.Contract { - constructor(context = new fabric_contract_api_1.Context()) { - super('privatedata'); - this.context = context; - } - createContext() { - return new MyContext(); - } - async Init(context) { - console.info('=========== START : Initialize PrivateData ========='); - console.info('============= END : Initialize PrivateData ==========='); - return 'Init Done'; - } - /** - * createCommit create commit for private data - * @param context context for Chaincode stub - * @param entityName entityName - * @param id id or entityId - * @param version version - * @param commitId commitId - */ - async createCommit(context, entityName, id, version, commitId) { - if (!id || !version || !entityName || !commitId) - throw new Error('createCommit: null argument: id, version, entityName, collection'); - const collection = `_implicit_org_${context.clientIdentity.getMSPID()}`; - console.info(`Submitter: ${context.clientIdentity.getID()} - createCommit`); - let transientMap; - try { - transientMap = context.stub.getTransient(); - } - catch (e) { - console.error(e); - throw new Error(util_1.default.format('fail to get transient map: %j', e)); - } - if (!transientMap) - throw new Error('Error getting transient map'); - let events; - let eventStr; - let commit; - try { - eventStr = transientMap.get('eventstr').toString(); - } - catch (e) { - console.error(e); - throw new Error(util_1.default.format('fail to get eventstr from transient map: %j', e)); - } - try { - events = JSON.parse(eventStr); - } - catch (e) { - console.error(e); - throw new Error(util_1.default.format('fail to parse transient data: %j', e)); - } - // ensure transient data is correct shape - if (ledger_api_1.isEventArray(events)) { - commit = ledger_api_1.createInstance({ - id, - version, - entityName, - mspId: context.stub.getCreator().mspid, - events, - commitId - }); - } - else - throw new Error('transient data is not correctly formatted'); - console.info(`CommitId created: ${commit.commitId}`); - // protect private data content with salt - // @see https://www.npmjs.com/package/bcrypt - // commit.hash = await hash(JSON.stringify(events), 8); - // todo: because bcrypt.js is binary compilation fail, in Github Action, now disable it. - commit.hash = ''; - await context.stateList.addState(collection, commit); - return Buffer.from(JSON.stringify(ledger_api_1.toRecord(lodash_1.omit(commit, 'key', 'events')))); - } - /** - * queryByEntityName query commits by entityName - * @param context context for Chaincode stub - * @param entityName entityName - */ - async queryByEntityName(context, entityName) { - if (!entityName) - throw new Error('queryPrivateDataByEntityName problem: null argument'); - const collection = `_implicit_org_${context.clientIdentity.getMSPID()}`; - console.info(`Submitter: ${context.clientIdentity.getID()} - queryByEntityName`); - return await context.stateList.getQueryResult(collection, [JSON.stringify(entityName)]); - } - /** - * queryByEntityId query commit by entityId - * @param context context for Chaincode stub - * @param entityName entityName - * @param id entityId or id - */ - async queryByEntityId(context, entityName, id) { - if (!id || !entityName) - throw new Error('queryPrivateDataByEntityId problem: null argument'); - const collection = `_implicit_org_${context.clientIdentity.getMSPID()}`; - console.info(`Submitter: ${context.clientIdentity.getID()} - queryByEntityId`); - return await context.stateList.getQueryResult(collection, [JSON.stringify(entityName), JSON.stringify(id)]); - } - /** - * queryByEntityIdCommitId query commit by entityId and commitId - * @param context context for Chaincode stub - * @param entityName entityName - * @param id entityId or id - * @param commitId commitId - */ - async queryByEntityIdCommitId(context, entityName, id, commitId) { - if (!id || !entityName || !commitId) - throw new Error('getPrivateData problem: null argument'); - console.info(`Submitter: ${context.clientIdentity.getID()} - queryByEntityIdCommitId`); - const collection = `_implicit_org_${context.clientIdentity.getMSPID()}`; - const key = ledger_api_1.makeKey([entityName, id, commitId]); - const commit = await context.stateList.getState(collection, key); - const result = {}; - if (commit === null || commit === void 0 ? void 0 : commit.commitId) - result[commit.commitId] = lodash_1.omit(commit, 'key'); - return Buffer.from(JSON.stringify(result)); - } - /** - * deleteByEntityIdCommitId delete commit by EntityId and commitId - * @param context - * @param entityName entityName - * @param id entityId or id - * @param commitId commitId - */ - async deleteByEntityIdCommitId(context, entityName, id, commitId) { - if (!id || !entityName || !commitId) - throw new Error('deletePrivateDataByEntityIdCommitId problem: null argument'); - console.info(`Submitter: ${context.clientIdentity.getID()} - deleteByEntityIdCommitId`); - const collection = `_implicit_org_${context.clientIdentity.getMSPID()}`; - const key = ledger_api_1.makeKey([entityName, id, commitId]); - let commit; - try { - commit = await context.stateList.getState(collection, key); - } - catch (e) { - console.error(e); - } - if (commit === null || commit === void 0 ? void 0 : commit.key) { - await context.stateList.deleteState(collection, commit); - return Buffer.from(JSON.stringify({ - status: 'SUCCESS', - message: `Commit ${commit.commitId} is deleted` - })); - } - else { - throw new Error('commitId does not exist'); - } - } - }; - __decorate([ - fabric_contract_api_1.Transaction(), - fabric_contract_api_1.Returns('string'), - __metadata("design:type", Function), - __metadata("design:paramtypes", [MyContext]), - __metadata("design:returntype", Promise) - ], PrivateData.prototype, "Init", null); - __decorate([ - fabric_contract_api_1.Transaction(), - fabric_contract_api_1.Returns('bytebuffer'), - __metadata("design:type", Function), - __metadata("design:paramtypes", [MyContext, String, String, String, String]), - __metadata("design:returntype", Promise) - ], PrivateData.prototype, "createCommit", null); - __decorate([ - fabric_contract_api_1.Transaction(false), - __metadata("design:type", Function), - __metadata("design:paramtypes", [MyContext, String]), - __metadata("design:returntype", Promise) - ], PrivateData.prototype, "queryByEntityName", null); - __decorate([ - fabric_contract_api_1.Transaction(false), - __metadata("design:type", Function), - __metadata("design:paramtypes", [MyContext, String, String]), - __metadata("design:returntype", Promise) - ], PrivateData.prototype, "queryByEntityId", null); - __decorate([ - fabric_contract_api_1.Transaction(false), - __metadata("design:type", Function), - __metadata("design:paramtypes", [MyContext, String, String, String]), - __metadata("design:returntype", Promise) - ], PrivateData.prototype, "queryByEntityIdCommitId", null); - __decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [MyContext, String, String, String]), - __metadata("design:returntype", Promise) - ], PrivateData.prototype, "deleteByEntityIdCommitId", null); - PrivateData = __decorate([ - fabric_contract_api_1.Info({ - title: 'smart contract for privatedata', - description: 'smart contract for privatedata' - }), - __metadata("design:paramtypes", [MyContext]) - ], PrivateData); - return PrivateData; -})(); -exports.PrivateData = PrivateData; diff --git a/chaincode/fabric-es/dist/getLogger.js b/chaincode/fabric-es/dist/getLogger.js deleted file mode 100644 index 95ac774..0000000 --- a/chaincode/fabric-es/dist/getLogger.js +++ /dev/null @@ -1,30 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.getLogger = void 0; -const winston_1 = require("winston"); -const { combine, timestamp, label, json } = winston_1.format; -exports.getLogger = (name, sendToConsole = true) => { - let transportArray = [ - new winston_1.transports.File({ filename: `./logs/all.log` }), - new winston_1.transports.File({ - filename: `./logs/error.log`, - level: 'error' - }), - new winston_1.transports.File({ - filename: `./logs/debug.log`, - level: 'debug' - }), - new winston_1.transports.File({ - filename: `./logs/warn.log`, - level: 'warn' - }) - ]; - if (sendToConsole) - transportArray = [new winston_1.transports.Console(), ...transportArray]; - return winston_1.createLogger({ - level: 'info', - exitOnError: false, - format: combine(label({ label: name }), timestamp(), json()), - transports: transportArray - }); -}; diff --git a/chaincode/fabric-es/dist/index.js b/chaincode/fabric-es/dist/index.js deleted file mode 100644 index 1c35aa2..0000000 --- a/chaincode/fabric-es/dist/index.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.contracts = exports.createInstance = exports.Commit = exports.EventStore = void 0; -const eventstore_1 = require("./contract/eventstore"); -Object.defineProperty(exports, "EventStore", { enumerable: true, get: function () { return eventstore_1.EventStore; } }); -const privateData_1 = require("./contract/privateData"); -const ledger_api_1 = require("./ledger-api"); -Object.defineProperty(exports, "Commit", { enumerable: true, get: function () { return ledger_api_1.Commit; } }); -Object.defineProperty(exports, "createInstance", { enumerable: true, get: function () { return ledger_api_1.createInstance; } }); -exports.contracts = [eventstore_1.EventStore, privateData_1.PrivateData]; diff --git a/chaincode/fabric-es/dist/ledger-api/commit.js b/chaincode/fabric-es/dist/ledger-api/commit.js deleted file mode 100644 index 42f326c..0000000 --- a/chaincode/fabric-es/dist/ledger-api/commit.js +++ /dev/null @@ -1,23 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Commit = void 0; -const index_1 = require("./index"); -class Commit { - constructor(option) { - this.key = index_1.makeKey([option.entityName, option.id, option.commitId]); - this.id = option.id; - this.entityName = option.entityName; - this.version = option.version; - this.commitId = option.commitId; - this.entityId = option.entityId; - this.mspId = option.mspId; - this.events = option.events; - if (option.hash) - this.hash = option.hash; - if (option.isFirst === true || option.isFirst === false) - this.isFirst = option.isFirst; - if (option.isLast === true || option.isLast === false) - this.isLast = option.isLast; - } -} -exports.Commit = Commit; diff --git a/chaincode/fabric-es/dist/ledger-api/index.js b/chaincode/fabric-es/dist/ledger-api/index.js deleted file mode 100644 index 6ff6f25..0000000 --- a/chaincode/fabric-es/dist/ledger-api/index.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("./statelist"), exports); -__exportStar(require("./utils"), exports); -__exportStar(require("./commit"), exports); -__exportStar(require("./privateStateList"), exports); diff --git a/chaincode/fabric-es/dist/ledger-api/privateStateList.js b/chaincode/fabric-es/dist/ledger-api/privateStateList.js deleted file mode 100644 index ffb212e..0000000 --- a/chaincode/fabric-es/dist/ledger-api/privateStateList.js +++ /dev/null @@ -1,49 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PrivateStateList = void 0; -const util_1 = __importDefault(require("util")); -const lodash_1 = require("lodash"); -const _1 = require("."); -class PrivateStateList { - constructor(ctx, name) { - this.ctx = ctx; - this.name = name; - } - async getQueryResult(collection, attributes) { - const promises = this.ctx.stub.getPrivateDataByPartialCompositeKey(collection, 'entities', attributes); - const result = {}; - try { - for await (const res of promises) { - const commit = JSON.parse(res.value.toString()); - result[commit.commitId] = lodash_1.omit(commit, 'key'); - } - } - catch (e) { - console.error(e); - throw new Error(util_1.default.format('fail to getQueryResult, %j', e)); - } - return Buffer.from(JSON.stringify(result)); - } - async addState(collection, commit) { - await this.ctx.stub.putPrivateData(collection, this.ctx.stub.createCompositeKey(this.name, _1.splitKey(commit.key)), _1.serialize(commit)); - } - async getState(collection, key) { - let result; - const data = await this.ctx.stub.getPrivateData(collection, this.ctx.stub.createCompositeKey(this.name, _1.splitKey(key))); - try { - result = data.toString() ? JSON.parse(data.toString()) : Object.assign({}); - } - catch (e) { - console.error(e); - throw new Error(util_1.default.format('fail to parse data, %j', e)); - } - return result; - } - async deleteState(collection, { key }) { - await this.ctx.stub.deletePrivateData(collection, this.ctx.stub.createCompositeKey(this.name, _1.splitKey(key))); - } -} -exports.PrivateStateList = PrivateStateList; diff --git a/chaincode/fabric-es/dist/ledger-api/statelist.js b/chaincode/fabric-es/dist/ledger-api/statelist.js deleted file mode 100644 index 4c7b2b4..0000000 --- a/chaincode/fabric-es/dist/ledger-api/statelist.js +++ /dev/null @@ -1,69 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.StateList = void 0; -const util_1 = __importDefault(require("util")); -const lodash_1 = require("lodash"); -const _1 = require("."); -class StateList { - constructor(ctx, name) { - this.ctx = ctx; - this.name = name; - } - async getQueryResult(attributes, plainObject) { - const promises = this.ctx.stub.getStateByPartialCompositeKey('entities', attributes); - const result = {}; - try { - for await (const res of promises) { - const commit = JSON.parse(res.value.toString()); - result[commit.commitId] = lodash_1.omit(commit, 'key'); - } - } - catch (e) { - console.error(e); - throw new Error(util_1.default.format('fail to getQueryResult, %j', e)); - } - return plainObject ? result : Buffer.from(JSON.stringify(result)); - } - async addState(commit) { - await this.ctx.stub.putState(this.ctx.stub.createCompositeKey(this.name, _1.splitKey(commit.key)), _1.serialize(commit)); - } - async getState(key) { - let result; - const data = await this.ctx.stub.getState(this.ctx.stub.createCompositeKey(this.name, _1.splitKey(key))); - try { - result = data.toString() ? JSON.parse(data.toString()) : Object.assign({}); - } - catch (e) { - console.error(e); - throw new Error(util_1.default.format('fail to parse data, %j', e)); - } - return result; - } - async deleteState(commit) { - await this.ctx.stub.deleteState(this.ctx.stub.createCompositeKey(this.name, _1.splitKey(commit.key))); - } - async deleteStateByEnityId(attributes) { - const promises = this.ctx.stub.getStateByPartialCompositeKey('entities', attributes); - const result = {}; - try { - for await (const res of promises) { - const { key, commitId } = JSON.parse(res.value.toString()); - await this.ctx.stub.deleteState(this.ctx.stub.createCompositeKey('entities', _1.splitKey(key))); - result[commitId] = {}; - } - } - catch (e) { - console.error(e); - throw new Error(util_1.default.format('fail to deleteStateByEnityId, %j', e)); - } - return Buffer.from(JSON.stringify({ - status: 'SUCCESS', - message: `${lodash_1.keys(result).length} record(s) deleted`, - result - })); - } -} -exports.StateList = StateList; diff --git a/chaincode/fabric-es/dist/ledger-api/utils.js b/chaincode/fabric-es/dist/ledger-api/utils.js deleted file mode 100644 index 5a1c558..0000000 --- a/chaincode/fabric-es/dist/ledger-api/utils.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isEventArray = exports.createInstance = exports.createCommitId = exports.toRecord = exports.serialize = exports.makeKey = exports.splitKey = void 0; -const lodash_1 = require("lodash"); -const commit_1 = require("./commit"); -exports.splitKey = (key) => key.split('~'); -exports.makeKey = (keyParts) => keyParts.map(part => JSON.stringify(part)).join('~'); -exports.serialize = object => Buffer.from(JSON.stringify(object)); -exports.toRecord = (commit) => lodash_1.assign({}, { [commit.commitId]: commit }); -exports.createCommitId = () => `${new Date(Date.now()).toISOString().replace(/[^0-9]/g, '')}`; -exports.createInstance = (option) => new commit_1.Commit({ - id: option.id, - entityName: option.entityName, - commitId: option.commitId, - version: parseInt(option.version, 10), - mspId: option.mspId, - events: option.events, - entityId: option.id -}); -// type guard for transient data -exports.isEventArray = (value) => Array.isArray(value) && value.every(item => typeof item.type === 'string'); diff --git a/chaincode/fabric-es/package-lock.json b/chaincode/fabric-es/package-lock.json deleted file mode 100644 index cfcf5a3..0000000 --- a/chaincode/fabric-es/package-lock.json +++ /dev/null @@ -1,5640 +0,0 @@ -{ - "name": "@fabric-es/chaincode", - "version": "0.6.3", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "dev": true, - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "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=", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "dev": true - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", - "requires": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "@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" - } - }, - "@grpc/grpc-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.1.7.tgz", - "integrity": "sha512-EuxMstI0u778dp0nk6Fe3gHXYPeV6FYsWOe0/QFwxv1NQ6bc5Wl/0Yxa4xl9uBlKElL6AIxuASmSfu7KEJhqiw==", - "requires": { - "@grpc/proto-loader": "^0.6.0-pre14", - "@types/node": "^12.12.47", - "google-auth-library": "^6.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "@grpc/proto-loader": { - "version": "0.6.0-pre9", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.0-pre9.tgz", - "integrity": "sha512-oM+LjpEjNzW5pNJjt4/hq1HYayNeQT+eGrOPABJnYHv7TyNPDNzkQ76rDYZF86X5swJOa4EujEMzQ9iiTdPgww==", - "requires": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^6.9.0", - "yargs": "^15.3.1" - } - }, - "@types/node": { - "version": "12.12.62", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.62.tgz", - "integrity": "sha512-qAfo81CsD7yQIM9mVyh6B/U47li5g7cfpVQEDMfQeF8pSZVwzbhwU3crc0qG4DmpsebpJPR49AKOExQyJ05Cpg==" - }, - "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" - } - }, - "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" - } - }, - "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==" - }, - "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==" - }, - "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" - } - }, - "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==" - }, - "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" - } - }, - "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" - } - }, - "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==" - }, - "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" - } - }, - "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" - } - }, - "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" - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "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.2" - } - }, - "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" - } - } - } - }, - "@grpc/proto-loader": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.5.tgz", - "integrity": "sha512-WwN9jVNdHRQoOBo9FDH7qU+mgfjPc8GygPYms3M+y3fbQLfnCe/Kv/E01t7JRgnrsOHH8euvSbed3mIalXhwqQ==", - "requires": { - "lodash.camelcase": "^4.3.0", - "protobufjs": "^6.8.6" - } - }, - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "dev": true, - "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" - } - }, - "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" - } - }, - "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" - } - }, - "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", - "dev": true, - "requires": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" - }, - "@types/babel__core": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", - "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.14.tgz", - "integrity": "sha512-8w9szzKs14ZtBVuP6Wn7nMLRJ0D6dfB0VEBEyRgxrZ/Ln49aNMykrghM2FaNn4FJRzNppCSa0Rv9pBRM5Xc3wg==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/bcrypt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-3.0.0.tgz", - "integrity": "sha512-nohgNyv+1ViVcubKBh0+XiNJ3dO8nYu///9aJ4cgSqv70gBL+94SNy/iC2NLzKPT2Zt/QavrOkBVbZRLZmw6NQ==", - "dev": true - }, - "@types/bytebuffer": { - "version": "5.0.41", - "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.41.tgz", - "integrity": "sha512-Mdrv4YcaHvpkx25ksqqFaezktx3yZRcd51GZY0rY/9avyaqZdiT/GiWRhfrJhMpgzXqTOSHgGvsumGxJFNiZZA==", - "requires": { - "@types/long": "*", - "@types/node": "*" - }, - "dependencies": { - "@types/node": { - "version": "14.11.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.1.tgz", - "integrity": "sha512-oTQgnd0hblfLsJ6BvJzzSL+Inogp3lq9fGgqRkMB/ziKMgEUaFl801OncOzUmalfzt14N0oPHMK47ipl+wbTIw==" - } - } - }, - "@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/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "24.9.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.1.tgz", - "integrity": "sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q==", - "dev": true, - "requires": { - "jest-diff": "^24.3.0" - } - }, - "@types/lodash": { - "version": "4.14.161", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.161.tgz", - "integrity": "sha512-EP6O3Jkr7bXvZZSZYlsgt5DIjiGr0dXP1/jVEwVLTFgg0d+3lWVQkRavYVQszV7dYUwvg0B8R0MBDpcmXg7XIA==", - "dev": true - }, - "@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" - }, - "@types/node": { - "version": "10.17.35", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.35.tgz", - "integrity": "sha512-gXx7jAWpMddu0f7a+L+txMplp3FnHl53OhQIF9puXKq3hDGY/GjH+MF04oWnV/adPSCrbtHumDCFwzq2VhltWA==", - "dev": true - }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", - "dev": true - }, - "@types/yargs": { - "version": "13.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", - "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", - "dev": true, - "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==", - "dev": true - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "dev": true, - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - } - } - }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "dev": true - }, - "agent-base": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", - "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==", - "requires": { - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "requires": { - "ms": "2.1.2" - } - } - } - }, - "ajv": { - "version": "6.12.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", - "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", - "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": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - }, - "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==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", - "dev": true - }, - "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", - "dev": true, - "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" - } - }, - "babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", - "dev": true, - "requires": { - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", - "dev": true, - "requires": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.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=", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - } - } - }, - "bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "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==", - "dev": true - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.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" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "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==", - "dev": true, - "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=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "child-process-promise": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/child-process-promise/-/child-process-promise-2.2.1.tgz", - "integrity": "sha1-RzChHvYQ+tRQuPIjx50x172tgHQ=", - "dev": true, - "requires": { - "cross-spawn": "^4.0.2", - "node-version": "^1.0.0", - "promise-polyfill": "^6.0.1" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "class-transformer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.2.3.tgz", - "integrity": "sha512-qsP+0xoavpOlJHuYsQJsN58HXSl8Jvveo+T37rEvCEeRfMWoytAyR0Ua/YsFgpM6AZYZ/og2PJwArwzJl1aXtQ==" - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.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=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "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=" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" - }, - "colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", - "requires": { - "color": "3.0.x", - "text-hex": "1.0.x" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-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": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", - "dev": true, - "requires": { - "cssom": "0.3.x" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", - "dev": true - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dev": true, - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } - } - }, - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "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==", - "dev": true - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - }, - "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==", - "dev": true - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "dev": true, - "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", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.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": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.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=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.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=", - "dev": true, - "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=", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fabric-contract-api": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/fabric-contract-api/-/fabric-contract-api-2.2.0.tgz", - "integrity": "sha512-vR0NSxXT15XeXxWQ5LuEE9zo54nbZvu4PdtI5GC40T1aQwwj1J9Bk2yOLYPib7xZXCnh3ZPyMZbLjtpAk4QMXQ==", - "requires": { - "class-transformer": "^0.2.2", - "fabric-shim-api": "2.2.0", - "fast-safe-stringify": "^2.0.7", - "get-params": "^0.1.2", - "reflect-metadata": "^0.1.13", - "winston": "^3.3.2" - } - }, - "fabric-shim": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/fabric-shim/-/fabric-shim-2.2.0.tgz", - "integrity": "sha512-uUF1cLZObr+b4H7mLMIw+NQXWPFEn/EzLWTxjyPFWMoVMn79J+lEdWEdBKK5MfFsccDn9P+sl7N/307aNe60zA==", - "requires": { - "@fidm/x509": "^1.2.1", - "@grpc/grpc-js": "^1.1.1", - "@grpc/proto-loader": "^0.5.4", - "@types/node": "^14.0.13", - "ajv": "^6.12.2", - "fabric-contract-api": "2.2.0", - "fabric-shim-api": "2.2.0", - "fs-extra": "^9.0.1", - "reflect-metadata": "^0.1.13", - "winston": "^3.3.2", - "yargs": "^15.3.1", - "yargs-parser": "^18.1.3" - }, - "dependencies": { - "@types/node": { - "version": "14.11.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.1.tgz", - "integrity": "sha512-oTQgnd0hblfLsJ6BvJzzSL+Inogp3lq9fGgqRkMB/ziKMgEUaFl801OncOzUmalfzt14N0oPHMK47ipl+wbTIw==" - }, - "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" - } - }, - "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" - } - }, - "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==" - }, - "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==" - }, - "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" - } - }, - "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==" - }, - "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" - } - }, - "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" - } - }, - "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==" - }, - "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" - } - }, - "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" - } - }, - "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" - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "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.2" - } - }, - "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" - } - } - } - }, - "fabric-shim-api": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/fabric-shim-api/-/fabric-shim-api-2.2.0.tgz", - "integrity": "sha512-kmjfDmqqWYra/9ENezBVi9PfhwwyRl9ihlD5AvMSOpYjD0HGK4GcdvXlxfv2i5jSA+4vd9KVXK6MCZm06Z8U7Q==" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "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=", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, - "fast-text-encoding": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", - "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "fecha": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", - "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.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=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gaxios": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.2.0.tgz", - "integrity": "sha512-+6WPeVzPvOshftpxJwRi2Ozez80tn/hdtOUag7+gajDHRJvAblKxTFSSMPtr2hmnLy7p0mvYz0rMXLBl8pSO7Q==", - "requires": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.3.0" - } - }, - "gcp-metadata": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.2.0.tgz", - "integrity": "sha512-vQZD57cQkqIA6YPGXM/zc+PIZfNRFdukWGsGZ5+LcJzesi5xp6Gn7a02wRJi4eXPyArNMIYpPET4QMxGqtlk6Q==", - "requires": { - "gaxios": "^3.0.0", - "json-bigint": "^1.0.0" - } - }, - "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==", - "dev": true - }, - "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-params": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/get-params/-/get-params-0.1.2.tgz", - "integrity": "sha1-uuDfq6WIoMYNeDTA2Nwv9g7u8v4=" - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "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=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "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==", - "dev": true - }, - "google-auth-library": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.0.6.tgz", - "integrity": "sha512-fWYdRdg55HSJoRq9k568jJA1lrhg9i2xgfhVIMJbskUmbDpJGHsbv9l41DGhCDXM21F9Kn4kUwdysgxSYBYJUw==", - "requires": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^3.0.0", - "gcp-metadata": "^4.1.0", - "gtoken": "^5.0.0", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "google-p12-pem": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.3.tgz", - "integrity": "sha512-wS0ek4ZtFx/ACKYF3JhyGe5kzH7pgiQ7J5otlumqR9psmWMYc+U9cErKlCYVYHoUaidXHdZ2xbo34kB+S+24hA==", - "requires": { - "node-forge": "^0.10.0" - } - }, - "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=", - "dev": true - }, - "gtoken": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.0.3.tgz", - "integrity": "sha512-Nyd1wZCMRc2dj/mAD0LlfQLcAO06uKdpKJXvK85SGrF5+5+Bpfil9u/2aw35ltvEHjvl0h5FMKN5knEU+9JrOg==", - "requires": { - "gaxios": "^3.0.0", - "google-p12-pem": "^3.0.0", - "jws": "^4.0.0", - "mime": "^2.2.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.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=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.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==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "requires": { - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "requires": { - "ms": "2.1.2" - } - } - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.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==" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", - "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.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==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "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==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "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==" - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0" - } - }, - "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", - "dev": true, - "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" - }, - "dependencies": { - "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", - "dev": true, - "requires": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" - } - } - } - }, - "jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.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==", - "dev": true, - "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==", - "dev": true, - "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=", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - } - } - }, - "jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", - "realpath-native": "^1.1.0" - } - }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", - "dev": true, - "requires": { - "detect-newline": "^2.1.0" - } - }, - "jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" - } - }, - "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" - } - }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", - "dev": true - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.9.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" - } - }, - "jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", - "dev": true, - "requires": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" - } - }, - "jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" - } - }, - "jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" - } - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true - }, - "jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" - } - }, - "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" - } - }, - "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "leven": "^3.1.0", - "pretty-format": "^24.9.0" - } - }, - "jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", - "dev": true, - "requires": { - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.9.0", - "string-length": "^2.0.0" - } - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.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==", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "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==", - "dev": true - }, - "json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "requires": { - "bignumber.js": "^9.0.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "requires": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "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==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "dev": true - }, - "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==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "logform": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", - "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", - "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "triple-beam": "^1.3.0" - } - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "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=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.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==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.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" - } - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.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=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" - }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "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=", - "dev": true - }, - "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "node-version": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.2.0.tgz", - "integrity": "sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==", - "dev": 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==", - "dev": true, - "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==", - "dev": true - } - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "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==", - "dev": true, - "requires": { - "path-key": "^3.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==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", - "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "requires": { - "fn.name": "1.x.x" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "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-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "dev": true, - "requires": { - "p-reduce": "^1.0.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "dev": true - }, - "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": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, - "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==" - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prettier": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", - "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", - "dev": true - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - } - }, - "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==" - }, - "promise-polyfill": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz", - "integrity": "sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc=", - "dev": true - }, - "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.4" - } - }, - "protobufjs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.1.tgz", - "integrity": "sha512-pb8kTchL+1Ceg4lFd5XUpK8PdWacbvV5SK2ULH2ebrYtl4GjJmS24m6CKME67jzV53tbJxHlnNOSqQHbTsR9JQ==", - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": "^13.7.0", - "long": "^4.0.0" - }, - "dependencies": { - "@types/node": { - "version": "13.13.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.21.tgz", - "integrity": "sha512-tlFWakSzBITITJSxHV4hg4KvrhR/7h3xbJdSFbYJBVzKubrASbnnIFuSgolUh7qKGo/ZeJPKUfbZ0WS6Jp14DQ==" - } - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.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==", - "dev": true - }, - "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==", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "dev": true, - "requires": { - "util.promisify": "^1.0.0" - } - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "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" - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "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==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "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==", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "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": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.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==", - "dev": true, - "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==", - "dev": true, - "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=", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "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==", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.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": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.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=", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.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==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-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==", - "dev": true, - "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=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", - "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.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" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - } - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-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==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "symbol-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==", - "dev": true - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - } - }, - "text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", - "dev": true - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - }, - "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=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.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=", - "dev": true, - "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==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "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==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" - }, - "ts-jest": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.3.0.tgz", - "integrity": "sha512-Hb94C/+QRIgjVZlJyiWwouYUF+siNJHJHknyspaOcZ+OQAIdFG/UrdQVXw/0B8Z3No34xkUXZJpOTy9alOWdVQ==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "mkdirp": "0.x", - "resolve": "1.x", - "semver": "^5.5", - "yargs-parser": "10.x" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "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=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.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=", - "dev": true, - "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==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.x" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "winston": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", - "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", - "requires": { - "@dabh/diagnostics": "^2.0.2", - "async": "^3.1.0", - "is-stream": "^2.0.0", - "logform": "^2.2.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" - } - }, - "winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", - "requires": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" - }, - "dependencies": { - "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" - } - }, - "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==" - }, - "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" - } - } - } - }, - "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==", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "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==", - "dev": true - }, - "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": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.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": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/chaincode/fabric-es/package.json b/chaincode/fabric-es/package.json deleted file mode 100644 index 9153dae..0000000 --- a/chaincode/fabric-es/package.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "@fabric-es/chaincode", - "version": "0.6.3", - "main": "dist/index.js", - "typings": "dist/index.d.ts", - "description": "Event Store Chaincode for Hyperledger Fabric", - "repository": { - "type": "git", - "url": "git://github.com/fabric-es/fabric-es.git" - }, - "keywords": [ - "hyperledger" - ], - "author": "Ross Tang", - "license": "BSD-3-Clause-Clear", - "homepage": "https://github.com/fabric-es/fabric-es", - "bugs": { - "url": "https://github.com/fabric-es/fabric-es/issues" - }, - "publishConfig": { - "registry": "https://npm.pkg.github.com/" - }, - "scripts": { - "start": "fabric-chaincode-node server --chaincode-address $CHAINCODE_ADDRESS --chaincode-id $CHAINCODE_CCID", - "build": "rimraf dist && tsc", - "build:prod": "rimraf dist && tsc -p ./tsconfig.prod.json", - "prepublishOnly": "npm run build", - "network-test": "jest network.test", - "unit-test": "jest unit.test", - "unit-test:fab": "yarn unit-test && yarn network-test", - "test:private": "jest private.integration.test", - "test:lc": "jest lifecycle.unit.test", - "lint": "eslint --max-warnings 10 'src/**/*.{js,ts}'", - "publish:gh:fabric-es": "npm publish" - }, - "dependencies": { - "@types/bytebuffer": "^5.0.41", - "fabric-contract-api": "2.2.0", - "fabric-shim": "2.2.0", - "lodash": "^4.17.15" - }, - "devDependencies": { - "@types/bcrypt": "^3.0.0", - "@types/jest": "^24.0.18", - "@types/lodash": "^4.14.136", - "@types/node": "^10.17.18", - "child-process-promise": "^2.2.1", - "execa": "3.4.0", - "jest": "^24.9.0", - "prettier": "^2.0.5", - "rimraf": "^3.0.0", - "ts-jest": "^24.0.2", - "typescript": "^3.8.3" - } -} diff --git a/chaincode/fabric-es/packaging/connection.json b/chaincode/fabric-es/packaging/connection.json deleted file mode 100644 index 2d3a623..0000000 --- a/chaincode/fabric-es/packaging/connection.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "address": "eventstore-hlf-cc:7052", - "dial_timeout": "10s", - "tls_required": false, - "client_auth_required": false, - "client_key": "-----BEGIN EC PRIVATE KEY----- ... -----END EC PRIVATE KEY-----", - "client_cert": "-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----", - "root_cert": "-----BEGIN CERTIFICATE---- ... -----END CERTIFICATE-----" -} diff --git a/chaincode/fabric-es/packaging/metadata.json b/chaincode/fabric-es/packaging/metadata.json deleted file mode 100644 index b9fa22b..0000000 --- a/chaincode/fabric-es/packaging/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"path":"","type":"external","label":"eventstore"} diff --git a/chaincode/marbles/Dockerfile b/chaincode/marbles/Dockerfile deleted file mode 100644 index 3f963f0..0000000 --- a/chaincode/marbles/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -# This image is a microservice in golang for the Degree chaincode -FROM golang:1.14.6-alpine AS build -COPY ./ /go/src/github.com/marbles -WORKDIR /go/src/github.com/marbles - -# Build application -RUN go build -o chaincode -v . - -# Production ready image -# Pass the binary to the prod image -FROM alpine:3.11 as prod - -COPY --from=build /go/src/github.com/marbles/chaincode /app/chaincode - -USER 1000 - -WORKDIR /app -CMD ./chaincode diff --git a/chaincode/marbles/go.mod b/chaincode/marbles/go.mod deleted file mode 100644 index 40b3afe..0000000 --- a/chaincode/marbles/go.mod +++ /dev/null @@ -1,12 +0,0 @@ -module github.com/marbles - -go 1.12 - -require ( - github.com/hyperledger/fabric-chaincode-go v0.0.0-20200128192331-2d899240a7ed - github.com/hyperledger/fabric-protos-go v0.0.0-20200124220212-e9cfc186ba7b - golang.org/x/net v0.0.0-20200202094626-16171245cfb2 // indirect - golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4 // indirect - golang.org/x/text v0.3.2 // indirect - google.golang.org/genproto v0.0.0-20200218151345-dad8c97a84f5 // indirect -) diff --git a/chaincode/marbles/marbles02.go b/chaincode/marbles/marbles02.go deleted file mode 100644 index 98f7559..0000000 --- a/chaincode/marbles/marbles02.go +++ /dev/null @@ -1,769 +0,0 @@ - -/* - SPDX-License-Identifier: Apache-2.0 -*/ - -// ====CHAINCODE EXECUTION SAMPLES (CLI) ================== - -// ==== Invoke marbles ==== -// peer chaincode invoke -C myc1 -n marbles -c '{"Args":["initMarble","marble1","blue","35","tom"]}' -// peer chaincode invoke -C myc1 -n marbles -c '{"Args":["initMarble","marble2","red","50","tom"]}' -// peer chaincode invoke -C myc1 -n marbles -c '{"Args":["initMarble","marble3","blue","70","tom"]}' -// peer chaincode invoke -C myc1 -n marbles -c '{"Args":["transferMarble","marble2","jerry"]}' -// peer chaincode invoke -C myc1 -n marbles -c '{"Args":["transferMarblesBasedOnColor","blue","jerry"]}' -// peer chaincode invoke -C myc1 -n marbles -c '{"Args":["delete","marble1"]}' - -// ==== Query marbles ==== -// peer chaincode query -C myc1 -n marbles -c '{"Args":["readMarble","marble1"]}' -// peer chaincode query -C myc1 -n marbles -c '{"Args":["getMarblesByRange","marble1","marble3"]}' -// peer chaincode query -C myc1 -n marbles -c '{"Args":["getHistoryForMarble","marble1"]}' - -// Rich Query (Only supported if CouchDB is used as state database): -// peer chaincode query -C myc1 -n marbles -c '{"Args":["queryMarblesByOwner","tom"]}' -// peer chaincode query -C myc1 -n marbles -c '{"Args":["queryMarbles","{\"selector\":{\"owner\":\"tom\"}}"]}' - -// Rich Query with Pagination (Only supported if CouchDB is used as state database): -// peer chaincode query -C myc1 -n marbles -c '{"Args":["queryMarblesWithPagination","{\"selector\":{\"owner\":\"tom\"}}","3",""]}' - -// INDEXES TO SUPPORT COUCHDB RICH QUERIES -// -// Indexes in CouchDB are required in order to make JSON queries efficient and are required for -// any JSON query with a sort. As of Hyperledger Fabric 1.1, indexes may be packaged alongside -// chaincode in a META-INF/statedb/couchdb/indexes directory. Each index must be defined in its own -// text file with extension *.json with the index definition formatted in JSON following the -// CouchDB index JSON syntax as documented at: -// http://docs.couchdb.org/en/2.1.1/api/database/find.html#db-index -// -// This marbles02 example chaincode demonstrates a packaged -// index which you can find in META-INF/statedb/couchdb/indexes/indexOwner.json. -// For deployment of chaincode to production environments, it is recommended -// to define any indexes alongside chaincode so that the chaincode and supporting indexes -// are deployed automatically as a unit, once the chaincode has been installed on a peer and -// instantiated on a channel. See Hyperledger Fabric documentation for more details. -// -// If you have access to the your peer's CouchDB state database in a development environment, -// you may want to iteratively test various indexes in support of your chaincode queries. You -// can use the CouchDB Fauxton interface or a command line curl utility to create and update -// indexes. Then once you finalize an index, include the index definition alongside your -// chaincode in the META-INF/statedb/couchdb/indexes directory, for packaging and deployment -// to managed environments. -// -// In the examples below you can find index definitions that support marbles02 -// chaincode queries, along with the syntax that you can use in development environments -// to create the indexes in the CouchDB Fauxton interface or a curl command line utility. -// - -//Example hostname:port configurations to access CouchDB. -// -//To access CouchDB docker container from within another docker container or from vagrant environments: -// http://couchdb:5984/ -// -//Inside couchdb docker container -// http://127.0.0.1:5984/ - -// Index for docType, owner. -// -// Example curl command line to define index in the CouchDB channel_chaincode database -// curl -i -X POST -H "Content-Type: application/json" -d "{\"index\":{\"fields\":[\"docType\",\"owner\"]},\"name\":\"indexOwner\",\"ddoc\":\"indexOwnerDoc\",\"type\":\"json\"}" http://hostname:port/myc1_marbles/_index -// - -// Index for docType, owner, size (descending order). -// -// Example curl command line to define index in the CouchDB channel_chaincode database -// curl -i -X POST -H "Content-Type: application/json" -d "{\"index\":{\"fields\":[{\"size\":\"desc\"},{\"docType\":\"desc\"},{\"owner\":\"desc\"}]},\"ddoc\":\"indexSizeSortDoc\", \"name\":\"indexSizeSortDesc\",\"type\":\"json\"}" http://hostname:port/myc1_marbles/_index - -// Rich Query with index design doc and index name specified (Only supported if CouchDB is used as state database): -// peer chaincode query -C myc1 -n marbles -c '{"Args":["queryMarbles","{\"selector\":{\"docType\":\"marble\",\"owner\":\"tom\"}, \"use_index\":[\"_design/indexOwnerDoc\", \"indexOwner\"]}"]}' - -// Rich Query with index design doc specified only (Only supported if CouchDB is used as state database): -// peer chaincode query -C myc1 -n marbles -c '{"Args":["queryMarbles","{\"selector\":{\"docType\":{\"$eq\":\"marble\"},\"owner\":{\"$eq\":\"tom\"},\"size\":{\"$gt\":0}},\"fields\":[\"docType\",\"owner\",\"size\"],\"sort\":[{\"size\":\"desc\"}],\"use_index\":\"_design/indexSizeSortDoc\"}"]}' - -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "strconv" - "strings" - "time" - "os" - - "github.com/hyperledger/fabric-chaincode-go/shim" - pb "github.com/hyperledger/fabric-protos-go/peer" -) - -// SimpleChaincode example simple Chaincode implementation -type SimpleChaincode struct { -} - -type marble struct { - ObjectType string `json:"docType"` //docType is used to distinguish the various types of objects in state database - Name string `json:"name"` //the fieldtags are needed to keep case from bouncing around - Color string `json:"color"` - Size int `json:"size"` - Owner string `json:"owner"` -} - -// =================================================================================== -// Main -// =================================================================================== -func main() { - - server := &shim.ChaincodeServer{ - CCID: os.Getenv("CHAINCODE_CCID"), - Address: os.Getenv("CHAINCODE_ADDRESS"), - CC: new(SimpleChaincode), - TLSProps: shim.TLSProperties{ - Disabled: true, - }, - } - - // Start the chaincode external server - err := server.Start() - - if err != nil { - fmt.Printf("Error starting Marbles02 chaincode: %s", err) - } -} - -// Init initializes chaincode -// =========================== -func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response { - return shim.Success(nil) -} - -// Invoke - Our entry point for Invocations -// ======================================== -func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response { - function, args := stub.GetFunctionAndParameters() - fmt.Println("invoke is running " + function) - - // Handle different functions - if function == "initMarble" { //create a new marble - return t.initMarble(stub, args) - } else if function == "transferMarble" { //change owner of a specific marble - return t.transferMarble(stub, args) - } else if function == "transferMarblesBasedOnColor" { //transfer all marbles of a certain color - return t.transferMarblesBasedOnColor(stub, args) - } else if function == "delete" { //delete a marble - return t.delete(stub, args) - } else if function == "readMarble" { //read a marble - return t.readMarble(stub, args) - } else if function == "queryMarblesByOwner" { //find marbles for owner X using rich query - return t.queryMarblesByOwner(stub, args) - } else if function == "queryMarbles" { //find marbles based on an ad hoc rich query - return t.queryMarbles(stub, args) - } else if function == "getHistoryForMarble" { //get history of values for a marble - return t.getHistoryForMarble(stub, args) - } else if function == "getMarblesByRange" { //get marbles based on range query - return t.getMarblesByRange(stub, args) - } else if function == "getMarblesByRangeWithPagination" { - return t.getMarblesByRangeWithPagination(stub, args) - } else if function == "queryMarblesWithPagination" { - return t.queryMarblesWithPagination(stub, args) - } - - fmt.Println("invoke did not find func: " + function) //error - return shim.Error("Received unknown function invocation") -} - -// ============================================================ -// initMarble - create a new marble, store into chaincode state -// ============================================================ -func (t *SimpleChaincode) initMarble(stub shim.ChaincodeStubInterface, args []string) pb.Response { - var err error - - // 0 1 2 3 - // "asdf", "blue", "35", "bob" - if len(args) != 4 { - return shim.Error("Incorrect number of arguments. Expecting 4") - } - - // ==== Input sanitation ==== - fmt.Println("- start init marble") - if len(args[0]) <= 0 { - return shim.Error("1st argument must be a non-empty string") - } - if len(args[1]) <= 0 { - return shim.Error("2nd argument must be a non-empty string") - } - if len(args[2]) <= 0 { - return shim.Error("3rd argument must be a non-empty string") - } - if len(args[3]) <= 0 { - return shim.Error("4th argument must be a non-empty string") - } - marbleName := args[0] - color := strings.ToLower(args[1]) - owner := strings.ToLower(args[3]) - size, err := strconv.Atoi(args[2]) - if err != nil { - return shim.Error("3rd argument must be a numeric string") - } - - // ==== Check if marble already exists ==== - marbleAsBytes, err := stub.GetState(marbleName) - if err != nil { - return shim.Error("Failed to get marble: " + err.Error()) - } else if marbleAsBytes != nil { - fmt.Println("This marble already exists: " + marbleName) - return shim.Error("This marble already exists: " + marbleName) - } - - // ==== Create marble object and marshal to JSON ==== - objectType := "marble" - marble := &marble{objectType, marbleName, color, size, owner} - marbleJSONasBytes, err := json.Marshal(marble) - if err != nil { - return shim.Error(err.Error()) - } - //Alternatively, build the marble json string manually if you don't want to use struct marshalling - //marbleJSONasString := `{"docType":"Marble", "name": "` + marbleName + `", "color": "` + color + `", "size": ` + strconv.Itoa(size) + `, "owner": "` + owner + `"}` - //marbleJSONasBytes := []byte(str) - - // === Save marble to state === - err = stub.PutState(marbleName, marbleJSONasBytes) - if err != nil { - return shim.Error(err.Error()) - } - - // ==== Index the marble to enable color-based range queries, e.g. return all blue marbles ==== - // An 'index' is a normal key/value entry in state. - // The key is a composite key, with the elements that you want to range query on listed first. - // In our case, the composite key is based on indexName~color~name. - // This will enable very efficient state range queries based on composite keys matching indexName~color~* - indexName := "color~name" - colorNameIndexKey, err := stub.CreateCompositeKey(indexName, []string{marble.Color, marble.Name}) - if err != nil { - return shim.Error(err.Error()) - } - // Save index entry to state. Only the key name is needed, no need to store a duplicate copy of the marble. - // Note - passing a 'nil' value will effectively delete the key from state, therefore we pass null character as value - value := []byte{0x00} - stub.PutState(colorNameIndexKey, value) - - // ==== Marble saved and indexed. Return success ==== - fmt.Println("- end init marble") - return shim.Success(nil) -} - -// =============================================== -// readMarble - read a marble from chaincode state -// =============================================== -func (t *SimpleChaincode) readMarble(stub shim.ChaincodeStubInterface, args []string) pb.Response { - var name, jsonResp string - var err error - - if len(args) != 1 { - return shim.Error("Incorrect number of arguments. Expecting name of the marble to query") - } - - name = args[0] - valAsbytes, err := stub.GetState(name) //get the marble from chaincode state - if err != nil { - jsonResp = "{\"Error\":\"Failed to get state for " + name + "\"}" - return shim.Error(jsonResp) - } else if valAsbytes == nil { - jsonResp = "{\"Error\":\"Marble does not exist: " + name + "\"}" - return shim.Error(jsonResp) - } - - return shim.Success(valAsbytes) -} - -// ================================================== -// delete - remove a marble key/value pair from state -// ================================================== -func (t *SimpleChaincode) delete(stub shim.ChaincodeStubInterface, args []string) pb.Response { - var jsonResp string - var marbleJSON marble - if len(args) != 1 { - return shim.Error("Incorrect number of arguments. Expecting 1") - } - marbleName := args[0] - - // to maintain the color~name index, we need to read the marble first and get its color - valAsbytes, err := stub.GetState(marbleName) //get the marble from chaincode state - if err != nil { - jsonResp = "{\"Error\":\"Failed to get state for " + marbleName + "\"}" - return shim.Error(jsonResp) - } else if valAsbytes == nil { - jsonResp = "{\"Error\":\"Marble does not exist: " + marbleName + "\"}" - return shim.Error(jsonResp) - } - - err = json.Unmarshal([]byte(valAsbytes), &marbleJSON) - if err != nil { - jsonResp = "{\"Error\":\"Failed to decode JSON of: " + marbleName + "\"}" - return shim.Error(jsonResp) - } - - err = stub.DelState(marbleName) //remove the marble from chaincode state - if err != nil { - return shim.Error("Failed to delete state:" + err.Error()) - } - - // maintain the index - indexName := "color~name" - colorNameIndexKey, err := stub.CreateCompositeKey(indexName, []string{marbleJSON.Color, marbleJSON.Name}) - if err != nil { - return shim.Error(err.Error()) - } - - // Delete index entry to state. - err = stub.DelState(colorNameIndexKey) - if err != nil { - return shim.Error("Failed to delete state:" + err.Error()) - } - return shim.Success(nil) -} - -// =========================================================== -// transfer a marble by setting a new owner name on the marble -// =========================================================== -func (t *SimpleChaincode) transferMarble(stub shim.ChaincodeStubInterface, args []string) pb.Response { - - // 0 1 - // "name", "bob" - if len(args) < 2 { - return shim.Error("Incorrect number of arguments. Expecting 2") - } - - marbleName := args[0] - newOwner := strings.ToLower(args[1]) - fmt.Println("- start transferMarble ", marbleName, newOwner) - - marbleAsBytes, err := stub.GetState(marbleName) - if err != nil { - return shim.Error("Failed to get marble:" + err.Error()) - } else if marbleAsBytes == nil { - return shim.Error("Marble does not exist") - } - - marbleToTransfer := marble{} - err = json.Unmarshal(marbleAsBytes, &marbleToTransfer) //unmarshal it aka JSON.parse() - if err != nil { - return shim.Error(err.Error()) - } - marbleToTransfer.Owner = newOwner //change the owner - - marbleJSONasBytes, _ := json.Marshal(marbleToTransfer) - err = stub.PutState(marbleName, marbleJSONasBytes) //rewrite the marble - if err != nil { - return shim.Error(err.Error()) - } - - fmt.Println("- end transferMarble (success)") - return shim.Success(nil) -} - -// =========================================================================================== -// constructQueryResponseFromIterator constructs a JSON array containing query results from -// a given result iterator -// =========================================================================================== -func constructQueryResponseFromIterator(resultsIterator shim.StateQueryIteratorInterface) (*bytes.Buffer, error) { - // buffer is a JSON array containing QueryResults - var buffer bytes.Buffer - buffer.WriteString("[") - - bArrayMemberAlreadyWritten := false - for resultsIterator.HasNext() { - queryResponse, err := resultsIterator.Next() - if err != nil { - return nil, err - } - // Add a comma before array members, suppress it for the first array member - if bArrayMemberAlreadyWritten == true { - buffer.WriteString(",") - } - buffer.WriteString("{\"Key\":") - buffer.WriteString("\"") - buffer.WriteString(queryResponse.Key) - buffer.WriteString("\"") - - buffer.WriteString(", \"Record\":") - // Record is a JSON object, so we write as-is - buffer.WriteString(string(queryResponse.Value)) - buffer.WriteString("}") - bArrayMemberAlreadyWritten = true - } - buffer.WriteString("]") - - return &buffer, nil -} - -// =========================================================================================== -// addPaginationMetadataToQueryResults adds QueryResponseMetadata, which contains pagination -// info, to the constructed query results -// =========================================================================================== -func addPaginationMetadataToQueryResults(buffer *bytes.Buffer, responseMetadata *pb.QueryResponseMetadata) *bytes.Buffer { - - buffer.WriteString("[{\"ResponseMetadata\":{\"RecordsCount\":") - buffer.WriteString("\"") - buffer.WriteString(fmt.Sprintf("%v", responseMetadata.FetchedRecordsCount)) - buffer.WriteString("\"") - buffer.WriteString(", \"Bookmark\":") - buffer.WriteString("\"") - buffer.WriteString(responseMetadata.Bookmark) - buffer.WriteString("\"}}]") - - return buffer -} - -// =========================================================================================== -// getMarblesByRange performs a range query based on the start and end keys provided. - -// Read-only function results are not typically submitted to ordering. If the read-only -// results are submitted to ordering, or if the query is used in an update transaction -// and submitted to ordering, then the committing peers will re-execute to guarantee that -// result sets are stable between endorsement time and commit time. The transaction is -// invalidated by the committing peers if the result set has changed between endorsement -// time and commit time. -// Therefore, range queries are a safe option for performing update transactions based on query results. -// =========================================================================================== -func (t *SimpleChaincode) getMarblesByRange(stub shim.ChaincodeStubInterface, args []string) pb.Response { - - if len(args) < 2 { - return shim.Error("Incorrect number of arguments. Expecting 2") - } - - startKey := args[0] - endKey := args[1] - - resultsIterator, err := stub.GetStateByRange(startKey, endKey) - if err != nil { - return shim.Error(err.Error()) - } - defer resultsIterator.Close() - - buffer, err := constructQueryResponseFromIterator(resultsIterator) - if err != nil { - return shim.Error(err.Error()) - } - - fmt.Printf("- getMarblesByRange queryResult:\n%s\n", buffer.String()) - - return shim.Success(buffer.Bytes()) -} - -// ==== Example: GetStateByPartialCompositeKey/RangeQuery ========================================= -// transferMarblesBasedOnColor will transfer marbles of a given color to a certain new owner. -// Uses a GetStateByPartialCompositeKey (range query) against color~name 'index'. -// Committing peers will re-execute range queries to guarantee that result sets are stable -// between endorsement time and commit time. The transaction is invalidated by the -// committing peers if the result set has changed between endorsement time and commit time. -// Therefore, range queries are a safe option for performing update transactions based on query results. -// =========================================================================================== -func (t *SimpleChaincode) transferMarblesBasedOnColor(stub shim.ChaincodeStubInterface, args []string) pb.Response { - - // 0 1 - // "color", "bob" - if len(args) < 2 { - return shim.Error("Incorrect number of arguments. Expecting 2") - } - - color := args[0] - newOwner := strings.ToLower(args[1]) - fmt.Println("- start transferMarblesBasedOnColor ", color, newOwner) - - // Query the color~name index by color - // This will execute a key range query on all keys starting with 'color' - coloredMarbleResultsIterator, err := stub.GetStateByPartialCompositeKey("color~name", []string{color}) - if err != nil { - return shim.Error(err.Error()) - } - defer coloredMarbleResultsIterator.Close() - - // Iterate through result set and for each marble found, transfer to newOwner - var i int - for i = 0; coloredMarbleResultsIterator.HasNext(); i++ { - // Note that we don't get the value (2nd return variable), we'll just get the marble name from the composite key - responseRange, err := coloredMarbleResultsIterator.Next() - if err != nil { - return shim.Error(err.Error()) - } - - // get the color and name from color~name composite key - objectType, compositeKeyParts, err := stub.SplitCompositeKey(responseRange.Key) - if err != nil { - return shim.Error(err.Error()) - } - returnedColor := compositeKeyParts[0] - returnedMarbleName := compositeKeyParts[1] - fmt.Printf("- found a marble from index:%s color:%s name:%s\n", objectType, returnedColor, returnedMarbleName) - - // Now call the transfer function for the found marble. - // Re-use the same function that is used to transfer individual marbles - response := t.transferMarble(stub, []string{returnedMarbleName, newOwner}) - // if the transfer failed break out of loop and return error - if response.Status != shim.OK { - return shim.Error("Transfer failed: " + response.Message) - } - } - - responsePayload := fmt.Sprintf("Transferred %d %s marbles to %s", i, color, newOwner) - fmt.Println("- end transferMarblesBasedOnColor: " + responsePayload) - return shim.Success([]byte(responsePayload)) -} - -// =======Rich queries ========================================================================= -// Two examples of rich queries are provided below (parameterized query and ad hoc query). -// Rich queries pass a query string to the state database. -// Rich queries are only supported by state database implementations -// that support rich query (e.g. CouchDB). -// The query string is in the syntax of the underlying state database. -// With rich queries there is no guarantee that the result set hasn't changed between -// endorsement time and commit time, aka 'phantom reads'. -// Therefore, rich queries should not be used in update transactions, unless the -// application handles the possibility of result set changes between endorsement and commit time. -// Rich queries can be used for point-in-time queries against a peer. -// ============================================================================================ - -// ===== Example: Parameterized rich query ================================================= -// queryMarblesByOwner queries for marbles based on a passed in owner. -// This is an example of a parameterized query where the query logic is baked into the chaincode, -// and accepting a single query parameter (owner). -// Only available on state databases that support rich query (e.g. CouchDB) -// ========================================================================================= -func (t *SimpleChaincode) queryMarblesByOwner(stub shim.ChaincodeStubInterface, args []string) pb.Response { - - // 0 - // "bob" - if len(args) < 1 { - return shim.Error("Incorrect number of arguments. Expecting 1") - } - - owner := strings.ToLower(args[0]) - - queryString := fmt.Sprintf("{\"selector\":{\"docType\":\"marble\",\"owner\":\"%s\"}}", owner) - - queryResults, err := getQueryResultForQueryString(stub, queryString) - if err != nil { - return shim.Error(err.Error()) - } - return shim.Success(queryResults) -} - -// ===== Example: Ad hoc rich query ======================================================== -// queryMarbles uses a query string to perform a query for marbles. -// Query string matching state database syntax is passed in and executed as is. -// Supports ad hoc queries that can be defined at runtime by the client. -// If this is not desired, follow the queryMarblesForOwner example for parameterized queries. -// Only available on state databases that support rich query (e.g. CouchDB) -// ========================================================================================= -func (t *SimpleChaincode) queryMarbles(stub shim.ChaincodeStubInterface, args []string) pb.Response { - - // 0 - // "queryString" - if len(args) < 1 { - return shim.Error("Incorrect number of arguments. Expecting 1") - } - - queryString := args[0] - - queryResults, err := getQueryResultForQueryString(stub, queryString) - if err != nil { - return shim.Error(err.Error()) - } - return shim.Success(queryResults) -} - -// ========================================================================================= -// getQueryResultForQueryString executes the passed in query string. -// Result set is built and returned as a byte array containing the JSON results. -// ========================================================================================= -func getQueryResultForQueryString(stub shim.ChaincodeStubInterface, queryString string) ([]byte, error) { - - fmt.Printf("- getQueryResultForQueryString queryString:\n%s\n", queryString) - - resultsIterator, err := stub.GetQueryResult(queryString) - if err != nil { - return nil, err - } - defer resultsIterator.Close() - - buffer, err := constructQueryResponseFromIterator(resultsIterator) - if err != nil { - return nil, err - } - - fmt.Printf("- getQueryResultForQueryString queryResult:\n%s\n", buffer.String()) - - return buffer.Bytes(), nil -} - -// ====== Pagination ========================================================================= -// Pagination provides a method to retrieve records with a defined pagesize and -// start point (bookmark). An empty string bookmark defines the first "page" of a query -// result. Paginated queries return a bookmark that can be used in -// the next query to retrieve the next page of results. Paginated queries extend -// rich queries and range queries to include a pagesize and bookmark. -// -// Two examples are provided in this example. The first is getMarblesByRangeWithPagination -// which executes a paginated range query. -// The second example is a paginated query for rich ad-hoc queries. -// ========================================================================================= - -// ====== Example: Pagination with Range Query =============================================== -// getMarblesByRangeWithPagination performs a range query based on the start & end key, -// page size and a bookmark. - -// The number of fetched records will be equal to or lesser than the page size. -// Paginated range queries are only valid for read only transactions. -// =========================================================================================== -func (t *SimpleChaincode) getMarblesByRangeWithPagination(stub shim.ChaincodeStubInterface, args []string) pb.Response { - - if len(args) < 4 { - return shim.Error("Incorrect number of arguments. Expecting 4") - } - - startKey := args[0] - endKey := args[1] - //return type of ParseInt is int64 - pageSize, err := strconv.ParseInt(args[2], 10, 32) - if err != nil { - return shim.Error(err.Error()) - } - bookmark := args[3] - - resultsIterator, responseMetadata, err := stub.GetStateByRangeWithPagination(startKey, endKey, int32(pageSize), bookmark) - if err != nil { - return shim.Error(err.Error()) - } - defer resultsIterator.Close() - - buffer, err := constructQueryResponseFromIterator(resultsIterator) - if err != nil { - return shim.Error(err.Error()) - } - - bufferWithPaginationInfo := addPaginationMetadataToQueryResults(buffer, responseMetadata) - - fmt.Printf("- getMarblesByRange queryResult:\n%s\n", bufferWithPaginationInfo.String()) - - return shim.Success(buffer.Bytes()) -} - -// ===== Example: Pagination with Ad hoc Rich Query ======================================================== -// queryMarblesWithPagination uses a query string, page size and a bookmark to perform a query -// for marbles. Query string matching state database syntax is passed in and executed as is. -// The number of fetched records would be equal to or lesser than the specified page size. -// Supports ad hoc queries that can be defined at runtime by the client. -// If this is not desired, follow the queryMarblesForOwner example for parameterized queries. -// Only available on state databases that support rich query (e.g. CouchDB) -// Paginated queries are only valid for read only transactions. -// ========================================================================================= -func (t *SimpleChaincode) queryMarblesWithPagination(stub shim.ChaincodeStubInterface, args []string) pb.Response { - - // 0 - // "queryString" - if len(args) < 3 { - return shim.Error("Incorrect number of arguments. Expecting 3") - } - - queryString := args[0] - //return type of ParseInt is int64 - pageSize, err := strconv.ParseInt(args[1], 10, 32) - if err != nil { - return shim.Error(err.Error()) - } - bookmark := args[2] - - queryResults, err := getQueryResultForQueryStringWithPagination(stub, queryString, int32(pageSize), bookmark) - if err != nil { - return shim.Error(err.Error()) - } - return shim.Success(queryResults) -} - -// ========================================================================================= -// getQueryResultForQueryStringWithPagination executes the passed in query string with -// pagination info. Result set is built and returned as a byte array containing the JSON results. -// ========================================================================================= -func getQueryResultForQueryStringWithPagination(stub shim.ChaincodeStubInterface, queryString string, pageSize int32, bookmark string) ([]byte, error) { - - fmt.Printf("- getQueryResultForQueryString queryString:\n%s\n", queryString) - - resultsIterator, responseMetadata, err := stub.GetQueryResultWithPagination(queryString, pageSize, bookmark) - if err != nil { - return nil, err - } - defer resultsIterator.Close() - - buffer, err := constructQueryResponseFromIterator(resultsIterator) - if err != nil { - return nil, err - } - - bufferWithPaginationInfo := addPaginationMetadataToQueryResults(buffer, responseMetadata) - - fmt.Printf("- getQueryResultForQueryString queryResult:\n%s\n", bufferWithPaginationInfo.String()) - - return buffer.Bytes(), nil -} - -func (t *SimpleChaincode) getHistoryForMarble(stub shim.ChaincodeStubInterface, args []string) pb.Response { - - if len(args) < 1 { - return shim.Error("Incorrect number of arguments. Expecting 1") - } - - marbleName := args[0] - - fmt.Printf("- start getHistoryForMarble: %s\n", marbleName) - - resultsIterator, err := stub.GetHistoryForKey(marbleName) - if err != nil { - return shim.Error(err.Error()) - } - defer resultsIterator.Close() - - // buffer is a JSON array containing historic values for the marble - var buffer bytes.Buffer - buffer.WriteString("[") - - bArrayMemberAlreadyWritten := false - for resultsIterator.HasNext() { - response, err := resultsIterator.Next() - if err != nil { - return shim.Error(err.Error()) - } - // Add a comma before array members, suppress it for the first array member - if bArrayMemberAlreadyWritten == true { - buffer.WriteString(",") - } - buffer.WriteString("{\"TxId\":") - buffer.WriteString("\"") - buffer.WriteString(response.TxId) - buffer.WriteString("\"") - - buffer.WriteString(", \"Value\":") - // if it was a delete operation on given key, then we need to set the - //corresponding value null. Else, we will write the response.Value - //as-is (as the Value itself a JSON marble) - if response.IsDelete { - buffer.WriteString("null") - } else { - buffer.WriteString(string(response.Value)) - } - - buffer.WriteString(", \"Timestamp\":") - buffer.WriteString("\"") - buffer.WriteString(time.Unix(response.Timestamp.Seconds, int64(response.Timestamp.Nanos)).String()) - buffer.WriteString("\"") - - buffer.WriteString(", \"IsDelete\":") - buffer.WriteString("\"") - buffer.WriteString(strconv.FormatBool(response.IsDelete)) - buffer.WriteString("\"") - - buffer.WriteString("}") - bArrayMemberAlreadyWritten = true - } - buffer.WriteString("]") - - fmt.Printf("- getHistoryForMarble returning:\n%s\n", buffer.String()) - - return shim.Success(buffer.Bytes()) -} diff --git a/chaincode/marbles/packaging/connection.json b/chaincode/marbles/packaging/connection.json deleted file mode 100644 index ac38481..0000000 --- a/chaincode/marbles/packaging/connection.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "address": "marbles1-hlf-cc:7052", - "dial_timeout": "10s", - "tls_required": false, - "client_auth_required": false, - "client_key": "-----BEGIN EC PRIVATE KEY----- ... -----END EC PRIVATE KEY-----", - "client_cert": "-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----", - "root_cert": "-----BEGIN CERTIFICATE---- ... -----END CERTIFICATE-----" -} diff --git a/chaincode/marbles/packaging/metadata.json b/chaincode/marbles/packaging/metadata.json deleted file mode 100644 index a722f2c..0000000 --- a/chaincode/marbles/packaging/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"path":"","type":"external","label":"marbles"} diff --git a/doc/TEST.md b/doc/TEST.md deleted file mode 100644 index 12782c2..0000000 --- a/doc/TEST.md +++ /dev/null @@ -1 +0,0 @@ -## INSTRUCTION FOR TEST diff --git a/doc/DEVELOPMENT.md b/docs/DEVELOPMENT.md similarity index 82% rename from doc/DEVELOPMENT.md rename to docs/DEVELOPMENT.md index ef963a5..c1b6708 100644 --- a/doc/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -15,8 +15,8 @@ the latest runnable deployment; and is protected. It should perform pull request **Technology** -- GKE 1.16.13-gke.401/regular channel (n1-standard-4: 4 vcpu/15GB x 1 node) -- Istio v1.4.10 +- GKE 1.18.13-gke.1200/regular channel (n1-standard-4: 4 vcpu/15GB x 1 node) +- Istio v1.6.11 - installation of gcloud cli, kubectl and istioctl - helm charts v3 - Fabric v2.2.0 @@ -41,6 +41,17 @@ is `fabric-cd-dev`. Also, make sure `gcloud`, `gsutil`, and `kubectl` are instal gcloud container clusters get-credentials dev-core-b --zone us-central1-c ``` +```shell +# Alternatively, create new GKE using gcloud cli +gcloud beta container --project "fdi-cd" clusters create "dev-core-b" --zone "us-central1-c" --no-enable-basic-auth \ + --cluster-version "1.18.12-gke.1200" --release-channel "rapid" --machine-type "n1-standard-4" --image-type "COS" \ + --disk-type "pd-standard" --disk-size "100" --metadata disable-legacy-endpoints=true --scopes "https://www.googleapis.com/auth/cloud-platform" \ + --preemptible --num-nodes "1" --enable-stackdriver-kubernetes --enable-ip-alias --network "projects/fdi-cd/global/networks/fdi-core" \ + --subnetwork "projects/fdi-cd/regions/us-central1/subnetworks/org0msp" --default-max-pods-per-node "110" \ + --no-enable-master-authorized-networks --addons HorizontalPodAutoscaling,HttpLoadBalancing,Istio --istio-config auth=MTLS_PERMISSIVE \ + --enable-autoupgrade --enable-autorepair --max-surge-upgrade 1 --max-unavailable-upgrade 0 --no-shielded-integrity-monitoring +``` + **Configure namespace** Here assumes to deploy 2 organizations, and a commonly shared argo and argocd. @@ -55,17 +66,22 @@ kubectl create namespace n2 ### Istio +**MUST DO: Upgrade from Istio v1.4 to v1.6** + +The out-of-box running Istio is v1.4.10. It needs a manual step to upgrade to v1.6.x. +[See Upgrade with Istio Operator](https://cloud.google.com/istio/docs/istio-on-gke/upgrade-with-operator) + + **Install istioctl cli** Be noted different GKE version comes with different version of istio. After the GKE is created, validate the version of -istio. Also, istio is a pre-GA, I also found that GKE 1.17 comes with dual control plane (v1.4 and 1.6). Make sure -to install the correct version level of istio cli; compatibile with GKE bundled istio version. +istio. Make sure to install the correct version level of istio cli; compatibile with GKE bundled istio version. *WARNING*: the latest / recent version may not work. ```shell script # client installation of istioctl v1.4.10 CLI on local machine -curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.4.10 TARGET_ARCH=x86_64 sh - +curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.6.4 TARGET_ARCH=x86_64 sh - ``` Here uses Istio Service Mesh, and istio CRD is located `networking` directory. @@ -88,12 +104,21 @@ kubectl -n argocd apply -f networking/istio-argocd.yaml **Auto injection** +It needs to find the "revision number" of istio by: + +```shell +kubectl -n istio-system get pods -lapp=istiod --show-labels +``` + ```shell script -kubectl label namespace n0 istio-injection=enabled -kubectl label namespace n1 istio-injection=enabled -kubectl label namespace n2 istio-injection=enabled -kubectl label namespace argo istio-injection=enabled -kubectl label namespace argocd istio-injection=enabled +# REV number is 1611 +# kubectl label namespace [NAMESPACE] istio.io/rev=istio-[REV-NUMBER] + +kubectl label namespace n0 istio.io/rev=istio-1611 +kubectl label namespace n1 istio.io/rev=istio-1611 +kubectl label namespace n2 istio.io/rev=istio-1611 +kubectl label namespace argo istio.io/rev=istio-1611 +kubectl label namespace argocd istio.io/rev=istio-1611 ``` **Optionally, istio probe rewrite** @@ -108,6 +133,17 @@ kubectl label namespace argocd istio-injection=enabled Notice that the current version of istio (v1.4.x) provided by GKE is too low version. The addon of istio v1.7, like kiali and prometheus do not work well. No traffic metric is able to capture in control plane. Still, istio traffic is fine. +**Install kiali** + +Kiali is the web ui dashboard for Istio. GKE's istio does not come with kiali; requiring manual installation. + +```shell +# Install kiali +helm install --namespace istio-system --set auth.strategy="anonymous" --repo https://kiali.org/helm-charts kiali-server kiali-server + +# use port-forward to launch kiali +istioctl dashboard kiali +``` ### Cloud DNS **Update Cloud Private Zone DNS** @@ -302,27 +338,18 @@ brew install argocd **Deploy project specific configuration** -```shell script -kubectl -n argocd apply -f argocd/project.yaml - -# Generate JWT, for use by automated process -# Remind to gitignore "download" directory. -# In ArgoCD, no JWT will persist. Need to store it locally -argocd proj role create-token my-project ci-role > download/ARGO_TOKEN_CI.txt -``` - **Port Forwarding** ```shell script kubectl port-forward svc/argocd-server -n argocd 8080:443 ``` + **Authenticate** -```shell script -# get all accounts, "admin", "cli" -argocd account list +There are two accounts: (1) default account 'admin', and (2) an optional account 'cli', which is defined by `argocd/values-argocd.yaml` +```shell script # the initial password is pod-id POD=$(kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2) @@ -335,18 +362,44 @@ argocd account update-password --current-password $POD --new-password [NEW-PASSW # Update password for account "cli" argocd account update-password --account cli --current-password [CURRENT ADMIN-PASSWORD] --new-password [NEW-PASSWORD] -# Generate JWT for "cli" +# optionally, save it locally; for repeated use, during development +# Remind to gitignore "download" directory. CONTENT=$(argocd account generate-token --account cli) -kubectl -n n0 create secret generic argocd-cli-jwt --from-literal=jwt="$CONTENT" -kubectl -n n1 create secret generic argocd-cli-jwt --from-literal=jwt="$CONTENT" -kubectl -n n2 create secret generic argocd-cli-jwt --from-literal=jwt="$CONTENT" +echo $CONTENT > download/ARGOCD_TOKEN_CLI.txt -# optionally, save it locally; for repeated use, during development +# get all accounts, "admin", "cli" +argocd account list +# should output: +# NAME ENABLED CAPABILITIES +# admin true login +# cli true apiKey, login +``` + +The argocd account 'cli' is not currently used. This is created for future use, when additional devOps engineer is on board. + +```shell script +kubectl -n argocd apply -f argocd/project.yaml + +# Generate JWT, for use by automated process # Remind to gitignore "download" directory. +# In ArgoCD, no JWT will persist. Need to store it locally +CONTENT=$(argocd proj role create-token my-project ci-role) echo $CONTENT > download/ARGOCD_TOKEN_CI.txt + +# Optional Step +# if argocd server is re-installed, the json web token of CLI need to be re-created +# application tear down does NOT need to re-install argo and argcd +kubectl -n n0 delete secret argocd-cli-jwt +kubectl -n n1 delete secret argocd-cli-jwt +kubectl -n n2 delete secret argocd-cli-jwt + +# Generate JWT for "cli" +kubectl -n n0 create secret generic argocd-cli-jwt --from-literal=jwt="$CONTENT" +kubectl -n n1 create secret generic argocd-cli-jwt --from-literal=jwt="$CONTENT" +kubectl -n n2 create secret generic argocd-cli-jwt --from-literal=jwt="$CONTENT" ``` -The above jwt is required in order to run bootstraping scripts. +The above jwt is required in order to run bootstraping scripts, used by workflow template `argocd-cli` of `argo-wf/argocd-cli.yaml`. TODO: If *orgX* is created in separate cluster, the *argo* server will be independently installed. The above jwt is required as well. @@ -354,7 +407,7 @@ is required as well. **Add your git repo** As a pre-requisite, you need to create ssh key in your github.com account; and having ssh key in below path. -In your fork repo, the below git url and ssh will be different. Notice that we intentionally not configuring +In your fork repo, the below git url and ssh will be different. Notice that we are intentionally not configuring the ssh as part of *argocd-cm* configMap, preventing the ssh private key from commiting to github. ```shell script @@ -390,7 +443,7 @@ As a development, *argo* is not hard-coded host file. Update the `/etc/hosts` to *Pre-requisite: service accounts* -All workflow are performed by rbac backed service accounts. There are two service accounts: +All workflows are performed by rbac backed service accounts. There are two service accounts: - *workflow*: is created for each namespace, e.g. n0 and n1. It can perform any verbs. - *orgadmin*: can do a subset of admin task, (subject to futher requirement). @@ -416,6 +469,7 @@ helm -n argo install argo -f argo/values-argo.yaml --set installCRDs=false argo/ ```shell script # configure artifactory to using GCS Storage +# NOTE: run below AFTER argo server starts successfully. The first start may take a while kubectl -n argo apply -f ./argo/argo-cm.yaml ``` @@ -443,6 +497,8 @@ cli requires the active port-forwarding of *Argo* server. ```shell script ARGO_TOKEN=$(argo auth token) echo $ARGO_TOKEN +# should return something like: +# Bearer ya29.xxxxxxxxx # using UI, open http://argo.server (ip address 35.202.107.80 <== expose via istio gateway) # login by copy-and-past the above access token in the login page @@ -451,7 +507,11 @@ echo $ARGO_TOKEN **cUrl: invoke workflow within the same namespace** ```shell script -curl -v -H "Authorization: $ARGO_TOKEN" -H "Host: argo.server" http://35.202.107.80/api/v1/workflows/argo +# run below to test the connection +curl -H "Authorization: $ARGO_TOKEN" -H "Host: argo.server" http://35.202.107.80/api/v1/workflows/argo + +# should return http status 200 and output below: +# {"metadata":{"resourceVersion":"25084184"},"items":null} ``` **Obtain access token for service-account "workflow"** @@ -467,9 +527,10 @@ ARGO_TOKEN="Bearer $(kubectl -n n1 get secret $SECRET -o=jsonpath='{.data.token} **Service Account: guest** -Organization needs a service account *guest*; if exposing *workflow* via by REST API. +Organization needs a service account *guest*; if exposing *workflow* via by REST API. Notice that if *argo* is re-installed +(e.g. via *helm uninstall*), the access token of all previous service accounts "workflow" and "guest" will be gone. -*Org1 create ARGO_TOKEN* +*Org1 create ARGO_TOKEN used by Org2* ```shell script # CREATE SERVICE ACCOUNT "org2.net". This SA is used for inter-organization workflow, via Events @@ -482,6 +543,11 @@ ARGO_TOKEN="Bearer $(kubectl -n n1 get secret $SECRET -o=jsonpath='{.data.token} *OrgX create secret for Org1 ARGO_TOKEN in n2* ```shell script +# Optional step +# if there is pre-existing guest token in org2, remove it +# kubectl -n n2 delete secret org1.net-guest-token + +# NOTE: this is service-account "guest" (not "workflow") created by org1 kubectl -n n2 create secret generic org1.net-guest-token --from-literal=ARGO_TOKEN="$ARGO_TOKEN" ``` @@ -510,8 +576,8 @@ organization. # E.g. inside bootstrapping script. # helm template ../argo-app --set ns=n1,path=argo-wf,target=dev-0.1,rel=argo-org1,file=values-org1.yaml | argocd app create -f - -# Test the deployed templates, e.g. "simple-echo" -argo -n n1 submit argo-wf/test/xxxx.test.yaml +# ONLY AFTER bootstrapping script is executed succesfully, you can test the deployed templates, e.g. "simple-echo" +# argo -n n1 submit argo-wf/test/xxxx.test.yaml ``` There will be no direct response of event execution; which will be the request on queue. @@ -523,8 +589,11 @@ Instead, use `kubectl -n n1 logs simple-echo-xxxxx -c main` for the result. # Deploy WorkflowEventBinding, for use by Argo server REST API kubectl -n n1 apply -f argo/eventbinding.yaml +# Similarly, ONLY AFTER bootstrapping script is executed succesfully, # run smoke test for REST api. Beforehand, make sure env variable ARGO_TOKEN is set for service account "guest" -curl http://argo.server/api/v1/events/n1/my-discriminator -H "Authorization: $ARGO_TOKEN" -d '{"message": "hello"}' +# SECRET=$(kubectl -n n1 get sa guest -o=jsonpath='{.secrets[0].name}') +# ARGO_TOKEN="Bearer $(kubectl -n n1 get secret $SECRET -o=jsonpath='{.data.token}' | base64 --decode)" +# curl http://argo.server/api/v1/events/n1/my-discriminator -H "Authorization: $ARGO_TOKEN" -d '{"message": "hello"}' ``` This enables Argo Events, such that the cross-organization workflow orchrestration is performed. @@ -534,9 +603,15 @@ This enables Argo Events, such that the cross-organization workflow orchrestrati - See [source of manifest](https://github.com/fai555/istio-eck-fluent-bit) ```shell script -kubectl apply -f https://download.elastic.co/downloads/eck/1.3.0/all-in-one.yaml - kubectl create namespace logging + +# Optional Step +# kubectl delete -f https://download.elastic.co/downloads/eck/1.3.0/all-in-one.yaml +# kubectl delete -f logging/service-account.yaml +# kubectl delete -f logging/fluentbit-cm.yaml +# kubectl delete -f logging/ds.yaml + +kubectl apply -f https://download.elastic.co/downloads/eck/1.3.0/all-in-one.yaml kubectl create -f logging/service-account.yaml kubectl create -f logging/fluentbit-cm.yaml kubectl create -f logging/ds.yaml @@ -549,7 +624,7 @@ kubectl get secret elastic-istio-es-elastic-user -n logging -o=jsonpath='{.data Kibana is using self-signed cert. -### External chaincode container +### (Out-of-dated) External chaincode container To remove the shortcoming of DockerInDocker chaincode, here uses the external chaincode, which requires v2.0+. See [Fabric Documentation](https://hyperledger-fabric.readthedocs.io/en/latest/cc_launcher.html) @@ -577,6 +652,12 @@ volume claims. ./recreate-pvc.sh org1 ./recreate-pvc.sh org2 +# Step 3: Optional Step +# In org1, remove service-account guest of other organization +# This step is required only if org1 wants to remove the service-account used by other organization +kubectl -n n1 delete -f ./argo/service-account-guest.yaml + +# Step 4: Optional Step # just in case, remove istio objects. If you want to re-run installation of the same cluster, unnecessarily removing istio object # kubectl -n n0 delete -f networking/istio-n0.yaml # kubectl -n n1 delete -f networking/istio-n1.yaml @@ -735,7 +816,8 @@ curl -d '{"spec":"grpc=debug:debug"}' -H "Content-Type: application/json" -X PUT - [logging istio + efk](https://medium.com/intelligentmachines/centralised-logging-for-istio-1-5-with-eck-elastic-cloud-on-kubernetes-and-fluent-bit-680db15af1e2) - [logging istio + efk (src)](https://github.com/fai555/istio-eck-fluent-bit) - [fluentbit](https://medium.com/swlh/fluentbit-stream-processing-with-kubernetes-plugin-caefffd9f9e4) -https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-tls-certificates.html#k8s-setting-up-your-own-certificate +- [setup tls for elastic](https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-tls-certificates.html#k8s-setting-up-your-own-certificate) +- [Upgrade Istio](https://cloud.google.com/istio/docs/istio-on-gke/upgrade-with-operator) ### TODO **Sops commit hook** @@ -766,3 +848,7 @@ This is unfinished part, to use Istio to add TLS support, for both *Argo* and *A # testing code. Not working. helm template workflow/secrets -f workflow/secrets/values-istio-org1.yaml | argo -n $NS1 submit - --wait ``` + +```shell +gcloud beta container --project "fdi-cd" clusters create "dev-core-c" --zone "us-central1-c" --no-enable-basic-auth --cluster-version "1.18.12-gke.1200" --release-channel "rapid" --machine-type "n1-standard-4" --image-type "COS" --disk-type "pd-standard" --disk-size "100" --metadata disable-legacy-endpoints=true --scopes "https://www.googleapis.com/auth/cloud-platform" --preemptible --num-nodes "1" --no-enable-stackdriver-kubernetes --enable-ip-alias --network "projects/fdi-cd/global/networks/fdi-core" --subnetwork "projects/fdi-cd/regions/us-central1/subnetworks/org0msp" --default-max-pods-per-node "110" --no-enable-master-authorized-networks --addons HorizontalPodAutoscaling,HttpLoadBalancing,Istio --istio-config auth=MTLS_PERMISSIVE --enable-autoupgrade --enable-autorepair --max-surge-upgrade 1 --max-unavailable-upgrade 0 --no-shielded-integrity-monitoring +``` diff --git a/docs/NEW_GKE.md b/docs/NEW_GKE.md new file mode 100644 index 0000000..63536e6 --- /dev/null +++ b/docs/NEW_GKE.md @@ -0,0 +1,9 @@ +## INSTRUCTION FOR USING NEW GKE + +### Install GKE v1.18 +```shell +gcloud beta container --project "fdi-cd" clusters create "dev-core-b" --zone "us-central1-c" --no-enable-basic-auth --cluster-version "1.18.12-gke.1200" --release-channel "rapid" --machine-type "n1-standard-4" --image-type "COS" --disk-type "pd-standard" --disk-size "100" --metadata disable-legacy-endpoints=true --scopes "https://www.googleapis.com/auth/cloud-platform" --preemptible --num-nodes "1" --enable-stackdriver-kubernetes --enable-ip-alias --network "projects/fdi-cd/global/networks/fdi-core" --subnetwork "projects/fdi-cd/regions/us-central1/subnetworks/org0msp" --default-max-pods-per-node "110" --no-enable-master-authorized-networks --addons HorizontalPodAutoscaling,HttpLoadBalancing,Istio --istio-config auth=MTLS_PERMISSIVE --enable-autoupgrade --enable-autorepair --max-surge-upgrade 1 --max-unavailable-upgrade 0 --no-shielded-integrity-monitoring +``` + +### Upgrade from v1.14 to v1.16 +See https://cloud.google.com/istio/docs/istio-on-gke/upgrade-with-operator diff --git a/doc/PRODUCTION.md b/docs/PRODUCTION.md similarity index 100% rename from doc/PRODUCTION.md rename to docs/PRODUCTION.md diff --git a/docs/RELEASE.md b/docs/RELEASE.md new file mode 100644 index 0000000..e69de29 diff --git a/gupload/.helmignore b/gupload/.helmignore deleted file mode 100644 index 645373b..0000000 --- a/gupload/.helmignore +++ /dev/null @@ -1,27 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj - -# OWNERS file for Helm repository -OWNERS - -# Test files -tests diff --git a/gw-org/.sops.yaml b/gw-org/.sops.yaml new file mode 100644 index 0000000..a36e47a --- /dev/null +++ b/gw-org/.sops.yaml @@ -0,0 +1,2 @@ +creation_rules: + - gcp_kms: projects/fdi-cd/locations/us-central1/keyRings/fdi/cryptoKeys/sops-key diff --git a/gw-org/Chart.yaml b/gw-org/Chart.yaml new file mode 100644 index 0000000..9441709 --- /dev/null +++ b/gw-org/Chart.yaml @@ -0,0 +1,10 @@ +apiVersion: v2 +# appVersion = RELEASE TARGET +appVersion: 0.7.1 +description: chart for gw-org +name: gw-org +sources: + - https://github.com/rtang03/fabric-cd +version: 1.0.0 +maintainers: + - name: Ross Tang diff --git a/gw-org/sec.org1.example.yaml b/gw-org/sec.org1.example.yaml new file mode 100644 index 0000000..9f492d2 --- /dev/null +++ b/gw-org/sec.org1.example.yaml @@ -0,0 +1,8 @@ +# orgAdmin credentials +config: + orgadmin: YWRtaW4tcGVlcjAub3JnMS5uZXQ= + orgadminpw: YWRtaW4tcGVlcjAub3JnMS5uZXRQVw== +# connection profile +connection: + caEnrollId: cmNhMS1hZG1pbg== + caEnrollSecret: cmNhMS1hZG1pblBX diff --git a/gw-org/sec.org2.example.yaml b/gw-org/sec.org2.example.yaml new file mode 100644 index 0000000..317ad67 --- /dev/null +++ b/gw-org/sec.org2.example.yaml @@ -0,0 +1,8 @@ +# orgAdmin credentials +config: + orgadmin: YWRtaW4tcGVlcjAub3JnMi5uZXQ= + orgadminpw: YWRtaW4tcGVlcjAub3JnMi5uZXRQVw== +# connection profile +connection: + caEnrollId: cmNhMi1hZG1pbg== + caEnrollSecret: cmNhMi1hZG1pblBX diff --git a/gw-org/secrets.org1.yaml b/gw-org/secrets.org1.yaml new file mode 100644 index 0000000..9739d3a --- /dev/null +++ b/gw-org/secrets.org1.yaml @@ -0,0 +1,19 @@ +config: + orgadmin: ENC[AES256_GCM,data:hJ5TvHPFTOkfOdIZADLIh/nQ/SFQXeoMBdXUOw==,iv:GAQvmRje11x1+muGTH8IiwvxUejQR5lFNwD6Qgl6jRg=,tag:75lZt9d2plY+ZcbFCB5XGw==,type:str] + orgadminpw: ENC[AES256_GCM,data:ScoiEE0uXEOWyMIO3gXD5FGe8GZnwlfUzQYbDbmmZkM=,iv:4Lxf4HEO1N73G9REfTNAPbfA4mEMO64q4pDpH7WxAx4=,tag:RW9xfv/rLr4KQyzD4Y2o5A==,type:str] +connection: + caEnrollId: ENC[AES256_GCM,data:43kuHXO7INuY5w7YcYp8bA==,iv:GqU98Gfo8k/z8WNVe1ztc2JT2RzRat971ZUnwgNOU6E=,tag:S3tHHiogPH92pkL7JP1dxg==,type:str] + caEnrollSecret: ENC[AES256_GCM,data:DmI9b81BQ/VnKJ8RB6UNJQ==,iv:k8xJA/1ETctsFnsJ49FSASMxn7WDEBIyFF0/Q5bw43g=,tag:bh1B4WIblo8/VuQgFVhNdw==,type:str] +sops: + kms: [] + gcp_kms: + - resource_id: projects/fdi-cd/locations/us-central1/keyRings/fdi/cryptoKeys/sops-key + created_at: '2020-12-14T14:37:26Z' + enc: CiQAkTrCx2rY9m4OMgj33tDmTt3wGg+T86xhWSN2eiBwUrjMqYYSSQCRJBjumq5FcX1HqMHP5yv5UM4Pp3lWNnrt9iUgNYQNxOdNbity+wlKMOA6xgrFLXiEEHiDNf2orWG4muCr3oF0u/p2qWE1/Xw= + azure_kv: [] + hc_vault: [] + lastmodified: '2020-12-14T14:37:28Z' + mac: ENC[AES256_GCM,data:TIwdJKDrrCXMfcDdgfUtCMyhyPKAv4xtB58n1IvEN1hgq31xYaBHbFWkSo9QFIc/3Govjg63+vbaHdiGJ49T1IUfddhUHo46rRLQP9ReccctqBu3f4TKkAq+C5yifZkidwg6XO1eZMJyWIyiqH0i1mNJG/ABY9qVJ8IORbQGsd4=,iv:gKoePydua/5MnEpFSOphpEQaEKLLTB80173gpI50QWQ=,tag:pl61uQDdDdh1h8KyA0UFAQ==,type:str] + pgp: [] + unencrypted_suffix: _unencrypted + version: 3.6.1 diff --git a/gw-org/secrets.org2.yaml b/gw-org/secrets.org2.yaml new file mode 100644 index 0000000..c5fa3ff --- /dev/null +++ b/gw-org/secrets.org2.yaml @@ -0,0 +1,19 @@ +config: + orgadmin: ENC[AES256_GCM,data:La+XBuMyMZbSFM3tsnUoQhijAVVCoAv1xcjWqw==,iv:Nos/CoDaZ7/dTT50bhJkI0wiyH+pR9FsDEZBMbCbupQ=,tag:OK2cOtbCUSba6kiNKV5RKA==,type:str] + orgadminpw: ENC[AES256_GCM,data:vmroQtFmtWsZH59ineGQn61vuYhKFqGux9ZKQRiQxHk=,iv:Q0vu08KA15t/DRTN/tOIRoU2AuO/xL6rFcO7XK31r6M=,tag:3AiGgHwk4m3xKkc0j66e9g==,type:str] +connection: + caEnrollId: ENC[AES256_GCM,data:yw1BKjlXLw5yl+nva95CiQ==,iv:gy3joIitGXKi9PZf90N6kqQUes5mI15RNsTF7z+k39U=,tag:azTTdVQYt8OM4UNIYfQ1Lw==,type:str] + caEnrollSecret: ENC[AES256_GCM,data:D3IKfgU3BYNnnfLgChbPrQ==,iv:LdcNeurSFFUflYDI4fPdDghdg5e3WUOa/ILZwqHGbfk=,tag:WTZlF46RChfvGQ968sEYXA==,type:str] +sops: + kms: [] + gcp_kms: + - resource_id: projects/fdi-cd/locations/us-central1/keyRings/fdi/cryptoKeys/sops-key + created_at: '2020-12-14T14:37:39Z' + enc: CiQAkTrCxxRUbHJ895q6sMBE6KzHuP4SwvfdKnx1RJhf4GfqwHgSSACRJBjuBxRmmYtqi6jjD5mFkqe/PPZrP685mxiZdHqa+rEI8+9nlI2xczwgDCqtlVbkr6zWZAV73aLpMk/0bv8DiI9rALnMWg== + azure_kv: [] + hc_vault: [] + lastmodified: '2020-12-14T14:37:40Z' + mac: ENC[AES256_GCM,data:0tRVD38MSNtxJIW2tZ6ibhkV7sycIm+eJ28kiE178T6IfZZpQYO/PrY8G5EbNIP+msTG8xbMt2FXPvMO7HQeMA4UE/rNggqpXzgseMXsGUahzw+IEE/983aM2sAho9p/2al0B7YGWIrLsEwg0HGMnR9iZ39wcy8cUu6YuWw+mJY=,iv:EoYRIMkXWKXtq/ZyTGXO+6MHoJfC4Kwrud9001lM+5Y=,tag:Sc4nT7Fk28cGbzwIxA+j/w==,type:str] + pgp: [] + unencrypted_suffix: _unencrypted + version: 3.6.1 diff --git a/gw-org/templates/_helpers.tpl b/gw-org/templates/_helpers.tpl new file mode 100644 index 0000000..ce4eb7c --- /dev/null +++ b/gw-org/templates/_helpers.tpl @@ -0,0 +1,47 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "gw-org.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "gw-org.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "gw-org.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- /* +Credit: @technosophos +https://github.com/technosophos/common-chart/ +labels.standard prints the standard Helm labels. +The standard labels are frequently used in metadata. +*/ -}} +{{- define "labels.standard" -}} +app: {{ include "gw-org.name" . }} +heritage: {{ .Release.Service | quote }} +release: {{ .Release.Name | quote }} +chart: {{ include "gw-org.chart" . }} +namespace: {{ .Release.Namespace }} +version: {{ .Chart.AppVersion }} +{{- end -}} diff --git a/gw-org/templates/configmap--ccp.yaml b/gw-org/templates/configmap--ccp.yaml new file mode 100644 index 0000000..cc72864 --- /dev/null +++ b/gw-org/templates/configmap--ccp.yaml @@ -0,0 +1,76 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "gw-org.fullname" . }}--ccp + labels: +{{- include "labels.standard" . | nindent 4 }} +data: + connection.yaml: | + name: test-net_openplatform + version: 1.0.0 + client: + organization: {{ .Values.global.mspId }} + connection: + timeout: + peer: + endorser: '300' + channels: + {{ .Values.connection.channelName }}: + orderers: + {{- range .Values.connection.orderers }} + - {{ .name }} + {{- end }} + peers: + {{- range .Values.connection.peers }} + {{ .name }}: + endorsingPeer: true + chaincodeQuery: true + ledgerQuery: true + eventSource: true + {{- end }} + chaincodes: + - eventstore + organizations: + {{ .Values.global.mspId }}: + mspid: {{ .Values.global.mspId }} + peers: + {{- range .Values.connection.peers }} + - {{ .name }} + {{- end }} + certificateAuthorities: + - {{ .Values.connection.ca.name }} + adminPrivateKey: + path: /tmp/org1.net-admin-key.pem + signedCert: + path: /tmp/org1.net-admin-cert.pem + orderers: + {{- range .Values.connection.orderers }} + {{ .name }}: + url: grpcs://{{ .url }} + grpcOptions: + ssl-target-name-override: {{ .grpcOptions.nameOverride }} + tlsCACerts: + path: {{ $.Values.connection.ordererCa }} + {{- end }} + peers: + {{- range .Values.connection.peers }} + {{ .name }}: + url: grpcs://{{ .url }} + eventUrl: grpcs://{{ .eventUrl }} + tlsCACerts: + path: {{ .tlscacert }} + grpcOptions: + ssl-target-name-override: {{ .grpcOptions.nameOverride }} + {{- end }} + certificateAuthorities: + {{ .Values.connection.ca.name }}: + url: http://{{ .Values.connection.ca.url }} + caName: {{ .Values.connection.ca.name }} + tlsCACerts: + path: {{ .Values.connection.ca.tlscacerts.path | quote }} + registrar: + - enrollId: {{ .Values.connection.registrar.enrollId }} + enrollSecret: {{ .Values.connection.registrar.enrollSecret }} + httpOptions: + verify: false + diff --git a/gw-org/templates/configmap.yaml b/gw-org/templates/configmap.yaml new file mode 100644 index 0000000..7d575f1 --- /dev/null +++ b/gw-org/templates/configmap.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "gw-org.fullname" . }} + labels: +{{- include "labels.standard" . | nindent 4 }} +data: + AUTHORIZATION_SERVER_URI: "http://{{ .Values.config.authServerUri }}/oauth/authenticate" + CA_NAME: {{ .Values.connection.ca.name | quote }} + CHANNEL_NAME: "loanapp" + CONNECTION_PROFILE: "/etc/hyperledger/fabric/connection.yaml" + GATEWAY_HOST: {{ .Values.config.gatewayHost | quote }} + LOG_LEVEL: {{ .Values.global.logging | quote }} + LOG_TARGET: "console" + MSPID: "Org1MSP" + # used by model-organization + ORGNAME: "org1.net" + ORG_CA_URL: {{ .Values.connection.ca.url | quote }} + # used by model-organization + ORGURL: "http://localhost:4001/graphql" + # redundant + QUERY_PORT: "5001" + # redundant + REDIS_HOST: {{ .Values.config.redisHost | quote }} + REDIS_PORT: "6379" + REMOTE_URI: "http://gw-org2:4001/graphql\ http://gw-org3:4001/graphql" + WALLET: /var/hyperledger/crypto-config/{{ .Values.global.mspId }}/{{ .Values.config.gatewayHost }} diff --git a/gw-org/templates/deployment.yaml b/gw-org/templates/deployment.yaml new file mode 100644 index 0000000..066d1ac --- /dev/null +++ b/gw-org/templates/deployment.yaml @@ -0,0 +1,132 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "gw-org.fullname" . }} + labels: +{{- include "labels.standard" . | nindent 4 }} +spec: + replicas: 1 + selector: + matchLabels: + app: {{ include "gw-org.name" . }} + release: {{ .Release.Name }} + strategy: + rollingUpdate: + maxUnavailable: 1 + template: + metadata: + annotations: + sidecar.istio.io/proxyCPU: "10m" + sidecar.istio.io/proxyCPULimit: "50m" + sidecar.istio.io/rewriteAppHTTPProbers: "false" + # trace|debug|info|warning|error|critical|off + sidecar.istio.io/logLevel: "info" + labels: +{{ include "labels.standard" . | indent 8 }} + spec: + hostAliases: + {{- range .Values.hostAlias }} + - hostnames: + {{- range .hostnames }} + - {{ . }} + {{- end }} + ip: {{ .ip }} + {{- end }} + volumes: + - name: data + persistentVolumeClaim: + claimName: {{ .Values.persistence.pvcName }} + - name: connection-yaml + configMap: + name: {{ include "gw-org.fullname" . }}--ccp + items: + - key: connection.yaml + path: connection.yaml + {{- range .Values.secrets }} + - name: {{ .name }} + secret: + secretName: {{ .secretName }} + {{- end }} + initContainers: + - name: wait + image: jwilder/dockerize + imagePullPolicy: IfNotPresent + envFrom: + - configMapRef: + name: {{ include "gw-org.fullname" . }} + command: ["sh", "-c"] + volumeMounts: + - mountPath: /var/hyperledger + name: data + args: + - |- + set -x + if [-d "$WALLET" ]; then + echo "Wallet exists" + else + mkdir -p $WALLET + fi + {{- range .Values.connection.peers }} + dockerize -wait tcp://{{ .healthz }} -timeout 60s && echo "peer {{ .healthz }} is ready" + {{- end }} + dockerize -wait tcp://$REDIS_HOST:$REDIS_PORT -timeout 60s && echo "redis $REDIS_HOST:$REDIS_PORT is ready" + dockerize -wait tcp://{{ .Values.config.authServerUri }} -timeout 60s && echo "auth-server {{ .Values.config.authServerUri }} is ready" + containers: + - name: main + image: {{ .Values.image.repository }}:{{ .Values.image.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - containerPort: 4001 + protocol: TCP + name: http + - containerPort: 5001 + protocol: TCP + name: http-qh + envFrom: + - configMapRef: + name: {{ include "gw-org.fullname" . }} + - secretRef: + name: {{ include "gw-org.fullname" . }} + livenessProbe: + successThreshold: 1 + failureThreshold: 3 + httpGet: + scheme: HTTP + path: /healthcheck + port: 4001 + initialDelaySeconds: 60 + periodSeconds: 15 + readinessProbe: + successThreshold: 1 + failureThreshold: 3 + httpGet: + scheme: HTTP + path: /healthcheck + port: 4001 + initialDelaySeconds: 60 + periodSeconds: 15 + volumeMounts: + - mountPath: /var/hyperledger + name: data + - mountPath: /etc/hyperledger/fabric/connection.yaml + name: connection-yaml + subPath: connection.yaml + {{- range .Values.secrets }} + - mountPath: {{ .mountPath }} + name: {{ .name }} + subPath: {{ .subPath }} + {{- end }} + resources: +{{ toYaml .Values.resources | indent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/gw-org/templates/sec.yaml b/gw-org/templates/sec.yaml new file mode 100644 index 0000000..250c6cb --- /dev/null +++ b/gw-org/templates/sec.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "gw-org.fullname" . }} + labels: +{{- include "labels.standard" . | nindent 4 }} +type: Opaque +data: + ORG_ADMIN_ID: {{ $.Values.config.orgadmin }} + ORG_ADMIN_SECRET: {{ $.Values.config.orgadminpw }} + CA_ENROLLMENT_ID_ADMIN: {{ $.Values.connection.caEnrollId }} + CA_ENROLLMENT_SECRET_ADMIN: {{ $.Values.connection.caEnrollSecret }} diff --git a/gw-org/templates/service.yaml b/gw-org/templates/service.yaml new file mode 100644 index 0000000..e4bfeb9 --- /dev/null +++ b/gw-org/templates/service.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "gw-org.fullname" . }} + labels: +{{ include "labels.standard" . | indent 4 }} +spec: + type: ClusterIP + ports: + - port: 4001 + targetPort: 4001 + protocol: TCP + name: http-request + - port: 5001 + targetPort: 5001 + protocol: TCP + name: http-qh + selector: + app: {{ include "gw-org.name" . }} + release: {{ .Release.Name }} diff --git a/gw-org/templates/virtual-service.yaml b/gw-org/templates/virtual-service.yaml new file mode 100644 index 0000000..39b58a3 --- /dev/null +++ b/gw-org/templates/virtual-service.yaml @@ -0,0 +1,19 @@ +apiVersion: networking.istio.io/v1alpha3 +kind: VirtualService +metadata: + name: {{ include "gw-org.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: +{{ include "labels.standard" . | indent 4 }} +spec: + hosts: + - gw.{{ .Values.global.domain }} + - {{ include "gw-org.fullname" . }} + gateways: + - {{ .Values.global.istiogateway }} + http: + - route: + - destination: + host: {{ include "gw-org.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local + port: + number: 4001 diff --git a/gw-org/values-org1.yaml b/gw-org/values-org1.yaml new file mode 100644 index 0000000..86f1d81 --- /dev/null +++ b/gw-org/values-org1.yaml @@ -0,0 +1,117 @@ +global: + TZ: Asia/Hong_Kong + mspId: Org1MSP + workingDir: /home/app + # info | debug + logging: info + domain: org1.net + istiogateway: p0o1-gateway + istiogatewayPort: 15443 + +image: + repository: ghcr.io/rtang03/gw-org1 + tag: 0.7.1 + pullPolicy: IfNotPresent + +hostAlias: + - hostnames: + - orderer0.org0.com + - orderer1.org0.com + - orderer2.org0.com + - orderer3.org0.com + - orderer4.org0.com + - peer0.org1.net + ip: 35.202.107.80 + - hostnames: + - peer0.org2.net + ip: 35.202.107.80 + +persistence: + ### Default + # annotations: {} + ### Default + # accessMode: ReadWriteOnce + ### Default + # enabled: true + pvcName: pvc-p0o1 + +config: + orgAdmin: admin-peer0.org1.net + orgAdminSecret: admin-peer0.org1.netPW + gatewayHost: localhost + redisHost: redis1 + packageName: gw-org1 + authServerUri: auth-server1:8080 + +connection: + registrar: + enrollId: rca1-admin + enrollSecret: rca1-adminPW + ca: + name: rca1 + url: rca1-hlf-ca:7054 + tlscacerts: + path: /tmp/org1.net-tlscacert.pem + channelName: loanapp + ordererCa: /tmp/org0.com-tlscacert.pem + peers: + - name: peer0 + healthz: p0o1-hlf-peer:80 + url: p0o1-hlf-peer:7051 + eventUrl: p0o1-hlf-peer:7053 + grpcOptions: + nameOverride: p0o1-hlf-peer + tlscacert: /tmp/org1.net-tlscacert.pem + orderers: + - name: orderer0 + url: orderer0.org0.com:15443 + grpcOptions: + nameOverride: orderer0.org0.com + - name: orderer1 + url: orderer1.org0.com:15443 + grpcOptions: + nameOverride: orderer1.org0.com + - name: orderer2 + url: orderer2.org0.com:15443 + grpcOptions: + nameOverride: orderer2.org0.com + - name: orderer3 + url: orderer3.org0.com:15443 + grpcOptions: + nameOverride: orderer3.org0.com + - name: orderer4 + url: orderer4.org0.com:15443 + grpcOptions: + nameOverride: orderer4.org0.com + +secrets: + - name: org0-tlscacert + secretName: org0.com-tlscacert + mountPath: /tmp/org0.com-tlscacert.pem + subPath: tlscacert.pem + - name: org1-tlscacert + secretName: org1.net-tlscacert + mountPath: /tmp/org1.net-tlscacert.pem + subPath: tlscacert.pem + - name: admin-cert + secretName: peer0.org1.net-admincert + mountPath: /tmp/org1.net-admin-cert.pem + subPath: org1.net-admin-cert.pem + - name: admin-key + secretName: peer0.org1.net-adminkey + mountPath: /tmp/org1.net-admin-key.pem + subPath: org1.net-admin-key.pem + +resources: + limits: + cpu: 1000m + memory: 1536Mi + requests: + cpu: 50m + memory: 1024Mi + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/gw-org/values-org2.yaml b/gw-org/values-org2.yaml new file mode 100644 index 0000000..5851c93 --- /dev/null +++ b/gw-org/values-org2.yaml @@ -0,0 +1,117 @@ +global: + TZ: Asia/Hong_Kong + mspId: Org2MSP + workingDir: /home/app + # info | debug + logging: info + domain: org2.net + istiogateway: p0o2-gateway + istiogatewayPort: 15443 + +image: + repository: ghcr.io/rtang03/gw-org2 + tag: 0.7.1 + pullPolicy: IfNotPresent + +hostAlias: + - hostnames: + - orderer0.org0.com + - orderer1.org0.com + - orderer2.org0.com + - orderer3.org0.com + - orderer4.org0.com + - peer0.org1.net + ip: 35.202.107.80 + - hostnames: + - peer0.org2.net + ip: 35.202.107.80 + +persistence: + ### Default + # annotations: {} + ### Default + # accessMode: ReadWriteOnce + ### Default + # enabled: true + pvcName: pvc-p0o2 + +config: + orgAdmin: admin-peer0.org2.net + orgAdminSecret: admin-peer0.org2.netPW + gatewayHost: gw-org2 + redisHost: redis2 + packageName: gw-org2 + authServerUri: auth-server2:8080 + +connection: + registrar: + enrollId: rca2-admin + enrollSecret: rca2-adminPW + ca: + name: rca2 + url: rca2-hlf-ca:7054 + tlscacerts: + path: /tmp/org2.net-tlscacert.pem + channelName: loanapp + ordererCa: /tmp/org0.com-tlscacert.pem + peers: + - name: peer0 + healthz: p0o2-hlf-peer:80 + url: p0o2-hlf-peer:7051 + eventUrl: p0o2-hlf-peer:7053 + grpcOptions: + nameOverride: p0o2-hlf-peer + tlscacert: /tmp/org2.net-tlscacert.pem + orderers: + - name: orderer0 + url: orderer0.org0.com:15443 + grpcOptions: + nameOverride: orderer0.org0.com + - name: orderer1 + url: orderer1.org0.com:15443 + grpcOptions: + nameOverride: orderer1.org0.com + - name: orderer2 + url: orderer2.org0.com:15443 + grpcOptions: + nameOverride: orderer2.org0.com + - name: orderer3 + url: orderer3.org0.com:15443 + grpcOptions: + nameOverride: orderer3.org0.com + - name: orderer4 + url: orderer4.org0.com:15443 + grpcOptions: + nameOverride: orderer4.org0.com + +secrets: + - name: org0-tlscacert + secretName: org0.com-tlscacert + mountPath: /tmp/org0.com-tlscacert.pem + subPath: tlscacert.pem + - name: org1-tlscacert + secretName: org1.net-tlscacert + mountPath: /tmp/org1.net-tlscacert.pem + subPath: tlscacert.pem + - name: admin-cert + secretName: peer0.org2.net-admincert + mountPath: /tmp/org2.net-admin-cert.pem + subPath: org2.net-admin-cert.pem + - name: admin-key + secretName: peer0.org2.net-adminkey + mountPath: /tmp/org2.net-admin-key.pem + subPath: org2.net-admin-key.pem + +resources: + limits: + cpu: 1000m + memory: 1536Mi + requests: + cpu: 50m + memory: 1024Mi + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/gw-org/values.yaml b/gw-org/values.yaml new file mode 100644 index 0000000..fa152b0 --- /dev/null +++ b/gw-org/values.yaml @@ -0,0 +1,117 @@ +global: + TZ: Asia/Hong_Kong + mspId: Org0MSP + workingDir: /home/app + # info | debug + logging: info + domain: org1.net + istiogateway: p0o1-gateway + istiogatewayPort: 15443 + +image: + repository: ghcr.io/rtang03/gw-org1 + tag: 0.7.1 + pullPolicy: IfNotPresent + +hostAlias: + - hostnames: + - orderer0.org0.com + - orderer1.org0.com + - orderer2.org0.com + - orderer3.org0.com + - orderer4.org0.com + - peer0.org1.net + ip: 35.202.107.80 + - hostnames: + - peer0.org2.net + ip: 35.202.107.80 + +persistence: + ### Default + # annotations: {} + ### Default + # accessMode: ReadWriteOnce + ### Default + # enabled: true + pvcName: pvc-p0o1 + +config: + orgAdmin: admin-peer0.org1.net + orgAdminSecret: admin-peer0.org1.netPW + gatewayHost: gw-org1 + redisHost: redis1 + packageName: gw-org1 + authServerUri: auth-server1:8080 + +connection: + registrar: + enrollId: rca1-admin + enrollSecret: rca1-adminPW + ca: + name: rca1 + url: rca1-hlf-ca:7054 + tlscacerts: + path: /tmp/org1.net-tlscacert.pem + channelName: loanapp + ordererCa: /tmp/org0.com-tlscacert.pem + peers: + - name: peer0 + healthz: p0o1-hlf-peer:80 + url: p0o1-hlf-peer:7051 + eventUrl: p0o1-hlf-peer:7053 + grpcOptions: + nameOverride: p0o1-hlf-peer + tlscacert: /tmp/org1.net-tlscacert.pem + orderers: + - name: orderer0 + url: orderer0.org0.com:15443 + grpcOptions: + nameOverride: orderer0.org0.com + - name: orderer1 + url: orderer1.org0.com:15443 + grpcOptions: + nameOverride: orderer1.org0.com + - name: orderer2 + url: orderer2.org0.com:15443 + grpcOptions: + nameOverride: orderer2.org0.com + - name: orderer3 + url: orderer3.org0.com:15443 + grpcOptions: + nameOverride: orderer3.org0.com + - name: orderer4 + url: orderer4.org0.com:15443 + grpcOptions: + nameOverride: orderer4.org0.com + +secrets: + - name: org0-tlscacert + secretName: org0.com-tlscacert + mountPath: /tmp/org0.com-tlscacert.pem + subPath: tlscacert.pem + - name: org1-tlscacert + secretName: org1.net-tlscacert + mountPath: /tmp/org1.net-tlscacert.pem + subPath: tlscacert.pem + - name: admin-cert + secretName: peer0.org1.net-admincert + mountPath: /tmp/org1.net-admin-cert.pem + subPath: org1.net-admin-cert.pem + - name: admin-key + secretName: peer0.org1.net-adminkey + mountPath: /tmp/org1.net-admin-key.pem + subPath: org1.net-admin-key.pem + +resources: + limits: + cpu: 1000m + memory: 1280Mi + requests: + cpu: 50m + memory: 512Mi + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/hlf-ca/secrets.org1.example.yaml b/hlf-ca/sec.org1.example.yaml similarity index 100% rename from hlf-ca/secrets.org1.example.yaml rename to hlf-ca/sec.org1.example.yaml diff --git a/hlf-ca/secrets.org2.example.yaml b/hlf-ca/sec.org2.example.yaml similarity index 100% rename from hlf-ca/secrets.org2.example.yaml rename to hlf-ca/sec.org2.example.yaml diff --git a/hlf-ca/templates/configmap--config.yaml b/hlf-ca/templates/configmap--config.yaml index 0ae7349..7e338b7 100644 --- a/hlf-ca/templates/configmap--config.yaml +++ b/hlf-ca/templates/configmap--config.yaml @@ -253,12 +253,8 @@ data: - localhost # K8S Service - {{ include "hlf-ca.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local - {{- if .Values.ingress.enabled }} - # Ingresses - {{- range .Values.ingress.hosts }} - - {{ . }} - {{- end }} - {{- end }} + # NOTE: If exposing to external network, here removes the ingress section, because it is replaced by Istio + # In future, it may add host, provided Istio ca: expiry: 131400h pathlength: {{ .Values.config.csr.ca.pathlength}} diff --git a/hlf-ca/templates/deployment.yaml b/hlf-ca/templates/deployment.yaml index 02e4453..9899a6a 100644 --- a/hlf-ca/templates/deployment.yaml +++ b/hlf-ca/templates/deployment.yaml @@ -17,7 +17,7 @@ spec: metadata: annotations: sidecar.istio.io/proxyCPU: "10m" - sidecar.istio.io/proxyCPULimit: "50m" + sidecar.istio.io/proxyCPULimit: "100m" sidecar.istio.io/rewriteAppHTTPProbers: "false" # trace|debug|info|warning|error|critical|off sidecar.istio.io/logLevel: "info" @@ -32,11 +32,6 @@ spec: {{- else }} emptyDir: {} {{- end }} - {{- if (and .Values.config.mountTLS .Values.ingress.tls) }} - - name: tls-secret - secret: - secretName: {{ (index .Values.ingress.tls 0).secretName }} - {{- end }} - name: ca-config configMap: name: {{ include "hlf-ca.fullname" . }}--config @@ -142,11 +137,6 @@ spec: - name: ca-config readOnly: true mountPath: /var/hyperledger/ca_config - {{- if (and .Values.config.mountTLS .Values.ingress.tls) }} - - name: tls-secret - readOnly: true - mountPath: /var/hyperledger/tls/secret - {{- end }} resources: {{ toYaml .Values.resources | indent 12 }} {{- with .Values.nodeSelector }} @@ -160,4 +150,4 @@ spec: {{- with .Values.tolerations }} tolerations: {{ toYaml . | indent 8 }} - {{- end }} + {{- end }} diff --git a/hlf-ca/values-rca0.yaml b/hlf-ca/values-rca0.yaml index 7b386d9..646340c 100644 --- a/hlf-ca/values-rca0.yaml +++ b/hlf-ca/values-rca0.yaml @@ -38,14 +38,6 @@ config: # port: 7054 ## Affiliations used in ca Server configuration file -ingress: - enabled: false - annotations: {} - path: / - hosts: - - rca0 - tls: [] - persistence: ### Default # enabled: true diff --git a/hlf-ca/values-tlsca0.yaml b/hlf-ca/values-tlsca0.yaml index 54a12bf..22cb500 100644 --- a/hlf-ca/values-tlsca0.yaml +++ b/hlf-ca/values-tlsca0.yaml @@ -38,14 +38,6 @@ config: # port: 7054 ## Affiliations used in ca Server configuration file -ingress: - enabled: false - annotations: {} - path: / - hosts: - - tlsca0 - tls: [] - persistence: ### Default # enabled: true diff --git a/hlf-ca/values.yaml b/hlf-ca/values.yaml index ed2c111..bdec79d 100644 --- a/hlf-ca/values.yaml +++ b/hlf-ca/values.yaml @@ -41,24 +41,6 @@ config: ### Affiliations used in ca Server configuration file, in ca.yaml # org1: [] -### Not decided if it requires external network for CA -### Ingress is not properly implemented -ingress: - enabled: false - annotations: {} -# kubernetes.io/ingress.class: "nginx" -# nginx.ingress.kubernetes.io/rewrite-target: / -# nginx.ingress.kubernetes.io/ssl-redirect: "false" - # certmanager.k8s.io/cluster-issuer: "letsencrypt-staging" - path: / - hosts: - - tlsca0 - tls: [] - # secretName is {{ Release.Name }}-tls. For org0, it must be tlsca0-tls -# - secretName: "tlsca0-tls" -# hosts: -# - tlsca0 - persistence: # Always true enabled: true diff --git a/hlf-cc/README.md b/hlf-cc/README.md new file mode 100644 index 0000000..e69de29 diff --git a/hlf-ord/templates/deployment.yaml b/hlf-ord/templates/deployment.yaml index d20321f..f58552d 100644 --- a/hlf-ord/templates/deployment.yaml +++ b/hlf-ord/templates/deployment.yaml @@ -18,7 +18,7 @@ spec: metadata: annotations: sidecar.istio.io/proxyCPU: "10m" - sidecar.istio.io/proxyCPULimit: "50m" + sidecar.istio.io/proxyCPULimit: "100m" sidecar.istio.io/rewriteAppHTTPProbers: "false" # trace|debug|info|warning|error|critical|off sidecar.istio.io/logLevel: "info" diff --git a/hlf-peer/templates/deployment.yaml b/hlf-peer/templates/deployment.yaml index efb9bfd..933b942 100644 --- a/hlf-peer/templates/deployment.yaml +++ b/hlf-peer/templates/deployment.yaml @@ -17,7 +17,7 @@ spec: metadata: annotations: sidecar.istio.io/proxyCPU: "10m" - sidecar.istio.io/proxyCPULimit: "50m" + sidecar.istio.io/proxyCPULimit: "100m" sidecar.istio.io/rewriteAppHTTPProbers: "false" # trace|debug|info|warning|error|critical|off sidecar.istio.io/logLevel: "info" @@ -195,10 +195,6 @@ spec: echo "🚀 peer node start" peer node start envFrom: - {{- if eq .Values.peer.databaseType "CouchDB" }} - - secretRef: - name: {{ .Values.peer.couchdbInstance }}-hlf-couchdb - {{- end }} - configMapRef: name: {{ include "hlf-peer.fullname" . }}--peer volumeMounts: diff --git a/networking/istio-n1.yaml b/networking/istio-n1.yaml index 0683254..7512e16 100644 --- a/networking/istio-n1.yaml +++ b/networking/istio-n1.yaml @@ -16,6 +16,25 @@ spec: - "gupload.org1.net" tls: mode: PASSTHROUGH + - port: + number: 80 + name: http + protocol: HTTP + hosts: + - "web.org1.net" + - "gw.org1.net" + tls: + httpsRedirect: true + - port: + number: 443 + name: https + protocol: HTTPS + tls: + mode: SIMPLE + credentialName: "peer0.org1.net-tls" + hosts: + - "web.org1.net" + - "gw.org1.net" --- apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry diff --git a/networking/istio-n2.yaml b/networking/istio-n2.yaml index 104e73a..6d5f34a 100644 --- a/networking/istio-n2.yaml +++ b/networking/istio-n2.yaml @@ -14,6 +14,8 @@ spec: hosts: - "peer0.org2.net" - "gupload.org2.net" + - "gw.org2.net" + - "web.org2.net" tls: mode: PASSTHROUGH --- diff --git a/networking/istio-n3.yaml b/networking/istio-n3.yaml index b26ae56..02fe4d9 100644 --- a/networking/istio-n3.yaml +++ b/networking/istio-n3.yaml @@ -14,6 +14,8 @@ spec: hosts: - "peer0.org3.net" - "gupload.org3.net" + - "gw.org3.net" + - "web.org3.net" tls: mode: PASSTHROUGH --- diff --git a/orgadmin/secrets.admin0-example.yaml b/orgadmin/sec.admin0-example.yaml similarity index 100% rename from orgadmin/secrets.admin0-example.yaml rename to orgadmin/sec.admin0-example.yaml diff --git a/orgadmin/secrets.admin1-example.yaml b/orgadmin/sec.admin1-example.yaml similarity index 100% rename from orgadmin/secrets.admin1-example.yaml rename to orgadmin/sec.admin1-example.yaml diff --git a/orgadmin/secrets.admin2-example.yaml b/orgadmin/sec.admin2-example.yaml similarity index 100% rename from orgadmin/secrets.admin2-example.yaml rename to orgadmin/sec.admin2-example.yaml diff --git a/orgadmin/values.yaml b/orgadmin/values.yaml index 9a2f98d..1737639 100644 --- a/orgadmin/values.yaml +++ b/orgadmin/values.yaml @@ -67,9 +67,16 @@ postgresql-0: CREATE DATABASE "tls_ca_db"; CREATE DATABASE "rca_db"; CREATE DATABASE "auth_db"; + 2-init-auth-db.sh: | + set -xe + psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "auth_db" <<-EOSQL + CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; + CREATE TABLE IF NOT EXISTS "api_key" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "api_key" text NOT NULL, "client_id" text NOT NULL, "scope" text, CONSTRAINT "PK_b1bd840641b8acbaad89c3d8d11" PRIMARY KEY ("id")); + CREATE TABLE IF NOT EXISTS "oauth_clients" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "application_name" text NOT NULL, "client_secret" text NOT NULL, "redirect_uris" text, "grants" text, "user_id" text, "is_system_app" boolean NOT NULL, CONSTRAINT "PK_c4759172d3431bae6f04e678e0d" PRIMARY KEY ("id")); + CREATE TABLE IF NOT EXISTS "users" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "email" text NOT NULL, "username" text, "password" text NOT NULL, "is_admin" boolean NOT NULL, "is_deleted" boolean, CONSTRAINT "PK_a3ffb1c0c8416b9fc6f907b7433" PRIMARY KEY ("id")); + EOSQL service: type: NodePort - # nodePort: 30432 persistence: enabled: true existingClaim: pvc-org0 diff --git a/redis/secrets.example.org1.yaml b/redis/secrets.example.org1.yaml new file mode 100644 index 0000000..e69de29 diff --git a/redis/secrets.example.org2.yaml b/redis/secrets.example.org2.yaml new file mode 100644 index 0000000..e69de29 diff --git a/redis/secrets.org1.yaml b/redis/secrets.org1.yaml new file mode 100644 index 0000000..e69de29 diff --git a/redis/secrets.org2.yaml b/redis/secrets.org2.yaml new file mode 100644 index 0000000..e69de29 diff --git a/redis/templates/deployment.yaml b/redis/templates/deployment.yaml index bd954ff..e2b5c11 100644 --- a/redis/templates/deployment.yaml +++ b/redis/templates/deployment.yaml @@ -31,19 +31,40 @@ spec: - name: redis image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy | quote }} - command: - - redis-server - - "/redis-master/redis.conf" + # command: + # - redis-server + # - "/redis-master/redis.conf" ports: - containerPort: 6379 protocol: TCP + livenessProbe: + successThreshold: 1 + failureThreshold: 3 + exec: + command: + - redis-cli + - ping + initialDelaySeconds: 30 + timeoutSeconds: 5 + periodSeconds: 15 + readinessProbe: + successThreshold: 1 + failureThreshold: 3 + exec: + command: + - redis-cli + - ping + initialDelaySeconds: 30 + timeoutSeconds: 5 + periodSeconds: 15 resources: {{ toYaml .Values.resources | indent 12 }} volumeMounts: - mountPath: /data name: data - - mountPath: /redis-master + - mountPath: /user/local/etc/redis/redis.conf name: config + subPath: redis.conf volumes: - name: host-sys hostPath: diff --git a/redis/values-org2.yaml b/redis/values-org2.yaml index fd02fa4..8a46477 100644 --- a/redis/values-org2.yaml +++ b/redis/values-org2.yaml @@ -1,2 +1,7 @@ config: maxmemory: 100mb + +persistence: + # alway enabled + enabled: true + pvcName: pvc-redis2 diff --git a/scripts/deploy-gw-ui.orgx.sh b/scripts/deploy-gw-ui.orgx.sh new file mode 100755 index 0000000..a70139c --- /dev/null +++ b/scripts/deploy-gw-ui.orgx.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# $1 = n1 or n2 +# $2 = org1 or org2 or org3 .... etc + +. ./setup.sh +. "env.$2.sh" + +SECONDS=0 + +set -x +argo submit -n $1 ../workflow/aoa-sync-re-au-gw-ui.$1.yaml --watch --request-timeout 300s +res=$? +set +x +printMessage "gw-org redis auth-server ui-control sync" $res + +duration=$SECONDS +printf "${GREEN}$(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed.\n\n${NC}" diff --git a/scripts/env.org1.sh b/scripts/env.org1.sh index 0185148..87b66be 100755 --- a/scripts/env.org1.sh +++ b/scripts/env.org1.sh @@ -29,3 +29,10 @@ REL_RCA1=rca1 REL_TLSCA1=tlsca1 PEER=peer0.org1.net TLSCACERT1=org1.net-tlscacert + +## DEFAULT +ORG=org1 +NS=n1 + +DOMAIN=org1.net +MSPID=Org1MSP diff --git a/scripts/manifest/pvc-redis.n1.yaml b/scripts/manifest/pvc-redis.n1.yaml deleted file mode 100644 index f4e565d..0000000 --- a/scripts/manifest/pvc-redis.n1.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: pvc-redis1 - labels: - app: redis - release: "redis1" - namespace: n1 -spec: - accessModes: - - "ReadWriteOnce" - resources: - requests: - storage: "1Gi" diff --git a/scripts/redis.sh b/scripts/redis.sh deleted file mode 100755 index 83afd44..0000000 --- a/scripts/redis.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash - -. ./setup.sh -. "env.org1.sh" - -SECONDS=0 -# IMPORTANT NOTE: TARGET is the Release Branch. Make sure correct TARGET for each deployment -TARGET=dev-0.2 - -echo "#################################" -echo "### Step 1: Install WorkflowTemplates ($NS1)" -echo "#################################" -set -x -helm template ../argo-app --set ns=$NS1,path=argo-wf,target=$TARGET,rel=argo-template-$ORG1,file=values-$ORG1.yaml | argocd app create -f - -res=$? -set +x -printMessage "install wfTemplate" $res - -set -x -argocd app sync argo-template-$ORG1 -res=$? -set +x -printMessage "app sync" $res - -set -x -argocd app wait argo-template-$ORG1 -res=$? -set +x -printMessage "wait wfTemplate" $res - -echo "#################################" -echo "### Step 2: App-of-apps ($NS1)" -echo "#################################" -set -x -helm template ../argo-app --set ns=argocd,path=app-of-app,target=$TARGET,rel=apps-$ORG1,file=values-redis.yaml | argocd app create -f - -res=$? -set +x -printMessage "install $ORG1 manifests" $res - -echo "#################################" -echo "### Step 3: App sync - $ORG1" -echo "#################################" -set -x -argo submit -n $NS1 ../workflow/sync-redis.n1.yaml --watch --request-timeout 300s -res=$? -set +x -printMessage "submit $ORG1 sync request - part1" $res -checkArgoWfSucceeded "aoa-sync-1" $NS1 - -duration=$SECONDS -printf "${GREEN}$(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed.\n\n${NC}" diff --git a/ui-control/Chart.yaml b/ui-control/Chart.yaml new file mode 100644 index 0000000..3b4fdd1 --- /dev/null +++ b/ui-control/Chart.yaml @@ -0,0 +1,10 @@ +apiVersion: v2 +# appVersion = RELEASE TARGET +appVersion: 0.7.1 +description: chart for ui-control +name: ui-control +sources: + - https://github.com/rtang03/fabric-cd +version: 1.0.0 +maintainers: + - name: Ross Tang diff --git a/ui-control/README.md b/ui-control/README.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ui-control/README.md @@ -0,0 +1 @@ + diff --git a/ui-control/templates/_helpers.tpl b/ui-control/templates/_helpers.tpl new file mode 100644 index 0000000..d27626e --- /dev/null +++ b/ui-control/templates/_helpers.tpl @@ -0,0 +1,47 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "ui-control.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "ui-control.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "ui-control.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- /* +Credit: @technosophos +https://github.com/technosophos/common-chart/ +labels.standard prints the standard Helm labels. +The standard labels are frequently used in metadata. +*/ -}} +{{- define "labels.standard" -}} +app: {{ include "ui-control.name" . }} +heritage: {{ .Release.Service | quote }} +release: {{ .Release.Name | quote }} +chart: {{ include "ui-control.chart" . }} +namespace: {{ .Release.Namespace }} +version: {{ .Chart.AppVersion }} +{{- end -}} diff --git a/ui-control/templates/configmap--envlocal.yaml b/ui-control/templates/configmap--envlocal.yaml new file mode 100644 index 0000000..7e1c040 --- /dev/null +++ b/ui-control/templates/configmap--envlocal.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "ui-control.fullname" . }}--envlocal + labels: +{{- include "labels.standard" . | nindent 4 }} +data: + .env.local: | + AUTH_HOST={{ .Values.config.authServerUri | quote }} + GW_ORG_EXTERNAL_HOST= {{ .Values.config.gwOrgExternalHost | quote }} + NEXT_PUBLIC_GW_ORG_EXTERNAL_HOST={{ .Values.config.gwOrgExternalHost | quote }} + QH_EXTERNAL_HOST={{ .Values.config.queryHandlerExternalHost | quote }} + NEXT_PUBLIC_QH_EXTERNAL_HOST={{ .Values.config.queryHandlerExternalHost | quote }} diff --git a/ui-control/templates/configmap.yaml b/ui-control/templates/configmap.yaml new file mode 100644 index 0000000..cc54260 --- /dev/null +++ b/ui-control/templates/configmap.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "ui-control.fullname" . }} + labels: +{{- include "labels.standard" . | nindent 4 }} +data: + AUTH_HOST: {{ .Values.config.authServerUri | quote }} + GW_ORG_EXTERNAL_HOST: {{ .Values.config.gwOrgExternalHost | quote }} + LOG_LEVEL: {{ .Values.global.logging | quote }} + LOG_TARGET: "console" + PORT: "3000" + QH_EXTERNAL_HOST: {{ .Values.config.queryHandlerExternalHost | quote }} diff --git a/ui-control/templates/deployment.yaml b/ui-control/templates/deployment.yaml new file mode 100644 index 0000000..d36a0d5 --- /dev/null +++ b/ui-control/templates/deployment.yaml @@ -0,0 +1,89 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "ui-control.fullname" . }} + labels: +{{- include "labels.standard" . | nindent 4 }} +spec: + replicas: 1 + selector: + matchLabels: + app: {{ include "ui-control.name" . }} + release: {{ .Release.Name }} + strategy: + rollingUpdate: + maxUnavailable: 1 + template: + metadata: + annotations: + sidecar.istio.io/proxyCPU: "10m" + sidecar.istio.io/proxyCPULimit: "50m" + sidecar.istio.io/rewriteAppHTTPProbers: "false" + # trace|debug|info|warning|error|critical|off + sidecar.istio.io/logLevel: "info" + labels: +{{ include "labels.standard" . | indent 8 }} + spec: + volumes: + - name: env-local + configMap: + name: {{ include "ui-control.fullname" . }}--envlocal + items: + - key: .env.local + path: .env.local + initContainers: + - name: wait + image: jwilder/dockerize + imagePullPolicy: IfNotPresent + command: ["sh", "-c"] + args: + - |- + set -x + dockerize -wait tcp://{{ .Values.config.waitForAuthServer }} -timeout 60s && echo "auth-server {{ .Values.config.authServerUri }} is ready" + containers: + - name: main + image: {{ .Values.image.repository }}:{{ .Values.image.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - containerPort: 3000 + protocol: TCP + name: http + envFrom: + - configMapRef: + name: {{ include "ui-control.fullname" . }} + volumeMounts: + - mountPath: /usr/src/app/.env.local + name: env-local + subPath: .env.local + livenessProbe: + successThreshold: 1 + failureThreshold: 3 + httpGet: + scheme: HTTP + path: /healthcheck + port: 3000 + initialDelaySeconds: 60 + periodSeconds: 15 + readinessProbe: + successThreshold: 1 + failureThreshold: 3 + httpGet: + scheme: HTTP + path: /healthcheck + port: 3000 + initialDelaySeconds: 60 + periodSeconds: 15 + resources: +{{ toYaml .Values.resources | indent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/ui-control/templates/service.yaml b/ui-control/templates/service.yaml new file mode 100644 index 0000000..a8143ec --- /dev/null +++ b/ui-control/templates/service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "ui-control.fullname" . }} + labels: +{{ include "labels.standard" . | indent 4 }} +spec: + type: ClusterIP + ports: + - port: 3001 + targetPort: 3000 + protocol: TCP + name: http-request + selector: + app: {{ include "ui-control.name" . }} + release: {{ .Release.Name }} diff --git a/ui-control/templates/virtual-service.yaml b/ui-control/templates/virtual-service.yaml new file mode 100644 index 0000000..4f7089b --- /dev/null +++ b/ui-control/templates/virtual-service.yaml @@ -0,0 +1,18 @@ +apiVersion: networking.istio.io/v1alpha3 +kind: VirtualService +metadata: + name: {{ include "ui-control.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: +{{ include "labels.standard" . | indent 4 }} +spec: + hosts: + - web.{{ .Values.global.domain }} + gateways: + - {{ .Values.global.istiogateway }} + http: + - route: + - destination: + host: {{ include "ui-control.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local + port: + number: 3001 diff --git a/ui-control/values-org1.yaml b/ui-control/values-org1.yaml new file mode 100644 index 0000000..811a59f --- /dev/null +++ b/ui-control/values-org1.yaml @@ -0,0 +1,29 @@ +global: + logging: info + domain: org1.net + istiogateway: p0o1-gateway + istiogatewayPort: 15443 + +image: + repository: ghcr.io/rtang03/ui-control-org1 + tag: 0.7.1 + +config: + waitForAuthServer: auth-server1:8080 + authServerUri: http://auth-server1:8080 + gwOrgExternalHost: http://gw.org1.net:443/graphql + queryHandlerExternalHost: http://gw.org1.net:443/graphql + +resources: + limits: + cpu: 100m + memory: 512Mi + requests: + cpu: 10m + memory: 128Mi + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/ui-control/values-org2.yaml b/ui-control/values-org2.yaml new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ui-control/values-org2.yaml @@ -0,0 +1 @@ + diff --git a/ui-control/values.yaml b/ui-control/values.yaml new file mode 100644 index 0000000..876d8c9 --- /dev/null +++ b/ui-control/values.yaml @@ -0,0 +1,30 @@ +global: + logging: info + domain: org1.net + istiogateway: p0o1-gateway + istiogatewayPort: 15443 + +image: + repository: ghcr.io/rtang03/ui-control-org1 + tag: 0.7.1 + pullPolicy: IfNotPresent + +config: + waitForAuthServer: auth-server1:8080 + authServerUri: http://auth-server1:8080 + gwOrgExternalHost: http://gw.org1.net:4001/graphql + queryHandlerExternalHost: http://gw.org1.net:4001/graphql + +resources: + limits: + cpu: 100m + memory: 512Mi + requests: + cpu: 10m + memory: 128Mi + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/workflow/sync-redis.n1.yaml b/workflow/aoa-sync-re-au-gw-ui.n1.yaml similarity index 52% rename from workflow/sync-redis.n1.yaml rename to workflow/aoa-sync-re-au-gw-ui.n1.yaml index 61e2f22..97fd5bf 100644 --- a/workflow/sync-redis.n1.yaml +++ b/workflow/aoa-sync-re-au-gw-ui.n1.yaml @@ -1,9 +1,9 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: - name: aoa-sync-org1-1 + name: aoa-sync-gw-org1 spec: - activeDeadlineSeconds: 300 + activeDeadlineSeconds: 900 ttlStrategy: secondsAfterCompletion: 3600 secondsAfterSuccess: 3600 @@ -13,19 +13,35 @@ spec: templates: - name: main steps: - - - name: sync-app-of-apps + - - name: sync-redis1 templateRef: name: argocd-cli template: argocd-app-sync arguments: parameters: - name: app - value: "apps-org1" - - - name: sync-redis1 + value: "redis1" + - - name: sync-auth1 templateRef: name: argocd-cli template: argocd-app-sync arguments: parameters: - name: app - value: "redis1" + value: "auth-server1" + - - name: sync-gw-org1 + templateRef: + name: argocd-cli + template: argocd-app-sync + arguments: + parameters: + - name: app + value: "gw-org1" + - - name: sync-ui-org1 + templateRef: + name: argocd-cli + template: argocd-app-sync + arguments: + parameters: + - name: app + value: "ui-org1" diff --git a/workflow/aoa-sync-re-au-gw-ui.n2.yaml b/workflow/aoa-sync-re-au-gw-ui.n2.yaml new file mode 100644 index 0000000..a6560da --- /dev/null +++ b/workflow/aoa-sync-re-au-gw-ui.n2.yaml @@ -0,0 +1,47 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Workflow +metadata: + name: aoa-sync-gw-org2 +spec: + activeDeadlineSeconds: 300 + ttlStrategy: + secondsAfterCompletion: 3600 + secondsAfterSuccess: 3600 + secondsAfterFailure: 3600 + entrypoint: main + serviceAccountName: workflow + templates: + - name: main + steps: + - - name: sync-redis2 + templateRef: + name: argocd-cli + template: argocd-app-sync + arguments: + parameters: + - name: app + value: "redis2" + - - name: sync-auth1 + templateRef: + name: argocd-cli + template: argocd-app-sync + arguments: + parameters: + - name: app + value: "auth-server2" + - - name: sync-gw-org2 + templateRef: + name: argocd-cli + template: argocd-app-sync + arguments: + parameters: + - name: app + value: "gw-org2" + - - name: sync-ui-org2 + templateRef: + name: argocd-cli + template: argocd-app-sync + arguments: + parameters: + - name: app + value: "ui-org2" diff --git a/workflow/bootstrap-channel.n1.yaml b/workflow/bootstrap-channel.n1.yaml index e93f680..0d370a9 100644 --- a/workflow/bootstrap-channel.n1.yaml +++ b/workflow/bootstrap-channel.n1.yaml @@ -4,7 +4,7 @@ metadata: name: bootstrap-channel-org1 spec: entrypoint: main - activeDeadlineSeconds: 300 + activeDeadlineSeconds: 600 ttlStrategy: secondsAfterCompletion: 3600 secondsAfterSuccess: 3600 diff --git a/workflow/cryptogen/values-rca1.yaml b/workflow/cryptogen/values-rca1.yaml index bc4b3d9..322b891 100644 --- a/workflow/cryptogen/values-rca1.yaml +++ b/workflow/cryptogen/values-rca1.yaml @@ -12,7 +12,7 @@ podGC: true items: - id: peer0.org1.net type: peer - csrHosts: "p0o1-hlf-peer,peer0.org1.net,gupload.org1.net,argo.org1.net,argocd.org1.net" + csrHosts: "p0o1-hlf-peer,peer0.org1.net,gupload.org1.net,argo.org1.net,argocd.org1.net,gw.org1.net,web.org1.net" pvcName: pvc-org1 outputArtifact: enabled: true diff --git a/workflow/cryptogen/values-rca2.yaml b/workflow/cryptogen/values-rca2.yaml index 1953c59..0828dc1 100644 --- a/workflow/cryptogen/values-rca2.yaml +++ b/workflow/cryptogen/values-rca2.yaml @@ -12,7 +12,7 @@ podGC: true items: - id: peer0.org2.net type: peer - csrHosts: "p0o2-hlf-peer,peer0.org2.net,gupload.org2.net,argo.org2.net,argocd.org2.net" + csrHosts: "p0o2-hlf-peer,peer0.org2.net,gupload.org2.net,argo.org2.net,argocd.org2.net,gw.org2.net,web.org2.net" pvcName: pvc-org2 outputArtifact: enabled: true diff --git a/workflow/cryptogen/values-tlsca1.yaml b/workflow/cryptogen/values-tlsca1.yaml index 43259a2..c50f09f 100644 --- a/workflow/cryptogen/values-tlsca1.yaml +++ b/workflow/cryptogen/values-tlsca1.yaml @@ -12,6 +12,6 @@ podGC: true items: - id: peer0.org1.net type: peer - csrHosts: "p0o1-hlf-peer,peer0.org1.net,gupload.org1.net,,argo.org1.net,argocd.org1.net" + csrHosts: "p0o1-hlf-peer,peer0.org1.net,gupload.org1.net,,argo.org1.net,argocd.org1.net,gw.org1.net,web.org1.net" pvcName: pvc-org1 diff --git a/workflow/cryptogen/values-tlsca2.yaml b/workflow/cryptogen/values-tlsca2.yaml index f5f39fd..29a8387 100644 --- a/workflow/cryptogen/values-tlsca2.yaml +++ b/workflow/cryptogen/values-tlsca2.yaml @@ -12,6 +12,6 @@ podGC: true items: - id: peer0.org2.net type: peer - csrHosts: "p0o2-hlf-peer,peer0.org2.net,gupload.org2.net,argo.org2.net,argocd.org2.net" + csrHosts: "p0o2-hlf-peer,peer0.org2.net,gupload.org2.net,argo.org2.net,argocd.org2.net,gw.org2.net,web.org2.net" pvcName: pvc-org2 diff --git a/workflow/genesis/README.md b/workflow/genesis/README.md new file mode 100644 index 0000000..e69de29 diff --git a/workflow/secrets/templates/workflow.yaml b/workflow/secrets/templates/workflow.yaml index a34f0fc..f3b587b 100644 --- a/workflow/secrets/templates/workflow.yaml +++ b/workflow/secrets/templates/workflow.yaml @@ -11,7 +11,7 @@ spec: strategy: OnPodCompletion # IMPORTANT: The workflow information about secret creation is made as short time as possible ttlStrategy: - secondsAfterCompletion: 600 # Time to live after workflow is completed, replaces ttlSecondsAfterFinished + secondsAfterCompletion: 300 # Time to live after workflow is completed, replaces ttlSecondsAfterFinished secondsAfterSuccess: 600 # Time to live after workflow is successful secondsAfterFailure: 600 # Time to live after workflow fails serviceAccountName: workflow @@ -99,6 +99,8 @@ spec: name: orgadmin--cli key: template inputs: + # TODO: add input artifacts to detect pre-existing secret. + # If exists, either remove it, OR exit (1) the task parameters: - name: secretName - name: key1 diff --git a/workflow/tmp/bootstrap.argo.org1.sh b/workflow/tmp/bootstrap.argo.org1.sh deleted file mode 100755 index 676c3fd..0000000 --- a/workflow/tmp/bootstrap.argo.org1.sh +++ /dev/null @@ -1,384 +0,0 @@ -#!/bin/bash - -. ./setup.sh -. "env.org1.sh" - -SECONDS=0 -TARGET=dev-0.1 - -echo "#################################" -echo "### Step 1: Install $REL_ORGADMIN1" -echo "#################################" -set -x -helm template ../argo-app --set ns=$NS1,rel=$REL_ORGADMIN1,file=values-$REL_ORGADMIN1.yaml,secret=secrets.$REL_ORGADMIN1.yaml,path=orgadmin,target=$TARGET | argocd app create -f - -res=$? -set +x -printMessage "create app: $REL_ORGADMIN1" $res - -set -x -argocd app sync $REL_ORGADMIN1 -res=$? -set +x -printMessage "$REL_ORGADMIN1 sync starts" $res - -set -x -argocd app wait $REL_ORGADMIN1 --timeout 120 -res=$? -set +x -printMessage "$REL_ORGADMIN1 is healthy and sync" $res - -echo "#################################" -echo "### Step 2: Install $REL_TLSCA1" -echo "#################################" -set -x -helm template ../argo-app --set ns=$NS1,rel=$REL_TLSCA1,file=values-$REL_TLSCA1.yaml,secret=secrets.org1.yaml,path=hlf-ca,target=$TARGET | argocd app create -f - -res=$? -set +x -printMessage "create apps: $REL_TLSCA1" $res - -set -x -argocd app sync $REL_TLSCA1 -res=$? -set +x -printMessage "$REL_TLSCA1 sync starts" $res - -echo "#################################" -echo "### Step 3: Install $REL_RCA1" -echo "#################################" -set -x -helm template ../argo-app --set ns=$NS1,rel=$REL_RCA1,file=values-$REL_RCA1.yaml,secret=secrets.org1.yaml,path=hlf-ca,target=$TARGET | argocd app create -f - -res=$? -set +x -printMessage "create apps: $REL_RCA1" $res - -set -x -argocd app sync $REL_RCA1 -res=$? -set +x -printMessage "$REL_RCA1 sync starts" $res - -set -x -argocd app wait $REL_TLSCA1 $REL_RCA1 --timeout 300 -res=$? -set +x -printMessage "$REL_TLSCA1 | $REL_RCA1 is healthy and sync" $res - - -echo "#################################" -echo "### Step 4: Workflow: crypto-$REL_TLSCA1" -echo "#################################" -set -x -helm template ../workflow/cryptogen -f ../workflow/cryptogen/values-$REL_TLSCA1.yaml | argo -n $NS1 submit - --generate-name cryptogen-$REL_TLSCA1- --watch --request-timeout 120s -res=$? -set +x -printMessage "run workflow cryptogen-$REL_TLSCA1" $res - -echo "#################################" -echo "### Step 5: Workflow crypto-$REL_RCA1" -echo "#################################" -set -x -helm template ../workflow/cryptogen -f ../workflow/cryptogen/values-$REL_RCA1.yaml | argo -n $NS1 submit - --generate-name cryptogen-$REL_RCA1- --watch --request-timeout 120s -res=$? -set +x -printMessage "run workflow crypto-$REL_RCA1" $res - -echo "#################################" -echo "### Step 6: Install $REL_ORGADMIN0" -echo "#################################" -set -x -helm template ../argo-app --set ns=$NS0,rel=$REL_ORGADMIN0,file=values-$REL_ORGADMIN0.yaml,secret=secrets.$REL_ORGADMIN0.yaml,path=orgadmin,target=$TARGET | argocd app create -f - -res=$? -set +x -printMessage "create app: $REL_ORGADMIN0" $res - -set -x -argocd app sync $REL_ORGADMIN0 -res=$? -set +x -printMessage "$REL_ORGADMIN0 sync starts" $res - -set -x -argocd app wait $REL_ORGADMIN0 --timeout 120 -res=$? -set +x -printMessage "$REL_ORGADMIN0 is healthy and sync" $res - -echo "#################################" -echo "### Step 7: Install $REL_TLSCA0" -echo "#################################" -set -x -helm template ../argo-app --set ns=$NS0,rel=$REL_TLSCA0,file=values-$REL_TLSCA0.yaml,secret=secrets.org0.yaml,path=hlf-ca,target=$TARGET | argocd app create -f - -res=$? -set +x -printMessage "create app: $REL_TLSCA0" $res - -set -x -argocd app sync $REL_TLSCA0 -res=$? -set +x -printMessage "$REL_TLSCA0 sync starts" $res - -echo "#################################" -echo "### Step 8: Install $REL_RCA0" -echo "#################################" -set -x -helm template ../argo-app --set ns=$NS0,rel=$REL_RCA0,file=values-$REL_RCA0.yaml,secret=secrets.org0.yaml,path=hlf-ca,target=$TARGET | argocd app create -f - -res=$? -set +x -printMessage "create app: $REL_RCA0" $res - -set -x -argocd app sync $REL_RCA0 -res=$? -set +x -printMessage "$REL_RCA0 sync starts" $res - -set -x -argocd app wait $REL_TLSCA0 $REL_RCA0 --timeout 300 -res=$? -set +x -printMessage "$REL_TLSCA0 | $REL_RCA0 is healthy and sync" $res - -echo "#################################" -echo "### Step 9: Workflow: crypto-$REL_TLSCA0" -echo "#################################" -set -x -helm template ../workflow/cryptogen -f ../workflow/cryptogen/values-$REL_TLSCA0.yaml | argo -n $NS0 submit - --generate-name cryptogen-$REL_TLSCA0- --watch --request-timeout 120s -res=$? -set +x -printMessage "run workflow crypto-tlsca0" $res - -echo "#################################" -echo "### Step 10: Workflow: crypto-$REL_RCA0" -echo "#################################" -set -x -helm template ../workflow/cryptogen -f ../workflow/cryptogen/values-$REL_RCA0.yaml | argo -n $NS0 submit - --generate-name cryptogen-$REL_RCA0- --watch --request-timeout 120s -res=$? -set +x -printMessage "run workflow crypto-$REL_RCA0" $res - -echo "#################################" -echo "### Step 11: Create secrets" -echo "#################################" -# Note: -# 1. It will not detect if the gcs bucket has genesis. If already exist, this workflow will fail. -# 2. intentionally split, to avoid too many pods running parallel -# 3. should not use --watch -set -x -helm template ../workflow/secrets -f ../workflow/secrets/values-$REL_RCA0-a.yaml | argo -n $NS0 submit - --wait -res=$? -set +x -printMessage "create secret rca0 - Step 1 to Step 4" $res - -set -x -helm template ../workflow/secrets -f ../workflow/secrets/values-$REL_RCA0-b.yaml | argo -n $NS0 submit - --wait -res=$? -set +x -printMessage "create secret rca0 - Step 5 to Step 10" $res - -set -x -helm template ../workflow/secrets -f ../workflow/secrets/values-$REL_RCA1.yaml | argo -n $NS1 submit - --wait -res=$? -set +x -printMessage "create secret rca1" $res - -echo "#################################" -echo "### Step 12: Create genesis block and channeltx" -echo "#################################" -# Note: It will not detect if the gcs bucket has genesis. If already exist, this workflow will fail. -set -x -helm template ../workflow/genesis | argo -n $NS0 submit - --watch --request-timeout 120s -res=$? -set +x -printMessage "create genesis.block in $NS0" $res - -######## 3. Create configmap: genesis.block -POD_CLI0=$(kubectl get pods -n $NS0 -l "app=orgadmin,release=$REL_ORGADMIN0" -o jsonpath="{.items[0].metadata.name}") -set -x -kubectl -n $NS0 exec $POD_CLI0 -- cat /var/hyperledger/crypto-config/genesis.block > ../download/genesis.block -res=$? -set +x -printMessage "obtain genesis block" $res - -kubectl -n $NS0 delete secret genesis -kubectl -n $NS0 create secret generic genesis --from-file=genesis=../download/genesis.block -printMessage "create secret genesis" $? - -rm ../download/genesis.block - -#### MAKE tlscacert.pem PUBLIC -# Make you have "gsutil" installed from gcloud; can run gcloud components list -gsutil acl ch -u AllUsers:R gs://fabric-cd-dev/workflow/secrets/n0/org0.com-tlscacert/tlscacert.pem - -gsutil acl ch -u AllUsers:R gs://fabric-cd-dev/workflow/secrets/n1/org1.net-tlscacert/tlscacert.pem - -sleep 5 - -echo "#################################" -echo "### Step 13: Install orderers" -echo "#################################" -set -x -helm template ../argo-app --set ns=$NS0,rel=$REL_O0,file=values-$REL_O0.yaml,path=hlf-ord,target=$TARGET | argocd app create -f - -res=$? -set +x -printMessage "create app: $REL_O0" $res - -set -x -argocd app sync $REL_O0 -res=$? -set +x -printMessage "$REL_O0 sync starts" $res - -set -x -helm template ../argo-app --set ns=$NS0,rel=$REL_O1,file=values-$REL_O1.yaml,path=hlf-ord,target=$TARGET | argocd app create -f - -res=$? -set +x -printMessage "create app: $REL_O1" $res - -set -x -argocd app sync $REL_O1 -res=$? -set +x -printMessage "$REL_O1 sync starts" $res - -set -x -helm template ../argo-app --set ns=$NS0,rel=$REL_O2,file=values-$REL_O2.yaml,path=hlf-ord,target=$TARGET | argocd app create -f - -res=$? -set +x -printMessage "create app: $REL_O2" $res - -set -x -argocd app sync $REL_O2 -res=$? -set +x -printMessage "$REL_O2 sync starts" $res - -set -x -helm template ../argo-app --set ns=$NS0,rel=$REL_O3,file=values-$REL_O3.yaml,path=hlf-ord,target=$TARGET | argocd app create -f - -res=$? -set +x -printMessage "create app: $REL_O3" $res - -set -x -argocd app sync $REL_O3 -res=$? -set +x -printMessage "$REL_O3 sync starts" $res - -set -x -helm template ../argo-app --set ns=$NS0,rel=$REL_O4,file=values-$REL_O4.yaml,path=hlf-ord,target=$TARGET | argocd app create -f - -res=$? -set +x -printMessage "create app: $REL_O4" $res - -set -x -argocd app sync $REL_O4 -res=$? -set +x -printMessage "$REL_O4 sync starts" $res - -set -x -argocd app wait $REL_O0 $REL_O1 $REL_O2 $REL_O3 $REL_O4 --timeout 300 -res=$? -set +x -printMessage "$REL_O0 | $REL_O1 | $REL_O2 | $REL_O3 | $REL_O4 are healthy and sync" $res - -echo "#################################" -echo "### Step 14: Install $REL_PEER" -echo "#################################" -set -x -helm template ../argo-app --set ns=$NS1,rel=$REL_PEER,file=values-$REL_PEER.yaml,path=hlf-peer,target=$TARGET | argocd app create -f - -res=$? -set +x -printMessage "create app: $REL_PEER" $res - -set -x -argocd app sync $REL_PEER -res=$? -set +x -printMessage "$REL_PEER sync starts" $res - -echo "#################################" -echo "### Step 15: Install $REL_GUPLOAD" -echo "#################################" -set -x -helm template ../argo-app --set ns=$NS1,rel=$REL_GUPLOAD,file=values-$REL_GUPLOAD.yaml,path=gupload,target=$TARGET | argocd app create -f - -res=$? -set +x -printMessage "create app: $REL_GUPLOAD" $res - -set -x -argocd app sync $REL_GUPLOAD -res=$? -set +x -printMessage "$REL_GUPLOAD sync starts" $res - -set -x -argocd app wait $REL_PEER $REL_GUPLOAD --timeout 120 -res=$? -set +x -printMessage "$REL_PEER | $REL_GUPLOAD are healthy and sync" $res - - -echo "#################################" -echo "### Step 16: Create Secret org0.com-tlscacert for n1" -echo "#################################" - -set -x -argo -n n1 submit ../workflow/create-org0tlscacert.n1.yaml --watch --request-timeout 60s -res=$? -set +x -printMessage "create tlscacerts" $res - -sleep 60 - -echo "#################################" -echo "### Step 17: Bootstrap part 1" -echo "#################################" -set -x -helm template ../workflow/bootstrap -f ../workflow/bootstrap/values-org1-a.yaml | argo -n $NS1 submit - --watch --request-timeout 300s -res=$? -set +x -printMessage "bootstrap part 1" $res - -echo "#################################" -echo "### Step 18: Install chaincode" -echo "#################################" -set -x -helm template ../argo-app --set ns=$NS1,rel=eventstore,file=values-org1.yaml,path=hlf-cc,target=$TARGET | argocd app create -f - -res=$? -set +x -printMessage "create app: eventstore" $res - -set -x -argocd app sync eventstore -res=$? -set +x -printMessage "eventstore sync starts" $res - -set -x -argocd app wait eventstore --timeout 120 -res=$? -set +x -printMessage "eventstore is healthy and sync" $res - -echo "#################################" -echo "### Step 19: Bootstrap part 2" -echo "#################################" -set -x -helm template ../workflow/bootstrap -f ../workflow/bootstrap/values-org1-b.yaml | argo -n $NS1 submit - --watch --request-timeout 300s -res=$? -set +x -printMessage "bootstrap part 2" $res - -# NOT WORKING -#export POD_RCA=$(kubectl get pods -n n1 -l "app=hlf-ca,release=rca1" -o jsonpath="{.items[0].metadata.name}") -#export CERT=$(kubectl -n n1 exec $POD_RCA -c ca -- cat ./Org1MSP/peer0.org1.net/tls-msp/signcerts/cert.pem) -#export KEY=$(kubectl -n n1 exec $POD_RCA -c ca -- cat ./Org1MSP/peer0.org1.net/tls-msp/keystore/key.pem) -#kubectl -n istio-system delete secret argo-tls -#kubectl -n istio-system create secret generic argo-tls --from-literal=cert="$CERT" --from-literal=key="$KEY" -# Don't work because pvc-org1 cannot be mount to istio-system -#helm template ../workflow/secrets -f ../workflow/secrets/values-istio-org1.yaml | argo -n istio-system submit - --wait - -duration=$SECONDS -printf "${GREEN}$(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed.\n\n${NC}" diff --git a/workflow/tmp/bootstrap.orgx.gcp.sh b/workflow/tmp/bootstrap.orgx.gcp.sh deleted file mode 100755 index c608d1d..0000000 --- a/workflow/tmp/bootstrap.orgx.gcp.sh +++ /dev/null @@ -1,405 +0,0 @@ -#!/bin/bash -# $1 "org2" or "org3" - -. ./scripts/setup.sh -. "env.$1.sh" - -SECONDS=0 - -mkdir -p ./download -rm ./download/*.pem - -echo "#################################" -echo "### Step 1: Install $REL_ORGADMIN" -echo "#################################" -helm install $REL_ORGADMIN -n $NS -f $RELEASE_DIR/orgadmin.$CLOUD.yaml ./orgadmin -printMessage "install $REL_ORGADMIN" $? -set -x -POD_PSQL=$(kubectl get pods -n $NS -l "app.kubernetes.io/name=postgresql-0,app.kubernetes.io/instance=$REL_ORGADMIN" -o jsonpath="{.items[0].metadata.name}") -kubectl wait --for=condition=Ready --timeout 180s pod/$POD_PSQL -n $NS -res=$? -set +x -printMessage "pod/$POD_PSQL" $res - -sleep 10 - -echo "#################################" -echo "### Step 2: Install $REL_TLSCA" -echo "#################################" -helm install $REL_TLSCA -n $NS -f $RELEASE_DIR/tlsca-hlf-ca.$CLOUD.yaml ./hlf-ca -printMessage "install $REL_TLSCA" $? -set -x -POD_TLSCA=$(kubectl get pods -n $NS -l "app=hlf-ca,release=$REL_TLSCA" -o jsonpath="{.items[0].metadata.name}") -kubectl wait --for=condition=Ready --timeout 180s pod/$POD_TLSCA -n $NS -res=$? -set +x -printMessage "pod/$POD_TLSCA" $res - -sleep 10 - -echo "#################################" -echo "### Step 3: Install $REL_RCA" -echo "#################################" -helm install $REL_RCA -n $NS -f $RELEASE_DIR/rca-hlf-ca.$CLOUD.yaml ./hlf-ca -set -x -POD_RCA=$(kubectl get pods -n $NS -l "app=hlf-ca,release=$REL_RCA" -o jsonpath="{.items[0].metadata.name}") -kubectl wait --for=condition=Ready --timeout 180s pod/$POD_RCA -n $NS -res=$? -set +x -printMessage "pod/$POD_RCA" $res - -sleep 10 - -echo "#################################" -echo "### Step 4: Job: $REL_TLSCA" -echo "#################################" -helm install crypto-$REL_TLSCA -n $NS -f $RELEASE_DIR/tlsca-cryptogen.gcp.yaml ./cryptogen -printMessage "install crypto-$REL_TLSCA" $? -set -x -kubectl wait --for=condition=complete --timeout 180s job/crypto-$REL_TLSCA-cryptogen -n $NS -res=$? -set +x -printMessage "job/crypto-$REL_TLSCA-cryptogen" $res - - -echo "#################################" -echo "### Step 5: Job: $REL_RCA" -echo "#################################" -helm install crypto-$REL_RCA -n $NS -f $RELEASE_DIR/rca-cryptogen.gcp.yaml ./cryptogen -printMessage "install crypto-$REL_RCA" $? -set -x -kubectl wait --for=condition=complete --timeout 180s job/crypto-$REL_RCA-cryptogen -n $NS -res=$? -set +x -printMessage "job/crypto-$REL_RCA-cryptogen" $res - - -echo "#################################" -echo "### Step 6: Create secrets" -echo "#################################" -echo "######## 0. peer msp - cert" -CONTENT=$(kubectl -n $NS exec $POD_RCA -c ca -- cat ./$MSPID/$PEER/msp/signcerts/cert.pem) -preventEmptyValue "$MSPID/$PEER/msp/signcerts/cert.pem" $CONTENT - -kubectl -n $NS delete secret $PEER-cert -kubectl -n $NS create secret generic "$PEER-cert" --from-literal=cert.pem="$CONTENT" -printMessage "create secret $PEER-cert" $? - -echo "######## 1. peer msp - key" -CONTENT=$(kubectl -n $NS exec $POD_RCA -c ca -- cat ./$MSPID/$PEER/msp/keystore/key.pem) -preventEmptyValue "$MSPID/$PEER/msp/keystore/key.pem" $CONTENT - -kubectl -n $NS delete secret $PEER-key -kubectl -n $NS create secret generic "$PEER-key" --from-literal=key.pem="$CONTENT" -printMessage "create secret $PEER-key" $? - -echo "######## 2. secret: CA cert" -CONTENT=$(kubectl -n $NS exec $POD_RCA -c ca -- cat ./$MSPID/$PEER/msp/cacerts/$REL_RCA-hlf-ca-7054.pem) -preventEmptyValue "$MSPID/$PEER/msp/cacerts/$REL_RCA-hlf-ca-7054.pem" $CONTENT - -kubectl -n $NS delete secret $PEER-cacert -kubectl -n $NS create secret generic "$PEER-cacert" --from-literal=cacert.pem="$CONTENT" -printMessage "create secret $PEER-cacert" $? - -echo "######## 3. secret: tls cert and key" -CERT=$(kubectl -n $NS exec $POD_RCA -c ca -- cat ./$MSPID/$PEER/tls-msp/signcerts/cert.pem) -preventEmptyValue "$MSPID/$PEER/tls-msp/signcerts/cert.pem" $CONTENT - -KEY=$(kubectl -n $NS exec $POD_RCA -c ca -- cat ./$MSPID/$PEER/tls-msp/keystore/key.pem) -preventEmptyValue "$MSPID/$PEER/tls-msp/keystore/key.pem" $CONTENT - -kubectl -n $NS delete secret $PEER-tls -# NOTE: tls.crt and tls.key is k8 ingress's tls naming convention. Keep the nameing convention -kubectl -n $NS create secret generic "$PEER-tls" --from-literal=tls.crt="$CERT" --from-literal=tls.key="$KEY" -printMessage "create secret $PEER-tls" $? - -echo "######## 4. secret: tls root CA cert" -CONTENT=$(kubectl -n $NS exec $POD_RCA -c ca -- cat ./$MSPID/$PEER/tls-msp/tlscacerts/tls-$REL_TLSCA-hlf-ca-7054.pem) -preventEmptyValue "$MSPID/$PEER/tls-msp/tlscacerts/tls-$REL_TLSCA-hlf-ca-7054.pem" $CONTENT - -kubectl -n $NS delete secret $PEER-tlsrootcert -kubectl -n $NS create secret generic "$PEER-tlsrootcert" --from-literal=tlscacert.pem="$CONTENT" -printMessage "create secret $PEER-tlsrootcert" $? - -echo "######## 5. create secret for $DOMAIN-admin-cert.pem" -CONTENT=$(kubectl -n $NS exec $POD_RCA -c ca -- cat ./$MSPID/admin/msp/admincerts/$DOMAIN-admin-cert.pem) -preventEmptyValue "$MSPID/admin/msp/admincerts/$DOMAIN-admin-cert.pem" $CONTENT - -kubectl -n $NS delete secret $PEER-admincert -kubectl -n $NS create secret generic $PEER-admincert --from-literal=$DOMAIN-admin-cert.pem="$CONTENT" -printMessage "create secret $PEER-admincert" $? - -echo "######## 6. create secret for $DOMAIN-admin-key.pem" -CONTENT=$(kubectl -n $NS exec $POD_RCA -c ca -- cat ./$MSPID/admin/msp/keystore/key.pem) -preventEmptyValue "$MSPID/admin/msp/keystore/key.pem" $CONTENT - -kubectl -n $NS delete secret $PEER-adminkey -kubectl -n $NS create secret generic "$PEER-adminkey" --from-literal=$DOMAIN-admin-key.pem="$CONTENT" -printMessage "create secret $PEER-adminkey" $? - -#### OPTIONAL: NOT CURRENTLY USED -echo "######## 7. Create secret for tls for tlsca, used by ingress controller" -POD_TLSCA=$(kubectl get pods -n $NS -l "app=hlf-ca,release=$REL_TLSCA" -o jsonpath="{.items[0].metadata.name}") -preventEmptyValue "pod unavailable" POD_TLSCA - -CERT=$(kubectl -n $NS exec ${POD_TLSCA} -c ca -- cat ./$MSPID/tls/server/ca-cert.pem) -preventEmptyValue "./$MSPID/tls/server/ca-cert.pem" $CERT - -KEY=$(kubectl -n $NS exec ${POD_TLSCA} -c ca -- cat ./$MSPID/tls/server/msp/keystore/key.pem) -preventEmptyValue "./$MSPID/tls/server/msp/keystore/key.pem" $KEY - -kubectl -n $NS delete secret $REL_TLSCA-tls -kubectl -n $NS create secret generic $REL_TLSCA-tls --from-literal=tls.crt="$CERT" --from-literal=tls.key="$KEY" -printMessage "create secret $REL_TLSCA-tls" $? - -#### OPTIONAL: NOT CURRENTLY USED -echo "######## 8. Create secret for tls for rca, used by ingress controller" -CERT=$(kubectl -n $NS exec ${POD_RCA} -c ca -- cat ./$MSPID/ca/server/ca-cert.pem) -preventEmptyValue "./$MSPID/ca/server/ca-cert.pem" $CERT - -KEY=$(kubectl -n $NS exec ${POD_RCA} -c ca -- cat ./$MSPID/ca/server/msp/keystore/key.pem) -preventEmptyValue "./$MSPID/ca/server/msp/keystore/key.pem" $KEY - -kubectl -n $NS delete secret $REL_RCA-tls -kubectl -n $NS create secret generic $REL_RCA-tls --from-literal=tls.crt="$CERT" --from-literal=tls.key="$KEY" -printMessage "create secret $REL_RCA-tls" $? - - -echo "#################################" -echo "### Step 7: Install gupload $REL_GUPLOAD" -echo "#################################" -helm install $REL_GUPLOAD -n $NS -f $RELEASE_DIR/gupload.$CLOUD.yaml ./gupload -set -x -POD_GUPLOAD=$(kubectl get pods -n $NS -l "app=gupload,release=$REL_GUPLOAD" -o jsonpath="{.items[0].metadata.name}") -kubectl wait --for=condition=Ready --timeout 180s pod/$POD_GUPLOAD -n $NS -res=$? -set +x -printMessage "pod/$REL_GUPLOAD" $res - - -echo "#################################" -echo "### Step 8: Out-of-band process" -echo "#################################" - -echo "# IMPORTANT NOTE: THIS SUB-STEP REQUIRING MANUAL INTERRUPTION" -# Below step may be replaced by manual step, to obtain org1 root cert -echo "######## 0. [$NS1] ==> obtain $TLSCACERT_1.pem from out-of-band process" -POD_RCA1=$(kubectl get pods -n $NS1 -l "app=hlf-ca,release=$REL_RCA1" -o jsonpath="{.items[0].metadata.name}") -set -x -kubectl -n $NS1 exec $POD_RCA1 -c ca -- cat ./$MSPID_1/msp/tlscacerts/tls-ca-cert.pem > ./download/$TLSCACERT_1.pem -res=$? -set +x -printMessage "download $TLSCACERT_1.pem from n1" $res - -# org1 root cert is used to connect to G1 with "gupload" cli in sequent steps -echo "######## 1. [$NS] ==> cp $TLSCACERT_1.pem to $REL_GUPLOAD" -POD_GUPLOAD=$(kubectl get pods -n $NS -l "app=gupload,release=$REL_GUPLOAD" -o jsonpath="{.items[0].metadata.name}") -set -x -kubectl -n $NS cp ./download/$TLSCACERT_1.pem $POD_GUPLOAD:/var/gupload/fileserver -c gupload -res=$? -set +x -printMessage "cp $TLSCACERT_1.pem to $REL_GUPLOAD" $res - -echo "######## 2. [$NS] ==> create secret $TLSCACERT_1" -kubectl -n $NS delete secret $TLSCACERT_1 -set -x -kubectl -n $NS create secret generic $TLSCACERT_1 --from-file=tlscacert.pem=./download/$TLSCACERT_1.pem -res=$? -set +x -printMessage "create secret $TLSCACERT_1 for $NS" $res - - -echo "######## 3. [$NS] ==> gupload download Index.txt from $NS1" -set -x -kubectl -n $NS exec $POD_GUPLOAD -c gupload -- sh -c "cd fileserver && ./gupload download --cacert $TLSCACERT_1.pem --file index.txt --address $G1_URL" -res=$? -set +x -printMessage "download index.txt using Gupload" $res -set -x -kubectl -n $NS exec $POD_GUPLOAD -c gupload -- cat /var/gupload/fileserver/index.txt > ./download/index.txt -res=$? -set +x -printMessage "cp index.txt to local folder" $res - -echo "######## 4. [$NS] ==> Looping Index.txt to create secret" -echo "=> this is indext.txt" -cat ./download/index.txt -cat ./download/index.txt | grep -v index.txt | grep -v $TLSCACERT_1 | while read CERT_FILE -do - # CERT_FILE, e.g. org0.com-tlscacert.pem - echo "### [$NS] .... $CERT_FILE" - - # CERT_NAME, e.g. org0.com-tlscacert - CERT_NAME=$(echo $CERT_FILE | sed -En 's/(.*)[.]pem$/\1/gp') - - # Gupload download from gupload.org1.net - set -x - kubectl -n $NS exec $POD_GUPLOAD -c gupload -- sh -c "cd fileserver && ./gupload download --cacert $TLSCACERT_1.pem --file $CERT_FILE --address $G1_URL" - res=$? - set +x - printMessage "gupload download $CERT_FILE" $res - - # retrieve certicate content - CONTENT=$(kubectl -n $NS exec $POD_GUPLOAD -c gupload -- cat ./fileserver/$CERT_FILE) - preventEmptyValue "$CERT_FILE" $CONTENT - - # delete pre-existing secret - kubectl -n $NS delete secret $CERT_NAME - - # create new tlscacert - kubectl -n $NS create secret generic $CERT_NAME --from-literal=tlscacert.pem="$CONTENT" - res=$? - printMessage "create secret $TLSCACERT_0 for $NS" $res -done - -# Below step cp $TLSCACERT to 'fileserver/public' directory pvc-gupload2 for later sharing -echo "######## 5. [$NS] ==> cp $TLSCACERT to $REL_GUPLOAD" -POD_RCA=$(kubectl get pods -n $NS -l "app=hlf-ca,release=$REL_RCA" -o jsonpath="{.items[0].metadata.name}") -preventEmptyValue "pod unavailable" $POD_RCA -set -x -kubectl -n $NS exec $POD_RCA -c ca -- cat ./$MSPID/msp/tlscacerts/tls-ca-cert.pem > ./download/$TLSCACERT.pem -res=$? -set +x -printMessage "download $TLSCACERT.pem from $NS" $res -set -x -kubectl -n $NS cp ./download/$TLSCACERT.pem $POD_GUPLOAD:/var/gupload/fileserver/public -c gupload -res=$? -set +x -printMessage "cp $TLSCACERT.pem to $REL_GUPLOAD" $res - -# Below step gupload $TLSCACERT to 'fileserver/public' directory pvc-gupload1 for later sharing -# note that --cacert is located under fileserver, by step 4 above. -echo "######## 6. [$NS] ==> gupload $TLSCACERT to $G1_URL" -set -x -kubectl -n $NS exec $POD_GUPLOAD -c gupload -- sh -c "cd fileserver && ./gupload upload --cacert $TLSCACERT_1.pem --infile ./public/$TLSCACERT.pem --public=true --outfile $TLSCACERT.pem --address $G1_URL" -res=$? -set +x -printMessage "gupload $TLSCACERT to $G1_URL" $res - -echo "######## 7. [$NS] ==> create secret $TLSCACERT" -kubectl -n $NS delete secret $TLSCACERT -kubectl -n $NS create secret generic $TLSCACERT --from-file=tlscacert.pem=./download/$TLSCACERT.pem -res=$? -printMessage "create secret $TLSCACERT for $NS" $res - -# NOTE: Below step 8 - 9 is performed by $NS1 -echo "# [$NS1] IMPORTANT NOTE: THIS SUB-STEP REQUIRING MANUAL INTERRUPTION" -echo "######## 8. [$NS1] obtain $TLSCACERT" -POD_GUPLOAD1=$(kubectl get pods -n $NS1 -l "app=gupload,release=$REL_GUPLOAD1" -o jsonpath="{.items[0].metadata.name}") -CONTENT=$(kubectl -n $NS1 exec $POD_GUPLOAD1 -c gupload -- cat ./fileserver/public/$TLSCACERT.pem) -printMessage "obtain $TLSCACERT" $? -preventEmptyValue "$TLSCACERT" $CONTENT - -echo "######## 9. [$NS1] create secret $TLSCACERT" -kubectl -n $NS1 delete secret $TLSCACERT -kubectl -n $NS1 create secret generic $TLSCACERT --from-literal=tlscacert.pem="$CONTENT" -res=$? -printMessage "create secret $TLSCACERT for $NS1" $res - -echo "#####################################################################" -echo "### END: OUT OF BAND" -echo "#####################################################################\n" - - -echo "#################################" -echo "### Step 9: Install peer" -echo "#################################" -helm install $REL_PEER -n $NS -f $RELEASE_DIR/hlf-peer.$CLOUD.yaml ./hlf-peer -set -x -POD_PEER=$(kubectl get pods -n $NS -l "app=hlf-peer,release=$REL_PEER" -o jsonpath="{.items[0].metadata.name}") -kubectl wait --for=condition=Ready --timeout 180s pod/$POD_PEER -n $NS -res=$? -set +x -printMessage "pod/$REL_PEER" $res - - -echo "#####################################################################" -echo "### MULTIPLE ORGS WORKFLOW" -echo "#####################################################################" -echo "######## [$MSPID_1] ==> fetch current block" -helm install $JOB_FETCH_BLOCK-$NS -n $NS1 -f $RELEASE_DIR1/fetch-$NS-hlf-operator.yaml ./hlf-operator -set -x -kubectl wait --for=condition=complete --timeout 120s job/$JOB_FETCH_BLOCK-$NS-hlf-operator--fetch -n $NS1 -res=$? -set +x -printMessage "job/fetch block" $res - -sleep 5 - -echo "######## [$MSPID] ==> prepares add-org update-channel-envelope" -helm install $JOB_NEWORG -n $NS -f $RELEASE_DIR/neworg-hlf-operator.yaml ./hlf-operator - -set -x -kubectl wait --for=condition=complete --timeout 120s job/$JOB_NEWORG-hlf-operator--neworg -n $NS -res=$? -set +x -printMessage "job/new org" $res - -sleep 5 - -echo "######## [$MSPID_1] ==> sign the updatechannel block" -helm install $JOB_UPDATE_CHANNEL-$NS -n $NS1 -f $RELEASE_DIR1/upch1-hlf-operator.yaml ./hlf-operator -set -x -kubectl wait --for=condition=complete --timeout 120s job/$JOB_UPDATE_CHANNEL-$NS-hlf-operator--updatechannel -n $NS1 -res=$? -set +x -printMessage "job/update channel" $res - -sleep 5 - -echo "######## [$MSPID] ==> join channel" -helm install $JOB_JOINCHANNEL -n $NS -f $RELEASE_DIR/joinch-hlf-operator.yaml ./hlf-operator -set -x -kubectl wait --for=condition=complete --timeout 120s job/$JOB_JOINCHANNEL-hlf-operator--joinchannel -n $NS -res=$? -set +x -printMessage "job/join channel" $res - -POD_CLI=$(kubectl get pods --namespace $NS -l "app=orgadmin,release=$REL_ORGADMIN" -o jsonpath="{.items[0].metadata.name}") -preventEmptyValue "pod unavailable" $POD_CLI - -sleep 10 - -echo "######## [$MSPID] ==> Update anchor peer; package & install chaincode" -helm install $JOB_INSTALL_CHAINCODE_A -n $NS -f $RELEASE_DIR/installcc-a.hlf-operator.yaml ./hlf-operator -set -x -kubectl wait --for=condition=complete --timeout 300s job/$JOB_INSTALL_CHAINCODE_A-hlf-operator--bootstrap -n $NS -res=$? -set +x -printMessage "job/install chaincode part1" $res - -sleep 10 - -set -x -CCID=$(kubectl -n $NS exec $POD_CLI -- cat /var/hyperledger/crypto-config/channel-artifacts/packageid.txt) -res=$? -set +x -printMessage "retrieve CCID" $res -preventEmptyValue "chaincodeId" $CCID - -echo "######## [$MSPID] ==> Launch chaincode container" -helm install eventstore -n $NS --set ccid=$CCID -f $RELEASE_DIR/eventstore-hlf-cc.yaml ./hlf-cc -set -x -POD_CC=$(kubectl get pods -n $NS -l "app=hlf-cc,release=eventstore" -o jsonpath="{.items[0].metadata.name}") -kubectl wait --for=condition=Ready --timeout 180s pod/$POD_CC -n $NS -res=$? -set +x -printMessage "pod/eventstore chaincode" $res - -## NOTE: there is an unknonw timeslapse between the chaincode server starts, and container. -sleep 30 - -echo "######## [$MSPID] ==> Approve chaincode and run smoke test" -helm install $JOB_INSTALL_CHAINCODE_B -n $NS -f $RELEASE_DIR/installcc-b.hlf-operator.yaml ./hlf-operator -set -x -kubectl wait --for=condition=complete --timeout 180s job/$JOB_INSTALL_CHAINCODE_B-hlf-operator--bootstrap -n $NS -res=$? -set +x -printMessage "job/install chaincode part2" $res - -echo "#####################################################################" -echo "### END: MULTIPLE ORGS WORKFLOW" -echo "#####################################################################" - -duration=$SECONDS -printf "${GREEN}$(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed.\n\n${NC}" diff --git a/workflow/tmp/create-secret.rca0.sh b/workflow/tmp/create-secret.rca0.sh deleted file mode 100755 index b08dda5..0000000 --- a/workflow/tmp/create-secret.rca0.sh +++ /dev/null @@ -1,327 +0,0 @@ -#!/bin/bash -. ./scripts/setup.sh - -######## 1. secret: rca0-hlf-ca--ca is already set by secret manifest. Below command retrieves it. -# CA_ADMIN=$(kubectl -n n0 get secret rca0-hlf-ca--ca -o jsonpath=".data.CA_ADMIN" | base64) -# CA_PASSWORD=$(kubectl -n n0 get secret rca0-hlf-ca--ca -o jsonpath=".data.CA_PASSWORD" | base64) -POD_RCA0=$(kubectl get pods -n n0 -l "app=hlf-ca,release=rca0" -o jsonpath="{.items[0].metadata.name}") -preventEmptyValue "pod unavailable" $POD_RCA0 - -echo "######## 2. secret: cert and key" -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer0.org0.com/msp/signcerts/cert.pem) -preventEmptyValue "./Org0MSP/orderer0.org0.com/msp/signcerts/cert.pem" $CONTENT - -kubectl -n n0 delete secret orderer0.org0.com-cert -kubectl -n n0 create secret generic orderer0.org0.com-cert --from-literal=cert.pem="$CONTENT" -printMessage "create secret orderer0.org0.com-cert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer0.org0.com/msp/keystore/key.pem) -preventEmptyValue "./Org0MSP/orderer0.org0.com/msp/keystore/key.pem" $CONTENT - -kubectl -n n0 delete secret orderer0.org0.com-key -kubectl -n n0 create secret generic orderer0.org0.com-key --from-literal=key.pem="$CONTENT" -printMessage "create secret orderer0.org0.com-key" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer1.org0.com/msp/signcerts/cert.pem) -preventEmptyValue "./Org0MSP/orderer1.org0.com/msp/signcerts/cert.pem" $CONTENT - -kubectl -n n0 delete secret orderer1.org0.com-cert -kubectl -n n0 create secret generic orderer1.org0.com-cert --from-literal=cert.pem="$CONTENT" -printMessage "create secret orderer1.org0.com-cert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer1.org0.com/msp/keystore/key.pem) -preventEmptyValue "./Org0MSP/orderer1.org0.com/msp/keystore/key.pem" $CONTENT - -kubectl -n n0 delete secret orderer1.org0.com-key -kubectl -n n0 create secret generic orderer1.org0.com-key --from-literal=key.pem="$CONTENT" -printMessage "create secret orderer1.org0.com-key" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer2.org0.com/msp/signcerts/cert.pem) -preventEmptyValue "./Org0MSP/orderer2.org0.com/msp/signcerts/cert.pem" $CONTENT - -kubectl -n n0 delete secret orderer2.org0.com-cert -kubectl -n n0 create secret generic orderer2.org0.com-cert --from-literal=cert.pem="$CONTENT" -printMessage "create secret orderer2.org0.com-cert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer2.org0.com/msp/keystore/key.pem) -preventEmptyValue "./Org0MSP/orderer2.org0.com/msp/keystore/key.pem" $CONTENT - -kubectl -n n0 delete secret orderer2.org0.com-key -kubectl -n n0 create secret generic orderer2.org0.com-key --from-literal=key.pem="$CONTENT" -printMessage "create secret orderer2.org0.com-key" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer3.org0.com/msp/signcerts/cert.pem) -preventEmptyValue "./Org0MSP/orderer3.org0.com/msp/signcerts/cert.pem" $CONTENT - -kubectl -n n0 delete secret orderer3.org0.com-cert -kubectl -n n0 create secret generic orderer3.org0.com-cert --from-literal=cert.pem="$CONTENT" -printMessage "create secret orderer3.org0.com-cert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer3.org0.com/msp/keystore/key.pem) -preventEmptyValue "./Org0MSP/orderer3.org0.com/msp/keystore/key.pem" $CONTENT - -kubectl -n n0 delete secret orderer3.org0.com-key -kubectl -n n0 create secret generic orderer3.org0.com-key --from-literal=key.pem="$CONTENT" -printMessage "create secret orderer3.org0.com-key" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer4.org0.com/msp/signcerts/cert.pem) -preventEmptyValue "./Org0MSP/orderer4.org0.com/msp/signcerts/cert.pem" $CONTENT - -kubectl -n n0 delete secret orderer4.org0.com-cert -kubectl -n n0 create secret generic orderer4.org0.com-cert --from-literal=cert.pem="$CONTENT" -printMessage "create secret orderer4.org0.com-cert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer4.org0.com/msp/keystore/key.pem) -preventEmptyValue "./Org0MSP/orderer4.org0.com/msp/keystore/key.pem" $CONTENT - -kubectl -n n0 delete secret orderer4.org0.com-key -kubectl -n n0 create secret generic orderer4.org0.com-key --from-literal=key.pem="$CONTENT" -printMessage "create secret orderer4.org0.com-key" $? - -echo "######## 3. secret: CA cert" -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer0.org0.com/msp/cacerts/rca0-hlf-ca-7054.pem) -preventEmptyValue "./Org0MSP/orderer0.org0.com/msp/cacerts/rca0-hlf-ca-7054.pem" $CONTENT - -kubectl -n n0 delete secret orderer0.org0.com-cacert -kubectl -n n0 create secret generic orderer0.org0.com-cacert --from-literal=cacert.pem="$CONTENT" -printMessage "create secret orderer0.org0.com-cacert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer1.org0.com/msp/cacerts/rca0-hlf-ca-7054.pem) -preventEmptyValue "./Org0MSP/orderer1.org0.com/msp/cacerts/rca0-hlf-ca-7054.pem" $CONTENT - -kubectl -n n0 delete secret orderer1.org0.com-cacert -kubectl -n n0 create secret generic orderer1.org0.com-cacert --from-literal=cacert.pem="$CONTENT" -printMessage "create secret orderer1.org0.com-cacert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer2.org0.com/msp/cacerts/rca0-hlf-ca-7054.pem) -preventEmptyValue "./Org0MSP/orderer2.org0.com/msp/cacerts/rca0-hlf-ca-7054.pem" $CONTENT - -kubectl -n n0 delete secret orderer2.org0.com-cacert -kubectl -n n0 create secret generic orderer2.org0.com-cacert --from-literal=cacert.pem="$CONTENT" -printMessage "create secret orderer2.org0.com-cacert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer3.org0.com/msp/cacerts/rca0-hlf-ca-7054.pem) -preventEmptyValue "./Org0MSP/orderer3.org0.com/msp/cacerts/rca0-hlf-ca-7054.pem" $CONTENT - -kubectl -n n0 delete secret orderer3.org0.com-cacert -kubectl -n n0 create secret generic orderer3.org0.com-cacert --from-literal=cacert.pem="$CONTENT" -printMessage "create secret orderer3.org0.com-cacert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer4.org0.com/msp/cacerts/rca0-hlf-ca-7054.pem) -preventEmptyValue "./Org0MSP/orderer4.org0.com/msp/cacerts/rca0-hlf-ca-7054.pem" $CONTENT - -kubectl -n n0 delete secret orderer4.org0.com-cacert -kubectl -n n0 create secret generic orderer4.org0.com-cacert --from-literal=cacert.pem="$CONTENT" -printMessage "create secret orderer4.org0.com-cacert" $? - -echo "######## 4. secret: tls cert and key" -CERT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer0.org0.com/tls-msp/signcerts/cert.pem) -preventEmptyValue "./Org0MSP/orderer0.org0.com/tls-msp/signcerts/cert.pem" $CONTENT - -KEY=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer0.org0.com/tls-msp/keystore/key.pem) -preventEmptyValue "./Org0MSP/orderer0.org0.com/tls-msp/keystore/key.pem" $CONTENT - -kubectl -n n0 delete secret orderer0.org0.com-tls -kubectl -n n0 create secret generic orderer0.org0.com-tls --from-literal=tls.crt="$CERT" --from-literal=tls.key="$KEY" -printMessage "create secret orderer0.org0.com-tls" $? - -CERT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer1.org0.com/tls-msp/signcerts/cert.pem) -preventEmptyValue "./Org0MSP/orderer1.org0.com/tls-msp/signcerts/cert.pem" $CONTENT - -KEY=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer1.org0.com/tls-msp/keystore/key.pem) -preventEmptyValue "./Org0MSP/orderer1.org0.com/tls-msp/keystore/key.pem" $CONTENT - -kubectl -n n0 delete secret orderer1.org0.com-tls -kubectl -n n0 create secret generic orderer1.org0.com-tls --from-literal=tls.crt="$CERT" --from-literal=tls.key="$KEY" -printMessage "create secret orderer1.org0.com-tls" $? - -CERT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer2.org0.com/tls-msp/signcerts/cert.pem) -preventEmptyValue "./Org0MSP/orderer2.org0.com/tls-msp/signcerts/cert.pem" $CONTENT - -KEY=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer2.org0.com/tls-msp/keystore/key.pem) -preventEmptyValue "./Org0MSP/orderer2.org0.com/tls-msp/keystore/key.pem" $CONTENT - -kubectl -n n0 delete secret orderer2.org0.com-tls -kubectl -n n0 create secret generic orderer2.org0.com-tls --from-literal=tls.crt="$CERT" --from-literal=tls.key="$KEY" -printMessage "create secret orderer2.org0.com-tls" $? - -CERT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer3.org0.com/tls-msp/signcerts/cert.pem) -preventEmptyValue "./Org0MSP/orderer3.org0.com/tls-msp/signcerts/cert.pem" $CONTENT - -KEY=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer3.org0.com/tls-msp/keystore/key.pem) -preventEmptyValue "./Org0MSP/orderer3.org0.com/tls-msp/keystore/key.pem" $CONTENT - -kubectl -n n0 delete secret orderer3.org0.com-tls -kubectl -n n0 create secret generic orderer3.org0.com-tls --from-literal=tls.crt="$CERT" --from-literal=tls.key="$KEY" -printMessage "create secret orderer3.org0.com-tls" $? - -CERT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer4.org0.com/tls-msp/signcerts/cert.pem) -preventEmptyValue "./Org0MSP/orderer4.org0.com/tls-msp/signcerts/cert.pem" $CONTENT - -KEY=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer4.org0.com/tls-msp/keystore/key.pem) -preventEmptyValue "./Org0MSP/orderer4.org0.com/tls-msp/keystore/key.pem" $CONTENT - -kubectl -n n0 delete secret orderer4.org0.com-tls -kubectl -n n0 create secret generic orderer4.org0.com-tls --from-literal=tls.crt="$CERT" --from-literal=tls.key="$KEY" -printMessage "create secret orderer4.org0.com-tls" $? - -echo "######## 5. secret: tls root CA cert for both n0 and n1" -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer0.org0.com/tls-msp/tlscacerts/tls-tlsca0-hlf-ca-7054.pem) -preventEmptyValue "./Org0MSP/orderer0.org0.com/tls-msp/tlscacerts/tls-tlsca0-hlf-ca-7054.pem" $CONTENT - -kubectl -n n0 delete secret orderer0.org0.com-tlsrootcert -kubectl -n n0 create secret generic orderer0.org0.com-tlsrootcert --from-literal=tlscacert.pem="$CONTENT" -printMessage "create secret orderer0.org0.com-tlsrootcert for n0" $? - -kubectl -n n1 delete secret orderer0.org0.com-tlsrootcert -kubectl -n n1 create secret generic orderer0.org0.com-tlsrootcert --from-literal=tlscacert.pem="$CONTENT" -printMessage "create secret orderer0.org0.com-tlsrootcert for n1" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer1.org0.com/tls-msp/tlscacerts/tls-tlsca0-hlf-ca-7054.pem) -preventEmptyValue "./Org0MSP/orderer1.org0.com/tls-msp/tlscacerts/tls-tlsca0-hlf-ca-7054.pem" $CONTENT - -kubectl -n n0 delete secret orderer1.org0.com-tlsrootcert -kubectl -n n0 create secret generic orderer1.org0.com-tlsrootcert --from-literal=tlscacert.pem="$CONTENT" -printMessage "create secret orderer1.org0.com-tlsrootcert for n0" $? - -kubectl -n n1 delete secret orderer1.org0.com-tlsrootcert -kubectl -n n1 create secret generic orderer1.org0.com-tlsrootcert --from-literal=tlscacert.pem="$CONTENT" -printMessage "create secret orderer1.org0.com-tlsrootcert for n1" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer2.org0.com/tls-msp/tlscacerts/tls-tlsca0-hlf-ca-7054.pem) -preventEmptyValue "./Org0MSP/orderer2.org0.com/tls-msp/tlscacerts/tls-tlsca0-hlf-ca-7054.pem" $CONTENT - -kubectl -n n0 delete secret orderer2.org0.com-tlsrootcert -kubectl -n n0 create secret generic orderer2.org0.com-tlsrootcert --from-literal=tlscacert.pem="$CONTENT" -printMessage "create secret orderer2.org0.com-tlsrootcert for n0" $? - -kubectl -n n1 delete secret orderer2.org0.com-tlsrootcert -kubectl -n n1 create secret generic orderer2.org0.com-tlsrootcert --from-literal=tlscacert.pem="$CONTENT" -printMessage "create secret orderer2.org0.com-tlsrootcert for n1" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer3.org0.com/tls-msp/tlscacerts/tls-tlsca0-hlf-ca-7054.pem) -preventEmptyValue "./Org0MSP/orderer3.org0.com/tls-msp/tlscacerts/tls-tlsca0-hlf-ca-7054.pem" $CONTENT - -kubectl -n n0 delete secret orderer3.org0.com-tlsrootcert -kubectl -n n0 create secret generic orderer3.org0.com-tlsrootcert --from-literal=tlscacert.pem="$CONTENT" -printMessage "create secret orderer3.org0.com-tlsrootcert for n0" $? - -kubectl -n n1 delete secret orderer3.org0.com-tlsrootcert -kubectl -n n1 create secret generic orderer3.org0.com-tlsrootcert --from-literal=tlscacert.pem="$CONTENT" -printMessage "create secret orderer3.org0.com-tlsrootcert for n1" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer4.org0.com/tls-msp/tlscacerts/tls-tlsca0-hlf-ca-7054.pem) -preventEmptyValue "./Org0MSP/orderer4.org0.com/tls-msp/tlscacerts/tls-tlsca0-hlf-ca-7054.pem" $CONTENT - -kubectl -n n0 delete secret orderer4.org0.com-tlsrootcert -kubectl -n n0 create secret generic orderer4.org0.com-tlsrootcert --from-literal=tlscacert.pem="$CONTENT" -printMessage "create secret orderer4.org0.com-tlsrootcert for n0" $? - -kubectl -n n1 delete secret orderer4.org0.com-tlsrootcert -kubectl -n n1 create secret generic orderer4.org0.com-tlsrootcert --from-literal=tlscacert.pem="$CONTENT" -printMessage "create secret orderer4.org0.com-tlsrootcert for n1" $? - -echo "######## 6. create secret for org0.com-admin-cert.pem" -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- sh -c "cat ./Org0MSP/orderer0.org0.com/msp/admincerts/org0.com-admin-cert.pem") -preventEmptyValue "./Org0MSP/orderer0.org0.com/msp/admincerts/org0.com-admin-cert.pem" $CONTENT - -kubectl -n n0 delete secret orderer0.org0.com-admincert -kubectl -n n0 create secret generic orderer0.org0.com-admincert --from-literal=org0.com-admin-cert.pem="$CONTENT" -printMessage "create secret orderer0.org0.com-admincert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- sh -c "cat ./Org0MSP/orderer1.org0.com/msp/admincerts/org0.com-admin-cert.pem") -preventEmptyValue "./Org0MSP/orderer1.org0.com/msp/admincerts/org0.com-admin-cert.pem" $CONTENT - -kubectl -n n0 delete secret orderer1.org0.com-admincert -kubectl -n n0 create secret generic orderer1.org0.com-admincert --from-literal=org0.com-admin-cert.pem="$CONTENT" -printMessage "create secret orderer1.org0.com-admincert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- sh -c "cat ./Org0MSP/orderer2.org0.com/msp/admincerts/org0.com-admin-cert.pem") -preventEmptyValue "./Org0MSP/orderer2.org0.com/msp/admincerts/org0.com-admin-cert.pem" $CONTENT - -kubectl -n n0 delete secret orderer2.org0.com-admincert -kubectl -n n0 create secret generic orderer2.org0.com-admincert --from-literal=org0.com-admin-cert.pem="$CONTENT" -printMessage "create secret orderer2.org0.com-admincert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- sh -c "cat ./Org0MSP/orderer3.org0.com/msp/admincerts/org0.com-admin-cert.pem") -preventEmptyValue "./Org0MSP/orderer3.org0.com/msp/admincerts/org0.com-admin-cert.pem" $CONTENT - -kubectl -n n0 delete secret orderer3.org0.com-admincert -kubectl -n n0 create secret generic orderer3.org0.com-admincert --from-literal=org0.com-admin-cert.pem="$CONTENT" -printMessage "create secret orderer3.org0.com-admincert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- sh -c "cat ./Org0MSP/orderer4.org0.com/msp/admincerts/org0.com-admin-cert.pem") -preventEmptyValue "./Org0MSP/orderer4.org0.com/msp/admincerts/org0.com-admin-cert.pem" $CONTENT - -kubectl -n n0 delete secret orderer4.org0.com-admincert -kubectl -n n0 create secret generic orderer4.org0.com-admincert --from-literal=org0.com-admin-cert.pem="$CONTENT" -printMessage "create secret orderer4.org0.com-admincert" $? - -echo "######## 7. create secret from orderer's tls signcert - used configtx.yaml to generate genesis block" -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer0.org0.com/tls-msp/signcerts/cert.pem) -preventEmptyValue "./Org0MSP/orderer0.org0.com/tls-msp/signcerts/cert.pem" $CONTENT - -kubectl -n n1 delete secret orderer0.org0.com-tlssigncert -kubectl -n n1 create secret generic orderer0.org0.com-tlssigncert --from-literal=cert.pem="$CONTENT" -printMessage "create secret orderer0.org0.com-tlssigncert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer1.org0.com/tls-msp/signcerts/cert.pem) -preventEmptyValue "./Org0MSP/orderer1.org0.com/tls-msp/signcerts/cert.pem" $CONTENT - -kubectl -n n1 delete secret orderer1.org0.com-tlssigncert -kubectl -n n1 create secret generic orderer1.org0.com-tlssigncert --from-literal=cert.pem="$CONTENT" -printMessage "create secret orderer1.org0.com-tlssigncert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer2.org0.com/tls-msp/signcerts/cert.pem) -preventEmptyValue "./Org0MSP/orderer2.org0.com/tls-msp/signcerts/cert.pem" $CONTENT - -kubectl -n n1 delete secret orderer2.org0.com-tlssigncert -kubectl -n n1 create secret generic orderer2.org0.com-tlssigncert --from-literal=cert.pem="$CONTENT" -printMessage "create secret orderer2.org0.com-tlssigncert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer3.org0.com/tls-msp/signcerts/cert.pem) -preventEmptyValue "./Org0MSP/orderer3.org0.com/tls-msp/signcerts/cert.pem" $CONTENT - -kubectl -n n1 delete secret orderer3.org0.com-tlssigncert -kubectl -n n1 create secret generic orderer3.org0.com-tlssigncert --from-literal=cert.pem="$CONTENT" -printMessage "create secret orderer3.org0.com-tlssigncert" $? - -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- cat ./Org0MSP/orderer4.org0.com/tls-msp/signcerts/cert.pem) -preventEmptyValue "./Org0MSP/orderer4.org0.com/tls-msp/signcerts/cert.pem" $CONTENT - -kubectl -n n1 delete secret orderer4.org0.com-tlssigncert -kubectl -n n1 create secret generic orderer4.org0.com-tlssigncert --from-literal=cert.pem="$CONTENT" -printMessage "create secret orderer4.org0.com-tlssigncert" $? - -echo "######## 8. create secret for org0.com-tlscacert" -CONTENT=$(kubectl -n n0 exec $POD_RCA0 -c ca -- sh -c "cat ./Org0MSP/msp/tlscacerts/tls-ca-cert.pem") -preventEmptyValue "./Org0MSP/msp/tlscacerts/tls-ca-cert.pem" $CONTENT - -kubectl -n n1 delete secret org0.com-tlscacert -kubectl -n n1 create secret generic org0.com-tlscacert --from-literal=tlscacert.pem="$CONTENT" -printMessage "create secret org0.com-tlscacert" $? - -echo "######## 9. Create secret for tls for tlsca, used by ingress controller" -POD_TLSCA0=$(kubectl get pods -n n0 -l "app=hlf-ca,release=tlsca0" -o jsonpath="{.items[0].metadata.name}") -preventEmptyValue "pod unavailable" $POD_TLSCA0 - -CERT=$(kubectl -n n0 exec ${POD_TLSCA0} -c ca -- cat ./Org0MSP/tls/server/ca-cert.pem) -preventEmptyValue "./Org0MSP/tls/server/ca-cert.pem" $CERT - -KEY=$(kubectl -n n0 exec ${POD_TLSCA0} -c ca -- cat ./Org0MSP/tls/server/msp/keystore/key.pem) -preventEmptyValue "./Org0MSP/tls/server/msp/keystore/key.pem" $KEY - -kubectl -n n0 delete secret tlsca0-tls -kubectl -n n0 create secret generic tlsca0-tls --from-literal=tls.crt="$CERT" --from-literal=tls.key="$KEY" -printMessage "create secret tlsca0-tls" $? - -echo "######## 10. Create secret for tls for rca, used by ingress controller" -CERT=$(kubectl -n n0 exec ${POD_RCA0} -c ca -- cat ./Org0MSP/ca/server/ca-cert.pem) -preventEmptyValue "./Org0MSP/ca/server/ca-cert.pem" $CERT - -KEY=$(kubectl -n n0 exec ${POD_RCA0} -c ca -- cat ./Org0MSP/ca/server/msp/keystore/key.pem) -preventEmptyValue "./Org0MSP/ca/server/msp/keystore/key.pem" $KEY - -kubectl -n n0 delete secret rca0-tls -kubectl -n n0 create secret generic rca0-tls --from-literal=tls.crt="$CERT" --from-literal=tls.key="$KEY" -printMessage "create secret rca0-tls" $? diff --git a/workflow/tmp/manifest/org3/installcc-b.hlf-operator.yaml b/workflow/tmp/manifest/org3/installcc-b.hlf-operator.yaml deleted file mode 100644 index 5a8c247..0000000 --- a/workflow/tmp/manifest/org3/installcc-b.hlf-operator.yaml +++ /dev/null @@ -1,74 +0,0 @@ -global: - logging: info - workingDir: /var/hyperledger - mspId: Org3MSP - config: - setupsh: admin3-orgadmin--setupsh - coreyaml: admin3-orgadmin--core - guploadImage: ghcr.io/rtang03/gupload:0.1.6 - channel: - name: loanapp - -config: - peer: - id: cli - peerTlsCaCert: /var/hyperledger/crypto-config/channel-artifacts/org3.net-tlscacert/tlscacert.pem - #Provide the address of the peer who creates the channel and port to be mentioned is grpc cluster IP port - address: p0o3-hlf-peer:7051 - target: p0o3-hlf-peer - orderer: - #Provide the address for orderer - address: orderer0.org0.com:15443 - -####################### -### Param for bootstrap -####################### -bootstrap: - enabled: true - hostAlias: - - hostnames: - - peer0.org1.net - - peer0.org2.net - - peer0.org3.net - - orderer0.org0.com - - orderer1.org0.com - - orderer2.org0.com - - orderer3.org0.com - - orderer4.org0.com - ip: 35.202.107.80 - pvcName: pvc-org3 - secret: - - name: org0tlscacert - secret: org0.com-tlscacert - path: "/var/hyperledger/crypto-config/channel-artifacts/org0.com-tlscacert" - - name: org1tlscacert - secret: org1.net-tlscacert - path: "/var/hyperledger/crypto-config/channel-artifacts/org1.net-tlscacert" - - name: org2tlscacert - secret: org2.net-tlscacert - path: "/var/hyperledger/crypto-config/channel-artifacts/org2.net-tlscacert" - - name: org3tlscacert - secret: org3.net-tlscacert - path: "/var/hyperledger/crypto-config/channel-artifacts/org3.net-tlscacert" - chaincode: - id: eventstore - contract: eventstore - version: 1 - lang: node - tasks: - approve_chaincode: - enabled: true - sequence: 1 - queryapproved: - enabled: true - dev_invoke: - enabled: true - targets: - - peerAddress: peer0.org1.net:15443 - tlsRootCertFiles: /var/hyperledger/crypto-config/channel-artifacts/org1.net-tlscacert/tlscacert.pem - - peerAddress: peer0.org2.net:15443 - tlsRootCertFiles: /var/hyperledger/crypto-config/channel-artifacts/org2.net-tlscacert/tlscacert.pem - - peerAddress: peer0.org3.net:15443 - tlsRootCertFiles: /var/hyperledger/crypto-config/channel-artifacts/org3.net-tlscacert/tlscacert.pem - dev_query: - enabled: true diff --git a/workflow/tmp/manifest/org3/joinch-hlf-operator.yaml b/workflow/tmp/manifest/org3/joinch-hlf-operator.yaml deleted file mode 100644 index e83f403..0000000 --- a/workflow/tmp/manifest/org3/joinch-hlf-operator.yaml +++ /dev/null @@ -1,40 +0,0 @@ -global: - logging: info - workingDir: /var/hyperledger - mspId: Org3MSP - # configMap - config: - setupsh: admin3-orgadmin--setupsh - coreyaml: admin3-orgadmin--core - guploadImage: ghcr.io/rtang03/gupload:0.1.6 - channel: - name: loanapp - -config: - peer: - id: cli - peerTlsCaCert: /var/hyperledger/crypto-config/channel-artifacts/org3.net-tlscacert/tlscacert.pem - #Provide the address of the peer who creates the channel and port to be mentioned is grpc cluster IP port - address: p0o3-hlf-peer:7051 - target: peer0.org3.net - orderer: - #Provide the address for orderer - address: orderer0.org0.com:15443 - -joinChannel: - enabled: true - hostAlias: - - hostnames: - - peer0.org3.net - ip: 35.202.107.80 - orgadmin: - pvcName: pvc-org3 - gupload: - pvcName: pvc-gupload3 - secret: - - name: org0tlscacert - secret: org0.com-tlscacert - path: "/var/hyperledger/crypto-config/channel-artifacts/org0.com-tlscacert" - - name: org3tlscacert - secret: org3.net-tlscacert - path: "/var/hyperledger/crypto-config/channel-artifacts/org3.net-tlscacert" diff --git a/workflow/tmp/manifest/org3/neworg-hlf-operator.yaml b/workflow/tmp/manifest/org3/neworg-hlf-operator.yaml deleted file mode 100644 index c661b14..0000000 --- a/workflow/tmp/manifest/org3/neworg-hlf-operator.yaml +++ /dev/null @@ -1,55 +0,0 @@ -global: - logging: info - workingDir: /var/hyperledger - mspId: Org3MSP - # configMap - config: - setupsh: admin3-orgadmin--setupsh - coreyaml: admin3-orgadmin--core - guploadImage: ghcr.io/rtang03/gupload:0.1.6 - channel: - name: loanapp - -config: - peer: - id: cli - peerTlsCaCert: /var/hyperledger/crypto-config/channel-artifacts/org3.net-tlscacert/tlscacert.pem - #Provide the address of the peer who creates the channel and port to be mentioned is grpc cluster IP port - address: p0o3-hlf-peer:7051 - target: peer0.org3.net - orderer: - #Provide the address for orderer - address: orderer0.org0.com:15443 - -neworgSend: - enabled: true - hostAlias: - - hostnames: - - orderer0.org0.com - - peer0.org3.net - ip: 35.202.107.80 - - hostnames: - - gupload.org1.net - ip: 35.202.107.80 - # latest channel block (block 0), uploaded by "fetch1" - channelConfg: o1_channel_config--config.json - orgadmin: - pvcName: pvc-org3 - gupload: - pvcName: pvc-gupload3 - secret: - - name: guploadtlscacert - secret: org1.net-tlscacert - path: "/var/gupload/cert" - - name: org3tlscacert - secret: org3.net-tlscacert - path: "/var/hyperledger/crypto-config/channel-artifacts/org3.net-tlscacert" - # used by configMap configtx.yaml - configtx: - mspId: Org3MSP - anchorPeer: peer0.org3.net - anchorPeerPort: 15443 - # dial address of gupload - address: - url: gupload.org1.net - port: 15443 diff --git a/workflow/tmp/manifest/org3/orgadmin.gcp.yaml b/workflow/tmp/manifest/org3/orgadmin.gcp.yaml deleted file mode 100644 index f55d1b2..0000000 --- a/workflow/tmp/manifest/org3/orgadmin.gcp.yaml +++ /dev/null @@ -1,65 +0,0 @@ -global: - mspId: Org3MSP - ### Default - # TZ: Asia/Hong_Kong - ### Default - # workingDir: /var/hyperledger/crypto-config - ### Default - # logging: info - -cli: - ### Default - fabricBinary: "2.2.0" - ### Default - fabricCABinary: "1.4.7" - -hostAlias: - enabled: true - hostnames: - # istio ingress gateway - - hostname: peer0.org3.net - ip: 35.202.107.80 - - hostname: orderer0.org0.com - ip: 35.202.107.80 - -peer: - enabled: true - ### configmap - config: - # peerAddress is [Release-name]-hlf-peer:7051 - peerAddress: "p0o3-hlf-peer:7051" - peerTlsRootcertFile: /var/hyperledger/crypto-config/Org3MSP/msp/tlscacerts/tls-ca-cert.pem -# peerTlsRootcertFile: /var/hyperledger/crypto-config/Org3MSP/peer0.org3.net/tls-msp/signcerts/cert.pem - ### certs provider by org0, to peer - secret: - ordTlsCaCert: org0.com-tlscacert - -persistence: - pvcName: pvc-org3 - -postgresql-0: - ### Default - # initdbScripts: - # 1-createdb.sql: | - # CREATE DATABASE "tls_ca_db"; - # CREATE DATABASE "rca_db"; - postgresqlPassword: password - master: - podAnnotations: - sidecar.istio.io/proxyCPU: "50m" - sidecar.istio.io/proxyCPULimit: "50m" - podLabels: - version: "0.6.3" - app: "orgadmin" - slave: - podAnnotations: - sidecar.istio.io/proxyCPU: "50m" - sidecar.istio.io/proxyCPULimit: "50m" - podLabels: - version: "0.6.3" - app: "orgadmin" - service: - type: NodePort - persistence: - enabled: true - existingClaim: pvc-org3 diff --git a/workflow/tmp/manifest/org3/rca-cryptogen.gcp.yaml b/workflow/tmp/manifest/org3/rca-cryptogen.gcp.yaml deleted file mode 100644 index ff02cea..0000000 --- a/workflow/tmp/manifest/org3/rca-cryptogen.gcp.yaml +++ /dev/null @@ -1,47 +0,0 @@ -global: - mspId: Org3MSP - caName: rca3 - # TODO: define it inside _helpers.tpl - # /var/hyperledger/crypto-config/[MSPID]/ca/server - caServerHome: /var/hyperledger/crypto-config/Org3MSP/ca/server - # /var/hyperledger/crypto-config/[MSPID]/ca/server - caClientHome: /var/hyperledger/crypto-config/Org3MSP/ca/admin - domain: org3.net - # name of configMap [release-name of orgadmin]-[app-name]-setupsh - setupsh: admin3-orgadmin--setupsh - -# admin credential of tlsca -caAdmin: rca3-admin -caAdminPW: rca3-adminPW - -# service name [release name]-hlf-ca:7054 -endpoint: rca3-hlf-ca:7054 - -# TODO: define it inside _helpers.tpl -# /var/hyperledger/crypto-config/[MSPID]/ca/admin/msp/cacerts/[RCA Release Name]-hlf-ca-7054.pem -orgCaCert: /var/hyperledger/crypto-config/Org3MSP/ca/admin/msp/cacerts/rca3-hlf-ca-7054.pem - -# /var/hyperledger/crypto-config/[MSPID]/admin/msp/signcerts/cert.pem -adminCert: /var/hyperledger/crypto-config/Org3MSP/admin/msp/signcerts/cert.pem - -orgAdmin: - enabled: true - # Root CA admin id - no naming convention - id: admin-peer0.org3.net - secret: admin-peer0.org3.netPW - type: admin - attrs: "hf.Registrar.Attributes=*,hf.Revoker=true,hf.GenCRL=true,admin=true:ecert" - -items: - - type: peer - id: peer0.org3.net - secret: peer0.org3.netPW - caClientMspDir: msp - # csrHosts is OPTIONAL - # [Release Name of peer]-hlf-peer - # External domain name - # gupload subdomain - csrHosts: "p0o3-hlf-peer,peer0.org3.net,gupload.org3.net" - -persistence: - pvcName: pvc-org3 diff --git a/workflow/tmp/manifest/org3/rca-hlf-ca.gcp.yaml b/workflow/tmp/manifest/org3/rca-hlf-ca.gcp.yaml deleted file mode 100644 index 711bc03..0000000 --- a/workflow/tmp/manifest/org3/rca-hlf-ca.gcp.yaml +++ /dev/null @@ -1,55 +0,0 @@ -global: - ### Default - # TZ: Asia/Hong_Kong - ### Default - # workingDir: /var/hyperledger/crypto-config - ### Default - # logging: info - mspId: Org3MSP - caName: rca3 - -caAdmin: rca3-admin -caAdminPW: rca3-adminPW - -### Default -#image: -# repository: hyperledger/fabric-ca -# tag: 1.4.7 -# pullPolicy: IfNotPresent - -config: - type: ca - ### Default - # debug: false - csr: - names: - c: US - st: "North Carolina" - o: Hyperledger - ou: Fabric - affiliations: {} - ## "intermediate" is only specified for Intermediate CA's - # intermediate: - # parent: - # chart: parent-ca - # url: parent-ca.example.com - # port: 7054 - ## Affiliations used in ca Server configuration file - -persistence: - ### Default - enabled: true - existingClaim: pvc-org3 - -externalDatabase: - type: postgres - # [Release-Name of OrgAdmin app]-postgresql-0 - host: admin3-postgresql-0 - port: 5432 - database: rca_db - username: postgres - password: password - -### Default -#db: -# ssl: disable diff --git a/workflow/tmp/manifest/org3/tlsca-cryptogen.gcp.yaml b/workflow/tmp/manifest/org3/tlsca-cryptogen.gcp.yaml deleted file mode 100644 index ad67605..0000000 --- a/workflow/tmp/manifest/org3/tlsca-cryptogen.gcp.yaml +++ /dev/null @@ -1,40 +0,0 @@ -global: - mspId: Org3MSP - caName: tlsca3 - # TODO: define it inside _helpers.tpl - # /var/hyperledger/crypto-config/[MSPID]/tls/server - caServerHome: /var/hyperledger/crypto-config/Org3MSP/tls/server - # /var/hyperledger/crypto-config/[MSPID]/tls/admin - caClientHome: /var/hyperledger/crypto-config/Org3MSP/tls/admin - domain: org3.net - # name of configMap [release-name of orgadmin]-[app-name]-setupsh - setupsh: admin3-orgadmin--setupsh - -# admin credential of tlsca -caAdmin: tlsca3-admin -caAdminPW: tlsca3-adminPW - -# service name [release name]-hlf-ca:7054 -endpoint: tlsca3-hlf-ca:7054 - -# TODO: define it inside _helpers.tpl -# /var/hyperledger/crypto-config/[MSPID]/tls/admin/msp/cacerts/[TLSCA Release Name]-hlf-ca-7054.pem -tlsCaCert: /var/hyperledger/crypto-config/Org3MSP/tls/admin/msp/cacerts/tlsca3-hlf-ca-7054.pem - -orgAdmin: - enabled: false - -items: - - type: peer - # domain url - id: peer0.org3.net - secret: peer0.org3.netPW - caClientMspDir: tls-msp - profile: tls - # [Release Name of peer]-hlf-peer - # External domain name - # gupload subdomain - csrHosts: "p0o3-hlf-peer,peer0.org3.net,gupload.org3.net" - -persistence: - pvcName: pvc-org3 diff --git a/workflow/tmp/manifest/org3/tlsca-hlf-ca.gcp.yaml b/workflow/tmp/manifest/org3/tlsca-hlf-ca.gcp.yaml deleted file mode 100644 index f0d25ec..0000000 --- a/workflow/tmp/manifest/org3/tlsca-hlf-ca.gcp.yaml +++ /dev/null @@ -1,61 +0,0 @@ -global: - ### Default - # TZ: Asia/Hong_Kong - ### Default - # workingDir: /var/hyperledger/crypto-config - ### Default - # logging: info - mspId: Org3MSP - caName: tlsca3 - -caAdmin: tlsca3-admin -caAdminPW: tlsca3-adminPW - -### Default -#image: -# repository: hyperledger/fabric-ca -# tag: 1.4.7 -# pullPolicy: IfNotPresent - -### Default -#service: -# type: NodePort -# port: 7054 - -config: - # FIXED - type: tls - ### Default - # debug: false - csr: - names: - c: US - st: "North Carolina" - o: Hyperledger - ou: Fabric - affiliations: {} - ## "intermediate" is only specified for Intermediate CA's - # intermediate: - # parent: - # chart: parent-ca - # url: parent-ca.example.com - # port: 7054 - ## Affiliations used in ca Server configuration file - -persistence: - ### Default - enabled: true - existingClaim: pvc-org3 - -externalDatabase: - type: postgres - # [Release-Name of OrgAdmin app]-postgresql-0 - host: admin3-postgresql-0 - port: 5432 - database: tls_ca_db - username: postgres - password: password - -### Default -#db: -# ssl: disable