git.iko.soy/rowtype-yoga/purescript-kafkajs
on main help sign in
.github/workflows/ci.ymlnew file+32
since splitsnapshots
unifiedsplit
@@ -0,0 +1,32 @@
1+name: CI
2+
3+on:
4+ push:
5+ branches: [main]
6+ pull_request:
7+ branches: [main]
8+
9+jobs:
10+ build:
11+ runs-on: ubuntu-latest
12+ steps:
13+ - uses: actions/checkout@v2
14+
15+ - uses: purescript-contrib/setup-purescript@main
16+
17+ - name: Cache PureScript dependencies
18+ uses: actions/cache@v2
19+ # This cache uses the .dhall files to know when it should reinstall
20+ # and rebuild packages. It caches both the installed packages from
21+ # the `.spago` directory and compilation artifacts from the `output`
22+ # directory. When restored the compiler will rebuild any files that
23+ # have changed. If you do not want to cache compiled output, remove
24+ # the `output` path.
25+ with:
26+ key: ${{ runner.os }}-spago-${{ hashFiles('**/*.dhall') }}
27+ path: |
28+ .spago
29+ output
30+ - run: spago build
31+
32+ - run: spago test --no-install
README.md+8−1
@@ -1 +1,8 @@
1−# purescript-kafkajs
1+# purescript-kafkajs
2+
3+Purescript wrapper for [kafkajs](https://kafka.js.org).
4+
5+
6+## Usage
7+
8+See [examples folder](./example) for usage.
bower.jsonnew file+27
@@ -0,0 +1,27 @@
1+{
2+ "name": "purescript-kafkajs",
3+ "license": [
4+ "MIT"
5+ ],
6+ "repository": {
7+ "type": "git",
8+ "url": "https://github.com/HivemindTechnologies/purescript-kafkajs.git"
9+ },
10+ "ignore": [
11+ "**/.*",
12+ "node_modules",
13+ "bower_components",
14+ "output"
15+ ],
16+ "dependencies": {
17+ "purescript-aff-promise": "^v2.1.0",
18+ "purescript-console": "^v5.0.0",
19+ "purescript-debug": "^v4.0.1",
20+ "purescript-effect": "^v3.0.0",
21+ "purescript-maybe": "^v5.0.0",
22+ "purescript-node-buffer": "^v7.0.0",
23+ "purescript-nullable": "^v5.0.0",
24+ "purescript-psci-support": "^v5.0.0",
25+ "purescript-spec": "^v5.0.0"
26+ }
27+}
example/README.mdnew file+26
@@ -0,0 +1,26 @@
1+# Examples
2+
3+Start a kafka using
4+
5+```bash
6+docker-compose up -d
7+```
8+
9+## Transactional producer consumer
10+
11+Install everything
12+```bash
13+cd transactional-producer-consumer && npm install
14+```
15+
16+Run a producer in a terminal.
17+
18+```bash
19+npx spago run -m Kafka.Example.Producer
20+```
21+
22+Run a consumer in another terminal.
23+
24+```bash
25+npx spago run -m Kafka.Example.Consumer
26+```
example/docker-compose.ymlnew file+23
@@ -0,0 +1,23 @@
1+version: '3.7'
2+services:
3+ zookeeper:
4+ image: confluentinc/cp-zookeeper:6.1.0
5+ container_name: zookeeper
6+ environment:
7+ ZOOKEEPER_CLIENT_PORT: 2181
8+ ZOOKEEPER_TICK_TIME: 2000
9+ kafka:
10+ image: confluentinc/cp-kafka:6.1.0
11+ container_name: kafka
12+ ports: ["9092:9092"]
13+ environment:
14+ KAFKA_BROKER_ID: 1
15+ KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
16+ KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
17+ KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
18+ KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
19+ KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
20+ KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
21+ KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
22+ KAFKA_MIN_INSYNC_REPLICAS: 1
23+ KAFKA_DEFAULT_REPLICATION_FACTOR: 1
example/transactional-producer-consumer/.gitignorenew file+10
@@ -0,0 +1,10 @@
1+/bower_components/
2+/node_modules/
3+/.pulp-cache/
4+/output/
5+/generated-docs/
6+/.psc-package/
7+/.psc*
8+/.purs*
9+/.psa*
10+/.spago
example/transactional-producer-consumer/package-lock.jsonnew file+2894
@@ -0,0 +1,2894 @@
1+{
2+ "name": "transactional-producer-consumer",
3+ "version": "1.0.0",
4+ "lockfileVersion": 2,
5+ "requires": true,
6+ "packages": {
7+ "": {
8+ "version": "1.0.0",
9+ "license": "MIT",
10+ "devDependencies": {
11+ "purescript": "^0.14.0",
12+ "purty": "^7.0.0",
13+ "spago": "^0.19.1"
14+ }
15+ },
16+ "node_modules/ajv": {
17+ "version": "6.12.6",
18+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
19+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
20+ "dev": true,
21+ "dependencies": {
22+ "fast-deep-equal": "^3.1.1",
23+ "fast-json-stable-stringify": "^2.0.0",
24+ "json-schema-traverse": "^0.4.1",
25+ "uri-js": "^4.2.2"
26+ },
27+ "funding": {
28+ "type": "github",
29+ "url": "https://github.com/sponsors/epoberezkin"
30+ }
31+ },
32+ "node_modules/ansi-escapes": {
33+ "version": "3.2.0",
34+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
35+ "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
36+ "dev": true,
37+ "engines": {
38+ "node": ">=4"
39+ }
40+ },
41+ "node_modules/ansi-regex": {
42+ "version": "4.1.0",
43+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
44+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
45+ "dev": true,
46+ "engines": {
47+ "node": ">=6"
48+ }
49+ },
50+ "node_modules/ansi-styles": {
51+ "version": "3.2.1",
52+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
53+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
54+ "dev": true,
55+ "dependencies": {
56+ "color-convert": "^1.9.0"
57+ },
58+ "engines": {
59+ "node": ">=4"
60+ }
61+ },
62+ "node_modules/aproba": {
63+ "version": "1.2.0",
64+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
65+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
66+ "dev": true
67+ },
68+ "node_modules/arch": {
69+ "version": "2.2.0",
70+ "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
71+ "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
72+ "dev": true,
73+ "funding": [
74+ {
75+ "type": "github",
76+ "url": "https://github.com/sponsors/feross"
77+ },
78+ {
79+ "type": "patreon",
80+ "url": "https://www.patreon.com/feross"
81+ },
82+ {
83+ "type": "consulting",
84+ "url": "https://feross.org/support"
85+ }
86+ ]
87+ },
88+ "node_modules/asn1": {
89+ "version": "0.2.4",
90+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
91+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
92+ "dev": true,
93+ "dependencies": {
94+ "safer-buffer": "~2.1.0"
95+ }
96+ },
97+ "node_modules/assert-plus": {
98+ "version": "1.0.0",
99+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
100+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
101+ "dev": true,
102+ "engines": {
103+ "node": ">=0.8"
104+ }
105+ },
106+ "node_modules/asynckit": {
107+ "version": "0.4.0",
108+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
109+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
110+ "dev": true
111+ },
112+ "node_modules/aws-sign2": {
113+ "version": "0.7.0",
114+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
115+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
116+ "dev": true,
117+ "engines": {
118+ "node": "*"
119+ }
120+ },
121+ "node_modules/aws4": {
122+ "version": "1.11.0",
123+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
124+ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
125+ "dev": true
126+ },
127+ "node_modules/balanced-match": {
128+ "version": "1.0.0",
129+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
130+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
131+ "dev": true
132+ },
133+ "node_modules/bcrypt-pbkdf": {
134+ "version": "1.0.2",
135+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
136+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
137+ "dev": true,
138+ "dependencies": {
139+ "tweetnacl": "^0.14.3"
140+ }
141+ },
142+ "node_modules/bluebird": {
143+ "version": "3.7.2",
144+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
145+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
146+ "dev": true
147+ },
148+ "node_modules/brace-expansion": {
149+ "version": "1.1.11",
150+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
151+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
152+ "dev": true,
153+ "dependencies": {
154+ "balanced-match": "^1.0.0",
155+ "concat-map": "0.0.1"
156+ }
157+ },
158+ "node_modules/buffer-from": {
159+ "version": "1.1.1",
160+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
161+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
162+ "dev": true
163+ },
164+ "node_modules/byline": {
165+ "version": "5.0.0",
166+ "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz",
167+ "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=",
168+ "dev": true,
169+ "engines": {
170+ "node": ">=0.10.0"
171+ }
172+ },
173+ "node_modules/cacache": {
174+ "version": "11.3.3",
175+ "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz",
176+ "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==",
177+ "dev": true,
178+ "dependencies": {
179+ "bluebird": "^3.5.5",
180+ "chownr": "^1.1.1",
181+ "figgy-pudding": "^3.5.1",
182+ "glob": "^7.1.4",
183+ "graceful-fs": "^4.1.15",
184+ "lru-cache": "^5.1.1",
185+ "mississippi": "^3.0.0",
186+ "mkdirp": "^0.5.1",
187+ "move-concurrently": "^1.0.1",
188+ "promise-inflight": "^1.0.1",
189+ "rimraf": "^2.6.3",
190+ "ssri": "^6.0.1",
191+ "unique-filename": "^1.1.1",
192+ "y18n": "^4.0.0"
193+ }
194+ },
195+ "node_modules/caseless": {
196+ "version": "0.12.0",
197+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
198+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
199+ "dev": true
200+ },
201+ "node_modules/chalk": {
202+ "version": "2.4.2",
203+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
204+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
205+ "dev": true,
206+ "dependencies": {
207+ "ansi-styles": "^3.2.1",
208+ "escape-string-regexp": "^1.0.5",
209+ "supports-color": "^5.3.0"
210+ },
211+ "engines": {
212+ "node": ">=4"
213+ }
214+ },
215+ "node_modules/chownr": {
216+ "version": "1.1.4",
217+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
218+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
219+ "dev": true
220+ },
221+ "node_modules/cli-cursor": {
222+ "version": "2.1.0",
223+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
224+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
225+ "dev": true,
226+ "dependencies": {
227+ "restore-cursor": "^2.0.0"
228+ },
229+ "engines": {
230+ "node": ">=4"
231+ }
232+ },
233+ "node_modules/color-convert": {
234+ "version": "1.9.3",
235+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
236+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
237+ "dev": true,
238+ "dependencies": {
239+ "color-name": "1.1.3"
240+ }
241+ },
242+ "node_modules/color-name": {
243+ "version": "1.1.3",
244+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
245+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
246+ "dev": true
247+ },
248+ "node_modules/combined-stream": {
249+ "version": "1.0.8",
250+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
251+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
252+ "dev": true,
253+ "dependencies": {
254+ "delayed-stream": "~1.0.0"
255+ },
256+ "engines": {
257+ "node": ">= 0.8"
258+ }
259+ },
260+ "node_modules/concat-map": {
261+ "version": "0.0.1",
262+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
263+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
264+ "dev": true
265+ },
266+ "node_modules/concat-stream": {
267+ "version": "1.6.2",
268+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
269+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
270+ "dev": true,
271+ "engines": [
272+ "node >= 0.8"
273+ ],
274+ "dependencies": {
275+ "buffer-from": "^1.0.0",
276+ "inherits": "^2.0.3",
277+ "readable-stream": "^2.2.2",
278+ "typedarray": "^0.0.6"
279+ }
280+ },
281+ "node_modules/copy-concurrently": {
282+ "version": "1.0.5",
283+ "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
284+ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
285+ "dev": true,
286+ "dependencies": {
287+ "aproba": "^1.1.1",
288+ "fs-write-stream-atomic": "^1.0.8",
289+ "iferr": "^0.1.5",
290+ "mkdirp": "^0.5.1",
291+ "rimraf": "^2.5.4",
292+ "run-queue": "^1.0.0"
293+ }
294+ },
295+ "node_modules/core-util-is": {
296+ "version": "1.0.2",
297+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
298+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
299+ "dev": true
300+ },
301+ "node_modules/cross-spawn": {
302+ "version": "7.0.3",
303+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
304+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
305+ "dev": true,
306+ "dependencies": {
307+ "path-key": "^3.1.0",
308+ "shebang-command": "^2.0.0",
309+ "which": "^2.0.1"
310+ },
311+ "engines": {
312+ "node": ">= 8"
313+ }
314+ },
315+ "node_modules/cross-spawn/node_modules/which": {
316+ "version": "2.0.2",
317+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
318+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
319+ "dev": true,
320+ "dependencies": {
321+ "isexe": "^2.0.0"
322+ },
323+ "bin": {
324+ "node-which": "bin/node-which"
325+ },
326+ "engines": {
327+ "node": ">= 8"
328+ }
329+ },
330+ "node_modules/cyclist": {
331+ "version": "1.0.1",
332+ "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
333+ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
334+ "dev": true
335+ },
336+ "node_modules/dashdash": {
337+ "version": "1.14.1",
338+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
339+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
340+ "dev": true,
341+ "dependencies": {
342+ "assert-plus": "^1.0.0"
343+ },
344+ "engines": {
345+ "node": ">=0.10"
346+ }
347+ },
348+ "node_modules/delayed-stream": {
349+ "version": "1.0.0",
350+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
351+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
352+ "dev": true,
353+ "engines": {
354+ "node": ">=0.4.0"
355+ }
356+ },
357+ "node_modules/duplexify": {
358+ "version": "3.7.1",
359+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
360+ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
361+ "dev": true,
362+ "dependencies": {
363+ "end-of-stream": "^1.0.0",
364+ "inherits": "^2.0.1",
365+ "readable-stream": "^2.0.0",
366+ "stream-shift": "^1.0.0"
367+ }
368+ },
369+ "node_modules/ecc-jsbn": {
370+ "version": "0.1.2",
371+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
372+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
373+ "dev": true,
374+ "dependencies": {
375+ "jsbn": "~0.1.0",
376+ "safer-buffer": "^2.1.0"
377+ }
378+ },
379+ "node_modules/emoji-regex": {
380+ "version": "7.0.3",
381+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
382+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
383+ "dev": true
384+ },
385+ "node_modules/end-of-stream": {
386+ "version": "1.4.4",
387+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
388+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
389+ "dev": true,
390+ "dependencies": {
391+ "once": "^1.4.0"
392+ }
393+ },
394+ "node_modules/env-paths": {
395+ "version": "2.2.0",
396+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz",
397+ "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==",
398+ "dev": true,
399+ "engines": {
400+ "node": ">=6"
401+ }
402+ },
403+ "node_modules/escape-string-regexp": {
404+ "version": "1.0.5",
405+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
406+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
407+ "dev": true,
408+ "engines": {
409+ "node": ">=0.8.0"
410+ }
411+ },
412+ "node_modules/execa": {
413+ "version": "2.1.0",
414+ "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz",
415+ "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==",
416+ "dev": true,
417+ "dependencies": {
418+ "cross-spawn": "^7.0.0",
419+ "get-stream": "^5.0.0",
420+ "is-stream": "^2.0.0",
421+ "merge-stream": "^2.0.0",
422+ "npm-run-path": "^3.0.0",
423+ "onetime": "^5.1.0",
424+ "p-finally": "^2.0.0",
425+ "signal-exit": "^3.0.2",
426+ "strip-final-newline": "^2.0.0"
427+ },
428+ "engines": {
429+ "node": "^8.12.0 || >=9.7.0"
430+ }
431+ },
432+ "node_modules/extend": {
433+ "version": "3.0.2",
434+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
435+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
436+ "dev": true
437+ },
438+ "node_modules/extsprintf": {
439+ "version": "1.3.0",
440+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
441+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
442+ "dev": true,
443+ "engines": [
444+ "node >=0.6.0"
445+ ]
446+ },
447+ "node_modules/fast-deep-equal": {
448+ "version": "3.1.3",
449+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
450+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
451+ "dev": true
452+ },
453+ "node_modules/fast-json-stable-stringify": {
454+ "version": "2.1.0",
455+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
456+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
457+ "dev": true
458+ },
459+ "node_modules/figgy-pudding": {
460+ "version": "3.5.2",
461+ "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
462+ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
463+ "dev": true
464+ },
465+ "node_modules/filesize": {
466+ "version": "4.2.1",
467+ "resolved": "https://registry.npmjs.org/filesize/-/filesize-4.2.1.tgz",
468+ "integrity": "sha512-bP82Hi8VRZX/TUBKfE24iiUGsB/sfm2WUrwTQyAzQrhO3V9IhcBBNBXMyzLY5orACxRyYJ3d2HeRVX+eFv4lmA==",
469+ "dev": true,
470+ "engines": {
471+ "node": ">= 0.4.0"
472+ }
473+ },
474+ "node_modules/flush-write-stream": {
475+ "version": "1.1.1",
476+ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
477+ "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
478+ "dev": true,
479+ "dependencies": {
480+ "inherits": "^2.0.3",
481+ "readable-stream": "^2.3.6"
482+ }
483+ },
484+ "node_modules/forever-agent": {
485+ "version": "0.6.1",
486+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
487+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
488+ "dev": true,
489+ "engines": {
490+ "node": "*"
491+ }
492+ },
493+ "node_modules/form-data": {
494+ "version": "2.3.3",
495+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
496+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
497+ "dev": true,
498+ "dependencies": {
499+ "asynckit": "^0.4.0",
500+ "combined-stream": "^1.0.6",
501+ "mime-types": "^2.1.12"
502+ },
503+ "engines": {
504+ "node": ">= 0.12"
505+ }
506+ },
507+ "node_modules/from2": {
508+ "version": "2.3.0",
509+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
510+ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
511+ "dev": true,
512+ "dependencies": {
513+ "inherits": "^2.0.1",
514+ "readable-stream": "^2.0.0"
515+ }
516+ },
517+ "node_modules/fs-minipass": {
518+ "version": "1.2.7",
519+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
520+ "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
521+ "dev": true,
522+ "dependencies": {
523+ "minipass": "^2.6.0"
524+ }
525+ },
526+ "node_modules/fs-write-stream-atomic": {
527+ "version": "1.0.10",
528+ "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
529+ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
530+ "dev": true,
531+ "dependencies": {
532+ "graceful-fs": "^4.1.2",
533+ "iferr": "^0.1.5",
534+ "imurmurhash": "^0.1.4",
535+ "readable-stream": "1 || 2"
536+ }
537+ },
538+ "node_modules/fs.realpath": {
539+ "version": "1.0.0",
540+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
541+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
542+ "dev": true
543+ },
544+ "node_modules/get-stream": {
545+ "version": "5.2.0",
546+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
547+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
548+ "dev": true,
549+ "dependencies": {
550+ "pump": "^3.0.0"
551+ },
552+ "engines": {
553+ "node": ">=8"
554+ },
555+ "funding": {
556+ "url": "https://github.com/sponsors/sindresorhus"
557+ }
558+ },
559+ "node_modules/getpass": {
560+ "version": "0.1.7",
561+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
562+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
563+ "dev": true,
564+ "dependencies": {
565+ "assert-plus": "^1.0.0"
566+ }
567+ },
568+ "node_modules/glob": {
569+ "version": "7.1.6",
570+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
571+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
572+ "dev": true,
573+ "dependencies": {
574+ "fs.realpath": "^1.0.0",
575+ "inflight": "^1.0.4",
576+ "inherits": "2",
577+ "minimatch": "^3.0.4",
578+ "once": "^1.3.0",
579+ "path-is-absolute": "^1.0.0"
580+ },
581+ "engines": {
582+ "node": "*"
583+ },
584+ "funding": {
585+ "url": "https://github.com/sponsors/isaacs"
586+ }
587+ },
588+ "node_modules/graceful-fs": {
589+ "version": "4.2.6",
590+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
591+ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
592+ "dev": true
593+ },
594+ "node_modules/har-schema": {
595+ "version": "2.0.0",
596+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
597+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
598+ "dev": true,
599+ "engines": {
600+ "node": ">=4"
601+ }
602+ },
603+ "node_modules/har-validator": {
604+ "version": "5.1.5",
605+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
606+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
607+ "deprecated": "this library is no longer supported",
608+ "dev": true,
609+ "dependencies": {
610+ "ajv": "^6.12.3",
611+ "har-schema": "^2.0.0"
612+ },
613+ "engines": {
614+ "node": ">=6"
615+ }
616+ },
617+ "node_modules/has-flag": {
618+ "version": "3.0.0",
619+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
620+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
621+ "dev": true,
622+ "engines": {
623+ "node": ">=4"
624+ }
625+ },
626+ "node_modules/http-signature": {
627+ "version": "1.2.0",
628+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
629+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
630+ "dev": true,
631+ "dependencies": {
632+ "assert-plus": "^1.0.0",
633+ "jsprim": "^1.2.2",
634+ "sshpk": "^1.7.0"
635+ },
636+ "engines": {
637+ "node": ">=0.8",
638+ "npm": ">=1.3.7"
639+ }
640+ },
641+ "node_modules/iferr": {
642+ "version": "0.1.5",
643+ "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
644+ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
645+ "dev": true
646+ },
647+ "node_modules/imurmurhash": {
648+ "version": "0.1.4",
649+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
650+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
651+ "dev": true,
652+ "engines": {
653+ "node": ">=0.8.19"
654+ }
655+ },
656+ "node_modules/inflight": {
657+ "version": "1.0.6",
658+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
659+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
660+ "dev": true,
661+ "dependencies": {
662+ "once": "^1.3.0",
663+ "wrappy": "1"
664+ }
665+ },
666+ "node_modules/inherits": {
667+ "version": "2.0.4",
668+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
669+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
670+ "dev": true
671+ },
672+ "node_modules/is-fullwidth-code-point": {
673+ "version": "2.0.0",
674+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
675+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
676+ "dev": true,
677+ "engines": {
678+ "node": ">=4"
679+ }
680+ },
681+ "node_modules/is-plain-obj": {
682+ "version": "2.1.0",
683+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
684+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
685+ "dev": true,
686+ "engines": {
687+ "node": ">=8"
688+ }
689+ },
690+ "node_modules/is-stream": {
691+ "version": "2.0.0",
692+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
693+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
694+ "dev": true,
695+ "engines": {
696+ "node": ">=8"
697+ }
698+ },
699+ "node_modules/is-typedarray": {
700+ "version": "1.0.0",
701+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
702+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
703+ "dev": true
704+ },
705+ "node_modules/isarray": {
706+ "version": "1.0.0",
707+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
708+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
709+ "dev": true
710+ },
711+ "node_modules/isexe": {
712+ "version": "2.0.0",
713+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
714+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
715+ "dev": true
716+ },
717+ "node_modules/isstream": {
718+ "version": "0.1.2",
719+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
720+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
721+ "dev": true
722+ },
723+ "node_modules/jsbn": {
724+ "version": "0.1.1",
725+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
726+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
727+ "dev": true
728+ },
729+ "node_modules/json-schema": {
730+ "version": "0.2.3",
731+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
732+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
733+ "dev": true
734+ },
735+ "node_modules/json-schema-traverse": {
736+ "version": "0.4.1",
737+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
738+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
739+ "dev": true
740+ },
741+ "node_modules/json-stringify-safe": {
742+ "version": "5.0.1",
743+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
744+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
745+ "dev": true
746+ },
747+ "node_modules/jsprim": {
748+ "version": "1.4.1",
749+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
750+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
751+ "dev": true,
752+ "engines": [
753+ "node >=0.6.0"
754+ ],
755+ "dependencies": {
756+ "assert-plus": "1.0.0",
757+ "extsprintf": "1.3.0",
758+ "json-schema": "0.2.3",
759+ "verror": "1.10.0"
760+ }
761+ },
762+ "node_modules/log-symbols": {
763+ "version": "3.0.0",
764+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
765+ "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
766+ "dev": true,
767+ "dependencies": {
768+ "chalk": "^2.4.2"
769+ },
770+ "engines": {
771+ "node": ">=8"
772+ }
773+ },
774+ "node_modules/log-update": {
775+ "version": "3.4.0",
776+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-3.4.0.tgz",
777+ "integrity": "sha512-ILKe88NeMt4gmDvk/eb615U/IVn7K9KWGkoYbdatQ69Z65nj1ZzjM6fHXfcs0Uge+e+EGnMW7DY4T9yko8vWFg==",
778+ "dev": true,
779+ "dependencies": {
780+ "ansi-escapes": "^3.2.0",
781+ "cli-cursor": "^2.1.0",
782+ "wrap-ansi": "^5.0.0"
783+ },
784+ "engines": {
785+ "node": ">=6"
786+ },
787+ "funding": {
788+ "url": "https://github.com/sponsors/sindresorhus"
789+ }
790+ },
791+ "node_modules/lru-cache": {
792+ "version": "5.1.1",
793+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
794+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
795+ "dev": true,
796+ "dependencies": {
797+ "yallist": "^3.0.2"
798+ }
799+ },
800+ "node_modules/merge-stream": {
801+ "version": "2.0.0",
802+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
803+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
804+ "dev": true
805+ },
806+ "node_modules/mime-db": {
807+ "version": "1.46.0",
808+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz",
809+ "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==",
810+ "dev": true,
811+ "engines": {
812+ "node": ">= 0.6"
813+ }
814+ },
815+ "node_modules/mime-types": {
816+ "version": "2.1.29",
817+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz",
818+ "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==",
819+ "dev": true,
820+ "dependencies": {
821+ "mime-db": "1.46.0"
822+ },
823+ "engines": {
824+ "node": ">= 0.6"
825+ }
826+ },
827+ "node_modules/mimic-fn": {
828+ "version": "2.1.0",
829+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
830+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
831+ "dev": true,
832+ "engines": {
833+ "node": ">=6"
834+ }
835+ },
836+ "node_modules/minimatch": {
837+ "version": "3.0.4",
838+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
839+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
840+ "dev": true,
841+ "dependencies": {
842+ "brace-expansion": "^1.1.7"
843+ },
844+ "engines": {
845+ "node": "*"
846+ }
847+ },
848+ "node_modules/minimist": {
849+ "version": "1.2.5",
850+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
851+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
852+ "dev": true
853+ },
854+ "node_modules/minipass": {
855+ "version": "2.9.0",
856+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
857+ "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
858+ "dev": true,
859+ "dependencies": {
860+ "safe-buffer": "^5.1.2",
861+ "yallist": "^3.0.0"
862+ }
863+ },
864+ "node_modules/minizlib": {
865+ "version": "1.3.3",
866+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
867+ "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
868+ "dev": true,
869+ "dependencies": {
870+ "minipass": "^2.9.0"
871+ }
872+ },
873+ "node_modules/mississippi": {
874+ "version": "3.0.0",
875+ "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
876+ "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
877+ "dev": true,
878+ "dependencies": {
879+ "concat-stream": "^1.5.0",
880+ "duplexify": "^3.4.2",
881+ "end-of-stream": "^1.1.0",
882+ "flush-write-stream": "^1.0.0",
883+ "from2": "^2.1.0",
884+ "parallel-transform": "^1.1.0",
885+ "pump": "^3.0.0",
886+ "pumpify": "^1.3.3",
887+ "stream-each": "^1.1.0",
888+ "through2": "^2.0.0"
889+ },
890+ "engines": {
891+ "node": ">=4.0.0"
892+ }
893+ },
894+ "node_modules/mkdirp": {
895+ "version": "0.5.5",
896+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
897+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
898+ "dev": true,
899+ "dependencies": {
900+ "minimist": "^1.2.5"
901+ },
902+ "bin": {
903+ "mkdirp": "bin/cmd.js"
904+ }
905+ },
906+ "node_modules/move-concurrently": {
907+ "version": "1.0.1",
908+ "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
909+ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
910+ "dev": true,
911+ "dependencies": {
912+ "aproba": "^1.1.1",
913+ "copy-concurrently": "^1.0.0",
914+ "fs-write-stream-atomic": "^1.0.8",
915+ "mkdirp": "^0.5.1",
916+ "rimraf": "^2.5.4",
917+ "run-queue": "^1.0.3"
918+ }
919+ },
920+ "node_modules/ms": {
921+ "version": "2.1.3",
922+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
923+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
924+ "dev": true
925+ },
926+ "node_modules/npm-run-path": {
927+ "version": "3.1.0",
928+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz",
929+ "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==",
930+ "dev": true,
931+ "dependencies": {
932+ "path-key": "^3.0.0"
933+ },
934+ "engines": {
935+ "node": ">=8"
936+ }
937+ },
938+ "node_modules/oauth-sign": {
939+ "version": "0.9.0",
940+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
941+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
942+ "dev": true,
943+ "engines": {
944+ "node": "*"
945+ }
946+ },
947+ "node_modules/once": {
948+ "version": "1.4.0",
949+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
950+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
951+ "dev": true,
952+ "dependencies": {
953+ "wrappy": "1"
954+ }
955+ },
956+ "node_modules/onetime": {
957+ "version": "5.1.2",
958+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
959+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
960+ "dev": true,
961+ "dependencies": {
962+ "mimic-fn": "^2.1.0"
963+ },
964+ "engines": {
965+ "node": ">=6"
966+ },
967+ "funding": {
968+ "url": "https://github.com/sponsors/sindresorhus"
969+ }
970+ },
971+ "node_modules/p-finally": {
972+ "version": "2.0.1",
973+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
974+ "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
975+ "dev": true,
976+ "engines": {
977+ "node": ">=8"
978+ }
979+ },
980+ "node_modules/parallel-transform": {
981+ "version": "1.2.0",
982+ "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
983+ "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
984+ "dev": true,
985+ "dependencies": {
986+ "cyclist": "^1.0.1",
987+ "inherits": "^2.0.3",
988+ "readable-stream": "^2.1.5"
989+ }
990+ },
991+ "node_modules/path-is-absolute": {
992+ "version": "1.0.1",
993+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
994+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
995+ "dev": true,
996+ "engines": {
997+ "node": ">=0.10.0"
998+ }
999+ },
1000+ "node_modules/path-key": {
1001+ "version": "3.1.1",
1002+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1003+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1004+ "dev": true,
1005+ "engines": {
1006+ "node": ">=8"
1007+ }
1008+ },
1009+ "node_modules/performance-now": {
1010+ "version": "2.1.0",
1011+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1012+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
1013+ "dev": true
1014+ },
1015+ "node_modules/process-nextick-args": {
1016+ "version": "2.0.1",
1017+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1018+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
1019+ "dev": true
1020+ },
1021+ "node_modules/promise-inflight": {
1022+ "version": "1.0.1",
1023+ "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
1024+ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
1025+ "dev": true
1026+ },
1027+ "node_modules/psl": {
1028+ "version": "1.8.0",
1029+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
1030+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
1031+ "dev": true
1032+ },
1033+ "node_modules/pump": {
1034+ "version": "3.0.0",
1035+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
1036+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
1037+ "dev": true,
1038+ "dependencies": {
1039+ "end-of-stream": "^1.1.0",
1040+ "once": "^1.3.1"
1041+ }
1042+ },
1043+ "node_modules/pumpify": {
1044+ "version": "1.5.1",
1045+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
1046+ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
1047+ "dev": true,
1048+ "dependencies": {
1049+ "duplexify": "^3.6.0",
1050+ "inherits": "^2.0.3",
1051+ "pump": "^2.0.0"
1052+ }
1053+ },
1054+ "node_modules/pumpify/node_modules/pump": {
1055+ "version": "2.0.1",
1056+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
1057+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
1058+ "dev": true,
1059+ "dependencies": {
1060+ "end-of-stream": "^1.1.0",
1061+ "once": "^1.3.1"
1062+ }
1063+ },
1064+ "node_modules/punycode": {
1065+ "version": "2.1.1",
1066+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1067+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
1068+ "dev": true,
1069+ "engines": {
1070+ "node": ">=6"
1071+ }
1072+ },
1073+ "node_modules/purescript": {
1074+ "version": "0.14.0",
1075+ "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.14.0.tgz",
1076+ "integrity": "sha512-iTA1k8mwxHqrJp/K296g6omVfve5RCjnB5D6Up93PVtZdP66mCIqlOYC4hrLBHg2hgkk27xePDt5NUXKvH4ApQ==",
1077+ "dev": true,
1078+ "hasInstallScript": true,
1079+ "dependencies": {
1080+ "purescript-installer": "^0.2.0"
1081+ },
1082+ "bin": {
1083+ "purs": "purs.bin"
1084+ }
1085+ },
1086+ "node_modules/purescript-installer": {
1087+ "version": "0.2.5",
1088+ "resolved": "https://registry.npmjs.org/purescript-installer/-/purescript-installer-0.2.5.tgz",
1089+ "integrity": "sha512-fQAWWP5a7scuchXecjpU4r4KEgSPuS6bBnaP01k9f71qqD28HaJ2m4PXHFkhkR4oATAxTPIGCtmTwtVoiBOHog==",
1090+ "dev": true,
1091+ "dependencies": {
1092+ "arch": "^2.1.1",
1093+ "byline": "^5.0.0",
1094+ "cacache": "^11.3.2",
1095+ "chalk": "^2.4.2",
1096+ "env-paths": "^2.2.0",
1097+ "execa": "^2.0.3",
1098+ "filesize": "^4.1.2",
1099+ "is-plain-obj": "^2.0.0",
1100+ "log-symbols": "^3.0.0",
1101+ "log-update": "^3.2.0",
1102+ "minimist": "^1.2.0",
1103+ "mkdirp": "^0.5.1",
1104+ "ms": "^2.1.2",
1105+ "once": "^1.4.0",
1106+ "pump": "^3.0.0",
1107+ "request": "^2.88.0",
1108+ "rimraf": "^2.6.3",
1109+ "tar": "^4.4.6",
1110+ "which": "^1.3.1",
1111+ "zen-observable": "^0.8.14"
1112+ },
1113+ "bin": {
1114+ "install-purescript": "index.js"
1115+ },
1116+ "engines": {
1117+ "node": ">=8.3.0"
1118+ }
1119+ },
1120+ "node_modules/purty": {
1121+ "version": "7.0.0",
1122+ "resolved": "https://registry.npmjs.org/purty/-/purty-7.0.0.tgz",
1123+ "integrity": "sha512-gHHghPEjRY39GUJ8KnOMRfPArJILGCXwEhX6BmEdNiLgZuCjLLBLyawGiKFjYMfy8H5Dsk5NbgwIGslrPrernA==",
1124+ "dev": true,
1125+ "os": [
1126+ "linux",
1127+ "darwin",
1128+ "win32"
1129+ ],
1130+ "bin": {
1131+ "purty": "bin/purty.js"
1132+ }
1133+ },
1134+ "node_modules/qs": {
1135+ "version": "6.5.2",
1136+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
1137+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
1138+ "dev": true,
1139+ "engines": {
1140+ "node": ">=0.6"
1141+ }
1142+ },
1143+ "node_modules/readable-stream": {
1144+ "version": "2.3.7",
1145+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
1146+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
1147+ "dev": true,
1148+ "dependencies": {
1149+ "core-util-is": "~1.0.0",
1150+ "inherits": "~2.0.3",
1151+ "isarray": "~1.0.0",
1152+ "process-nextick-args": "~2.0.0",
1153+ "safe-buffer": "~5.1.1",
1154+ "string_decoder": "~1.1.1",
1155+ "util-deprecate": "~1.0.1"
1156+ }
1157+ },
1158+ "node_modules/request": {
1159+ "version": "2.88.2",
1160+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
1161+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
1162+ "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
1163+ "dev": true,
1164+ "dependencies": {
1165+ "aws-sign2": "~0.7.0",
1166+ "aws4": "^1.8.0",
1167+ "caseless": "~0.12.0",
1168+ "combined-stream": "~1.0.6",
1169+ "extend": "~3.0.2",
1170+ "forever-agent": "~0.6.1",
1171+ "form-data": "~2.3.2",
1172+ "har-validator": "~5.1.3",
1173+ "http-signature": "~1.2.0",
1174+ "is-typedarray": "~1.0.0",
1175+ "isstream": "~0.1.2",
1176+ "json-stringify-safe": "~5.0.1",
1177+ "mime-types": "~2.1.19",
1178+ "oauth-sign": "~0.9.0",
1179+ "performance-now": "^2.1.0",
1180+ "qs": "~6.5.2",
1181+ "safe-buffer": "^5.1.2",
1182+ "tough-cookie": "~2.5.0",
1183+ "tunnel-agent": "^0.6.0",
1184+ "uuid": "^3.3.2"
1185+ },
1186+ "engines": {
1187+ "node": ">= 6"
1188+ }
1189+ },
1190+ "node_modules/restore-cursor": {
1191+ "version": "2.0.0",
1192+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
1193+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
1194+ "dev": true,
1195+ "dependencies": {
1196+ "onetime": "^2.0.0",
1197+ "signal-exit": "^3.0.2"
1198+ },
1199+ "engines": {
1200+ "node": ">=4"
1201+ }
1202+ },
1203+ "node_modules/restore-cursor/node_modules/mimic-fn": {
1204+ "version": "1.2.0",
1205+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
1206+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
1207+ "dev": true,
1208+ "engines": {
1209+ "node": ">=4"
1210+ }
1211+ },
1212+ "node_modules/restore-cursor/node_modules/onetime": {
1213+ "version": "2.0.1",
1214+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
1215+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
1216+ "dev": true,
1217+ "dependencies": {
1218+ "mimic-fn": "^1.0.0"
1219+ },
1220+ "engines": {
1221+ "node": ">=4"
1222+ }
1223+ },
1224+ "node_modules/rimraf": {
1225+ "version": "2.7.1",
1226+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
1227+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
1228+ "dev": true,
1229+ "dependencies": {
1230+ "glob": "^7.1.3"
1231+ },
1232+ "bin": {
1233+ "rimraf": "bin.js"
1234+ }
1235+ },
1236+ "node_modules/run-queue": {
1237+ "version": "1.0.3",
1238+ "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
1239+ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
1240+ "dev": true,
1241+ "dependencies": {
1242+ "aproba": "^1.1.1"
1243+ }
1244+ },
1245+ "node_modules/safe-buffer": {
1246+ "version": "5.1.2",
1247+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1248+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1249+ "dev": true
1250+ },
1251+ "node_modules/safer-buffer": {
1252+ "version": "2.1.2",
1253+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1254+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1255+ "dev": true
1256+ },
1257+ "node_modules/shebang-command": {
1258+ "version": "2.0.0",
1259+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1260+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1261+ "dev": true,
1262+ "dependencies": {
1263+ "shebang-regex": "^3.0.0"
1264+ },
1265+ "engines": {
1266+ "node": ">=8"
1267+ }
1268+ },
1269+ "node_modules/shebang-regex": {
1270+ "version": "3.0.0",
1271+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1272+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1273+ "dev": true,
1274+ "engines": {
1275+ "node": ">=8"
1276+ }
1277+ },
1278+ "node_modules/signal-exit": {
1279+ "version": "3.0.3",
1280+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
1281+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
1282+ "dev": true
1283+ },
1284+ "node_modules/spago": {
1285+ "version": "0.19.1",
1286+ "resolved": "https://registry.npmjs.org/spago/-/spago-0.19.1.tgz",
1287+ "integrity": "sha512-OD/yopJZ9Ub+XsFtayDeLAWLT4kLdMxosJEyyp8W5OkyJVVSbCrvYacsO7iq3lSuHJmmNny/TEZdyb7uSyupng==",
1288+ "dev": true,
1289+ "hasInstallScript": true,
1290+ "dependencies": {
1291+ "request": "^2.88.0",
1292+ "tar": "^4.4.8"
1293+ },
1294+ "bin": {
1295+ "spago": "spago"
1296+ }
1297+ },
1298+ "node_modules/sshpk": {
1299+ "version": "1.16.1",
1300+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
1301+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
1302+ "dev": true,
1303+ "dependencies": {
1304+ "asn1": "~0.2.3",
1305+ "assert-plus": "^1.0.0",
1306+ "bcrypt-pbkdf": "^1.0.0",
1307+ "dashdash": "^1.12.0",
1308+ "ecc-jsbn": "~0.1.1",
1309+ "getpass": "^0.1.1",
1310+ "jsbn": "~0.1.0",
1311+ "safer-buffer": "^2.0.2",
1312+ "tweetnacl": "~0.14.0"
1313+ },
1314+ "bin": {
1315+ "sshpk-conv": "bin/sshpk-conv",
1316+ "sshpk-sign": "bin/sshpk-sign",
1317+ "sshpk-verify": "bin/sshpk-verify"
1318+ },
1319+ "engines": {
1320+ "node": ">=0.10.0"
1321+ }
1322+ },
1323+ "node_modules/ssri": {
1324+ "version": "6.0.1",
1325+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
1326+ "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
1327+ "dev": true,
1328+ "dependencies": {
1329+ "figgy-pudding": "^3.5.1"
1330+ }
1331+ },
1332+ "node_modules/stream-each": {
1333+ "version": "1.2.3",
1334+ "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
1335+ "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
1336+ "dev": true,
1337+ "dependencies": {
1338+ "end-of-stream": "^1.1.0",
1339+ "stream-shift": "^1.0.0"
1340+ }
1341+ },
1342+ "node_modules/stream-shift": {
1343+ "version": "1.0.1",
1344+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
1345+ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
1346+ "dev": true
1347+ },
1348+ "node_modules/string_decoder": {
1349+ "version": "1.1.1",
1350+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1351+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1352+ "dev": true,
1353+ "dependencies": {
1354+ "safe-buffer": "~5.1.0"
1355+ }
1356+ },
1357+ "node_modules/string-width": {
1358+ "version": "3.1.0",
1359+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
1360+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
1361+ "dev": true,
1362+ "dependencies": {
1363+ "emoji-regex": "^7.0.1",
1364+ "is-fullwidth-code-point": "^2.0.0",
1365+ "strip-ansi": "^5.1.0"
1366+ },
1367+ "engines": {
1368+ "node": ">=6"
1369+ }
1370+ },
1371+ "node_modules/strip-ansi": {
1372+ "version": "5.2.0",
1373+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
1374+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
1375+ "dev": true,
1376+ "dependencies": {
1377+ "ansi-regex": "^4.1.0"
1378+ },
1379+ "engines": {
1380+ "node": ">=6"
1381+ }
1382+ },
1383+ "node_modules/strip-final-newline": {
1384+ "version": "2.0.0",
1385+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
1386+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
1387+ "dev": true,
1388+ "engines": {
1389+ "node": ">=6"
1390+ }
1391+ },
1392+ "node_modules/supports-color": {
1393+ "version": "5.5.0",
1394+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1395+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1396+ "dev": true,
1397+ "dependencies": {
1398+ "has-flag": "^3.0.0"
1399+ },
1400+ "engines": {
1401+ "node": ">=4"
1402+ }
1403+ },
1404+ "node_modules/tar": {
1405+ "version": "4.4.13",
1406+ "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
1407+ "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
1408+ "dev": true,
1409+ "dependencies": {
1410+ "chownr": "^1.1.1",
1411+ "fs-minipass": "^1.2.5",
1412+ "minipass": "^2.8.6",
1413+ "minizlib": "^1.2.1",
1414+ "mkdirp": "^0.5.0",
1415+ "safe-buffer": "^5.1.2",
1416+ "yallist": "^3.0.3"
1417+ },
1418+ "engines": {
1419+ "node": ">=4.5"
1420+ }
1421+ },
1422+ "node_modules/through2": {
1423+ "version": "2.0.5",
1424+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
1425+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
1426+ "dev": true,
1427+ "dependencies": {
1428+ "readable-stream": "~2.3.6",
1429+ "xtend": "~4.0.1"
1430+ }
1431+ },
1432+ "node_modules/tough-cookie": {
1433+ "version": "2.5.0",
1434+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
1435+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
1436+ "dev": true,
1437+ "dependencies": {
1438+ "psl": "^1.1.28",
1439+ "punycode": "^2.1.1"
1440+ },
1441+ "engines": {
1442+ "node": ">=0.8"
1443+ }
1444+ },
1445+ "node_modules/tunnel-agent": {
1446+ "version": "0.6.0",
1447+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1448+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1449+ "dev": true,
1450+ "dependencies": {
1451+ "safe-buffer": "^5.0.1"
1452+ },
1453+ "engines": {
1454+ "node": "*"
1455+ }
1456+ },
1457+ "node_modules/tweetnacl": {
1458+ "version": "0.14.5",
1459+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1460+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
1461+ "dev": true
1462+ },
1463+ "node_modules/typedarray": {
1464+ "version": "0.0.6",
1465+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1466+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
1467+ "dev": true
1468+ },
1469+ "node_modules/unique-filename": {
1470+ "version": "1.1.1",
1471+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
1472+ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
1473+ "dev": true,
1474+ "dependencies": {
1475+ "unique-slug": "^2.0.0"
1476+ }
1477+ },
1478+ "node_modules/unique-slug": {
1479+ "version": "2.0.2",
1480+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
1481+ "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
1482+ "dev": true,
1483+ "dependencies": {
1484+ "imurmurhash": "^0.1.4"
1485+ }
1486+ },
1487+ "node_modules/uri-js": {
1488+ "version": "4.4.1",
1489+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
1490+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1491+ "dev": true,
1492+ "dependencies": {
1493+ "punycode": "^2.1.0"
1494+ }
1495+ },
1496+ "node_modules/util-deprecate": {
1497+ "version": "1.0.2",
1498+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1499+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
1500+ "dev": true
1501+ },
1502+ "node_modules/uuid": {
1503+ "version": "3.4.0",
1504+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
1505+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
1506+ "dev": true,
1507+ "bin": {
1508+ "uuid": "bin/uuid"
1509+ }
1510+ },
1511+ "node_modules/verror": {
1512+ "version": "1.10.0",
1513+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1514+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
1515+ "dev": true,
1516+ "engines": [
1517+ "node >=0.6.0"
1518+ ],
1519+ "dependencies": {
1520+ "assert-plus": "^1.0.0",
1521+ "core-util-is": "1.0.2",
1522+ "extsprintf": "^1.2.0"
1523+ }
1524+ },
1525+ "node_modules/which": {
1526+ "version": "1.3.1",
1527+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
1528+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
1529+ "dev": true,
1530+ "dependencies": {
1531+ "isexe": "^2.0.0"
1532+ },
1533+ "bin": {
1534+ "which": "bin/which"
1535+ }
1536+ },
1537+ "node_modules/wrap-ansi": {
1538+ "version": "5.1.0",
1539+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
1540+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
1541+ "dev": true,
1542+ "dependencies": {
1543+ "ansi-styles": "^3.2.0",
1544+ "string-width": "^3.0.0",
1545+ "strip-ansi": "^5.0.0"
1546+ },
1547+ "engines": {
1548+ "node": ">=6"
1549+ }
1550+ },
1551+ "node_modules/wrappy": {
1552+ "version": "1.0.2",
1553+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1554+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1555+ "dev": true
1556+ },
1557+ "node_modules/xtend": {
1558+ "version": "4.0.2",
1559+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
1560+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
1561+ "dev": true,
1562+ "engines": {
1563+ "node": ">=0.4"
1564+ }
1565+ },
1566+ "node_modules/y18n": {
1567+ "version": "4.0.1",
1568+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
1569+ "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==",
1570+ "dev": true
1571+ },
1572+ "node_modules/yallist": {
1573+ "version": "3.1.1",
1574+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
1575+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
1576+ "dev": true
1577+ },
1578+ "node_modules/zen-observable": {
1579+ "version": "0.8.15",
1580+ "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz",
1581+ "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==",
1582+ "dev": true
1583+ }
1584+ },
1585+ "dependencies": {
1586+ "ajv": {
1587+ "version": "6.12.6",
1588+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
1589+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
1590+ "dev": true,
1591+ "requires": {
1592+ "fast-deep-equal": "^3.1.1",
1593+ "fast-json-stable-stringify": "^2.0.0",
1594+ "json-schema-traverse": "^0.4.1",
1595+ "uri-js": "^4.2.2"
1596+ }
1597+ },
1598+ "ansi-escapes": {
1599+ "version": "3.2.0",
1600+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
1601+ "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
1602+ "dev": true
1603+ },
1604+ "ansi-regex": {
1605+ "version": "4.1.0",
1606+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
1607+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
1608+ "dev": true
1609+ },
1610+ "ansi-styles": {
1611+ "version": "3.2.1",
1612+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
1613+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
1614+ "dev": true,
1615+ "requires": {
1616+ "color-convert": "^1.9.0"
1617+ }
1618+ },
1619+ "aproba": {
1620+ "version": "1.2.0",
1621+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
1622+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
1623+ "dev": true
1624+ },
1625+ "arch": {
1626+ "version": "2.2.0",
1627+ "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
1628+ "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
1629+ "dev": true
1630+ },
1631+ "asn1": {
1632+ "version": "0.2.4",
1633+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
1634+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
1635+ "dev": true,
1636+ "requires": {
1637+ "safer-buffer": "~2.1.0"
1638+ }
1639+ },
1640+ "assert-plus": {
1641+ "version": "1.0.0",
1642+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
1643+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
1644+ "dev": true
1645+ },
1646+ "asynckit": {
1647+ "version": "0.4.0",
1648+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
1649+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
1650+ "dev": true
1651+ },
1652+ "aws-sign2": {
1653+ "version": "0.7.0",
1654+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
1655+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
1656+ "dev": true
1657+ },
1658+ "aws4": {
1659+ "version": "1.11.0",
1660+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
1661+ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
1662+ "dev": true
1663+ },
1664+ "balanced-match": {
1665+ "version": "1.0.0",
1666+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
1667+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
1668+ "dev": true
1669+ },
1670+ "bcrypt-pbkdf": {
1671+ "version": "1.0.2",
1672+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
1673+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
1674+ "dev": true,
1675+ "requires": {
1676+ "tweetnacl": "^0.14.3"
1677+ }
1678+ },
1679+ "bluebird": {
1680+ "version": "3.7.2",
1681+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
1682+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
1683+ "dev": true
1684+ },
1685+ "brace-expansion": {
1686+ "version": "1.1.11",
1687+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1688+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1689+ "dev": true,
1690+ "requires": {
1691+ "balanced-match": "^1.0.0",
1692+ "concat-map": "0.0.1"
1693+ }
1694+ },
1695+ "buffer-from": {
1696+ "version": "1.1.1",
1697+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
1698+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
1699+ "dev": true
1700+ },
1701+ "byline": {
1702+ "version": "5.0.0",
1703+ "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz",
1704+ "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=",
1705+ "dev": true
1706+ },
1707+ "cacache": {
1708+ "version": "11.3.3",
1709+ "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz",
1710+ "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==",
1711+ "dev": true,
1712+ "requires": {
1713+ "bluebird": "^3.5.5",
1714+ "chownr": "^1.1.1",
1715+ "figgy-pudding": "^3.5.1",
1716+ "glob": "^7.1.4",
1717+ "graceful-fs": "^4.1.15",
1718+ "lru-cache": "^5.1.1",
1719+ "mississippi": "^3.0.0",
1720+ "mkdirp": "^0.5.1",
1721+ "move-concurrently": "^1.0.1",
1722+ "promise-inflight": "^1.0.1",
1723+ "rimraf": "^2.6.3",
1724+ "ssri": "^6.0.1",
1725+ "unique-filename": "^1.1.1",
1726+ "y18n": "^4.0.0"
1727+ }
1728+ },
1729+ "caseless": {
1730+ "version": "0.12.0",
1731+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
1732+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
1733+ "dev": true
1734+ },
1735+ "chalk": {
1736+ "version": "2.4.2",
1737+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
1738+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
1739+ "dev": true,
1740+ "requires": {
1741+ "ansi-styles": "^3.2.1",
1742+ "escape-string-regexp": "^1.0.5",
1743+ "supports-color": "^5.3.0"
1744+ }
1745+ },
1746+ "chownr": {
1747+ "version": "1.1.4",
1748+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
1749+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
1750+ "dev": true
1751+ },
1752+ "cli-cursor": {
1753+ "version": "2.1.0",
1754+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
1755+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
1756+ "dev": true,
1757+ "requires": {
1758+ "restore-cursor": "^2.0.0"
1759+ }
1760+ },
1761+ "color-convert": {
1762+ "version": "1.9.3",
1763+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
1764+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
1765+ "dev": true,
1766+ "requires": {
1767+ "color-name": "1.1.3"
1768+ }
1769+ },
1770+ "color-name": {
1771+ "version": "1.1.3",
1772+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
1773+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
1774+ "dev": true
1775+ },
1776+ "combined-stream": {
1777+ "version": "1.0.8",
1778+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
1779+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
1780+ "dev": true,
1781+ "requires": {
1782+ "delayed-stream": "~1.0.0"
1783+ }
1784+ },
1785+ "concat-map": {
1786+ "version": "0.0.1",
1787+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1788+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
1789+ "dev": true
1790+ },
1791+ "concat-stream": {
1792+ "version": "1.6.2",
1793+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
1794+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
1795+ "dev": true,
1796+ "requires": {
1797+ "buffer-from": "^1.0.0",
1798+ "inherits": "^2.0.3",
1799+ "readable-stream": "^2.2.2",
1800+ "typedarray": "^0.0.6"
1801+ }
1802+ },
1803+ "copy-concurrently": {
1804+ "version": "1.0.5",
1805+ "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
1806+ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
1807+ "dev": true,
1808+ "requires": {
1809+ "aproba": "^1.1.1",
1810+ "fs-write-stream-atomic": "^1.0.8",
1811+ "iferr": "^0.1.5",
1812+ "mkdirp": "^0.5.1",
1813+ "rimraf": "^2.5.4",
1814+ "run-queue": "^1.0.0"
1815+ }
1816+ },
1817+ "core-util-is": {
1818+ "version": "1.0.2",
1819+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
1820+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
1821+ "dev": true
1822+ },
1823+ "cross-spawn": {
1824+ "version": "7.0.3",
1825+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
1826+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
1827+ "dev": true,
1828+ "requires": {
1829+ "path-key": "^3.1.0",
1830+ "shebang-command": "^2.0.0",
1831+ "which": "^2.0.1"
1832+ },
1833+ "dependencies": {
1834+ "which": {
1835+ "version": "2.0.2",
1836+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1837+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1838+ "dev": true,
1839+ "requires": {
1840+ "isexe": "^2.0.0"
1841+ }
1842+ }
1843+ }
1844+ },
1845+ "cyclist": {
1846+ "version": "1.0.1",
1847+ "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
1848+ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
1849+ "dev": true
1850+ },
1851+ "dashdash": {
1852+ "version": "1.14.1",
1853+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
1854+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
1855+ "dev": true,
1856+ "requires": {
1857+ "assert-plus": "^1.0.0"
1858+ }
1859+ },
1860+ "delayed-stream": {
1861+ "version": "1.0.0",
1862+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
1863+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
1864+ "dev": true
1865+ },
1866+ "duplexify": {
1867+ "version": "3.7.1",
1868+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
1869+ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
1870+ "dev": true,
1871+ "requires": {
1872+ "end-of-stream": "^1.0.0",
1873+ "inherits": "^2.0.1",
1874+ "readable-stream": "^2.0.0",
1875+ "stream-shift": "^1.0.0"
1876+ }
1877+ },
1878+ "ecc-jsbn": {
1879+ "version": "0.1.2",
1880+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
1881+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
1882+ "dev": true,
1883+ "requires": {
1884+ "jsbn": "~0.1.0",
1885+ "safer-buffer": "^2.1.0"
1886+ }
1887+ },
1888+ "emoji-regex": {
1889+ "version": "7.0.3",
1890+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
1891+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
1892+ "dev": true
1893+ },
1894+ "end-of-stream": {
1895+ "version": "1.4.4",
1896+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
1897+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
1898+ "dev": true,
1899+ "requires": {
1900+ "once": "^1.4.0"
1901+ }
1902+ },
1903+ "env-paths": {
1904+ "version": "2.2.0",
1905+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz",
1906+ "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==",
1907+ "dev": true
1908+ },
1909+ "escape-string-regexp": {
1910+ "version": "1.0.5",
1911+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1912+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
1913+ "dev": true
1914+ },
1915+ "execa": {
1916+ "version": "2.1.0",
1917+ "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz",
1918+ "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==",
1919+ "dev": true,
1920+ "requires": {
1921+ "cross-spawn": "^7.0.0",
1922+ "get-stream": "^5.0.0",
1923+ "is-stream": "^2.0.0",
1924+ "merge-stream": "^2.0.0",
1925+ "npm-run-path": "^3.0.0",
1926+ "onetime": "^5.1.0",
1927+ "p-finally": "^2.0.0",
1928+ "signal-exit": "^3.0.2",
1929+ "strip-final-newline": "^2.0.0"
1930+ }
1931+ },
1932+ "extend": {
1933+ "version": "3.0.2",
1934+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
1935+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
1936+ "dev": true
1937+ },
1938+ "extsprintf": {
1939+ "version": "1.3.0",
1940+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
1941+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
1942+ "dev": true
1943+ },
1944+ "fast-deep-equal": {
1945+ "version": "3.1.3",
1946+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1947+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
1948+ "dev": true
1949+ },
1950+ "fast-json-stable-stringify": {
1951+ "version": "2.1.0",
1952+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1953+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
1954+ "dev": true
1955+ },
1956+ "figgy-pudding": {
1957+ "version": "3.5.2",
1958+ "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
1959+ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
1960+ "dev": true
1961+ },
1962+ "filesize": {
1963+ "version": "4.2.1",
1964+ "resolved": "https://registry.npmjs.org/filesize/-/filesize-4.2.1.tgz",
1965+ "integrity": "sha512-bP82Hi8VRZX/TUBKfE24iiUGsB/sfm2WUrwTQyAzQrhO3V9IhcBBNBXMyzLY5orACxRyYJ3d2HeRVX+eFv4lmA==",
1966+ "dev": true
1967+ },
1968+ "flush-write-stream": {
1969+ "version": "1.1.1",
1970+ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
1971+ "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
1972+ "dev": true,
1973+ "requires": {
1974+ "inherits": "^2.0.3",
1975+ "readable-stream": "^2.3.6"
1976+ }
1977+ },
1978+ "forever-agent": {
1979+ "version": "0.6.1",
1980+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
1981+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
1982+ "dev": true
1983+ },
1984+ "form-data": {
1985+ "version": "2.3.3",
1986+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
1987+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
1988+ "dev": true,
1989+ "requires": {
1990+ "asynckit": "^0.4.0",
1991+ "combined-stream": "^1.0.6",
1992+ "mime-types": "^2.1.12"
1993+ }
1994+ },
1995+ "from2": {
1996+ "version": "2.3.0",
1997+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
1998+ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
1999+ "dev": true,
2000+ "requires": {
2001+ "inherits": "^2.0.1",
2002+ "readable-stream": "^2.0.0"
2003+ }
2004+ },
2005+ "fs-minipass": {
2006+ "version": "1.2.7",
2007+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
2008+ "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
2009+ "dev": true,
2010+ "requires": {
2011+ "minipass": "^2.6.0"
2012+ }
2013+ },
2014+ "fs-write-stream-atomic": {
2015+ "version": "1.0.10",
2016+ "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
2017+ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
2018+ "dev": true,
2019+ "requires": {
2020+ "graceful-fs": "^4.1.2",
2021+ "iferr": "^0.1.5",
2022+ "imurmurhash": "^0.1.4",
2023+ "readable-stream": "1 || 2"
2024+ }
2025+ },
2026+ "fs.realpath": {
2027+ "version": "1.0.0",
2028+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
2029+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
2030+ "dev": true
2031+ },
2032+ "get-stream": {
2033+ "version": "5.2.0",
2034+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
2035+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
2036+ "dev": true,
2037+ "requires": {
2038+ "pump": "^3.0.0"
2039+ }
2040+ },
2041+ "getpass": {
2042+ "version": "0.1.7",
2043+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
2044+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
2045+ "dev": true,
2046+ "requires": {
2047+ "assert-plus": "^1.0.0"
2048+ }
2049+ },
2050+ "glob": {
2051+ "version": "7.1.6",
2052+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
2053+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
2054+ "dev": true,
2055+ "requires": {
2056+ "fs.realpath": "^1.0.0",
2057+ "inflight": "^1.0.4",
2058+ "inherits": "2",
2059+ "minimatch": "^3.0.4",
2060+ "once": "^1.3.0",
2061+ "path-is-absolute": "^1.0.0"
2062+ }
2063+ },
2064+ "graceful-fs": {
2065+ "version": "4.2.6",
2066+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
2067+ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
2068+ "dev": true
2069+ },
2070+ "har-schema": {
2071+ "version": "2.0.0",
2072+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
2073+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
2074+ "dev": true
2075+ },
2076+ "har-validator": {
2077+ "version": "5.1.5",
2078+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
2079+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
2080+ "dev": true,
2081+ "requires": {
2082+ "ajv": "^6.12.3",
2083+ "har-schema": "^2.0.0"
2084+ }
2085+ },
2086+ "has-flag": {
2087+ "version": "3.0.0",
2088+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
2089+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
2090+ "dev": true
2091+ },
2092+ "http-signature": {
2093+ "version": "1.2.0",
2094+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
2095+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
2096+ "dev": true,
2097+ "requires": {
2098+ "assert-plus": "^1.0.0",
2099+ "jsprim": "^1.2.2",
2100+ "sshpk": "^1.7.0"
2101+ }
2102+ },
2103+ "iferr": {
2104+ "version": "0.1.5",
2105+ "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
2106+ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
2107+ "dev": true
2108+ },
2109+ "imurmurhash": {
2110+ "version": "0.1.4",
2111+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
2112+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
2113+ "dev": true
2114+ },
2115+ "inflight": {
2116+ "version": "1.0.6",
2117+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
2118+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
2119+ "dev": true,
2120+ "requires": {
2121+ "once": "^1.3.0",
2122+ "wrappy": "1"
2123+ }
2124+ },
2125+ "inherits": {
2126+ "version": "2.0.4",
2127+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
2128+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
2129+ "dev": true
2130+ },
2131+ "is-fullwidth-code-point": {
2132+ "version": "2.0.0",
2133+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2134+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
2135+ "dev": true
2136+ },
2137+ "is-plain-obj": {
2138+ "version": "2.1.0",
2139+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
2140+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
2141+ "dev": true
2142+ },
2143+ "is-stream": {
2144+ "version": "2.0.0",
2145+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
2146+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
2147+ "dev": true
2148+ },
2149+ "is-typedarray": {
2150+ "version": "1.0.0",
2151+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
2152+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
2153+ "dev": true
2154+ },
2155+ "isarray": {
2156+ "version": "1.0.0",
2157+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
2158+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
2159+ "dev": true
2160+ },
2161+ "isexe": {
2162+ "version": "2.0.0",
2163+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
2164+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
2165+ "dev": true
2166+ },
2167+ "isstream": {
2168+ "version": "0.1.2",
2169+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
2170+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
2171+ "dev": true
2172+ },
2173+ "jsbn": {
2174+ "version": "0.1.1",
2175+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
2176+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
2177+ "dev": true
2178+ },
2179+ "json-schema": {
2180+ "version": "0.2.3",
2181+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
2182+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
2183+ "dev": true
2184+ },
2185+ "json-schema-traverse": {
2186+ "version": "0.4.1",
2187+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
2188+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
2189+ "dev": true
2190+ },
2191+ "json-stringify-safe": {
2192+ "version": "5.0.1",
2193+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
2194+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
2195+ "dev": true
2196+ },
2197+ "jsprim": {
2198+ "version": "1.4.1",
2199+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
2200+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
2201+ "dev": true,
2202+ "requires": {
2203+ "assert-plus": "1.0.0",
2204+ "extsprintf": "1.3.0",
2205+ "json-schema": "0.2.3",
2206+ "verror": "1.10.0"
2207+ }
2208+ },
2209+ "log-symbols": {
2210+ "version": "3.0.0",
2211+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
2212+ "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
2213+ "dev": true,
2214+ "requires": {
2215+ "chalk": "^2.4.2"
2216+ }
2217+ },
2218+ "log-update": {
2219+ "version": "3.4.0",
2220+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-3.4.0.tgz",
2221+ "integrity": "sha512-ILKe88NeMt4gmDvk/eb615U/IVn7K9KWGkoYbdatQ69Z65nj1ZzjM6fHXfcs0Uge+e+EGnMW7DY4T9yko8vWFg==",
2222+ "dev": true,
2223+ "requires": {
2224+ "ansi-escapes": "^3.2.0",
2225+ "cli-cursor": "^2.1.0",
2226+ "wrap-ansi": "^5.0.0"
2227+ }
2228+ },
2229+ "lru-cache": {
2230+ "version": "5.1.1",
2231+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
2232+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
2233+ "dev": true,
2234+ "requires": {
2235+ "yallist": "^3.0.2"
2236+ }
2237+ },
2238+ "merge-stream": {
2239+ "version": "2.0.0",
2240+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
2241+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
2242+ "dev": true
2243+ },
2244+ "mime-db": {
2245+ "version": "1.46.0",
2246+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz",
2247+ "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==",
2248+ "dev": true
2249+ },
2250+ "mime-types": {
2251+ "version": "2.1.29",
2252+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz",
2253+ "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==",
2254+ "dev": true,
2255+ "requires": {
2256+ "mime-db": "1.46.0"
2257+ }
2258+ },
2259+ "mimic-fn": {
2260+ "version": "2.1.0",
2261+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
2262+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
2263+ "dev": true
2264+ },
2265+ "minimatch": {
2266+ "version": "3.0.4",
2267+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2268+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
2269+ "dev": true,
2270+ "requires": {
2271+ "brace-expansion": "^1.1.7"
2272+ }
2273+ },
2274+ "minimist": {
2275+ "version": "1.2.5",
2276+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
2277+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
2278+ "dev": true
2279+ },
2280+ "minipass": {
2281+ "version": "2.9.0",
2282+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
2283+ "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
2284+ "dev": true,
2285+ "requires": {
2286+ "safe-buffer": "^5.1.2",
2287+ "yallist": "^3.0.0"
2288+ }
2289+ },
2290+ "minizlib": {
2291+ "version": "1.3.3",
2292+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
2293+ "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
2294+ "dev": true,
2295+ "requires": {
2296+ "minipass": "^2.9.0"
2297+ }
2298+ },
2299+ "mississippi": {
2300+ "version": "3.0.0",
2301+ "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
2302+ "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
2303+ "dev": true,
2304+ "requires": {
2305+ "concat-stream": "^1.5.0",
2306+ "duplexify": "^3.4.2",
2307+ "end-of-stream": "^1.1.0",
2308+ "flush-write-stream": "^1.0.0",
2309+ "from2": "^2.1.0",
2310+ "parallel-transform": "^1.1.0",
2311+ "pump": "^3.0.0",
2312+ "pumpify": "^1.3.3",
2313+ "stream-each": "^1.1.0",
2314+ "through2": "^2.0.0"
2315+ }
2316+ },
2317+ "mkdirp": {
2318+ "version": "0.5.5",
2319+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
2320+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
2321+ "dev": true,
2322+ "requires": {
2323+ "minimist": "^1.2.5"
2324+ }
2325+ },
2326+ "move-concurrently": {
2327+ "version": "1.0.1",
2328+ "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
2329+ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
2330+ "dev": true,
2331+ "requires": {
2332+ "aproba": "^1.1.1",
2333+ "copy-concurrently": "^1.0.0",
2334+ "fs-write-stream-atomic": "^1.0.8",
2335+ "mkdirp": "^0.5.1",
2336+ "rimraf": "^2.5.4",
2337+ "run-queue": "^1.0.3"
2338+ }
2339+ },
2340+ "ms": {
2341+ "version": "2.1.3",
2342+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
2343+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
2344+ "dev": true
2345+ },
2346+ "npm-run-path": {
2347+ "version": "3.1.0",
2348+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz",
2349+ "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==",
2350+ "dev": true,
2351+ "requires": {
2352+ "path-key": "^3.0.0"
2353+ }
2354+ },
2355+ "oauth-sign": {
2356+ "version": "0.9.0",
2357+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
2358+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
2359+ "dev": true
2360+ },
2361+ "once": {
2362+ "version": "1.4.0",
2363+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2364+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
2365+ "dev": true,
2366+ "requires": {
2367+ "wrappy": "1"
2368+ }
2369+ },
2370+ "onetime": {
2371+ "version": "5.1.2",
2372+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
2373+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
2374+ "dev": true,
2375+ "requires": {
2376+ "mimic-fn": "^2.1.0"
2377+ }
2378+ },
2379+ "p-finally": {
2380+ "version": "2.0.1",
2381+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
2382+ "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
2383+ "dev": true
2384+ },
2385+ "parallel-transform": {
2386+ "version": "1.2.0",
2387+ "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
2388+ "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
2389+ "dev": true,
2390+ "requires": {
2391+ "cyclist": "^1.0.1",
2392+ "inherits": "^2.0.3",
2393+ "readable-stream": "^2.1.5"
2394+ }
2395+ },
2396+ "path-is-absolute": {
2397+ "version": "1.0.1",
2398+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
2399+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
2400+ "dev": true
2401+ },
2402+ "path-key": {
2403+ "version": "3.1.1",
2404+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
2405+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
2406+ "dev": true
2407+ },
2408+ "performance-now": {
2409+ "version": "2.1.0",
2410+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
2411+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
2412+ "dev": true
2413+ },
2414+ "process-nextick-args": {
2415+ "version": "2.0.1",
2416+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
2417+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
2418+ "dev": true
2419+ },
2420+ "promise-inflight": {
2421+ "version": "1.0.1",
2422+ "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
2423+ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
2424+ "dev": true
2425+ },
2426+ "psl": {
2427+ "version": "1.8.0",
2428+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
2429+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
2430+ "dev": true
2431+ },
2432+ "pump": {
2433+ "version": "3.0.0",
2434+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
2435+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
2436+ "dev": true,
2437+ "requires": {
2438+ "end-of-stream": "^1.1.0",
2439+ "once": "^1.3.1"
2440+ }
2441+ },
2442+ "pumpify": {
2443+ "version": "1.5.1",
2444+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
2445+ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
2446+ "dev": true,
2447+ "requires": {
2448+ "duplexify": "^3.6.0",
2449+ "inherits": "^2.0.3",
2450+ "pump": "^2.0.0"
2451+ },
2452+ "dependencies": {
2453+ "pump": {
2454+ "version": "2.0.1",
2455+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
2456+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
2457+ "dev": true,
2458+ "requires": {
2459+ "end-of-stream": "^1.1.0",
2460+ "once": "^1.3.1"
2461+ }
2462+ }
2463+ }
2464+ },
2465+ "punycode": {
2466+ "version": "2.1.1",
2467+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
2468+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
2469+ "dev": true
2470+ },
2471+ "purescript": {
2472+ "version": "0.14.0",
2473+ "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.14.0.tgz",
2474+ "integrity": "sha512-iTA1k8mwxHqrJp/K296g6omVfve5RCjnB5D6Up93PVtZdP66mCIqlOYC4hrLBHg2hgkk27xePDt5NUXKvH4ApQ==",
2475+ "dev": true,
2476+ "requires": {
2477+ "purescript-installer": "^0.2.0"
2478+ }
2479+ },
2480+ "purescript-installer": {
2481+ "version": "0.2.5",
2482+ "resolved": "https://registry.npmjs.org/purescript-installer/-/purescript-installer-0.2.5.tgz",
2483+ "integrity": "sha512-fQAWWP5a7scuchXecjpU4r4KEgSPuS6bBnaP01k9f71qqD28HaJ2m4PXHFkhkR4oATAxTPIGCtmTwtVoiBOHog==",
2484+ "dev": true,
2485+ "requires": {
2486+ "arch": "^2.1.1",
2487+ "byline": "^5.0.0",
2488+ "cacache": "^11.3.2",
2489+ "chalk": "^2.4.2",
2490+ "env-paths": "^2.2.0",
2491+ "execa": "^2.0.3",
2492+ "filesize": "^4.1.2",
2493+ "is-plain-obj": "^2.0.0",
2494+ "log-symbols": "^3.0.0",
2495+ "log-update": "^3.2.0",
2496+ "minimist": "^1.2.0",
2497+ "mkdirp": "^0.5.1",
2498+ "ms": "^2.1.2",
2499+ "once": "^1.4.0",
2500+ "pump": "^3.0.0",
2501+ "request": "^2.88.0",
2502+ "rimraf": "^2.6.3",
2503+ "tar": "^4.4.6",
2504+ "which": "^1.3.1",
2505+ "zen-observable": "^0.8.14"
2506+ }
2507+ },
2508+ "purty": {
2509+ "version": "7.0.0",
2510+ "resolved": "https://registry.npmjs.org/purty/-/purty-7.0.0.tgz",
2511+ "integrity": "sha512-gHHghPEjRY39GUJ8KnOMRfPArJILGCXwEhX6BmEdNiLgZuCjLLBLyawGiKFjYMfy8H5Dsk5NbgwIGslrPrernA==",
2512+ "dev": true
2513+ },
2514+ "qs": {
2515+ "version": "6.5.2",
2516+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
2517+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
2518+ "dev": true
2519+ },
2520+ "readable-stream": {
2521+ "version": "2.3.7",
2522+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
2523+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
2524+ "dev": true,
2525+ "requires": {
2526+ "core-util-is": "~1.0.0",
2527+ "inherits": "~2.0.3",
2528+ "isarray": "~1.0.0",
2529+ "process-nextick-args": "~2.0.0",
2530+ "safe-buffer": "~5.1.1",
2531+ "string_decoder": "~1.1.1",
2532+ "util-deprecate": "~1.0.1"
2533+ }
2534+ },
2535+ "request": {
2536+ "version": "2.88.2",
2537+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
2538+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
2539+ "dev": true,
2540+ "requires": {
2541+ "aws-sign2": "~0.7.0",
2542+ "aws4": "^1.8.0",
2543+ "caseless": "~0.12.0",
2544+ "combined-stream": "~1.0.6",
2545+ "extend": "~3.0.2",
2546+ "forever-agent": "~0.6.1",
2547+ "form-data": "~2.3.2",
2548+ "har-validator": "~5.1.3",
2549+ "http-signature": "~1.2.0",
2550+ "is-typedarray": "~1.0.0",
2551+ "isstream": "~0.1.2",
2552+ "json-stringify-safe": "~5.0.1",
2553+ "mime-types": "~2.1.19",
2554+ "oauth-sign": "~0.9.0",
2555+ "performance-now": "^2.1.0",
2556+ "qs": "~6.5.2",
2557+ "safe-buffer": "^5.1.2",
2558+ "tough-cookie": "~2.5.0",
2559+ "tunnel-agent": "^0.6.0",
2560+ "uuid": "^3.3.2"
2561+ }
2562+ },
2563+ "restore-cursor": {
2564+ "version": "2.0.0",
2565+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
2566+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
2567+ "dev": true,
2568+ "requires": {
2569+ "onetime": "^2.0.0",
2570+ "signal-exit": "^3.0.2"
2571+ },
2572+ "dependencies": {
2573+ "mimic-fn": {
2574+ "version": "1.2.0",
2575+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
2576+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
2577+ "dev": true
2578+ },
2579+ "onetime": {
2580+ "version": "2.0.1",
2581+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
2582+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
2583+ "dev": true,
2584+ "requires": {
2585+ "mimic-fn": "^1.0.0"
2586+ }
2587+ }
2588+ }
2589+ },
2590+ "rimraf": {
2591+ "version": "2.7.1",
2592+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
2593+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
2594+ "dev": true,
2595+ "requires": {
2596+ "glob": "^7.1.3"
2597+ }
2598+ },
2599+ "run-queue": {
2600+ "version": "1.0.3",
2601+ "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
2602+ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
2603+ "dev": true,
2604+ "requires": {
2605+ "aproba": "^1.1.1"
2606+ }
2607+ },
2608+ "safe-buffer": {
2609+ "version": "5.1.2",
2610+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2611+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
2612+ "dev": true
2613+ },
2614+ "safer-buffer": {
2615+ "version": "2.1.2",
2616+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
2617+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
2618+ "dev": true
2619+ },
2620+ "shebang-command": {
2621+ "version": "2.0.0",
2622+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2623+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2624+ "dev": true,
2625+ "requires": {
2626+ "shebang-regex": "^3.0.0"
2627+ }
2628+ },
2629+ "shebang-regex": {
2630+ "version": "3.0.0",
2631+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2632+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2633+ "dev": true
2634+ },
2635+ "signal-exit": {
2636+ "version": "3.0.3",
2637+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
2638+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
2639+ "dev": true
2640+ },
2641+ "spago": {
2642+ "version": "0.19.1",
2643+ "resolved": "https://registry.npmjs.org/spago/-/spago-0.19.1.tgz",
2644+ "integrity": "sha512-OD/yopJZ9Ub+XsFtayDeLAWLT4kLdMxosJEyyp8W5OkyJVVSbCrvYacsO7iq3lSuHJmmNny/TEZdyb7uSyupng==",
2645+ "dev": true,
2646+ "requires": {
2647+ "request": "^2.88.0",
2648+ "tar": "^4.4.8"
2649+ }
2650+ },
2651+ "sshpk": {
2652+ "version": "1.16.1",
2653+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
2654+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
2655+ "dev": true,
2656+ "requires": {
2657+ "asn1": "~0.2.3",
2658+ "assert-plus": "^1.0.0",
2659+ "bcrypt-pbkdf": "^1.0.0",
2660+ "dashdash": "^1.12.0",
2661+ "ecc-jsbn": "~0.1.1",
2662+ "getpass": "^0.1.1",
2663+ "jsbn": "~0.1.0",
2664+ "safer-buffer": "^2.0.2",
2665+ "tweetnacl": "~0.14.0"
2666+ }
2667+ },
2668+ "ssri": {
2669+ "version": "6.0.1",
2670+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
2671+ "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
2672+ "dev": true,
2673+ "requires": {
2674+ "figgy-pudding": "^3.5.1"
2675+ }
2676+ },
2677+ "stream-each": {
2678+ "version": "1.2.3",
2679+ "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
2680+ "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
2681+ "dev": true,
2682+ "requires": {
2683+ "end-of-stream": "^1.1.0",
2684+ "stream-shift": "^1.0.0"
2685+ }
2686+ },
2687+ "stream-shift": {
2688+ "version": "1.0.1",
2689+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
2690+ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
2691+ "dev": true
2692+ },
2693+ "string_decoder": {
2694+ "version": "1.1.1",
2695+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2696+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2697+ "dev": true,
2698+ "requires": {
2699+ "safe-buffer": "~5.1.0"
2700+ }
2701+ },
2702+ "string-width": {
2703+ "version": "3.1.0",
2704+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
2705+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
2706+ "dev": true,
2707+ "requires": {
2708+ "emoji-regex": "^7.0.1",
2709+ "is-fullwidth-code-point": "^2.0.0",
2710+ "strip-ansi": "^5.1.0"
2711+ }
2712+ },
2713+ "strip-ansi": {
2714+ "version": "5.2.0",
2715+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
2716+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
2717+ "dev": true,
2718+ "requires": {
2719+ "ansi-regex": "^4.1.0"
2720+ }
2721+ },
2722+ "strip-final-newline": {
2723+ "version": "2.0.0",
2724+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
2725+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
2726+ "dev": true
2727+ },
2728+ "supports-color": {
2729+ "version": "5.5.0",
2730+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
2731+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
2732+ "dev": true,
2733+ "requires": {
2734+ "has-flag": "^3.0.0"
2735+ }
2736+ },
2737+ "tar": {
2738+ "version": "4.4.13",
2739+ "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
2740+ "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
2741+ "dev": true,
2742+ "requires": {
2743+ "chownr": "^1.1.1",
2744+ "fs-minipass": "^1.2.5",
2745+ "minipass": "^2.8.6",
2746+ "minizlib": "^1.2.1",
2747+ "mkdirp": "^0.5.0",
2748+ "safe-buffer": "^5.1.2",
2749+ "yallist": "^3.0.3"
2750+ }
2751+ },
2752+ "through2": {
2753+ "version": "2.0.5",
2754+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
2755+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
2756+ "dev": true,
2757+ "requires": {
2758+ "readable-stream": "~2.3.6",
2759+ "xtend": "~4.0.1"
2760+ }
2761+ },
2762+ "tough-cookie": {
2763+ "version": "2.5.0",
2764+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
2765+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
2766+ "dev": true,
2767+ "requires": {
2768+ "psl": "^1.1.28",
2769+ "punycode": "^2.1.1"
2770+ }
2771+ },
2772+ "tunnel-agent": {
2773+ "version": "0.6.0",
2774+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
2775+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
2776+ "dev": true,
2777+ "requires": {
2778+ "safe-buffer": "^5.0.1"
2779+ }
2780+ },
2781+ "tweetnacl": {
2782+ "version": "0.14.5",
2783+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
2784+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
2785+ "dev": true
2786+ },
2787+ "typedarray": {
2788+ "version": "0.0.6",
2789+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
2790+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
2791+ "dev": true
2792+ },
2793+ "unique-filename": {
2794+ "version": "1.1.1",
2795+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
2796+ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
2797+ "dev": true,
2798+ "requires": {
2799+ "unique-slug": "^2.0.0"
2800+ }
2801+ },
2802+ "unique-slug": {
2803+ "version": "2.0.2",
2804+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
2805+ "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
2806+ "dev": true,
2807+ "requires": {
2808+ "imurmurhash": "^0.1.4"
2809+ }
2810+ },
2811+ "uri-js": {
2812+ "version": "4.4.1",
2813+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
2814+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
2815+ "dev": true,
2816+ "requires": {
2817+ "punycode": "^2.1.0"
2818+ }
2819+ },
2820+ "util-deprecate": {
2821+ "version": "1.0.2",
2822+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2823+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
2824+ "dev": true
2825+ },
2826+ "uuid": {
2827+ "version": "3.4.0",
2828+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
2829+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
2830+ "dev": true
2831+ },
2832+ "verror": {
2833+ "version": "1.10.0",
2834+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
2835+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
2836+ "dev": true,
2837+ "requires": {
2838+ "assert-plus": "^1.0.0",
2839+ "core-util-is": "1.0.2",
2840+ "extsprintf": "^1.2.0"
2841+ }
2842+ },
2843+ "which": {
2844+ "version": "1.3.1",
2845+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
2846+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
2847+ "dev": true,
2848+ "requires": {
2849+ "isexe": "^2.0.0"
2850+ }
2851+ },
2852+ "wrap-ansi": {
2853+ "version": "5.1.0",
2854+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
2855+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
2856+ "dev": true,
2857+ "requires": {
2858+ "ansi-styles": "^3.2.0",
2859+ "string-width": "^3.0.0",
2860+ "strip-ansi": "^5.0.0"
2861+ }
2862+ },
2863+ "wrappy": {
2864+ "version": "1.0.2",
2865+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2866+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2867+ "dev": true
2868+ },
2869+ "xtend": {
2870+ "version": "4.0.2",
2871+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
2872+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
2873+ "dev": true
2874+ },
2875+ "y18n": {
2876+ "version": "4.0.1",
2877+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
2878+ "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==",
2879+ "dev": true
2880+ },
2881+ "yallist": {
2882+ "version": "3.1.1",
2883+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
2884+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
2885+ "dev": true
2886+ },
2887+ "zen-observable": {
2888+ "version": "0.8.15",
2889+ "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz",
2890+ "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==",
2891+ "dev": true
2892+ }
2893+ }
2894+}
example/transactional-producer-consumer/package.jsonnew file+16
@@ -0,0 +1,16 @@
1+{
2+ "name": "transactional-producer-consumer",
3+ "version": "1.0.0",
4+ "description": "",
5+ "main": "index.js",
6+ "scripts": {
7+ "test": "echo \"Error: no test specified\" && exit 1"
8+ },
9+ "author": "Hivemind Technologies AG",
10+ "license": "MIT",
11+ "devDependencies": {
12+ "purescript": "^0.14.0",
13+ "purty": "^7.0.0",
14+ "spago": "^0.19.1"
15+ }
16+}
example/transactional-producer-consumer/packages.dhallnew file+5
@@ -0,0 +1,5 @@
1+
2+let upstream =
3+ https://github.com/purescript/package-sets/releases/download/psc-0.14.0-20210307/packages.dhall sha256:5f9e009bf539a4d1fa2be3ea340aeca4e3ca69515f5e351473d722619906d0b0
4+ with kafkajs = ../../spago.dhall as Location
5+in upstream
example/transactional-producer-consumer/spago.dhallnew file+9
@@ -0,0 +1,9 @@
1+{-
2+Welcome to a Spago project!
3+You can edit this file as you like.
4+-}
5+{ name = "my-project"
6+, dependencies = [ "console", "effect", "kafkajs", "psci-support", "random" ]
7+, packages = ./packages.dhall
8+, sources = [ "src/**/*.purs", "test/**/*.purs" ]
9+}
example/transactional-producer-consumer/src/Kafka/Example/Consumer.pursnew file+45
@@ -0,0 +1,45 @@
1+module Kafka.Example.Consumer where
2+
3+import Prelude (Unit, (>>>), (#), (<#>), bind, ($), (<>), pure, unit, (*>), discard)
4+import Control.Promise (Promise, toAffE, fromAff)
5+import Effect (Effect)
6+import Effect.Console (log)
7+import Kafka.Consumer (connect, disconnect, Consumer, makeConsumer, ConsumerConfig, subscribe, EachBatch, eachBatch, ResolveOffset, ConsumerMessage)
8+import Kafka.Kafka
9+import Kafka.Transaction (transaction, send, commit, abort)
10+import Data.Maybe (Maybe(..))
11+import Effect.Aff (bracket, delay, Aff)
12+import Data.Show (show)
13+import Data.Traversable (for, traverse)
14+import Data.Time.Duration (Milliseconds(..))
15+import Effect.Random (randomBool)
16+import Effect.Class (liftEffect)
17+import Effect.Class.Console (logShow)
18+import Node.Buffer (toString)
19+import Node.Encoding (Encoding(..))
20+import Data.Functor (void)
21+
22+printAndResolve :: ResolveOffset -> ConsumerMessage -> Aff Unit
23+printAndResolve resolveOffset { value, offset } = do
24+ v <- liftEffect $ toString UTF8 value
25+ logShow $ "Got message: " <> v
26+ liftEffect $ resolveOffset offset
27+
28+main :: Effect (Promise Unit)
29+main =
30+ fromAff
31+ $ do
32+ let
33+ kafka = makeClient { clientId: "transactional-consumer", brokers: [ "localhost:9092" ], ssl: false, sasl: Nothing }
34+
35+ consumerConfig = { groupId: "transactional-group", readUncommitted: false, autoCommit: false }
36+
37+ consumer = makeConsumer kafka consumerConfig
38+ connect consumer
39+ subscribe consumer { topic: "transactions" }
40+ let
41+ handler :: EachBatch
42+ handler { highWatermark, messages } resolveOffset heartBeat commitIfNecessary uncommittedOffsets isRunning isStale = do
43+ void $ traverse (printAndResolve resolveOffset) messages
44+ heartBeat
45+ eachBatch consumer false handler
example/transactional-producer-consumer/src/Kafka/Example/Producer.pursnew file+57
@@ -0,0 +1,57 @@
1+module Kafka.Example.Producer where
2+
3+import Prelude (Unit, (>>>), (#), (<#>), bind, ($), (<>), pure, unit, (*>), (+), discard)
4+import Control.Promise (Promise, toAffE, fromAff)
5+import Effect (Effect)
6+import Kafka.Producer (connect, disconnect, Producer, makeProducer, ProducerConfig)
7+import Kafka.Kafka
8+import Kafka.Transaction (transaction, send, commit, abort)
9+import Data.Maybe (Maybe(..))
10+import Effect.Aff (bracket, delay, Aff)
11+import Data.Show (show)
12+import Data.Traversable (for)
13+import Effect.Class.Console (log)
14+import Data.Time.Duration (Milliseconds(..))
15+import Effect.Random (randomBool)
16+import Effect.Class (liftEffect)
17+import Kafka.Types (Topic(..))
18+
19+-- | Send 10 messages every 5 seconds and randomly abort or commit
20+use :: Int -> Producer -> Aff Unit
21+use run producer = do
22+ trx <- transaction producer
23+ condition <- liftEffect $ randomBool
24+ _ <-
25+ send trx
26+ { topic: Topic "transactions"
27+ , messages:
28+ [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
29+ <#> \i ->
30+ { key: Nothing
31+ , value: "[run=" <> (show run) <> ", msg=" <> (show i) <> ", committed=" <> (show condition) <> "]"
32+ , partition: Nothing
33+ }
34+ }
35+ _ <-
36+ if condition then
37+ commit trx *> (log $ "Run " <> (show run) <> " was committed.")
38+ else
39+ abort trx *> (log $ "Run " <> (show run) <> " was aborted.")
40+ delay (Milliseconds 5000.0) *> use (run + 1) producer
41+
42+main :: Effect (Promise Unit)
43+main =
44+ fromAff
45+ $ do
46+ let
47+ kafka = makeClient { clientId: "transactional-producer", brokers: [ "localhost:9092" ], ssl: false, sasl: Nothing }
48+
49+ producerConfig = { idempotent: Just true, transactionalId: Just "tx-0", maxInFlightRequests: Nothing }
50+
51+ acquire :: Kafka -> ProducerConfig -> Aff Producer
52+ acquire kafka conf = makeProducer kafka conf # \producer -> connect producer *> pure producer
53+
54+ release :: Producer -> Aff Unit
55+ release = disconnect
56+ bracket (acquire kafka producerConfig) release (use 0)
57+ pure unit
test/Main.purs → example/transactional-producer-consumer/test/Main.pursrenamed

The content is the same.

package-lock.json+8−7
@@ -11,7 +11,7 @@
11 "kafkajs": "^1.15.0"
11 "kafkajs": "^1.15.0"
12 },
12 },
13 "devDependencies": {
13 "devDependencies": {
14− "purescript": "^0.13.8",
14+ "purescript": "^0.14.0",
15 "purty": "^6.3.0",
15 "purty": "^6.3.0",
16 "spago": "^0.19.0"
16 "spago": "^0.19.0"
17 }
17 }
@@ -1051,11 +1051,12 @@
1051 }
1051 }
1052 },
1052 },
1053 "node_modules/purescript": {
1053 "node_modules/purescript": {
1054− "version": "0.13.8",
1054+ "version": "0.14.0",
1055− "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.13.8.tgz",
1055+ "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.14.0.tgz",
1056− "integrity": "sha512-1ZyVEVFLgcEcjPXxJYeVEyYn66DF2DnOLTWzo/K/MrQUF2chdLSyZ8sJpcarWyrz2HxXaubYceYbo5KexKzynA==",
1056+ "integrity": "sha512-iTA1k8mwxHqrJp/K296g6omVfve5RCjnB5D6Up93PVtZdP66mCIqlOYC4hrLBHg2hgkk27xePDt5NUXKvH4ApQ==",
1057 "dev": true,
1057 "dev": true,
1058 "hasInstallScript": true,
1058 "hasInstallScript": true,
1059+ "license": "ISC",
1059 "dependencies": {
1060 "dependencies": {
1060 "purescript-installer": "^0.2.0"
1061 "purescript-installer": "^0.2.0"
1061 },
1062 },
@@ -2448,9 +2449,9 @@
2448 "dev": true
2449 "dev": true
2449 },
2450 },
2450 "purescript": {
2451 "purescript": {
2451− "version": "0.13.8",
2452+ "version": "0.14.0",
2452− "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.13.8.tgz",
2453+ "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.14.0.tgz",
2453− "integrity": "sha512-1ZyVEVFLgcEcjPXxJYeVEyYn66DF2DnOLTWzo/K/MrQUF2chdLSyZ8sJpcarWyrz2HxXaubYceYbo5KexKzynA==",
2454+ "integrity": "sha512-iTA1k8mwxHqrJp/K296g6omVfve5RCjnB5D6Up93PVtZdP66mCIqlOYC4hrLBHg2hgkk27xePDt5NUXKvH4ApQ==",
2454 "dev": true,
2455 "dev": true,
2455 "requires": {
2456 "requires": {
2456 "purescript-installer": "^0.2.0"
2457 "purescript-installer": "^0.2.0"
package.json+1−1
@@ -17,7 +17,7 @@
17 },
17 },
18 "homepage": "https://github.com/HivemindTechnologies/purescript-kafkajs#readme",
18 "homepage": "https://github.com/HivemindTechnologies/purescript-kafkajs#readme",
19 "devDependencies": {
19 "devDependencies": {
20− "purescript": "^0.13.8",
20+ "purescript": "^0.14.0",
21 "purty": "^6.3.0",
21 "purty": "^6.3.0",
22 "spago": "^0.19.0"
22 "spago": "^0.19.0"
23 },
23 },
packages.dhall+1−2
@@ -1,5 +1,4 @@
1−
2let upstream =
1let upstream =
3− https://github.com/purescript/package-sets/releases/download/psc-0.13.8-20210118/packages.dhall sha256:a59c5c93a68d5d066f3815a89f398bcf00e130a51cb185b2da29b20e2d8ae115
2+ https://github.com/purescript/package-sets/releases/download/psc-0.14.0-20210313/packages.dhall sha256:ba6368b31902aad206851fec930e89465440ebf5a1fe0391f8be396e2d2f1d87
4
3
5in upstream
4in upstream
spago.dhall+11−6
@@ -1,10 +1,15 @@
1−{-
2−Welcome to a Spago project!
3−You can edit this file as you like.
4−-}
5−{ name = "purescript-kafkajs"
1+{ name = "kafkajs"
6, dependencies =
2, dependencies =
3+ [ "aff-promise"
4+ , "console"
5+ , "debug"
6+ , "effect"
7+ , "maybe"
8+ , "node-buffer"
9+ , "nullable"
7− [ "aff-promise", "console", "effect", "nullable", "psci-support" ]
10+ , "psci-support"
11+ , "spec"
12+ ]
8, packages = ./packages.dhall
13, packages = ./packages.dhall
9, sources = [ "src/**/*.purs", "test/**/*.purs" ]
14, sources = [ "src/**/*.purs", "test/**/*.purs" ]
10, license = "MIT"
15, license = "MIT"
src/Kafka.jsdeleted−19
@@ -1,19 +0,0 @@
1−const { Kafka } = require('kafkajs')
2−
3−exports.makeClientImpl = params => new Kafka(params)
4−
5−exports.makeProducerImpl = (kafka, producerConfig) => kafka.producer(producerConfig)
6−
7−exports.connectImpl = (producer) => () => producer.connect()
8−
9−exports.sendImpl = (producer, data) => () => producer.send(data)
10−
11−exports.sendTImpl = (transaction, data) => () => transaction.send(data)
12−
13−exports.disconnectImpl = (producer) => () => producer.disconnect()
14−
15−exports.transactionImpl = (producer) => () => producer.transaction()
16−
17−exports.commitImpl = (transaction) => () => transaction.commit()
18−
19−exports.abortImpl = (transaction) => () => transaction.abort()
src/Kafka.pursdeleted−135
@@ -1,135 +0,0 @@
1−module Kafka
2− ( SaslConfig
3− , Kafka
4− , Producer
5− , RecordMetadata
6− , KafkaConfig
7− , ProducerConfig
8− , makeClient
9− , makeProducer
10− , connect
11− , Message
12− , Payload
13− , send
14− , disconnect
15− ) where
16−
17−import Prelude
18−import Control.Promise (Promise, toAffE)
19−import Data.Function.Uncurried (Fn2, runFn2)
20−import Data.Maybe (Maybe)
21−import Data.Nullable (Nullable, toNullable)
22−import Effect (Effect)
23−import Effect.Aff (Aff)
24−
25−foreign import data Kafka :: Type
26−
27−type SaslConfig
28− = { mechanism :: String
29− , username :: String
30− , password :: String
31− }
32−
33−type InternalKafkaConfig
34− = { clientId :: String
35− , brokers :: Array String
36− , ssl :: Boolean
37− , sasl :: Nullable SaslConfig
38− }
39−
40−type KafkaConfig
41− = { clientId :: String
42− , brokers :: Array String
43− , ssl :: Boolean
44− , sasl :: Maybe SaslConfig
45− }
46−
47−foreign import data Producer :: Type
48−
49−type ProducerConfig
50− = {}
51−
52−foreign import makeClientImpl :: InternalKafkaConfig -> Kafka
53−
54−makeClient :: KafkaConfig -> Kafka
55−makeClient = toInternal >>> makeClientImpl
56− where
57− toInternal config =
58− { clientId: config.clientId
59− , brokers: config.brokers
60− , ssl: config.ssl
61− , sasl: toNullable config.sasl
62− }
63−
64−foreign import makeProducerImpl :: Fn2 Kafka ProducerConfig Producer
65−
66−makeProducer :: Kafka -> ProducerConfig -> Producer
67−makeProducer = runFn2 makeProducerImpl
68−
69−foreign import connectImpl :: Producer -> Effect (Promise Unit)
70−
71−connect :: Producer -> Aff Unit
72−connect = connectImpl >>> toAffE
73−
74−foreign import data Transaction :: Type
75−
76−foreign import transactionImpl :: Producer -> Effect (Promise Transaction)
77−
78−transaction :: Producer -> Aff Transaction
79−transaction = transactionImpl >>> toAffE
80−
81−foreign import commitImpl :: Transaction -> Effect (Promise Unit)
82−
83−commit :: Transaction -> Aff Unit
84−commit = commitImpl >>> toAffE
85−
86−foreign import abortImpl :: Transaction -> Effect (Promise Unit)
87−
88−abort :: Transaction -> Aff Unit
89−abort = abortImpl >>> toAffE
90−
91−type Message
92− = { key :: Maybe String
93− , value :: String
94− , partition :: Maybe Int
95− }
96−
97−type Payload
98− = { topic :: String
99− , messages :: Array (Message)
100− }
101−
102−type InternalMessage
103− = { key :: Nullable String
104− , value :: String
105− , partition :: Nullable Int
106− }
107−
108−type InternalPayload
109− = { topic :: String
110− , messages :: Array (InternalMessage)
111− }
112−
113−foreign import data RecordMetadata :: Type
114−
115−foreign import sendImpl :: Fn2 Producer InternalPayload (Effect (Promise (Array RecordMetadata)))
116−
117−foreign import sendTImpl :: Fn2 Transaction InternalPayload (Effect (Promise (Array RecordMetadata)))
118−
119−convertMessage :: Message -> InternalMessage
120−convertMessage { key, value, partition } = { key: toNullable key, value: value, partition: toNullable partition }
121−
122−convert :: Payload -> InternalPayload
123−convert { topic, messages } = { topic, messages: messages <#> convertMessage }
124−
125−
126−send :: Producer -> Payload -> Aff (Array RecordMetadata)
127−send p pl = runFn2 sendImpl p (convert pl) # toAffE
128−
129−sendT :: Transaction -> Payload -> Aff (Array RecordMetadata)
130−sendT t pl = runFn2 sendTImpl t (convert pl) # toAffE
131−
132−foreign import disconnectImpl :: Producer -> Effect (Promise Unit)
133−
134−disconnect :: Producer -> Aff Unit
135−disconnect = disconnectImpl >>> toAffE
src/Kafka/Consumer.jsnew file+33
@@ -0,0 +1,33 @@
1+
2+
3+exports.makeConsumerImpl = (kafka, consumerConfig) => kafka.consumer(consumerConfig)
4+
5+exports.connectImpl = (consumer) => () => consumer.connect()
6+
7+exports.subscribeImpl = (consumer, subscriptionConfig) => () => consumer.subscribe(subscriptionConfig)
8+
9+exports.eachBatchImpl = (consumer, eachBatchAutoResolve, handler) => () => {
10+ return consumer.run({
11+ eachBatchAutoResolve: eachBatchAutoResolve,
12+ eachBatch: ({
13+ batch,
14+ resolveOffset,
15+ heartbeat,
16+ commitOffsetsIfNecessary,
17+ uncommittedOffsets,
18+ isRunning,
19+ isStale }) => {
20+ const resolveOffsetEff = offset => () => resolveOffset(offset)
21+ const commitOffsetsIfNecessaryEff = () => commitOffsetsIfNecessary()
22+ const uncommittedOffsetsEff = () => uncommittedOffsets()
23+ const isRunningEff = () => isRunning()
24+ const isStaleEff = () => isStale()
25+
26+ return handler(batch, resolveOffsetEff, heartbeat, commitOffsetsIfNecessaryEff, uncommittedOffsetsEff, isRunningEff, isStaleEff)()
27+ }
28+
29+ })
30+}
31+
32+exports.disconnectImpl = (consumer) => () => consumer.disconnect()
33+
src/Kafka/Consumer.pursnew file+293
@@ -0,0 +1,293 @@
1+module Kafka.Consumer
2+ ( Consumer
3+ , GroupId(..)
4+ , ConsumerConfig
5+ , SubscriptionConfig
6+ , makeConsumer
7+ , connect
8+ , subscribe
9+ , ConsumerMessage
10+ , ConsumerBatch
11+ , Heartbeat
12+ , ResolveOffset
13+ , CommitOffsetsIfNecessary
14+ , OffsetInfo
15+ , toOffsetInfo
16+ , UncommittedOffsets
17+ , IsStale
18+ , IsRunning
19+ , EachBatch
20+ , eachBatch
21+ , disconnect
22+ ) where
23+
24+import Prelude (Unit, bind, (#), ($), (>>>))
25+import Control.Promise (Promise, toAffE, fromAff)
26+import Kafka.Kafka (Kafka)
27+import Data.Function.Uncurried (Fn2, Fn3, Fn7, mkFn7, runFn2, runFn3)
28+import Effect (Effect)
29+import Effect.Aff (Aff)
30+import Data.Show (class Show)
31+import Kafka.Types
32+import Data.Nullable (Nullable, toMaybe)
33+import Node.Buffer (Buffer)
34+import Data.Maybe (Maybe, maybe)
35+import Data.Traversable (traverse)
36+import Control.Monad.Error.Class (throwError)
37+import Effect.Exception (error)
38+import Data.Int (fromString)
39+import Control.Applicative (pure)
40+import Data.Either (Either, either, note)
41+import Data.Newtype (un, class Newtype)
42+
43+foreign import data Consumer :: Type
44+
45+newtype GroupId
46+ = GroupId String
47+
48+instance ntGroupId :: Newtype GroupId String
49+
50+derive newtype instance showGroupId :: Show GroupId
51+
52+type ConsumerConfig
53+ = { groupId :: GroupId
54+ , readUncommitted :: Boolean
55+ , autoCommit :: Boolean
56+ }
57+
58+type SubscriptionConfig
59+ = { topic :: String }
60+
61+foreign import makeConsumerImpl :: Fn2 Kafka ConsumerConfig Consumer
62+
63+makeConsumer :: Kafka -> ConsumerConfig -> Consumer
64+makeConsumer = runFn2 makeConsumerImpl
65+
66+foreign import connectImpl :: Consumer -> Effect (Promise Unit)
67+
68+connect :: Consumer -> Aff Unit
69+connect = connectImpl >>> toAffE
70+
71+foreign import subscribeImpl :: Fn2 Consumer SubscriptionConfig (Effect (Promise Unit))
72+
73+subscribe :: Consumer -> SubscriptionConfig -> Aff Unit
74+subscribe consumer subscriptionConfig = runFn2 subscribeImpl consumer subscriptionConfig # toAffE
75+
76+type InternalConsumerMessage
77+ = { key :: Nullable Buffer
78+ , value :: Buffer
79+ , offset :: String
80+ }
81+
82+type InternalConsumerBatch
83+ = { fetchedOffset :: String
84+ , highWatermark :: String
85+ , messages :: Array InternalConsumerMessage
86+ , partition :: Int
87+ , topic :: String
88+ }
89+
90+type ConsumerMessage
91+ = { key :: Maybe Buffer
92+ , value :: Buffer
93+ , offset :: Offset
94+ }
95+
96+type ConsumerBatch
97+ = { fetchedOffset :: Offset
98+ , highWatermark :: Offset
99+ , messages :: Array ConsumerMessage
100+ , partition :: Partition
101+ , topic :: Topic
102+ }
103+
104+type InternalHeartbeat
105+ = Effect (Promise Unit)
106+
107+type Heartbeat
108+ = Aff Unit
109+
110+type InternalResolveOffset
111+ = Int -> Effect Unit
112+
113+type ResolveOffset
114+ = Offset -> Effect Unit
115+
116+type InternalCommitOffsetsIfNecessary
117+ = Effect (Promise Unit)
118+
119+type CommitOffsetsIfNecessary
120+ = Aff Unit
121+
122+type InternalOffsetInfo
123+ = { topics ::
124+ Array
125+ { partitions ::
126+ Array
127+ { offset :: String
128+ , partition :: String
129+ }
130+ , topic :: String
131+ }
132+ }
133+
134+type InternalUncommittedOffsets
135+ = Effect InternalOffsetInfo
136+
137+type OffsetInfo
138+ = { topics ::
139+ Array
140+ { partitions ::
141+ Array
142+ { offset :: Offset
143+ , partition :: Partition
144+ }
145+ , topic :: Topic
146+ }
147+ }
148+
149+raiseMaybe :: forall a. Maybe a -> Effect a
150+raiseMaybe = maybe (throwError $ error "Maybe is Nothing") pure
151+
152+raiseEither :: forall a. Either String a -> Effect a
153+raiseEither = either (error >>> throwError) pure
154+
155+toOffsetInfo :: InternalOffsetInfo -> Effect OffsetInfo
156+toOffsetInfo { topics } = do
157+ topicInfo <- traverse parseTopicInfo topics
158+ pure { topics: topicInfo }
159+ where
160+ parsePartitionInfo ::
161+ { offset :: String
162+ , partition :: String
163+ } ->
164+ Effect
165+ { offset :: Offset
166+ , partition :: Partition
167+ }
168+ parsePartitionInfo { offset, partition } = do
169+ o <- raiseMaybe $ fromString offset
170+ p <- raiseMaybe $ fromString partition
171+ pure { offset: Offset o, partition: Partition p }
172+
173+ parseTopicInfo ::
174+ { partitions ::
175+ Array
176+ { offset :: String
177+ , partition :: String
178+ }
179+ , topic :: String
180+ } ->
181+ Effect
182+ { partitions ::
183+ Array
184+ { offset :: Offset
185+ , partition :: Partition
186+ }
187+ , topic :: Topic
188+ }
189+ parseTopicInfo { partitions, topic } = do
190+ partitionInfo <- traverse parsePartitionInfo partitions
191+ pure { partitions: partitionInfo, topic: Topic topic }
192+
193+type UncommittedOffsets
194+ = Effect OffsetInfo
195+
196+type InternalIsStale
197+ = Effect Boolean
198+
199+type IsStale
200+ = Effect Boolean
201+
202+type InternalIsRunning
203+ = Effect Boolean
204+
205+type IsRunning
206+ = Effect Boolean
207+
208+type EachBatchImpl
209+ = Fn7
210+ InternalConsumerBatch
211+ InternalResolveOffset
212+ InternalHeartbeat
213+ InternalCommitOffsetsIfNecessary
214+ InternalUncommittedOffsets
215+ InternalIsRunning
216+ InternalIsStale
217+ (Effect (Promise Unit))
218+
219+type EachBatch
220+ = ConsumerBatch ->
221+ ResolveOffset ->
222+ Heartbeat ->
223+ CommitOffsetsIfNecessary ->
224+ UncommittedOffsets ->
225+ IsRunning ->
226+ IsStale ->
227+ (Aff Unit)
228+
229+toConsumerMessage :: InternalConsumerMessage -> Either String ConsumerMessage
230+toConsumerMessage { key, value, offset } = do
231+ o <- note "offset is not a number" $ fromString offset
232+ pure
233+ { key: toMaybe key
234+ , value: value
235+ , offset: Offset o
236+ }
237+
238+toConsumerBatch :: InternalConsumerBatch -> Either String ConsumerBatch
239+toConsumerBatch { fetchedOffset, highWatermark, messages, partition, topic } = do
240+ fo <- note "fetchedOffset is not a number" $ fromString fetchedOffset
241+ hwm <- note "highWatermark is not a number" $ fromString highWatermark
242+ msgs <- traverse toConsumerMessage messages
243+ pure
244+ { fetchedOffset: Offset fo
245+ , highWatermark: Offset hwm
246+ , messages: msgs
247+ , partition: Partition partition
248+ , topic: Topic topic
249+ }
250+
251+foreign import eachBatchImpl :: Fn3 Consumer Boolean EachBatchImpl (Effect (Promise Unit))
252+
253+eachBatch :: Consumer -> Boolean -> EachBatch -> Aff Unit
254+eachBatch consumer eachBatchAutoResolve handler =
255+ let
256+ iResolveOffset :: (Int -> Effect Unit) -> (Offset -> Effect Unit)
257+ iResolveOffset f = un Offset >>> f
258+
259+ iUncommitedOffsets :: Effect InternalOffsetInfo -> Effect OffsetInfo
260+ iUncommitedOffsets ioiEff = do
261+ ioi <- ioiEff
262+ toOffsetInfo ioi
263+
264+ internalHandlerCurried ::
265+ InternalConsumerBatch ->
266+ InternalResolveOffset ->
267+ InternalHeartbeat ->
268+ InternalCommitOffsetsIfNecessary ->
269+ InternalUncommittedOffsets ->
270+ InternalIsRunning ->
271+ InternalIsStale ->
272+ (Effect (Promise Unit))
273+ internalHandlerCurried icb iro ih icoin iuo iir iis = do
274+ batch <- raiseEither (toConsumerBatch icb)
275+ handler
276+ batch
277+ (iResolveOffset iro)
278+ (toAffE ih)
279+ (toAffE icoin)
280+ (iUncommitedOffsets iuo)
281+ (iir)
282+ (iis)
283+ # fromAff
284+
285+ internalHandler :: EachBatchImpl
286+ internalHandler = mkFn7 internalHandlerCurried
287+ in
288+ runFn3 eachBatchImpl consumer eachBatchAutoResolve internalHandler # toAffE
289+
290+foreign import disconnectImpl :: Consumer -> Effect (Promise Unit)
291+
292+disconnect :: Consumer -> Aff Unit
293+disconnect = disconnectImpl >>> toAffE
src/Kafka/Kafka.jsnew file+9
@@ -0,0 +1,9 @@
1+const { Kafka, logLevel } = require('kafkajs')
2+
3+exports.makeClientImpl = params => new Kafka(params)
4+
5+exports.internalLogNothing = logLevel.NOTHING
6+exports.internalLogDebug = logLevel.DEBUG
7+exports.internalLogInfo = logLevel.INFO
8+exports.internalLogWarn = logLevel.WARN
9+exports.internalLogError = logLevel.ERROR
src/Kafka/Kafka.pursnew file+67
@@ -0,0 +1,67 @@
1+module Kafka.Kafka
2+ ( SaslConfig
3+ , Kafka
4+ , KafkaConfig
5+ , makeClient
6+ , LogLevel(..)
7+ ) where
8+
9+import Prelude
10+import Data.Maybe (Maybe)
11+import Data.Nullable (Nullable, toNullable)
12+
13+foreign import data Kafka :: Type
14+
15+
16+data LogLevel = LogNothing | LogDebug | LogInfo | LogWarn | LogError
17+
18+foreign import data InternalLogLevel :: Type
19+
20+foreign import internalLogNothing :: InternalLogLevel
21+
22+foreign import internalLogDebug :: InternalLogLevel
23+foreign import internalLogInfo:: InternalLogLevel
24+foreign import internalLogWarn :: InternalLogLevel
25+foreign import internalLogError :: InternalLogLevel
26+
27+type SaslConfig
28+ = { mechanism :: String
29+ , username :: String
30+ , password :: String
31+ }
32+
33+type InternalKafkaConfig
34+ = { clientId :: String
35+ , brokers :: Array String
36+ , ssl :: Boolean
37+ , sasl :: Nullable SaslConfig
38+ , logLevel :: Nullable InternalLogLevel
39+ }
40+
41+type KafkaConfig
42+ = { clientId :: String
43+ , brokers :: Array String
44+ , ssl :: Boolean
45+ , sasl :: Maybe SaslConfig
46+ , logLevel :: Maybe LogLevel
47+ }
48+
49+foreign import makeClientImpl :: InternalKafkaConfig -> Kafka
50+
51+makeClient :: KafkaConfig -> Kafka
52+makeClient = toInternal >>> makeClientImpl
53+ where
54+
55+ toInternalLogLevel LogNothing = internalLogNothing
56+ toInternalLogLevel LogDebug = internalLogDebug
57+ toInternalLogLevel LogInfo = internalLogDebug
58+ toInternalLogLevel LogWarn = internalLogWarn
59+ toInternalLogLevel LogError = internalLogError
60+
61+ toInternal config =
62+ { clientId: config.clientId
63+ , brokers: config.brokers
64+ , ssl: config.ssl
65+ , sasl: toNullable config.sasl
66+ , logLevel : config.logLevel <#> toInternalLogLevel # toNullable
67+ }
src/Kafka/Producer.jsnew file+8
@@ -0,0 +1,8 @@
1+
2+exports.makeProducerImpl = (kafka, producerConfig) => kafka.producer(producerConfig)
3+
4+exports.connectImpl = (producer) => () => producer.connect()
5+
6+exports.sendImpl = (producer, data) => () => producer.send(data)
7+
8+exports.disconnectImpl = (producer) => () => producer.disconnect()
src/Kafka/Producer.pursnew file+96
@@ -0,0 +1,96 @@
1+module Kafka.Producer
2+ ( Producer
3+ , ProducerConfig
4+ , makeProducer
5+ , connect
6+ , ProducerMessage
7+ , ProducerBatch
8+ , InternalProducerMessage
9+ , InternalProducerBatch
10+ , toInternalProducerMessage
11+ , toInternalProducerBatch
12+ , RecordMetadata
13+ , send
14+ , disconnect
15+ ) where
16+
17+import Prelude (Unit, (#), (>>>), (<#>))
18+import Control.Promise (Promise, toAffE)
19+import Data.Function.Uncurried (Fn2, runFn2)
20+import Data.Maybe (Maybe)
21+import Data.Nullable (Nullable, toNullable)
22+import Effect (Effect)
23+import Effect.Aff (Aff)
24+import Kafka.Kafka (Kafka)
25+import Kafka.Types (Partition(..), Topic(..))
26+import Data.Newtype (un)
27+
28+foreign import data Producer :: Type
29+
30+type ProducerConfig
31+ = { idempotent :: Maybe Boolean
32+ , transactionalId :: Maybe String
33+ , maxInFlightRequests :: Maybe Int
34+ }
35+
36+type InternalProducerConfig
37+ = { idempotent :: Nullable Boolean
38+ , transactionalId :: Nullable String
39+ , maxInFlightRequests :: Nullable Int
40+ }
41+
42+foreign import makeProducerImpl :: Fn2 Kafka InternalProducerConfig Producer
43+
44+makeProducer :: Kafka -> ProducerConfig -> Producer
45+makeProducer k pc = runFn2 makeProducerImpl k ipc
46+ where
47+ ipc =
48+ { idempotent: toNullable pc.idempotent
49+ , transactionalId: toNullable pc.transactionalId
50+ , maxInFlightRequests: toNullable pc.maxInFlightRequests
51+ }
52+
53+foreign import connectImpl :: Producer -> Effect (Promise Unit)
54+
55+connect :: Producer -> Aff Unit
56+connect = connectImpl >>> toAffE
57+
58+type ProducerMessage
59+ = { key :: Maybe String
60+ , value :: String
61+ , partition :: Maybe Partition
62+ }
63+
64+type ProducerBatch
65+ = { topic :: Topic
66+ , messages :: Array (ProducerMessage)
67+ }
68+
69+foreign import data RecordMetadata :: Type
70+
71+type InternalProducerMessage
72+ = { key :: Nullable String
73+ , value :: String
74+ , partition :: Nullable Int
75+ }
76+
77+type InternalProducerBatch
78+ = { topic :: String
79+ , messages :: Array (InternalProducerMessage)
80+ }
81+
82+toInternalProducerMessage :: ProducerMessage -> InternalProducerMessage
83+toInternalProducerMessage { key, value, partition: partition } = { key: toNullable key, value: value, partition: partition <#> un Partition # toNullable }
84+
85+toInternalProducerBatch :: ProducerBatch -> InternalProducerBatch
86+toInternalProducerBatch { topic: Topic topic, messages } = { topic, messages: messages <#> toInternalProducerMessage }
87+
88+foreign import sendImpl :: Fn2 Producer InternalProducerBatch (Effect (Promise (Array RecordMetadata)))
89+
90+send :: Producer -> ProducerBatch -> Aff (Array RecordMetadata)
91+send p pl = runFn2 sendImpl p (toInternalProducerBatch pl) # toAffE
92+
93+foreign import disconnectImpl :: Producer -> Effect (Promise Unit)
94+
95+disconnect :: Producer -> Aff Unit
96+disconnect = disconnectImpl >>> toAffE
src/Kafka/Transaction.jsnew file+11
@@ -0,0 +1,11 @@
1+
2+
3+exports.transactionImpl = (producer) => () => producer.transaction()
4+
5+exports.sendImpl = (transaction, data) => () => transaction.send(data)
6+
7+exports.sendOffsetsImpl = (transaction, sendOffsets) => () => transaction.sendOffsets(sendOffsets)
8+
9+exports.commitImpl = (transaction) => () => transaction.commit()
10+
11+exports.abortImpl = (transaction) => () => transaction.abort()
src/Kafka/Transaction.pursnew file+63
@@ -0,0 +1,63 @@
1+module Kafka.Transaction
2+ ( Transaction
3+ , transaction
4+ , commit
5+ , abort
6+ , send
7+ , sendOffsets
8+ , SendOffsets
9+ , TopicCommit
10+ , PartitionCommit
11+ ) where
12+
13+import Control.Promise (Promise, toAffE)
14+import Data.Function.Uncurried (Fn2, runFn2)
15+import Effect (Effect)
16+import Effect.Aff (Aff)
17+import Kafka.Consumer (GroupId)
18+import Kafka.Producer (InternalProducerBatch, Producer, ProducerBatch, RecordMetadata, toInternalProducerBatch)
19+import Kafka.Types (Offset, Partition, Topic)
20+import Prelude (Unit, (#), (>>>))
21+
22+foreign import data Transaction :: Type
23+
24+foreign import transactionImpl :: Producer -> Effect (Promise Transaction)
25+
26+transaction :: Producer -> Aff Transaction
27+transaction = transactionImpl >>> toAffE
28+
29+type PartitionCommit = {
30+ partition:: Partition,
31+ offset :: Offset
32+ }
33+
34+type TopicCommit = {
35+ topic :: Topic,
36+ partitions :: Array PartitionCommit
37+}
38+
39+type SendOffsets = {
40+ consumerGroupId :: GroupId,
41+ topics :: Array TopicCommit
42+}
43+
44+foreign import sendOffsetsImpl :: Fn2 Transaction SendOffsets (Effect (Promise Unit))
45+
46+sendOffsets :: Transaction -> SendOffsets -> Aff Unit
47+sendOffsets t so = runFn2 sendOffsetsImpl t so # toAffE
48+
49+foreign import sendImpl :: Fn2 Transaction InternalProducerBatch (Effect (Promise (Array RecordMetadata)))
50+
51+send :: Transaction -> ProducerBatch -> Aff (Array RecordMetadata)
52+send t pl = runFn2 sendImpl t (toInternalProducerBatch pl) # toAffE
53+
54+foreign import commitImpl :: Transaction -> Effect (Promise Unit)
55+
56+commit :: Transaction -> Aff Unit
57+commit = commitImpl >>> toAffE
58+
59+foreign import abortImpl :: Transaction -> Effect (Promise Unit)
60+
61+abort :: Transaction -> Aff Unit
62+abort = abortImpl >>> toAffE
63+
src/Kafka/Types.pursnew file+29
@@ -0,0 +1,29 @@
1+module Kafka.Types
2+ ( Offset(..)
3+ , Partition(..)
4+ , Topic(..)
5+ ) where
6+
7+import Data.Newtype (class Newtype)
8+import Data.Show (class Show)
9+
10+newtype Offset
11+ = Offset Int
12+
13+instance ntOffset :: Newtype Offset Int
14+
15+derive newtype instance showOffset :: Show Offset
16+
17+newtype Partition
18+ = Partition Int
19+
20+instance ntPartiton :: Newtype Partition Int
21+
22+derive newtype instance showPartition :: Show Partition
23+
24+newtype Topic
25+ = Topic String
26+
27+instance ntTopic :: Newtype Topic String
28+
29+derive newtype instance showTopic :: Show Topic
test/Test/Main.pursnew file+10
@@ -0,0 +1,10 @@
1+module Test.Main where
2+
3+import Data.Unit (Unit)
4+import Effect (Effect)
5+import Effect.Class.Console (log)
6+
7+main :: Effect Unit
8+main =
9+ do
10+ log "Add some tests"