git.iko.soy/rowtype-yoga/purescript-parsing-dataview
on master help sign in
26 files changed+1052−5482
since splitsnapshots
unifiedsplit
.github/workflows/push-build.yml+48 .gitignore+9−10 .travis.yml−15 CHANGELOG.md+39 LICENSE+18−79 LICENSE_THIRDPARTY+87 README.md+90−32 bower.json+29−38 package-lock.json−2741 package.json−13 packages.dhall+127 psc-package.json−19 spago-dev.dhall+25 spago.dhall+23 src/Parsing/DataView.Basic.purs+51 src/Parsing/DataView.purs+353 src/Text/Parsing/Parser.purs−138 src/Text/Parsing/Parser/Combinators.purs−200 src/Text/Parsing/Parser/DataView.purs−314 src/Text/Parsing/Parser/Expr.purs−107 src/Text/Parsing/Parser/Indent.purs−219 src/Text/Parsing/Parser/Language.purs−118 src/Text/Parsing/Parser/Pos.purs−36 src/Text/Parsing/Parser/String.purs−92 src/Text/Parsing/Parser/Token.purs−809 test/Main.purs+153−502
.github/workflows/push-build.ymlnew file+48
@@ -0,0 +1,48 @@
1+name: CI
2+
3+on:
4+ push:
5+ branches: [master]
6+ pull_request:
7+ branches: [master]
8+
9+jobs:
10+ build:
11+ runs-on: ubuntu-latest
12+
13+ steps:
14+ - uses: actions/checkout@v2
15+
16+ - name: Set up a PureScript toolchain
17+ uses: purescript-contrib/setup-purescript@main
18+ with:
19+ purescript: "unstable"
20+ purs-tidy: "latest"
21+
22+ - name: Cache PureScript dependencies
23+ uses: actions/cache@v2
24+ with:
25+ key: ${{ runner.os }}-spago-${{ hashFiles('**/*.dhall') }}
26+ path: |
27+ .spago
28+ output
29+ - name: Install dependencies
30+ run: spago install
31+
32+ - name: Build source
33+ run: spago build --no-install --purs-args '--censor-lib --strict'
34+
35+ - name: Install dev dependencies
36+ run: spago -x spago-dev.dhall install
37+
38+ - name: Run tests
39+ run: spago -x spago-dev.dhall test --no-install
40+
41+ - name: Check formatting
42+ run: purs-tidy check src test
43+
44+ - name: Verify Bower & Pulp
45+ run: |
46+ npm install bower pulp@16.0.0-0
47+ npx bower install
48+ npx pulp build -- --censor-lib --strict
.gitignore+9−10
@@ -1,10 +1,9 @@
1−/.*
2−!/.gitignore
3−!/.github
4−!/.jscsrc
5−!/.jshintrc
6−!/.travis.yml
7−/bower_components/
8−/generated-docs/
9−/node_modules/
10−/output/
1+bower_components
2+generated-docs
3+node_modules
4+output
5+.psc-package
6+.spago
7+.psc-ide-port
8+.purs-repl
9+package-lock.json
.travis.ymldeleted−15
@@ -1,15 +0,0 @@
1−language: node_js
2−dist: trusty
3−sudo: required
4−node_js: stable
5−install:
6− - npm install -g bower
7− - npm install
8− - bower install
9−script:
10− - npm run -s build
11−after_success:
12−- >-
13− test $TRAVIS_TAG &&
14− echo $GITHUB_TOKEN | pulp login &&
15− echo y | pulp publish --no-push
CHANGELOG.mdnew file+39
@@ -0,0 +1,39 @@
1+# Changelog
2+
3+## v3.2.0
4+
5+- Build for PureScript v0.15.4
6+- New combinator: `anyTill`
7+- New parser: `anyCodePointUTF8`
8+- Move to rowtype-yoga org
9+
10+## v3.1.0
11+
12+Bugfix `takeN`.
13+
14+## v3.0.0
15+
16+### Breaking changes
17+
18+- Build for PureScript v0.15.0 with __parsing__ v9.0.0.
19+
20+## v2.1.0 2021-11-24
21+
22+Licensing cleanup.
23+
24+## v2.0.0 2021-07-21
25+
26+Build for PureScript v0.14.0.
27+
28+Added the `match` combinator.
29+
30+### Breaking changes
31+
32+Some typeclass constraints on the public API have changed due to changes
33+in the __arraybuffer__ package v11. For the most part we don’t expect
34+this will require any changes to code which depends on this package. If
35+you are using the `anyPrim` function you might have to change `AProxy` to
36+`Prelude.Proxy`. See for more details:
37+
38+* https://github.com/purescript-contrib/purescript-arraybuffer/blob/main/CHANGELOG.md#v1100
39+
LICENSE+18−79
@@ -1,83 +1,22 @@
1−Copyright 2014-2016 PureScript
1+Copyright 2020 James Dawson Brock
22
33Redistribution and use in source and binary forms, with or without
44modification, are permitted provided that the following conditions are met:
55
6−* Redistributions of source code must retain the above copyright notice,
7− this list of conditions and the following disclaimer.
8−* Redistributions in binary form must reproduce the above copyright
9− notice, this list of conditions and the following disclaimer in the
10− documentation and/or other materials provided with the distribution.
11−
12−This software is provided by the copyright holders "as is" and any express or
13−implied warranties, including, but not limited to, the implied warranties of
14−merchantability and fitness for a particular purpose are disclaimed. In no
15−event shall the copyright holders be liable for any direct, indirect,
16−incidental, special, exemplary, or consequential damages (including, but not
17−limited to, procurement of substitute goods or services; loss of use, data,
18−or profits; or business interruption) however caused and on any theory of
19−liability, whether in contract, strict liability, or tort (including
20−negligence or otherwise) arising in any way out of the use of this software,
21−even if advised of the possibility of such damage.
22−
23−-------------------------------------------------------------------------------
24−
25−This library uses code adapted from the Haskell libraries parsec and indents.
26−Their licenses are reproduced below:
27−
28−'parsec' license:
29−
30− Copyright 1999-2000, Daan Leijen; 2007, Paolo Martini. All rights reserved.
31−
32− Redistribution and use in source and binary forms, with or without
33− modification, are permitted provided that the following conditions are met:
34−
35− * Redistributions of source code must retain the above copyright notice,
36− this list of conditions and the following disclaimer.
37− * Redistributions in binary form must reproduce the above copyright
38− notice, this list of conditions and the following disclaimer in the
39− documentation and/or other materials provided with the distribution.
40−
41− This software is provided by the copyright holders "as is" and any express or
42− implied warranties, including, but not limited to, the implied warranties of
43− merchantability and fitness for a particular purpose are disclaimed. In no
44− event shall the copyright holders be liable for any direct, indirect,
45− incidental, special, exemplary, or consequential damages (including, but not
46− limited to, procurement of substitute goods or services; loss of use, data,
47− or profits; or business interruption) however caused and on any theory of
48− liability, whether in contract, strict liability, or tort (including
49− negligence or otherwise) arising in any way out of the use of this software,
50− even if advised of the possibility of such damage.
51−
52−'indents' license:
53−
54− Copyright (c)2010, Sam Anklesaria
55−
56− All rights reserved.
57−
58− Redistribution and use in source and binary forms, with or without
59− modification, are permitted provided that the following conditions are met:
60−
61− * Redistributions of source code must retain the above copyright
62− notice, this list of conditions and the following disclaimer.
63−
64− * Redistributions in binary form must reproduce the above
65− copyright notice, this list of conditions and the following
66− disclaimer in the documentation and/or other materials provided
67− with the distribution.
68−
69− * Neither the name of Sam Anklesaria nor the names of other
70− contributors may be used to endorse or promote products derived
71− from this software without specific prior written permission.
72−
73− THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
74− "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
75− LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
76− A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
77− OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
78− SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
79− LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
80− DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
81− THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
82− (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
83− OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
6+1. Redistributions of source code must retain the above copyright notice, this
7+ list of conditions and the following disclaimer.
8+
9+2. Redistributions in binary form must reproduce the above copyright notice,
10+ this list of conditions and the following disclaimer in the documentation
11+ and/or other materials provided with the distribution.
12+
13+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
14+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
17+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
20+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
21+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
22+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
LICENSE_THIRDPARTYnew file+87
@@ -0,0 +1,87 @@
1+This library is based on purescript-parsing, copyright follows.
2+
3+--------------------------------------------------------------------------------
4+
5+Copyright 2014-2016 PureScript
6+
7+Redistribution and use in source and binary forms, with or without
8+modification, are permitted provided that the following conditions are met:
9+
10+* Redistributions of source code must retain the above copyright notice,
11+ this list of conditions and the following disclaimer.
12+* Redistributions in binary form must reproduce the above copyright
13+ notice, this list of conditions and the following disclaimer in the
14+ documentation and/or other materials provided with the distribution.
15+
16+This software is provided by the copyright holders "as is" and any express or
17+implied warranties, including, but not limited to, the implied warranties of
18+merchantability and fitness for a particular purpose are disclaimed. In no
19+event shall the copyright holders be liable for any direct, indirect,
20+incidental, special, exemplary, or consequential damages (including, but not
21+limited to, procurement of substitute goods or services; loss of use, data,
22+or profits; or business interruption) however caused and on any theory of
23+liability, whether in contract, strict liability, or tort (including
24+negligence or otherwise) arising in any way out of the use of this software,
25+even if advised of the possibility of such damage.
26+
27+-------------------------------------------------------------------------------
28+
29+This library uses code adapted from the Haskell libraries parsec and indents.
30+Their licenses are reproduced below:
31+
32+'parsec' license:
33+
34+ Copyright 1999-2000, Daan Leijen; 2007, Paolo Martini. All rights reserved.
35+
36+ Redistribution and use in source and binary forms, with or without
37+ modification, are permitted provided that the following conditions are met:
38+
39+ * Redistributions of source code must retain the above copyright notice,
40+ this list of conditions and the following disclaimer.
41+ * Redistributions in binary form must reproduce the above copyright
42+ notice, this list of conditions and the following disclaimer in the
43+ documentation and/or other materials provided with the distribution.
44+
45+ This software is provided by the copyright holders "as is" and any express or
46+ implied warranties, including, but not limited to, the implied warranties of
47+ merchantability and fitness for a particular purpose are disclaimed. In no
48+ event shall the copyright holders be liable for any direct, indirect,
49+ incidental, special, exemplary, or consequential damages (including, but not
50+ limited to, procurement of substitute goods or services; loss of use, data,
51+ or profits; or business interruption) however caused and on any theory of
52+ liability, whether in contract, strict liability, or tort (including
53+ negligence or otherwise) arising in any way out of the use of this software,
54+ even if advised of the possibility of such damage.
55+
56+'indents' license:
57+
58+ Copyright (c)2010, Sam Anklesaria
59+
60+ All rights reserved.
61+
62+ Redistribution and use in source and binary forms, with or without
63+ modification, are permitted provided that the following conditions are met:
64+
65+ * Redistributions of source code must retain the above copyright
66+ notice, this list of conditions and the following disclaimer.
67+
68+ * Redistributions in binary form must reproduce the above
69+ copyright notice, this list of conditions and the following
70+ disclaimer in the documentation and/or other materials provided
71+ with the distribution.
72+
73+ * Neither the name of Sam Anklesaria nor the names of other
74+ contributors may be used to endorse or promote products derived
75+ from this software without specific prior written permission.
76+
77+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
78+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
79+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
80+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
81+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
82+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
83+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
84+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
85+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
86+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
87+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
README.md+90−32
@@ -1,47 +1,105 @@
1−# purescript-parsing
1+# purescript-parsing-dataview
22
3−[![Latest release](http://img.shields.io/github/release/purescript-contrib/purescript-parsing.svg)](https://github.com/purescript-contrib/purescript-parsing/releases)
4−[![Build status](https://travis-ci.org/purescript-contrib/purescript-parsing.svg?branch=master)](https://travis-ci.org/purescript-contrib/purescript-parsing)
5−[![Pursuit](http://pursuit.purescript.org/packages/purescript-parsing/badge)](http://pursuit.purescript.org/packages/purescript-parsing/)
6−[![Maintainer: garyb](https://img.shields.io/badge/maintainer-garyb-lightgrey.svg)](http://github.com/garyb)
7−[![Maintainer: thomashoneyman](https://img.shields.io/badge/maintainer-thomashoneyman-lightgrey.svg)](http://github.com/thomashoneyman)
3+[![CI](https://github.com/rowtype-yoga/purescript-parsing-dataview/workflows/CI/badge.svg?branch=master)](https://github.com/rowtype-yoga/purescript-parsing-dataview/actions)
4+[![Pursuit](http://pursuit.purescript.org/packages/purescript-parsing-dataview/badge)](http://pursuit.purescript.org/packages/purescript-parsing-dataview/)
5+[![Maintainer: jamesdbrock](https://img.shields.io/badge/maintainer-jamesdbrock-teal.svg)](https://github.com/jamesdbrock)
86
9−-- | Primitive parsers for parsing Javascript ArrayBuffers with the
10−-- | `Text.Parsing.Parser` module in package __purescript-parsing__.
11−-- |
12−-- | This module brings __purescript-parsing__ into rough feature parity
13−-- | with __Megaparsec__:
14−-- |
15−-- | | Built-in stream support | purescript-parsing | Megaparsec |
16−-- | |----|-----|----|
17−-- | | UTF-16 strings | String | Text |
18−-- | | Listy strings | Token | String |
19−-- | | Binary blobs | __DataView__ | Bytestring |
7+Primitive parsers for
8+`DataView`s on JavaScript `ArrayBuffer`s with the package
9+[__parsing__](https://pursuit.purescript.org/packages/purescript-parsing/).
2010
21−A parser combinator library based on Haskell's Parsec.
11+With this package, the input stream support of __parsing__
12+is similar to the built-in stream support of [__Megaparsec__](https://hackage.haskell.org/package/megaparsec):
2213
23−## Parsers
14+| Stream type | parsing | Megaparsec |
15+|----|-----|----|
16+| UTF-16 strings | String | Text < v2.0|
17+| UTF-8 strings | __DataView__ | Text ≥ v2.0 |
18+| Listy strings | Token | String |
19+| Binary blobs | __DataView__ | ByteString |
2420
25−There are three sets of parsing primitives included in this library.
21+## Usage examples
2622
27−* `Text.Parsing.Parser.String` module for native `String` parsing.
28−* `Text.Parsing.Parser.Token` module for parsing `List`s of any type of token.
29−* `Text.Parsing.Parser.DataView` module for parsing native Javascript `ArrayBuffer`.
23+Parse values out of a `dataview :: Data.ArrayBuffer.Types.DataView`. All
24+`DataView` parsing must be done in an `Effect` context. The `result` will be
25+`Either` a parse error or the parsed value.
3026
31−All parsing primitives are “auto-backtracking”, meaning that if they fail,
32−then they consume no input.
27+### Parse two numbers
3328
34−## Installation
29+Parse two big-endian IEEE 754 double-precision `Number`s.
3530
31+```purescript
32+import Parsing (runParserT)
33+import Parsing.DataView (anyFloat64be)
34+
35+do
36+ result <- runParserT dataview do
37+ float1 <- anyFloat64be
38+ float2 <- anyFloat64be
39+ pure $ Tuple float1 float2
3640```
37−bower install purescript-parsing
41+
42+### Parse an array
43+
44+Parse an array of `n` 32-bit big-endian signed `Int`s.
45+
46+```purescript
47+import Parsing (runParserT)
48+import Parsing.DataView (anyUint32be)
49+import Data.Unfoldable (replicateA)
50+
51+do
52+ result <- runParserT dataview $ replicateA n anyInt32be
53+```
54+
55+### Parse UTF-8
56+
57+Parse a UTF-8 `String` with a length prefix.
58+
59+We give this as an example, rather than supporting it in the library, because
60+it depends on
61+[__web-encoding__](https://pursuit.purescript.org/packages/purescript-web-encoding) for UTF-8.
62+
63+```purescript
64+import Control.Monad.Except (ExceptT)
65+import Data.ArrayBuffer.Cast (toUint8Array)
66+import Effect.Exception (catchException, message)
67+import Parsing (runParserT, liftExceptT)
68+import Parsing.DataView (anyInt32be, takeN)
69+import Web.Encoding.TextDecoder as TextDecoder
70+import Web.Encoding.UtfLabel as UtfLabel
71+
72+do
73+ textDecoder <- TextDecoder.new UtfLabel.utf8
74+
75+ result <- runParserT dataview do
76+ -- First parse a 32-bit big-endian length prefix for the length
77+ -- of the UTF-8 string in bytes.
78+ length <- anyInt32be
79+ stringview <- takeN length
80+ stringarray <- lift $ liftEffect $ toUint8Array stringview
81+ liftExceptT $ ExceptT $ catchException (pure <<< Left <<< message) do
82+ Right <$> TextDecoder.decode stringarray textDecoder
3883```
3984
40−## Documentation
85+## Serialization
86+
87+This package is for reading (`DataView`s on) `ArrayBuffer`s, not writing
88+them. See the package
89+[__arraybuffer-builder__](https://pursuit.purescript.org/packages/purescript-arraybuffer-builder/)
90+for a way to
91+serialize and build `ArrayBuffer`s.
92+
4193
42−- [See the tests](test/Main.purs) for some example usages.
43−- Module documentation is [published on Pursuit](http://pursuit.purescript.org/packages/purescript-parsing).
94+## References
4495
45−## Contributing
96+* [MDN `ArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)
97+* [MDN `DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView)
4698
47−Read the [contribution guidelines](https://github.com/purescript-contrib/purescript-parsing/blob/master/.github/contributing.md) to get started and see helpful related resources.
99+## Development
100+
101+Run the tests with the development `spago` file:
102+
103+```
104+spago -x spago-dev.dhall test
105+```
bower.json+29−38
@@ -1,40 +1,31 @@
11{
2− "name": "purescript-parsing",
3− "homepage": "https://github.com/purescript-contrib/purescript-parsing",
4− "description": "Parser combinator library",
5− "keywords": [
6− "purescript"
7− ],
8− "license": "BSD-3-Clause",
9− "repository": {
10− "type": "git",
11− "url": "git://github.com/purescript-contrib/purescript-parsing.git"
12− },
13− "ignore": [
14− "**/.*",
15− "bower_components",
16− "node_modules",
17− "output",
18− "test",
19− "bower.json",
20− "package.json"
21− ],
22− "dependencies": {
23− "purescript-arrays": "^5.0.0",
24− "purescript-either": "^4.0.0",
25− "purescript-foldable-traversable": "^4.0.0",
26− "purescript-identity": "^4.0.0",
27− "purescript-integers": "^4.0.0",
28− "purescript-lists": "^5.0.0",
29− "purescript-maybe": "^4.0.0",
30− "purescript-strings": "^4.0.0",
31− "purescript-transformers": "^4.1.0",
32− "purescript-unicode": "^4.0.0",
33− "purescript-arraybuffer": "^10.0.0"
34− },
35− "devDependencies": {
36− "purescript-assert": "^4.0.0",
37− "purescript-console": "^4.1.0",
38− "purescript-psci-support": "^4.0.0"
39− }
2+ "name": "purescript-parsing-dataview",
3+ "license": [
4+ "BSD-2-Clause"
5+ ],
6+ "repository": {
7+ "type": "git",
8+ "url": "https://github.com/rowtype-yoga/purescript-parsing-dataview"
9+ },
10+ "ignore": [
11+ "**/.*",
12+ "node_modules",
13+ "bower_components",
14+ "output"
15+ ],
16+ "dependencies": {
17+ "purescript-arraybuffer": "^v13.1.1",
18+ "purescript-arraybuffer-types": "^v3.0.2",
19+ "purescript-effect": "^v4.0.0",
20+ "purescript-enums": "^v6.0.1",
21+ "purescript-float32": "^v2.0.0",
22+ "purescript-maybe": "^v6.0.0",
23+ "purescript-parsing": "^v10.2.0",
24+ "purescript-prelude": "^v6.0.1",
25+ "purescript-strings": "^v6.0.1",
26+ "purescript-tailrec": "^v6.1.0",
27+ "purescript-transformers": "^v6.0.0",
28+ "purescript-tuples": "^v7.0.0",
29+ "purescript-uint": "^v7.0.0"
30+ }
4031}
package-lock.jsondeleted−2741
@@ -1,2741 +0,0 @@
1−{
2− "requires": true,
3− "lockfileVersion": 1,
4− "dependencies": {
5− "JSONStream": {
6− "version": "1.3.5",
7− "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
8− "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
9− "dev": true,
10− "requires": {
11− "jsonparse": "^1.2.0",
12− "through": ">=2.2.7 <3"
13− }
14− },
15− "acorn": {
16− "version": "7.0.0",
17− "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz",
18− "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==",
19− "dev": true
20− },
21− "acorn-node": {
22− "version": "1.8.2",
23− "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
24− "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
25− "dev": true,
26− "requires": {
27− "acorn": "^7.0.0",
28− "acorn-walk": "^7.0.0",
29− "xtend": "^4.0.2"
30− }
31− },
32− "acorn-walk": {
33− "version": "7.0.0",
34− "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz",
35− "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==",
36− "dev": true
37− },
38− "ajv": {
39− "version": "6.10.2",
40− "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
41− "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
42− "dev": true,
43− "requires": {
44− "fast-deep-equal": "^2.0.1",
45− "fast-json-stable-stringify": "^2.0.0",
46− "json-schema-traverse": "^0.4.1",
47− "uri-js": "^4.2.2"
48− }
49− },
50− "ansi-escapes": {
51− "version": "3.2.0",
52− "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
53− "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
54− "dev": true
55− },
56− "ansi-regex": {
57− "version": "4.1.0",
58− "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
59− "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
60− "dev": true
61− },
62− "ansi-styles": {
63− "version": "3.2.1",
64− "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
65− "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
66− "dev": true,
67− "requires": {
68− "color-convert": "^1.9.0"
69− }
70− },
71− "aproba": {
72− "version": "1.2.0",
73− "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
74− "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
75− "dev": true
76− },
77− "arch": {
78− "version": "2.1.1",
79− "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz",
80− "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==",
81− "dev": true
82− },
83− "asn1": {
84− "version": "0.2.4",
85− "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
86− "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
87− "dev": true,
88− "requires": {
89− "safer-buffer": "~2.1.0"
90− }
91− },
92− "asn1.js": {
93− "version": "4.10.1",
94− "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
95− "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
96− "dev": true,
97− "requires": {
98− "bn.js": "^4.0.0",
99− "inherits": "^2.0.1",
100− "minimalistic-assert": "^1.0.0"
101− }
102− },
103− "assert": {
104− "version": "1.5.0",
105− "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
106− "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
107− "dev": true,
108− "requires": {
109− "object-assign": "^4.1.1",
110− "util": "0.10.3"
111− },
112− "dependencies": {
113− "inherits": {
114− "version": "2.0.1",
115− "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
116− "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
117− "dev": true
118− },
119− "util": {
120− "version": "0.10.3",
121− "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
122− "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
123− "dev": true,
124− "requires": {
125− "inherits": "2.0.1"
126− }
127− }
128− }
129− },
130− "assert-plus": {
131− "version": "1.0.0",
132− "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
133− "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
134− "dev": true
135− },
136− "async": {
137− "version": "1.5.2",
138− "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
139− "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
140− "dev": true
141− },
142− "asynckit": {
143− "version": "0.4.0",
144− "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
145− "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
146− "dev": true
147− },
148− "aws-sign2": {
149− "version": "0.7.0",
150− "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
151− "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
152− "dev": true
153− },
154− "aws4": {
155− "version": "1.8.0",
156− "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
157− "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
158− "dev": true
159− },
160− "balanced-match": {
161− "version": "1.0.0",
162− "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
163− "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
164− "dev": true
165− },
166− "base64-js": {
167− "version": "1.3.1",
168− "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
169− "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
170− "dev": true
171− },
172− "bcrypt-pbkdf": {
173− "version": "1.0.2",
174− "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
175− "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
176− "dev": true,
177− "requires": {
178− "tweetnacl": "^0.14.3"
179− }
180− },
181− "bluebird": {
182− "version": "3.5.5",
183− "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
184− "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
185− "dev": true
186− },
187− "bn.js": {
188− "version": "4.11.8",
189− "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
190− "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
191− "dev": true
192− },
193− "brace-expansion": {
194− "version": "1.1.11",
195− "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
196− "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
197− "dev": true,
198− "requires": {
199− "balanced-match": "^1.0.0",
200− "concat-map": "0.0.1"
201− }
202− },
203− "brorand": {
204− "version": "1.1.0",
205− "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
206− "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
207− "dev": true
208− },
209− "browser-pack": {
210− "version": "6.1.0",
211− "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
212− "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
213− "dev": true,
214− "requires": {
215− "JSONStream": "^1.0.3",
216− "combine-source-map": "~0.8.0",
217− "defined": "^1.0.0",
218− "safe-buffer": "^5.1.1",
219− "through2": "^2.0.0",
220− "umd": "^3.0.0"
221− }
222− },
223− "browser-resolve": {
224− "version": "1.11.3",
225− "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
226− "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
227− "dev": true,
228− "requires": {
229− "resolve": "1.1.7"
230− },
231− "dependencies": {
232− "resolve": {
233− "version": "1.1.7",
234− "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
235− "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
236− "dev": true
237− }
238− }
239− },
240− "browserify": {
241− "version": "16.5.0",
242− "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.0.tgz",
243− "integrity": "sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw==",
244− "dev": true,
245− "requires": {
246− "JSONStream": "^1.0.3",
247− "assert": "^1.4.0",
248− "browser-pack": "^6.0.1",
249− "browser-resolve": "^1.11.0",
250− "browserify-zlib": "~0.2.0",
251− "buffer": "^5.0.2",
252− "cached-path-relative": "^1.0.0",
253− "concat-stream": "^1.6.0",
254− "console-browserify": "^1.1.0",
255− "constants-browserify": "~1.0.0",
256− "crypto-browserify": "^3.0.0",
257− "defined": "^1.0.0",
258− "deps-sort": "^2.0.0",
259− "domain-browser": "^1.2.0",
260− "duplexer2": "~0.1.2",
261− "events": "^2.0.0",
262− "glob": "^7.1.0",
263− "has": "^1.0.0",
264− "htmlescape": "^1.1.0",
265− "https-browserify": "^1.0.0",
266− "inherits": "~2.0.1",
267− "insert-module-globals": "^7.0.0",
268− "labeled-stream-splicer": "^2.0.0",
269− "mkdirp": "^0.5.0",
270− "module-deps": "^6.0.0",
271− "os-browserify": "~0.3.0",
272− "parents": "^1.0.1",
273− "path-browserify": "~0.0.0",
274− "process": "~0.11.0",
275− "punycode": "^1.3.2",
276− "querystring-es3": "~0.2.0",
277− "read-only-stream": "^2.0.0",
278− "readable-stream": "^2.0.2",
279− "resolve": "^1.1.4",
280− "shasum": "^1.0.0",
281− "shell-quote": "^1.6.1",
282− "stream-browserify": "^2.0.0",
283− "stream-http": "^3.0.0",
284− "string_decoder": "^1.1.1",
285− "subarg": "^1.0.0",
286− "syntax-error": "^1.1.1",
287− "through2": "^2.0.0",
288− "timers-browserify": "^1.0.1",
289− "tty-browserify": "0.0.1",
290− "url": "~0.11.0",
291− "util": "~0.10.1",
292− "vm-browserify": "^1.0.0",
293− "xtend": "^4.0.0"
294− },
295− "dependencies": {
296− "concat-stream": {
297− "version": "1.6.2",
298− "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
299− "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
300− "dev": true,
301− "requires": {
302− "buffer-from": "^1.0.0",
303− "inherits": "^2.0.3",
304− "readable-stream": "^2.2.2",
305− "typedarray": "^0.0.6"
306− }
307− }
308− }
309− },
310− "browserify-aes": {
311− "version": "1.2.0",
312− "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
313− "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
314− "dev": true,
315− "requires": {
316− "buffer-xor": "^1.0.3",
317− "cipher-base": "^1.0.0",
318− "create-hash": "^1.1.0",
319− "evp_bytestokey": "^1.0.3",
320− "inherits": "^2.0.1",
321− "safe-buffer": "^5.0.1"
322− }
323− },
324− "browserify-cache-api": {
325− "version": "3.0.1",
326− "resolved": "https://registry.npmjs.org/browserify-cache-api/-/browserify-cache-api-3.0.1.tgz",
327− "integrity": "sha1-liR+hT8Gj9bg1FzHPwuyzZd47wI=",
328− "dev": true,
329− "requires": {
330− "async": "^1.5.2",
331− "through2": "^2.0.0",
332− "xtend": "^4.0.0"
333− }
334− },
335− "browserify-cipher": {
336− "version": "1.0.1",
337− "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
338− "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
339− "dev": true,
340− "requires": {
341− "browserify-aes": "^1.0.4",
342− "browserify-des": "^1.0.0",
343− "evp_bytestokey": "^1.0.0"
344− }
345− },
346− "browserify-des": {
347− "version": "1.0.2",
348− "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
349− "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
350− "dev": true,
351− "requires": {
352− "cipher-base": "^1.0.1",
353− "des.js": "^1.0.0",
354− "inherits": "^2.0.1",
355− "safe-buffer": "^5.1.2"
356− }
357− },
358− "browserify-incremental": {
359− "version": "3.1.1",
360− "resolved": "https://registry.npmjs.org/browserify-incremental/-/browserify-incremental-3.1.1.tgz",
361− "integrity": "sha1-BxPLdYckemMqnwjPG9FpuHi2Koo=",
362− "dev": true,
363− "requires": {
364− "JSONStream": "^0.10.0",
365− "browserify-cache-api": "^3.0.0",
366− "through2": "^2.0.0",
367− "xtend": "^4.0.0"
368− },
369− "dependencies": {
370− "JSONStream": {
371− "version": "0.10.0",
372− "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.10.0.tgz",
373− "integrity": "sha1-dDSdDYlSK3HzDwoD/5vSDKbxKsA=",
374− "dev": true,
375− "requires": {
376− "jsonparse": "0.0.5",
377− "through": ">=2.2.7 <3"
378− }
379− },
380− "jsonparse": {
381− "version": "0.0.5",
382− "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz",
383− "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=",
384− "dev": true
385− }
386− }
387− },
388− "browserify-rsa": {
389− "version": "4.0.1",
390− "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
391− "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
392− "dev": true,
393− "requires": {
394− "bn.js": "^4.1.0",
395− "randombytes": "^2.0.1"
396− }
397− },
398− "browserify-sign": {
399− "version": "4.0.4",
400− "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
401− "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
402− "dev": true,
403− "requires": {
404− "bn.js": "^4.1.1",
405− "browserify-rsa": "^4.0.0",
406− "create-hash": "^1.1.0",
407− "create-hmac": "^1.1.2",
408− "elliptic": "^6.0.0",
409− "inherits": "^2.0.1",
410− "parse-asn1": "^5.0.0"
411− }
412− },
413− "browserify-zlib": {
414− "version": "0.2.0",
415− "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
416− "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
417− "dev": true,
418− "requires": {
419− "pako": "~1.0.5"
420− }
421− },
422− "buffer": {
423− "version": "5.4.0",
424− "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.0.tgz",
425− "integrity": "sha512-Xpgy0IwHK2N01ncykXTy6FpCWuM+CJSHoPVBLyNqyrWxsedpLvwsYUhf0ME3WRFNUhos0dMamz9cOS/xRDtU5g==",
426− "dev": true,
427− "requires": {
428− "base64-js": "^1.0.2",
429− "ieee754": "^1.1.4"
430− }
431− },
432− "buffer-crc32": {
433− "version": "0.2.13",
434− "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
435− "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
436− "dev": true
437− },
438− "buffer-from": {
439− "version": "1.1.1",
440− "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
441− "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
442− "dev": true
443− },
444− "buffer-xor": {
445− "version": "1.0.3",
446− "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
447− "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
448− "dev": true
449− },
450− "builtin-status-codes": {
451− "version": "3.0.0",
452− "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
453− "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
454− "dev": true
455− },
456− "byline": {
457− "version": "5.0.0",
458− "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz",
459− "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=",
460− "dev": true
461− },
462− "cacache": {
463− "version": "11.3.3",
464− "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz",
465− "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==",
466− "dev": true,
467− "requires": {
468− "bluebird": "^3.5.5",
469− "chownr": "^1.1.1",
470− "figgy-pudding": "^3.5.1",
471− "glob": "^7.1.4",
472− "graceful-fs": "^4.1.15",
473− "lru-cache": "^5.1.1",
474− "mississippi": "^3.0.0",
475− "mkdirp": "^0.5.1",
476− "move-concurrently": "^1.0.1",
477− "promise-inflight": "^1.0.1",
478− "rimraf": "^2.6.3",
479− "ssri": "^6.0.1",
480− "unique-filename": "^1.1.1",
481− "y18n": "^4.0.0"
482− },
483− "dependencies": {
484− "rimraf": {
485− "version": "2.7.1",
486− "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
487− "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
488− "dev": true,
489− "requires": {
490− "glob": "^7.1.3"
491− }
492− }
493− }
494− },
495− "cached-path-relative": {
496− "version": "1.0.2",
497− "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz",
498− "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==",
499− "dev": true
500− },
501− "caseless": {
502− "version": "0.12.0",
503− "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
504− "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
505− "dev": true
506− },
507− "chalk": {
508− "version": "2.4.2",
509− "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
510− "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
511− "dev": true,
512− "requires": {
513− "ansi-styles": "^3.2.1",
514− "escape-string-regexp": "^1.0.5",
515− "supports-color": "^5.3.0"
516− }
517− },
518− "chownr": {
519− "version": "1.1.2",
520− "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz",
521− "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==",
522− "dev": true
523− },
524− "cipher-base": {
525− "version": "1.0.4",
526− "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
527− "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
528− "dev": true,
529− "requires": {
530− "inherits": "^2.0.1",
531− "safe-buffer": "^5.0.1"
532− }
533− },
534− "cli-cursor": {
535− "version": "2.1.0",
536− "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
537− "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
538− "dev": true,
539− "requires": {
540− "restore-cursor": "^2.0.0"
541− }
542− },
543− "color-convert": {
544− "version": "1.9.3",
545− "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
546− "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
547− "dev": true,
548− "requires": {
549− "color-name": "1.1.3"
550− }
551− },
552− "color-name": {
553− "version": "1.1.3",
554− "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
555− "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
556− "dev": true
557− },
558− "colors": {
559− "version": "1.3.3",
560− "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz",
561− "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==",
562− "dev": true
563− },
564− "combine-source-map": {
565− "version": "0.8.0",
566− "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
567− "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=",
568− "dev": true,
569− "requires": {
570− "convert-source-map": "~1.1.0",
571− "inline-source-map": "~0.6.0",
572− "lodash.memoize": "~3.0.3",
573− "source-map": "~0.5.3"
574− }
575− },
576− "combined-stream": {
577− "version": "1.0.8",
578− "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
579− "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
580− "dev": true,
581− "requires": {
582− "delayed-stream": "~1.0.0"
583− }
584− },
585− "concat-map": {
586− "version": "0.0.1",
587− "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
588− "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
589− "dev": true
590− },
591− "concat-stream": {
592− "version": "2.0.0",
593− "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
594− "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
595− "dev": true,
596− "requires": {
597− "buffer-from": "^1.0.0",
598− "inherits": "^2.0.3",
599− "readable-stream": "^3.0.2",
600− "typedarray": "^0.0.6"
601− },
602− "dependencies": {
603− "readable-stream": {
604− "version": "3.4.0",
605− "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
606− "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
607− "dev": true,
608− "requires": {
609− "inherits": "^2.0.3",
610− "string_decoder": "^1.1.1",
611− "util-deprecate": "^1.0.1"
612− }
613− }
614− }
615− },
616− "console-browserify": {
617− "version": "1.1.0",
618− "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
619− "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
620− "dev": true,
621− "requires": {
622− "date-now": "^0.1.4"
623− }
624− },
625− "constants-browserify": {
626− "version": "1.0.0",
627− "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
628− "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
629− "dev": true
630− },
631− "convert-source-map": {
632− "version": "1.1.3",
633− "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
634− "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=",
635− "dev": true
636− },
637− "copy-concurrently": {
638− "version": "1.0.5",
639− "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
640− "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
641− "dev": true,
642− "requires": {
643− "aproba": "^1.1.1",
644− "fs-write-stream-atomic": "^1.0.8",
645− "iferr": "^0.1.5",
646− "mkdirp": "^0.5.1",
647− "rimraf": "^2.5.4",
648− "run-queue": "^1.0.0"
649− },
650− "dependencies": {
651− "rimraf": {
652− "version": "2.7.1",
653− "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
654− "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
655− "dev": true,
656− "requires": {
657− "glob": "^7.1.3"
658− }
659− }
660− }
661− },
662− "core-util-is": {
663− "version": "1.0.2",
664− "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
665− "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
666− "dev": true
667− },
668− "create-ecdh": {
669− "version": "4.0.3",
670− "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
671− "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
672− "dev": true,
673− "requires": {
674− "bn.js": "^4.1.0",
675− "elliptic": "^6.0.0"
676− }
677− },
678− "create-hash": {
679− "version": "1.2.0",
680− "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
681− "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
682− "dev": true,
683− "requires": {
684− "cipher-base": "^1.0.1",
685− "inherits": "^2.0.1",
686− "md5.js": "^1.3.4",
687− "ripemd160": "^2.0.1",
688− "sha.js": "^2.4.0"
689− }
690− },
691− "create-hmac": {
692− "version": "1.1.7",
693− "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
694− "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
695− "dev": true,
696− "requires": {
697− "cipher-base": "^1.0.3",
698− "create-hash": "^1.1.0",
699− "inherits": "^2.0.1",
700− "ripemd160": "^2.0.0",
701− "safe-buffer": "^5.0.1",
702− "sha.js": "^2.4.8"
703− }
704− },
705− "cross-spawn": {
706− "version": "6.0.5",
707− "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
708− "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
709− "dev": true,
710− "requires": {
711− "nice-try": "^1.0.4",
712− "path-key": "^2.0.1",
713− "semver": "^5.5.0",
714− "shebang-command": "^1.2.0",
715− "which": "^1.2.9"
716− }
717− },
718− "crypto-browserify": {
719− "version": "3.12.0",
720− "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
721− "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
722− "dev": true,
723− "requires": {
724− "browserify-cipher": "^1.0.0",
725− "browserify-sign": "^4.0.0",
726− "create-ecdh": "^4.0.0",
727− "create-hash": "^1.1.0",
728− "create-hmac": "^1.1.0",
729− "diffie-hellman": "^5.0.0",
730− "inherits": "^2.0.1",
731− "pbkdf2": "^3.0.3",
732− "public-encrypt": "^4.0.0",
733− "randombytes": "^2.0.0",
734− "randomfill": "^1.0.3"
735− }
736− },
737− "cyclist": {
738− "version": "0.2.2",
739− "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
740− "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
741− "dev": true
742− },
743− "dash-ast": {
744− "version": "1.0.0",
745− "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz",
746− "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==",
747− "dev": true
748− },
749− "dashdash": {
750− "version": "1.14.1",
751− "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
752− "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
753− "dev": true,
754− "requires": {
755− "assert-plus": "^1.0.0"
756− }
757− },
758− "date-now": {
759− "version": "0.1.4",
760− "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
761− "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
762− "dev": true
763− },
764− "defined": {
765− "version": "1.0.0",
766− "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
767− "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
768− "dev": true
769− },
770− "delayed-stream": {
771− "version": "1.0.0",
772− "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
773− "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
774− "dev": true
775− },
776− "deps-sort": {
777− "version": "2.0.0",
778− "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz",
779− "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=",
780− "dev": true,
781− "requires": {
782− "JSONStream": "^1.0.3",
783− "shasum": "^1.0.0",
784− "subarg": "^1.0.0",
785− "through2": "^2.0.0"
786− }
787− },
788− "des.js": {
789− "version": "1.0.0",
790− "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
791− "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
792− "dev": true,
793− "requires": {
794− "inherits": "^2.0.1",
795− "minimalistic-assert": "^1.0.0"
796− }
797− },
798− "detective": {
799− "version": "5.2.0",
800− "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
801− "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
802− "dev": true,
803− "requires": {
804− "acorn-node": "^1.6.1",
805− "defined": "^1.0.0",
806− "minimist": "^1.1.1"
807− }
808− },
809− "diffie-hellman": {
810− "version": "5.0.3",
811− "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
812− "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
813− "dev": true,
814− "requires": {
815− "bn.js": "^4.1.0",
816− "miller-rabin": "^4.0.0",
817− "randombytes": "^2.0.0"
818− }
819− },
820− "domain-browser": {
821− "version": "1.2.0",
822− "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
823− "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
824− "dev": true
825− },
826− "duplexer2": {
827− "version": "0.1.4",
828− "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
829− "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
830− "dev": true,
831− "requires": {
832− "readable-stream": "^2.0.2"
833− }
834− },
835− "duplexify": {
836− "version": "3.7.1",
837− "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
838− "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
839− "dev": true,
840− "requires": {
841− "end-of-stream": "^1.0.0",
842− "inherits": "^2.0.1",
843− "readable-stream": "^2.0.0",
844− "stream-shift": "^1.0.0"
845− }
846− },
847− "ecc-jsbn": {
848− "version": "0.1.2",
849− "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
850− "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
851− "dev": true,
852− "requires": {
853− "jsbn": "~0.1.0",
854− "safer-buffer": "^2.1.0"
855− }
856− },
857− "elliptic": {
858− "version": "6.5.0",
859− "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz",
860− "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==",
861− "dev": true,
862− "requires": {
863− "bn.js": "^4.4.0",
864− "brorand": "^1.0.1",
865− "hash.js": "^1.0.0",
866− "hmac-drbg": "^1.0.0",
867− "inherits": "^2.0.1",
868− "minimalistic-assert": "^1.0.0",
869− "minimalistic-crypto-utils": "^1.0.0"
870− }
871− },
872− "emoji-regex": {
873− "version": "7.0.3",
874− "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
875− "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
876− "dev": true
877− },
878− "end-of-stream": {
879− "version": "1.4.1",
880− "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
881− "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
882− "dev": true,
883− "requires": {
884− "once": "^1.4.0"
885− }
886− },
887− "env-paths": {
888− "version": "2.2.0",
889− "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz",
890− "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==",
891− "dev": true
892− },
893− "es6-promise": {
894− "version": "3.3.1",
895− "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
896− "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=",
897− "dev": true
898− },
899− "escape-string-regexp": {
900− "version": "1.0.5",
901− "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
902− "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
903− "dev": true
904− },
905− "events": {
906− "version": "2.1.0",
907− "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz",
908− "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==",
909− "dev": true
910− },
911− "evp_bytestokey": {
912− "version": "1.0.3",
913− "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
914− "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
915− "dev": true,
916− "requires": {
917− "md5.js": "^1.3.4",
918− "safe-buffer": "^5.1.1"
919− }
920− },
921− "execa": {
922− "version": "2.0.4",
923− "resolved": "https://registry.npmjs.org/execa/-/execa-2.0.4.tgz",
924− "integrity": "sha512-VcQfhuGD51vQUQtKIq2fjGDLDbL6N1DTQVpYzxZ7LPIXw3HqTuIz6uxRmpV1qf8i31LHf2kjiaGI+GdHwRgbnQ==",
925− "dev": true,
926− "requires": {
927− "cross-spawn": "^6.0.5",
928− "get-stream": "^5.0.0",
929− "is-stream": "^2.0.0",
930− "merge-stream": "^2.0.0",
931− "npm-run-path": "^3.0.0",
932− "onetime": "^5.1.0",
933− "p-finally": "^2.0.0",
934− "signal-exit": "^3.0.2",
935− "strip-final-newline": "^2.0.0"
936− }
937− },
938− "extend": {
939− "version": "3.0.2",
940− "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
941− "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
942− "dev": true
943− },
944− "extsprintf": {
945− "version": "1.3.0",
946− "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
947− "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
948− "dev": true
949− },
950− "fast-deep-equal": {
951− "version": "2.0.1",
952− "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
953− "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
954− "dev": true
955− },
956− "fast-json-stable-stringify": {
957− "version": "2.0.0",
958− "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
959− "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
960− "dev": true
961− },
962− "figgy-pudding": {
963− "version": "3.5.1",
964− "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
965− "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==",
966− "dev": true
967− },
968− "filesize": {
969− "version": "4.1.2",
970− "resolved": "https://registry.npmjs.org/filesize/-/filesize-4.1.2.tgz",
971− "integrity": "sha512-iSWteWtfNcrWQTkQw8ble2bnonSl7YJImsn9OZKpE2E4IHhXI78eASpDYUljXZZdYj36QsEKjOs/CsiDqmKMJw==",
972− "dev": true
973− },
974− "flush-write-stream": {
975− "version": "1.1.1",
976− "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
977− "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
978− "dev": true,
979− "requires": {
980− "inherits": "^2.0.3",
981− "readable-stream": "^2.3.6"
982− }
983− },
984− "forever-agent": {
985− "version": "0.6.1",
986− "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
987− "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
988− "dev": true
989− },
990− "form-data": {
991− "version": "2.3.3",
992− "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
993− "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
994− "dev": true,
995− "requires": {
996− "asynckit": "^0.4.0",
997− "combined-stream": "^1.0.6",
998− "mime-types": "^2.1.12"
999− }
1000− },
1001− "from2": {
1002− "version": "2.3.0",
1003− "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
1004− "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
1005− "dev": true,
1006− "requires": {
1007− "inherits": "^2.0.1",
1008− "readable-stream": "^2.0.0"
1009− }
1010− },
1011− "fs-minipass": {
1012− "version": "1.2.6",
1013− "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz",
1014− "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==",
1015− "dev": true,
1016− "requires": {
1017− "minipass": "^2.2.1"
1018− }
1019− },
1020− "fs-write-stream-atomic": {
1021− "version": "1.0.10",
1022− "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
1023− "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
1024− "dev": true,
1025− "requires": {
1026− "graceful-fs": "^4.1.2",
1027− "iferr": "^0.1.5",
1028− "imurmurhash": "^0.1.4",
1029− "readable-stream": "1 || 2"
1030− }
1031− },
1032− "fs.realpath": {
1033− "version": "1.0.0",
1034− "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1035− "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1036− "dev": true
1037− },
1038− "function-bind": {
1039− "version": "1.1.1",
1040− "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1041− "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
1042− "dev": true
1043− },
1044− "gaze": {
1045− "version": "1.1.3",
1046− "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
1047− "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
1048− "dev": true,
1049− "requires": {
1050− "globule": "^1.0.0"
1051− }
1052− },
1053− "get-assigned-identifiers": {
1054− "version": "1.2.0",
1055− "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
1056− "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==",
1057− "dev": true
1058− },
1059− "get-stream": {
1060− "version": "5.1.0",
1061− "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
1062− "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
1063− "dev": true,
1064− "requires": {
1065− "pump": "^3.0.0"
1066− }
1067− },
1068− "getpass": {
1069− "version": "0.1.7",
1070− "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
1071− "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
1072− "dev": true,
1073− "requires": {
1074− "assert-plus": "^1.0.0"
1075− }
1076− },
1077− "glob": {
1078− "version": "7.1.4",
1079− "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
1080− "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
1081− "dev": true,
1082− "requires": {
1083− "fs.realpath": "^1.0.0",
1084− "inflight": "^1.0.4",
1085− "inherits": "2",
1086− "minimatch": "^3.0.4",
1087− "once": "^1.3.0",
1088− "path-is-absolute": "^1.0.0"
1089− }
1090− },
1091− "globule": {
1092− "version": "1.2.1",
1093− "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
1094− "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
1095− "dev": true,
1096− "requires": {
1097− "glob": "~7.1.1",
1098− "lodash": "~4.17.10",
1099− "minimatch": "~3.0.2"
1100− }
1101− },
1102− "graceful-fs": {
1103− "version": "4.2.2",
1104− "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz",
1105− "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==",
1106− "dev": true
1107− },
1108− "har-schema": {
1109− "version": "2.0.0",
1110− "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
1111− "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
1112− "dev": true
1113− },
1114− "har-validator": {
1115− "version": "5.1.3",
1116− "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
1117− "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
1118− "dev": true,
1119− "requires": {
1120− "ajv": "^6.5.5",
1121− "har-schema": "^2.0.0"
1122− }
1123− },
1124− "has": {
1125− "version": "1.0.3",
1126− "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1127− "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1128− "dev": true,
1129− "requires": {
1130− "function-bind": "^1.1.1"
1131− }
1132− },
1133− "has-flag": {
1134− "version": "3.0.0",
1135− "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1136− "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
1137− "dev": true
1138− },
1139− "hash-base": {
1140− "version": "3.0.4",
1141− "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
1142− "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
1143− "dev": true,
1144− "requires": {
1145− "inherits": "^2.0.1",
1146− "safe-buffer": "^5.0.1"
1147− }
1148− },
1149− "hash.js": {
1150− "version": "1.1.7",
1151− "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
1152− "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
1153− "dev": true,
1154− "requires": {
1155− "inherits": "^2.0.3",
1156− "minimalistic-assert": "^1.0.1"
1157− }
1158− },
1159− "hmac-drbg": {
1160− "version": "1.0.1",
1161− "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
1162− "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
1163− "dev": true,
1164− "requires": {
1165− "hash.js": "^1.0.3",
1166− "minimalistic-assert": "^1.0.0",
1167− "minimalistic-crypto-utils": "^1.0.1"
1168− }
1169− },
1170− "htmlescape": {
1171− "version": "1.1.1",
1172− "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
1173− "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=",
1174− "dev": true
1175− },
1176− "http-signature": {
1177− "version": "1.2.0",
1178− "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
1179− "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
1180− "dev": true,
1181− "requires": {
1182− "assert-plus": "^1.0.0",
1183− "jsprim": "^1.2.2",
1184− "sshpk": "^1.7.0"
1185− }
1186− },
1187− "https-browserify": {
1188− "version": "1.0.0",
1189− "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
1190− "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
1191− "dev": true
1192− },
1193− "ieee754": {
1194− "version": "1.1.13",
1195− "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
1196− "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
1197− "dev": true
1198− },
1199− "iferr": {
1200− "version": "0.1.5",
1201− "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
1202− "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
1203− "dev": true
1204− },
1205− "imurmurhash": {
1206− "version": "0.1.4",
1207− "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1208− "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
1209− "dev": true
1210− },
1211− "inflight": {
1212− "version": "1.0.6",
1213− "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1214− "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1215− "dev": true,
1216− "requires": {
1217− "once": "^1.3.0",
1218− "wrappy": "1"
1219− }
1220− },
1221− "inherits": {
1222− "version": "2.0.4",
1223− "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1224− "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1225− "dev": true
1226− },
1227− "inline-source-map": {
1228− "version": "0.6.2",
1229− "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
1230− "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=",
1231− "dev": true,
1232− "requires": {
1233− "source-map": "~0.5.3"
1234− }
1235− },
1236− "insert-module-globals": {
1237− "version": "7.2.0",
1238− "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz",
1239− "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==",
1240− "dev": true,
1241− "requires": {
1242− "JSONStream": "^1.0.3",
1243− "acorn-node": "^1.5.2",
1244− "combine-source-map": "^0.8.0",
1245− "concat-stream": "^1.6.1",
1246− "is-buffer": "^1.1.0",
1247− "path-is-absolute": "^1.0.1",
1248− "process": "~0.11.0",
1249− "through2": "^2.0.0",
1250− "undeclared-identifiers": "^1.1.2",
1251− "xtend": "^4.0.0"
1252− },
1253− "dependencies": {
1254− "concat-stream": {
1255− "version": "1.6.2",
1256− "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
1257− "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
1258− "dev": true,
1259− "requires": {
1260− "buffer-from": "^1.0.0",
1261− "inherits": "^2.0.3",
1262− "readable-stream": "^2.2.2",
1263− "typedarray": "^0.0.6"
1264− }
1265− }
1266− }
1267− },
1268− "is-buffer": {
1269− "version": "1.1.6",
1270− "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
1271− "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
1272− "dev": true
1273− },
1274− "is-fullwidth-code-point": {
1275− "version": "2.0.0",
1276− "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
1277− "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
1278− "dev": true
1279− },
1280− "is-plain-obj": {
1281− "version": "2.0.0",
1282− "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.0.0.tgz",
1283− "integrity": "sha512-EYisGhpgSCwspmIuRHGjROWTon2Xp8Z7U03Wubk/bTL5TTRC5R1rGVgyjzBrk9+ULdH6cRD06KRcw/xfqhVYKQ==",
1284− "dev": true
1285− },
1286− "is-stream": {
1287− "version": "2.0.0",
1288− "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
1289− "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
1290− "dev": true
1291− },
1292− "is-typedarray": {
1293− "version": "1.0.0",
1294− "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
1295− "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
1296− "dev": true
1297− },
1298− "isarray": {
1299− "version": "1.0.0",
1300− "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1301− "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
1302− "dev": true
1303− },
1304− "isexe": {
1305− "version": "2.0.0",
1306− "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1307− "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1308− "dev": true
1309− },
1310− "isstream": {
1311− "version": "0.1.2",
1312− "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
1313− "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
1314− "dev": true
1315− },
1316− "jsbn": {
1317− "version": "0.1.1",
1318− "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
1319− "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
1320− "dev": true
1321− },
1322− "json-schema": {
1323− "version": "0.2.3",
1324− "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
1325− "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
1326− "dev": true
1327− },
1328− "json-schema-traverse": {
1329− "version": "0.4.1",
1330− "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1331− "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1332− "dev": true
1333− },
1334− "json-stable-stringify": {
1335− "version": "0.0.1",
1336− "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
1337− "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=",
1338− "dev": true,
1339− "requires": {
1340− "jsonify": "~0.0.0"
1341− }
1342− },
1343− "json-stringify-safe": {
1344− "version": "5.0.1",
1345− "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
1346− "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
1347− "dev": true
1348− },
1349− "jsonify": {
1350− "version": "0.0.0",
1351− "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
1352− "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
1353− "dev": true
1354− },
1355− "jsonparse": {
1356− "version": "1.3.1",
1357− "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
1358− "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
1359− "dev": true
1360− },
1361− "jsprim": {
1362− "version": "1.4.1",
1363− "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
1364− "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
1365− "dev": true,
1366− "requires": {
1367− "assert-plus": "1.0.0",
1368− "extsprintf": "1.3.0",
1369− "json-schema": "0.2.3",
1370− "verror": "1.10.0"
1371− }
1372− },
1373− "labeled-stream-splicer": {
1374− "version": "2.0.2",
1375− "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz",
1376− "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==",
1377− "dev": true,
1378− "requires": {
1379− "inherits": "^2.0.1",
1380− "stream-splicer": "^2.0.0"
1381− }
1382− },
1383− "lodash": {
1384− "version": "4.17.15",
1385− "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
1386− "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
1387− "dev": true
1388− },
1389− "lodash.memoize": {
1390− "version": "3.0.4",
1391− "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
1392− "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=",
1393− "dev": true
1394− },
1395− "log-symbols": {
1396− "version": "3.0.0",
1397− "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
1398− "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
1399− "dev": true,
1400− "requires": {
1401− "chalk": "^2.4.2"
1402− }
1403− },
1404− "log-update": {
1405− "version": "3.2.0",
1406− "resolved": "https://registry.npmjs.org/log-update/-/log-update-3.2.0.tgz",
1407− "integrity": "sha512-KJ6zAPIHWo7Xg1jYror6IUDFJBq1bQ4Bi4wAEp2y/0ScjBBVi/g0thr0sUVhuvuXauWzczt7T2QHghPDNnKBuw==",
1408− "dev": true,
1409− "requires": {
1410− "ansi-escapes": "^3.2.0",
1411− "cli-cursor": "^2.1.0",
1412− "wrap-ansi": "^5.0.0"
1413− }
1414− },
1415− "lru-cache": {
1416− "version": "5.1.1",
1417− "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
1418− "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
1419− "dev": true,
1420− "requires": {
1421− "yallist": "^3.0.2"
1422− }
1423− },
1424− "md5.js": {
1425− "version": "1.3.5",
1426− "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
1427− "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
1428− "dev": true,
1429− "requires": {
1430− "hash-base": "^3.0.0",
1431− "inherits": "^2.0.1",
1432− "safe-buffer": "^5.1.2"
1433− }
1434− },
1435− "merge-stream": {
1436− "version": "2.0.0",
1437− "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
1438− "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
1439− "dev": true
1440− },
1441− "miller-rabin": {
1442− "version": "4.0.1",
1443− "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
1444− "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
1445− "dev": true,
1446− "requires": {
1447− "bn.js": "^4.0.0",
1448− "brorand": "^1.0.1"
1449− }
1450− },
1451− "mime": {
1452− "version": "1.6.0",
1453− "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1454− "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
1455− "dev": true
1456− },
1457− "mime-db": {
1458− "version": "1.40.0",
1459− "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
1460− "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
1461− "dev": true
1462− },
1463− "mime-types": {
1464− "version": "2.1.24",
1465− "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
1466− "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
1467− "dev": true,
1468− "requires": {
1469− "mime-db": "1.40.0"
1470− }
1471− },
1472− "mimic-fn": {
1473− "version": "2.1.0",
1474− "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
1475− "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
1476− "dev": true
1477− },
1478− "minimalistic-assert": {
1479− "version": "1.0.1",
1480− "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
1481− "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
1482− "dev": true
1483− },
1484− "minimalistic-crypto-utils": {
1485− "version": "1.0.1",
1486− "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
1487− "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
1488− "dev": true
1489− },
1490− "minimatch": {
1491− "version": "3.0.4",
1492− "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1493− "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1494− "dev": true,
1495− "requires": {
1496− "brace-expansion": "^1.1.7"
1497− }
1498− },
1499− "minimist": {
1500− "version": "1.2.0",
1501− "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
1502− "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
1503− "dev": true
1504− },
1505− "minipass": {
1506− "version": "2.3.5",
1507− "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz",
1508− "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
1509− "dev": true,
1510− "requires": {
1511− "safe-buffer": "^5.1.2",
1512− "yallist": "^3.0.0"
1513− }
1514− },
1515− "minizlib": {
1516− "version": "1.2.1",
1517− "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz",
1518− "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==",
1519− "dev": true,
1520− "requires": {
1521− "minipass": "^2.2.1"
1522− }
1523− },
1524− "mississippi": {
1525− "version": "3.0.0",
1526− "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
1527− "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
1528− "dev": true,
1529− "requires": {
1530− "concat-stream": "^1.5.0",
1531− "duplexify": "^3.4.2",
1532− "end-of-stream": "^1.1.0",
1533− "flush-write-stream": "^1.0.0",
1534− "from2": "^2.1.0",
1535− "parallel-transform": "^1.1.0",
1536− "pump": "^3.0.0",
1537− "pumpify": "^1.3.3",
1538− "stream-each": "^1.1.0",
1539− "through2": "^2.0.0"
1540− },
1541− "dependencies": {
1542− "concat-stream": {
1543− "version": "1.6.2",
1544− "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
1545− "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
1546− "dev": true,
1547− "requires": {
1548− "buffer-from": "^1.0.0",
1549− "inherits": "^2.0.3",
1550− "readable-stream": "^2.2.2",
1551− "typedarray": "^0.0.6"
1552− }
1553− }
1554− }
1555− },
1556− "mkdirp": {
1557− "version": "0.5.1",
1558− "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1559− "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1560− "dev": true,
1561− "requires": {
1562− "minimist": "0.0.8"
1563− },
1564− "dependencies": {
1565− "minimist": {
1566− "version": "0.0.8",
1567− "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1568− "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
1569− "dev": true
1570− }
1571− }
1572− },
1573− "module-deps": {
1574− "version": "6.2.1",
1575− "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.1.tgz",
1576− "integrity": "sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A==",
1577− "dev": true,
1578− "requires": {
1579− "JSONStream": "^1.0.3",
1580− "browser-resolve": "^1.7.0",
1581− "cached-path-relative": "^1.0.2",
1582− "concat-stream": "~1.6.0",
1583− "defined": "^1.0.0",
1584− "detective": "^5.0.2",
1585− "duplexer2": "^0.1.2",
1586− "inherits": "^2.0.1",
1587− "parents": "^1.0.0",
1588− "readable-stream": "^2.0.2",
1589− "resolve": "^1.4.0",
1590− "stream-combiner2": "^1.1.1",
1591− "subarg": "^1.0.0",
1592− "through2": "^2.0.0",
1593− "xtend": "^4.0.0"
1594− },
1595− "dependencies": {
1596− "concat-stream": {
1597− "version": "1.6.2",
1598− "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
1599− "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
1600− "dev": true,
1601− "requires": {
1602− "buffer-from": "^1.0.0",
1603− "inherits": "^2.0.3",
1604− "readable-stream": "^2.2.2",
1605− "typedarray": "^0.0.6"
1606− }
1607− }
1608− }
1609− },
1610− "mold-source-map": {
1611− "version": "0.4.0",
1612− "resolved": "https://registry.npmjs.org/mold-source-map/-/mold-source-map-0.4.0.tgz",
1613− "integrity": "sha1-z2fgsxxHq5uttcnCVlGGISe7gxc=",
1614− "dev": true,
1615− "requires": {
1616− "convert-source-map": "^1.1.0",
1617− "through": "~2.2.7"
1618− },
1619− "dependencies": {
1620− "through": {
1621− "version": "2.2.7",
1622− "resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz",
1623− "integrity": "sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0=",
1624− "dev": true
1625− }
1626− }
1627− },
1628− "move-concurrently": {
1629− "version": "1.0.1",
1630− "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
1631− "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
1632− "dev": true,
1633− "requires": {
1634− "aproba": "^1.1.1",
1635− "copy-concurrently": "^1.0.0",
1636− "fs-write-stream-atomic": "^1.0.8",
1637− "mkdirp": "^0.5.1",
1638− "rimraf": "^2.5.4",
1639− "run-queue": "^1.0.3"
1640− },
1641− "dependencies": {
1642− "rimraf": {
1643− "version": "2.7.1",
1644− "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
1645− "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
1646− "dev": true,
1647− "requires": {
1648− "glob": "^7.1.3"
1649− }
1650− }
1651− }
1652− },
1653− "ms": {
1654− "version": "2.1.2",
1655− "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1656− "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1657− "dev": true
1658− },
1659− "mute-stream": {
1660− "version": "0.0.8",
1661− "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
1662− "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
1663− "dev": true
1664− },
1665− "nice-try": {
1666− "version": "1.0.5",
1667− "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
1668− "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
1669− "dev": true
1670− },
1671− "node-static": {
1672− "version": "0.7.11",
1673− "resolved": "https://registry.npmjs.org/node-static/-/node-static-0.7.11.tgz",
1674− "integrity": "sha512-zfWC/gICcqb74D9ndyvxZWaI1jzcoHmf4UTHWQchBNuNMxdBLJMDiUgZ1tjGLEIe/BMhj2DxKD8HOuc2062pDQ==",
1675− "dev": true,
1676− "requires": {
1677− "colors": ">=0.6.0",
1678− "mime": "^1.2.9",
1679− "optimist": ">=0.3.4"
1680− }
1681− },
1682− "npm-run-path": {
1683− "version": "3.1.0",
1684− "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz",
1685− "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==",
1686− "dev": true,
1687− "requires": {
1688− "path-key": "^3.0.0"
1689− },
1690− "dependencies": {
1691− "path-key": {
1692− "version": "3.1.0",
1693− "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz",
1694− "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==",
1695− "dev": true
1696− }
1697− }
1698− },
1699− "oauth-sign": {
1700− "version": "0.9.0",
1701− "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
1702− "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
1703− "dev": true
1704− },
1705− "object-assign": {
1706− "version": "4.1.1",
1707− "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1708− "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1709− "dev": true
1710− },
1711− "once": {
1712− "version": "1.4.0",
1713− "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1714− "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1715− "dev": true,
1716− "requires": {
1717− "wrappy": "1"
1718− }
1719− },
1720− "onetime": {
1721− "version": "5.1.0",
1722− "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
1723− "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
1724− "dev": true,
1725− "requires": {
1726− "mimic-fn": "^2.1.0"
1727− }
1728− },
1729− "optimist": {
1730− "version": "0.6.1",
1731− "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
1732− "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
1733− "dev": true,
1734− "requires": {
1735− "minimist": "~0.0.1",
1736− "wordwrap": "~0.0.2"
1737− },
1738− "dependencies": {
1739− "minimist": {
1740− "version": "0.0.10",
1741− "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
1742− "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
1743− "dev": true
1744− },
1745− "wordwrap": {
1746− "version": "0.0.3",
1747− "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
1748− "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
1749− "dev": true
1750− }
1751− }
1752− },
1753− "os-browserify": {
1754− "version": "0.3.0",
1755− "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
1756− "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
1757− "dev": true
1758− },
1759− "p-finally": {
1760− "version": "2.0.1",
1761− "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
1762− "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
1763− "dev": true
1764− },
1765− "pako": {
1766− "version": "1.0.10",
1767− "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz",
1768− "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==",
1769− "dev": true
1770− },
1771− "parallel-transform": {
1772− "version": "1.1.0",
1773− "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
1774− "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
1775− "dev": true,
1776− "requires": {
1777− "cyclist": "~0.2.2",
1778− "inherits": "^2.0.3",
1779− "readable-stream": "^2.1.5"
1780− }
1781− },
1782− "parents": {
1783− "version": "1.0.1",
1784− "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
1785− "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
1786− "dev": true,
1787− "requires": {
1788− "path-platform": "~0.11.15"
1789− }
1790− },
1791− "parse-asn1": {
1792− "version": "5.1.4",
1793− "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz",
1794− "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==",
1795− "dev": true,
1796− "requires": {
1797− "asn1.js": "^4.0.0",
1798− "browserify-aes": "^1.0.0",
1799− "create-hash": "^1.1.0",
1800− "evp_bytestokey": "^1.0.0",
1801− "pbkdf2": "^3.0.3",
1802− "safe-buffer": "^5.1.1"
1803− }
1804− },
1805− "path-browserify": {
1806− "version": "0.0.1",
1807− "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
1808− "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
1809− "dev": true
1810− },
1811− "path-is-absolute": {
1812− "version": "1.0.1",
1813− "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1814− "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1815− "dev": true
1816− },
1817− "path-key": {
1818− "version": "2.0.1",
1819− "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
1820− "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
1821− "dev": true
1822− },
1823− "path-parse": {
1824− "version": "1.0.6",
1825− "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
1826− "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
1827− "dev": true
1828− },
1829− "path-platform": {
1830− "version": "0.11.15",
1831− "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
1832− "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=",
1833− "dev": true
1834− },
1835− "pbkdf2": {
1836− "version": "3.0.17",
1837− "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
1838− "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
1839− "dev": true,
1840− "requires": {
1841− "create-hash": "^1.1.2",
1842− "create-hmac": "^1.1.4",
1843− "ripemd160": "^2.0.1",
1844− "safe-buffer": "^5.0.1",
1845− "sha.js": "^2.4.8"
1846− }
1847− },
1848− "performance-now": {
1849− "version": "2.1.0",
1850− "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1851− "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
1852− "dev": true
1853− },
1854− "process": {
1855− "version": "0.11.10",
1856− "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
1857− "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
1858− "dev": true
1859− },
1860− "process-nextick-args": {
1861− "version": "2.0.1",
1862− "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1863− "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
1864− "dev": true
1865− },
1866− "promise-inflight": {
1867− "version": "1.0.1",
1868− "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
1869− "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
1870− "dev": true
1871− },
1872− "psl": {
1873− "version": "1.3.0",
1874− "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz",
1875− "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==",
1876− "dev": true
1877− },
1878− "public-encrypt": {
1879− "version": "4.0.3",
1880− "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
1881− "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
1882− "dev": true,
1883− "requires": {
1884− "bn.js": "^4.1.0",
1885− "browserify-rsa": "^4.0.0",
1886− "create-hash": "^1.1.0",
1887− "parse-asn1": "^5.0.0",
1888− "randombytes": "^2.0.1",
1889− "safe-buffer": "^5.1.2"
1890− }
1891− },
1892− "pulp": {
1893− "version": "13.0.0",
1894− "resolved": "https://registry.npmjs.org/pulp/-/pulp-13.0.0.tgz",
1895− "integrity": "sha512-wjjAVuN1Shx6783NvTd8aPwWZ1pE94+isiWtdAJhedvbLqJuwe8p5CSNul9FS0WvBz7ejdrW0vc6wLDLsKX7Yw==",
1896− "dev": true,
1897− "requires": {
1898− "browserify": "^16.2.3",
1899− "browserify-incremental": "^3.1.1",
1900− "concat-stream": "^2.0.0",
1901− "gaze": "^1.1.3",
1902− "glob": "^7.1.3",
1903− "mold-source-map": "^0.4.0",
1904− "node-static": "^0.7.11",
1905− "read": "^1.0.7",
1906− "sorcery": "^0.10.0",
1907− "temp": "^0.9.0",
1908− "through": "^2.3.8",
1909− "tree-kill": "^1.2.1",
1910− "which": "^1.3.1",
1911− "wordwrap": "1.0.0"
1912− }
1913− },
1914− "pump": {
1915− "version": "3.0.0",
1916− "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
1917− "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
1918− "dev": true,
1919− "requires": {
1920− "end-of-stream": "^1.1.0",
1921− "once": "^1.3.1"
1922− }
1923− },
1924− "pumpify": {
1925− "version": "1.5.1",
1926− "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
1927− "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
1928− "dev": true,
1929− "requires": {
1930− "duplexify": "^3.6.0",
1931− "inherits": "^2.0.3",
1932− "pump": "^2.0.0"
1933− },
1934− "dependencies": {
1935− "pump": {
1936− "version": "2.0.1",
1937− "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
1938− "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
1939− "dev": true,
1940− "requires": {
1941− "end-of-stream": "^1.1.0",
1942− "once": "^1.3.1"
1943− }
1944− }
1945− }
1946− },
1947− "punycode": {
1948− "version": "1.4.1",
1949− "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
1950− "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
1951− "dev": true
1952− },
1953− "purescript": {
1954− "version": "0.13.3",
1955− "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.13.3.tgz",
1956− "integrity": "sha512-YFznjWSFrl6pbds0JxWXJ/ztzyGgUsR5pvdF/wH1i1BqSqxpFtWgREUIOCCkzmuc+X9U2Ntf5DMQ56RxawE3gQ==",
1957− "dev": true,
1958− "requires": {
1959− "purescript-installer": "^0.2.0"
1960− }
1961− },
1962− "purescript-installer": {
1963− "version": "0.2.5",
1964− "resolved": "https://registry.npmjs.org/purescript-installer/-/purescript-installer-0.2.5.tgz",
1965− "integrity": "sha512-fQAWWP5a7scuchXecjpU4r4KEgSPuS6bBnaP01k9f71qqD28HaJ2m4PXHFkhkR4oATAxTPIGCtmTwtVoiBOHog==",
1966− "dev": true,
1967− "requires": {
1968− "arch": "^2.1.1",
1969− "byline": "^5.0.0",
1970− "cacache": "^11.3.2",
1971− "chalk": "^2.4.2",
1972− "env-paths": "^2.2.0",
1973− "execa": "^2.0.3",
1974− "filesize": "^4.1.2",
1975− "is-plain-obj": "^2.0.0",
1976− "log-symbols": "^3.0.0",
1977− "log-update": "^3.2.0",
1978− "minimist": "^1.2.0",
1979− "mkdirp": "^0.5.1",
1980− "ms": "^2.1.2",
1981− "once": "^1.4.0",
1982− "pump": "^3.0.0",
1983− "request": "^2.88.0",
1984− "rimraf": "^2.6.3",
1985− "tar": "^4.4.6",
1986− "which": "^1.3.1",
1987− "zen-observable": "^0.8.14"
1988− },
1989− "dependencies": {
1990− "rimraf": {
1991− "version": "2.7.1",
1992− "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
1993− "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
1994− "dev": true,
1995− "requires": {
1996− "glob": "^7.1.3"
1997− }
1998− }
1999− }
2000− },
2001− "purescript-psa": {
2002− "version": "0.7.3",
2003− "resolved": "https://registry.npmjs.org/purescript-psa/-/purescript-psa-0.7.3.tgz",
2004− "integrity": "sha512-qcnhruybTHVunhJqAuurOEWnz1BOOc/7mpcnyH5yxm5caYCejxq8GOE4ZNWbiPMeTlcG79qUPIOz7gx5OVmk2Q==",
2005− "dev": true
2006− },
2007− "qs": {
2008− "version": "6.5.2",
2009− "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
2010− "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
2011− "dev": true
2012− },
2013− "querystring": {
2014− "version": "0.2.0",
2015− "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
2016− "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
2017− "dev": true
2018− },
2019− "querystring-es3": {
2020− "version": "0.2.1",
2021− "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
2022− "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
2023− "dev": true
2024− },
2025− "randombytes": {
2026− "version": "2.1.0",
2027− "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
2028− "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
2029− "dev": true,
2030− "requires": {
2031− "safe-buffer": "^5.1.0"
2032− }
2033− },
2034− "randomfill": {
2035− "version": "1.0.4",
2036− "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
2037− "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
2038− "dev": true,
2039− "requires": {
2040− "randombytes": "^2.0.5",
2041− "safe-buffer": "^5.1.0"
2042− }
2043− },
2044− "read": {
2045− "version": "1.0.7",
2046− "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
2047− "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=",
2048− "dev": true,
2049− "requires": {
2050− "mute-stream": "~0.0.4"
2051− }
2052− },
2053− "read-only-stream": {
2054− "version": "2.0.0",
2055− "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
2056− "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=",
2057− "dev": true,
2058− "requires": {
2059− "readable-stream": "^2.0.2"
2060− }
2061− },
2062− "readable-stream": {
2063− "version": "2.3.6",
2064− "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
2065− "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
2066− "dev": true,
2067− "requires": {
2068− "core-util-is": "~1.0.0",
2069− "inherits": "~2.0.3",
2070− "isarray": "~1.0.0",
2071− "process-nextick-args": "~2.0.0",
2072− "safe-buffer": "~5.1.1",
2073− "string_decoder": "~1.1.1",
2074− "util-deprecate": "~1.0.1"
2075− },
2076− "dependencies": {
2077− "safe-buffer": {
2078− "version": "5.1.2",
2079− "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2080− "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
2081− "dev": true
2082− },
2083− "string_decoder": {
2084− "version": "1.1.1",
2085− "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2086− "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2087− "dev": true,
2088− "requires": {
2089− "safe-buffer": "~5.1.0"
2090− }
2091− }
2092− }
2093− },
2094− "request": {
2095− "version": "2.88.0",
2096− "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
2097− "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
2098− "dev": true,
2099− "requires": {
2100− "aws-sign2": "~0.7.0",
2101− "aws4": "^1.8.0",
2102− "caseless": "~0.12.0",
2103− "combined-stream": "~1.0.6",
2104− "extend": "~3.0.2",
2105− "forever-agent": "~0.6.1",
2106− "form-data": "~2.3.2",
2107− "har-validator": "~5.1.0",
2108− "http-signature": "~1.2.0",
2109− "is-typedarray": "~1.0.0",
2110− "isstream": "~0.1.2",
2111− "json-stringify-safe": "~5.0.1",
2112− "mime-types": "~2.1.19",
2113− "oauth-sign": "~0.9.0",
2114− "performance-now": "^2.1.0",
2115− "qs": "~6.5.2",
2116− "safe-buffer": "^5.1.2",
2117− "tough-cookie": "~2.4.3",
2118− "tunnel-agent": "^0.6.0",
2119− "uuid": "^3.3.2"
2120− }
2121− },
2122− "resolve": {
2123− "version": "1.12.0",
2124− "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
2125− "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
2126− "dev": true,
2127− "requires": {
2128− "path-parse": "^1.0.6"
2129− }
2130− },
2131− "restore-cursor": {
2132− "version": "2.0.0",
2133− "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
2134− "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
2135− "dev": true,
2136− "requires": {
2137− "onetime": "^2.0.0",
2138− "signal-exit": "^3.0.2"
2139− },
2140− "dependencies": {
2141− "mimic-fn": {
2142− "version": "1.2.0",
2143− "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
2144− "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
2145− "dev": true
2146− },
2147− "onetime": {
2148− "version": "2.0.1",
2149− "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
2150− "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
2151− "dev": true,
2152− "requires": {
2153− "mimic-fn": "^1.0.0"
2154− }
2155− }
2156− }
2157− },
2158− "rimraf": {
2159− "version": "3.0.0",
2160− "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz",
2161− "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==",
2162− "dev": true,
2163− "requires": {
2164− "glob": "^7.1.3"
2165− }
2166− },
2167− "ripemd160": {
2168− "version": "2.0.2",
2169− "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
2170− "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
2171− "dev": true,
2172− "requires": {
2173− "hash-base": "^3.0.0",
2174− "inherits": "^2.0.1"
2175− }
2176− },
2177− "run-queue": {
2178− "version": "1.0.3",
2179− "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
2180− "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
2181− "dev": true,
2182− "requires": {
2183− "aproba": "^1.1.1"
2184− }
2185− },
2186− "safe-buffer": {
2187− "version": "5.2.0",
2188− "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
2189− "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
2190− "dev": true
2191− },
2192− "safer-buffer": {
2193− "version": "2.1.2",
2194− "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
2195− "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
2196− "dev": true
2197− },
2198− "sander": {
2199− "version": "0.5.1",
2200− "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz",
2201− "integrity": "sha1-dB4kXiMfB8r7b98PEzrfohalAq0=",
2202− "dev": true,
2203− "requires": {
2204− "es6-promise": "^3.1.2",
2205− "graceful-fs": "^4.1.3",
2206− "mkdirp": "^0.5.1",
2207− "rimraf": "^2.5.2"
2208− },
2209− "dependencies": {
2210− "rimraf": {
2211− "version": "2.7.1",
2212− "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
2213− "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
2214− "dev": true,
2215− "requires": {
2216− "glob": "^7.1.3"
2217− }
2218− }
2219− }
2220− },
2221− "semver": {
2222− "version": "5.7.1",
2223− "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
2224− "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
2225− "dev": true
2226− },
2227− "sha.js": {
2228− "version": "2.4.11",
2229− "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
2230− "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
2231− "dev": true,
2232− "requires": {
2233− "inherits": "^2.0.1",
2234− "safe-buffer": "^5.0.1"
2235− }
2236− },
2237− "shasum": {
2238− "version": "1.0.2",
2239− "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
2240− "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=",
2241− "dev": true,
2242− "requires": {
2243− "json-stable-stringify": "~0.0.0",
2244− "sha.js": "~2.4.4"
2245− }
2246− },
2247− "shebang-command": {
2248− "version": "1.2.0",
2249− "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
2250− "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
2251− "dev": true,
2252− "requires": {
2253− "shebang-regex": "^1.0.0"
2254− }
2255− },
2256− "shebang-regex": {
2257− "version": "1.0.0",
2258− "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
2259− "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
2260− "dev": true
2261− },
2262− "shell-quote": {
2263− "version": "1.7.1",
2264− "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.1.tgz",
2265− "integrity": "sha512-2kUqeAGnMAu6YrTPX4E3LfxacH9gKljzVjlkUeSqY0soGwK4KLl7TURXCem712tkhBCeeaFP9QK4dKn88s3Icg==",
2266− "dev": true
2267− },
2268− "signal-exit": {
2269− "version": "3.0.2",
2270− "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
2271− "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
2272− "dev": true
2273− },
2274− "simple-concat": {
2275− "version": "1.0.0",
2276− "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
2277− "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=",
2278− "dev": true
2279− },
2280− "sorcery": {
2281− "version": "0.10.0",
2282− "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz",
2283− "integrity": "sha1-iukK19fLBfxZ8asMY3hF1cFaUrc=",
2284− "dev": true,
2285− "requires": {
2286− "buffer-crc32": "^0.2.5",
2287− "minimist": "^1.2.0",
2288− "sander": "^0.5.0",
2289− "sourcemap-codec": "^1.3.0"
2290− }
2291− },
2292− "source-map": {
2293− "version": "0.5.7",
2294− "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
2295− "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
2296− "dev": true
2297− },
2298− "sourcemap-codec": {
2299− "version": "1.4.6",
2300− "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz",
2301− "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==",
2302− "dev": true
2303− },
2304− "sshpk": {
2305− "version": "1.16.1",
2306− "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
2307− "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
2308− "dev": true,
2309− "requires": {
2310− "asn1": "~0.2.3",
2311− "assert-plus": "^1.0.0",
2312− "bcrypt-pbkdf": "^1.0.0",
2313− "dashdash": "^1.12.0",
2314− "ecc-jsbn": "~0.1.1",
2315− "getpass": "^0.1.1",
2316− "jsbn": "~0.1.0",
2317− "safer-buffer": "^2.0.2",
2318− "tweetnacl": "~0.14.0"
2319− }
2320− },
2321− "ssri": {
2322− "version": "6.0.1",
2323− "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
2324− "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
2325− "dev": true,
2326− "requires": {
2327− "figgy-pudding": "^3.5.1"
2328− }
2329− },
2330− "stream-browserify": {
2331− "version": "2.0.2",
2332− "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
2333− "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
2334− "dev": true,
2335− "requires": {
2336− "inherits": "~2.0.1",
2337− "readable-stream": "^2.0.2"
2338− }
2339− },
2340− "stream-combiner2": {
2341− "version": "1.1.1",
2342− "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
2343− "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
2344− "dev": true,
2345− "requires": {
2346− "duplexer2": "~0.1.0",
2347− "readable-stream": "^2.0.2"
2348− }
2349− },
2350− "stream-each": {
2351− "version": "1.2.3",
2352− "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
2353− "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
2354− "dev": true,
2355− "requires": {
2356− "end-of-stream": "^1.1.0",
2357− "stream-shift": "^1.0.0"
2358− }
2359− },
2360− "stream-http": {
2361− "version": "3.1.0",
2362− "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz",
2363− "integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==",
2364− "dev": true,
2365− "requires": {
2366− "builtin-status-codes": "^3.0.0",
2367− "inherits": "^2.0.1",
2368− "readable-stream": "^3.0.6",
2369− "xtend": "^4.0.0"
2370− },
2371− "dependencies": {
2372− "readable-stream": {
2373− "version": "3.4.0",
2374− "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
2375− "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
2376− "dev": true,
2377− "requires": {
2378− "inherits": "^2.0.3",
2379− "string_decoder": "^1.1.1",
2380− "util-deprecate": "^1.0.1"
2381− }
2382− }
2383− }
2384− },
2385− "stream-shift": {
2386− "version": "1.0.0",
2387− "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
2388− "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
2389− "dev": true
2390− },
2391− "stream-splicer": {
2392− "version": "2.0.1",
2393− "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz",
2394− "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==",
2395− "dev": true,
2396− "requires": {
2397− "inherits": "^2.0.1",
2398− "readable-stream": "^2.0.2"
2399− }
2400− },
2401− "string-width": {
2402− "version": "3.1.0",
2403− "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
2404− "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
2405− "dev": true,
2406− "requires": {
2407− "emoji-regex": "^7.0.1",
2408− "is-fullwidth-code-point": "^2.0.0",
2409− "strip-ansi": "^5.1.0"
2410− }
2411− },
2412− "string_decoder": {
2413− "version": "1.3.0",
2414− "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
2415− "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
2416− "dev": true,
2417− "requires": {
2418− "safe-buffer": "~5.2.0"
2419− }
2420− },
2421− "strip-ansi": {
2422− "version": "5.2.0",
2423− "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
2424− "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
2425− "dev": true,
2426− "requires": {
2427− "ansi-regex": "^4.1.0"
2428− }
2429− },
2430− "strip-final-newline": {
2431− "version": "2.0.0",
2432− "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
2433− "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
2434− "dev": true
2435− },
2436− "subarg": {
2437− "version": "1.0.0",
2438− "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
2439− "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
2440− "dev": true,
2441− "requires": {
2442− "minimist": "^1.1.0"
2443− }
2444− },
2445− "supports-color": {
2446− "version": "5.5.0",
2447− "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
2448− "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
2449− "dev": true,
2450− "requires": {
2451− "has-flag": "^3.0.0"
2452− }
2453− },
2454− "syntax-error": {
2455− "version": "1.4.0",
2456− "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
2457− "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
2458− "dev": true,
2459− "requires": {
2460− "acorn-node": "^1.2.0"
2461− }
2462− },
2463− "tar": {
2464− "version": "4.4.10",
2465− "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz",
2466− "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==",
2467− "dev": true,
2468− "requires": {
2469− "chownr": "^1.1.1",
2470− "fs-minipass": "^1.2.5",
2471− "minipass": "^2.3.5",
2472− "minizlib": "^1.2.1",
2473− "mkdirp": "^0.5.0",
2474− "safe-buffer": "^5.1.2",
2475− "yallist": "^3.0.3"
2476− }
2477− },
2478− "temp": {
2479− "version": "0.9.0",
2480− "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.0.tgz",
2481− "integrity": "sha512-YfUhPQCJoNQE5N+FJQcdPz63O3x3sdT4Xju69Gj4iZe0lBKOtnAMi0SLj9xKhGkcGhsxThvTJ/usxtFPo438zQ==",
2482− "dev": true,
2483− "requires": {
2484− "rimraf": "~2.6.2"
2485− },
2486− "dependencies": {
2487− "rimraf": {
2488− "version": "2.6.3",
2489− "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
2490− "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
2491− "dev": true,
2492− "requires": {
2493− "glob": "^7.1.3"
2494− }
2495− }
2496− }
2497− },
2498− "through": {
2499− "version": "2.3.8",
2500− "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
2501− "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
2502− "dev": true
2503− },
2504− "through2": {
2505− "version": "2.0.5",
2506− "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
2507− "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
2508− "dev": true,
2509− "requires": {
2510− "readable-stream": "~2.3.6",
2511− "xtend": "~4.0.1"
2512− }
2513− },
2514− "timers-browserify": {
2515− "version": "1.4.2",
2516− "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
2517− "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=",
2518− "dev": true,
2519− "requires": {
2520− "process": "~0.11.0"
2521− }
2522− },
2523− "tough-cookie": {
2524− "version": "2.4.3",
2525− "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
2526− "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
2527− "dev": true,
2528− "requires": {
2529− "psl": "^1.1.24",
2530− "punycode": "^1.4.1"
2531− }
2532− },
2533− "tree-kill": {
2534− "version": "1.2.1",
2535− "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz",
2536− "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==",
2537− "dev": true
2538− },
2539− "tty-browserify": {
2540− "version": "0.0.1",
2541− "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
2542− "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
2543− "dev": true
2544− },
2545− "tunnel-agent": {
2546− "version": "0.6.0",
2547− "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
2548− "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
2549− "dev": true,
2550− "requires": {
2551− "safe-buffer": "^5.0.1"
2552− }
2553− },
2554− "tweetnacl": {
2555− "version": "0.14.5",
2556− "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
2557− "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
2558− "dev": true
2559− },
2560− "typedarray": {
2561− "version": "0.0.6",
2562− "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
2563− "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
2564− "dev": true
2565− },
2566− "umd": {
2567− "version": "3.0.3",
2568− "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
2569− "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==",
2570− "dev": true
2571− },
2572− "undeclared-identifiers": {
2573− "version": "1.1.3",
2574− "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz",
2575− "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==",
2576− "dev": true,
2577− "requires": {
2578− "acorn-node": "^1.3.0",
2579− "dash-ast": "^1.0.0",
2580− "get-assigned-identifiers": "^1.2.0",
2581− "simple-concat": "^1.0.0",
2582− "xtend": "^4.0.1"
2583− }
2584− },
2585− "unique-filename": {
2586− "version": "1.1.1",
2587− "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
2588− "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
2589− "dev": true,
2590− "requires": {
2591− "unique-slug": "^2.0.0"
2592− }
2593− },
2594− "unique-slug": {
2595− "version": "2.0.2",
2596− "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
2597− "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
2598− "dev": true,
2599− "requires": {
2600− "imurmurhash": "^0.1.4"
2601− }
2602− },
2603− "uri-js": {
2604− "version": "4.2.2",
2605− "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
2606− "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
2607− "dev": true,
2608− "requires": {
2609− "punycode": "^2.1.0"
2610− },
2611− "dependencies": {
2612− "punycode": {
2613− "version": "2.1.1",
2614− "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
2615− "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
2616− "dev": true
2617− }
2618− }
2619− },
2620− "url": {
2621− "version": "0.11.0",
2622− "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
2623− "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
2624− "dev": true,
2625− "requires": {
2626− "punycode": "1.3.2",
2627− "querystring": "0.2.0"
2628− },
2629− "dependencies": {
2630− "punycode": {
2631− "version": "1.3.2",
2632− "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
2633− "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
2634− "dev": true
2635− }
2636− }
2637− },
2638− "util": {
2639− "version": "0.10.4",
2640− "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
2641− "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
2642− "dev": true,
2643− "requires": {
2644− "inherits": "2.0.3"
2645− },
2646− "dependencies": {
2647− "inherits": {
2648− "version": "2.0.3",
2649− "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
2650− "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
2651− "dev": true
2652− }
2653− }
2654− },
2655− "util-deprecate": {
2656− "version": "1.0.2",
2657− "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2658− "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
2659− "dev": true
2660− },
2661− "uuid": {
2662− "version": "3.3.3",
2663− "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
2664− "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==",
2665− "dev": true
2666− },
2667− "verror": {
2668− "version": "1.10.0",
2669− "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
2670− "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
2671− "dev": true,
2672− "requires": {
2673− "assert-plus": "^1.0.0",
2674− "core-util-is": "1.0.2",
2675− "extsprintf": "^1.2.0"
2676− }
2677− },
2678− "vm-browserify": {
2679− "version": "1.1.0",
2680− "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz",
2681− "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==",
2682− "dev": true
2683− },
2684− "which": {
2685− "version": "1.3.1",
2686− "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
2687− "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
2688− "dev": true,
2689− "requires": {
2690− "isexe": "^2.0.0"
2691− }
2692− },
2693− "wordwrap": {
2694− "version": "1.0.0",
2695− "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
2696− "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
2697− "dev": true
2698− },
2699− "wrap-ansi": {
2700− "version": "5.1.0",
2701− "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
2702− "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
2703− "dev": true,
2704− "requires": {
2705− "ansi-styles": "^3.2.0",
2706− "string-width": "^3.0.0",
2707− "strip-ansi": "^5.0.0"
2708− }
2709− },
2710− "wrappy": {
2711− "version": "1.0.2",
2712− "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2713− "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2714− "dev": true
2715− },
2716− "xtend": {
2717− "version": "4.0.2",
2718− "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
2719− "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
2720− "dev": true
2721− },
2722− "y18n": {
2723− "version": "4.0.0",
2724− "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
2725− "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
2726− "dev": true
2727− },
2728− "yallist": {
2729− "version": "3.0.3",
2730− "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
2731− "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
2732− "dev": true
2733− },
2734− "zen-observable": {
2735− "version": "0.8.14",
2736− "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.14.tgz",
2737− "integrity": "sha512-kQz39uonEjEESwh+qCi83kcC3rZJGh4mrZW7xjkSQYXkq//JZHTtKo+6yuVloTgMtzsIWOJrjIrKvk/dqm0L5g==",
2738− "dev": true
2739− }
2740− }
2741−}
package.jsondeleted−13
@@ -1,13 +0,0 @@
1−{
2− "private": true,
3− "scripts": {
4− "clean": "rimraf output && rimraf .pulp-cache",
5− "build": "pulp build && pulp test"
6− },
7− "devDependencies": {
8− "pulp": "^13.0.0",
9− "purescript-psa": "^0.7.3",
10− "purescript": "^0.13.3",
11− "rimraf": "^3.0.0"
12− }
13−}
packages.dhallnew file+127
@@ -0,0 +1,127 @@
1+{-
2+Welcome to your new Dhall package-set!
3+
4+Below are instructions for how to edit this file for most use
5+cases, so that you don't need to know Dhall to use it.
6+
7+## Warning: Don't Move This Top-Level Comment!
8+
9+Due to how `dhall format` currently works, this comment's
10+instructions cannot appear near corresponding sections below
11+because `dhall format` will delete the comment. However,
12+it will not delete a top-level comment like this one.
13+
14+## Use Cases
15+
16+Most will want to do one or both of these options:
17+1. Override/Patch a package's dependency
18+2. Add a package not already in the default package set
19+
20+This file will continue to work whether you use one or both options.
21+Instructions for each option are explained below.
22+
23+### Overriding/Patching a package
24+
25+Purpose:
26+- Change a package's dependency to a newer/older release than the
27+ default package set's release
28+- Use your own modified version of some dependency that may
29+ include new API, changed API, removed API by
30+ using your custom git repo of the library rather than
31+ the package set's repo
32+
33+Syntax:
34+Replace the overrides' "{=}" (an empty record) with the following idea
35+The "//" or "⫽" means "merge these two records and
36+ when they have the same value, use the one on the right:"
37+-------------------------------
38+let overrides =
39+ { packageName =
40+ upstream.packageName // { updateEntity1 = "new value", updateEntity2 = "new value" }
41+ , packageName =
42+ upstream.packageName // { version = "v4.0.0" }
43+ , packageName =
44+ upstream.packageName // { repo = "https://www.example.com/path/to/new/repo.git" }
45+ }
46+-------------------------------
47+
48+Example:
49+-------------------------------
50+let overrides =
51+ { halogen =
52+ upstream.halogen // { version = "master" }
53+ , halogen-vdom =
54+ upstream.halogen-vdom // { version = "v4.0.0" }
55+ }
56+-------------------------------
57+
58+### Additions
59+
60+Purpose:
61+- Add packages that aren't already included in the default package set
62+
63+Syntax:
64+Replace the additions' "{=}" (an empty record) with the following idea:
65+-------------------------------
66+let additions =
67+ { package-name =
68+ { dependencies =
69+ [ "dependency1"
70+ , "dependency2"
71+ ]
72+ , repo =
73+ "https://example.com/path/to/git/repo.git"
74+ , version =
75+ "tag ('v4.0.0') or branch ('master')"
76+ }
77+ , package-name =
78+ { dependencies =
79+ [ "dependency1"
80+ , "dependency2"
81+ ]
82+ , repo =
83+ "https://example.com/path/to/git/repo.git"
84+ , version =
85+ "tag ('v4.0.0') or branch ('master')"
86+ }
87+ , etc.
88+ }
89+-------------------------------
90+
91+Example:
92+-------------------------------
93+let additions =
94+ { benchotron =
95+ { dependencies =
96+ [ "arrays"
97+ , "exists"
98+ , "profunctor"
99+ , "strings"
100+ , "quickcheck"
101+ , "lcg"
102+ , "transformers"
103+ , "foldable-traversable"
104+ , "exceptions"
105+ , "node-fs"
106+ , "node-buffer"
107+ , "node-readline"
108+ , "datetime"
109+ , "now"
110+ ]
111+ , repo =
112+ "https://github.com/hdgarrood/purescript-benchotron.git"
113+ , version =
114+ "v7.0.0"
115+ }
116+ }
117+-------------------------------
118+-}
119+let upstream =
120+ https://github.com/purescript/package-sets/releases/download/psc-0.15.4-20221202/packages.dhall
121+ sha256:4e2f2e060ab73b119eeb55fe9bc75168b380fc5e0696d2cc2941ac674b32cb3c
122+
123+let overrides = {=}
124+
125+let additions = {=}
126+
127+in upstream // overrides // additions
psc-package.jsondeleted−19
@@ -1,19 +0,0 @@
1−{
2− "name": "purescript-parsing",
3− "set": "psc-0.12.0",
4− "source": "https://github.com/purescript/package-sets.git",
5− "depends": [
6− "arrays",
7− "either",
8− "foldable-traversable",
9− "identity",
10− "integers",
11− "lists",
12− "maybe",
13− "prelude",
14− "psci-support",
15− "strings",
16− "transformers",
17− "unicode"
18− ]
19−}
spago-dev.dhallnew file+25
@@ -0,0 +1,25 @@
1+-- Spago configuration for running the tests
2+--
3+-- See:
4+-- https://github.com/purescript/spago#devdependencies-testdependencies-or-in-general-a-situation-with-many-configurations
5+--
6+-- Usage:
7+--
8+-- spago -x test.dhall test
9+--
10+
11+let conf = ./spago.dhall
12+
13+in conf //
14+ { sources = conf.sources # [ "test/**/*.purs" ]
15+ , dependencies = conf.dependencies #
16+ [ "assert"
17+ , "parsing"
18+ , "console"
19+ , "foldable-traversable"
20+ , "lists"
21+ , "either"
22+ , "web-encoding"
23+ , "exceptions"
24+ ]
25+ }
spago.dhallnew file+23
@@ -0,0 +1,23 @@
1+{-
2+-}
3+{ name = "parsing-dataview"
4+, dependencies =
5+ [ "arraybuffer"
6+ , "arraybuffer-types"
7+ , "effect"
8+ , "enums"
9+ , "float32"
10+ , "maybe"
11+ , "parsing"
12+ , "prelude"
13+ , "strings"
14+ , "tailrec"
15+ , "transformers"
16+ , "tuples"
17+ , "uint"
18+ ]
19+, packages = ./packages.dhall
20+, sources = [ "src/**/*.purs" ]
21+, license = "BSD-2-Clause"
22+, repository = "https://github.com/rowtype-yoga/purescript-parsing-dataview"
23+}
src/Parsing/DataView.Basic.pursnew file+51
@@ -0,0 +1,51 @@
1+-- | Basic `DataView` parsers derived from primitive `DataView` parsers.
2+-- |
3+-- | All of these parsers will consume when they succeed.
4+-- |
5+-- | All of these parsers will not consume and will automatically
6+-- | backtrack when they fail.
7+module Parsing.DataView.Basic
8+ ( anyCodePointUTF8
9+ ) where
10+
11+import Prelude
12+
13+import Data.ArrayBuffer.Types (DataView)
14+import Data.Enum (toEnum)
15+import Data.String (CodePoint)
16+import Data.UInt (toInt)
17+import Effect.Class (class MonadEffect)
18+import Parsing (ParserT, fail, liftMaybe)
19+import Parsing.Combinators (tryRethrow)
20+import Parsing.DataView (anyUint8)
21+
22+-- | Decode one UTF-8 code point, *1—4* bytes.
23+anyCodePointUTF8
24+ :: forall m
25+ . MonadEffect m
26+ => ParserT DataView m CodePoint
27+anyCodePointUTF8 = tryRethrow do
28+ -- https://en.wikipedia.org/wiki/UTF-8#Encoding
29+ c0 <- toInt <$> anyUint8
30+ if c0 < 128 then do
31+ liftMaybe (\_ -> "Invalid CodePoint " <> show c0) (toEnum c0)
32+ else if c0 < 192 then fail "Invalid UTF-8 encoding"
33+ else if c0 < 224 then do
34+ c1 <- toInt <$> anyUint8
35+ if c1 < 128 || c1 > 191 then fail "Invalid UTF-8 encoding" else pure unit
36+ let codepoint = (64 * (c0 `mod` 32)) + (c1 `mod` 64)
37+ liftMaybe (\_ -> "Invalid CodePoint " <> show codepoint) (toEnum codepoint)
38+ else if c0 < 240 then do
39+ c1 <- toInt <$> anyUint8
40+ c2 <- toInt <$> anyUint8
41+ if c1 < 128 || c1 > 191 || c2 < 128 || c2 > 191 then fail "Invalid UTF-8 encoding" else pure unit
42+ let codepoint = (4096 * (c0 `mod` 16)) + (64 * (c1 `mod` 64)) + (c2 `mod` 64)
43+ liftMaybe (\_ -> "Invalid CodePoint " <> show codepoint) (toEnum codepoint)
44+ else if c0 < 248 then do
45+ c1 <- toInt <$> anyUint8
46+ c2 <- toInt <$> anyUint8
47+ c3 <- toInt <$> anyUint8
48+ if c1 < 128 || c1 > 191 || c2 < 128 || c2 > 191 || c3 < 128 || c3 > 191 then fail "Invalid UTF-8 encoding" else pure unit
49+ let codepoint = (262144 * (c0 `mod` 8)) + (4096 * (c1 `mod` 64)) + (64 * (c2 `mod` 64)) + (c3 `mod` 64)
50+ liftMaybe (\_ -> "Invalid CodePoint " <> show codepoint) (toEnum codepoint)
51+ else fail "Invalid UTF-8 encoding"
src/Parsing/DataView.pursnew file+353
@@ -0,0 +1,353 @@
1+-- | Primitive parsers for input type `DataView`.
2+-- |
3+-- | All of these primitive parsers will consume when they succeed.
4+-- |
5+-- | All of these primitive parsers will not consume and will automatically
6+-- | backtrack when they fail.
7+-- |
8+-- | See the package README for usage examples.
9+-- |
10+-- | ### Mutable ArrayBuffer
11+-- |
12+-- | All of the parsers in this module operate on an input stream of
13+-- | [__Data.ArrayBuffer.Types.DataView__](https://pursuit.purescript.org/packages/purescript-arraybuffer-types/docs/Data.ArrayBuffer.Types#t:DataView),
14+-- | which represents a range of a mutable
15+-- | [__Data.ArrayBuffer.Types.ArrayBuffer__](https://pursuit.purescript.org/packages/purescript-arraybuffer-types/docs/Data.ArrayBuffer.Types#t:ArrayBuffer).
16+-- |
17+-- | For operations for working with `DataView`, see
18+-- | module
19+-- | [__Data.ArrayBuffer.DataView__](https://pursuit.purescript.org/packages/purescript-arraybuffer/docs/Data.ArrayBuffer.DataView)
20+-- | in package __arraybuffer__.
21+-- |
22+-- | Reading from an `ArrayBuffer` is an `Effect`ful activity, so
23+-- | all parsers in this module must be run in a
24+-- | `MonadEffect m => ParserT DataView m` context with
25+-- | `Parsing.runParserT`.
26+-- |
27+-- | ### Position
28+-- |
29+-- | In a `DataView` parser, the `Position {index}` counts the number of
30+-- | bytes since the beginning of the input.
31+-- |
32+-- | The `Postion {line,column}` fields are unused and will remain constant *1*.
33+module Parsing.DataView
34+ ( takeN
35+ , takeRest
36+ , eof
37+ , match
38+ , anyTill
39+ , anyPrim
40+ , anyInt8
41+ , anyInt16be
42+ , anyInt16le
43+ , anyInt32be
44+ , anyInt32le
45+ , anyUint8
46+ , anyUint16be
47+ , anyUint16le
48+ , anyUint32be
49+ , anyUint32le
50+ , anyFloat32be
51+ , anyFloat32le
52+ , anyFloat64be
53+ , anyFloat64le
54+ , satisfy
55+ , satisfyInt8
56+ , satisfyInt16be
57+ , satisfyInt16le
58+ , satisfyInt32be
59+ , satisfyInt32le
60+ , satisfyUint8
61+ , satisfyUint16be
62+ , satisfyUint16le
63+ , satisfyUint32be
64+ , satisfyUint32le
65+ , satisfyFloat32be
66+ , satisfyFloat32le
67+ , satisfyFloat64be
68+ , satisfyFloat64le
69+ ) where
70+
71+import Prelude
72+
73+import Control.Monad.Rec.Class (Step(..), tailRecM)
74+import Control.Monad.Trans.Class (lift)
75+import Data.ArrayBuffer.DataView (Endian(LE, BE))
76+import Data.ArrayBuffer.DataView (buffer, byteLength, byteOffset, get, part) as DV
77+import Data.ArrayBuffer.Types (DataView, Int16, Int32, Int8, Uint16, Uint32, Uint8, Float32, Float64, ByteLength)
78+import Data.ArrayBuffer.ValueMapping (class BytesPerType, class BinaryValue, class ShowArrayViewType, byteWidth)
79+import Data.Float32 as Float32
80+import Data.Maybe (Maybe(..))
81+import Data.Symbol (class IsSymbol)
82+import Data.Tuple (Tuple(..))
83+import Data.UInt (UInt)
84+import Effect.Class (class MonadEffect, liftEffect)
85+import Parsing (ParseState(..), ParserT, Position(..), consume, fail, getParserT, stateParserT)
86+import Parsing.Combinators (alt, try, tryRethrow)
87+import Type.Proxy (Proxy(..))
88+
89+-- | Parse one fixed-bit-width `Data.ArrayBuffer.Types.ArrayViewType` primitive
90+-- | of a given endianness.
91+-- |
92+-- | #### Example
93+-- |
94+-- | Parse a little-endian 32-bit two’s-complement signed integer (4 bytes):
95+-- |
96+-- | anyPrim LE (Proxy :: Proxy Int32)
97+-- |
98+-- | or just use the convenience function `anyInt32le`, see below.
99+anyPrim
100+ :: forall a name m t
101+ . BinaryValue a t
102+ => BytesPerType a
103+ => ShowArrayViewType a name
104+ => IsSymbol name
105+ => MonadEffect m
106+ => Endian
107+ -> Proxy a
108+ -> ParserT DataView m t
109+anyPrim endian _ = do
110+ ParseState input (Position { index }) _ <- getParserT
111+ lift (liftEffect (DV.get endian (Proxy :: Proxy a) input index)) >>= case _ of
112+ Nothing -> fail "anyPrim unexpected end of DataView"
113+ Just i -> do
114+ stateParserT \_ -> Tuple i $ ParseState input (Position { line: 1, column: 1, index: index + byteWidth (Proxy :: Proxy a) }) true
115+
116+-- | Parse one 8-bit two’s-complement signed integer (byte).
117+anyInt8 :: forall m. MonadEffect m => ParserT DataView m Int
118+anyInt8 = anyPrim LE (Proxy :: Proxy Int8)
119+
120+-- | Parse one 16-bit big-endian two’s-complement signed integer.
121+anyInt16be :: forall m. MonadEffect m => ParserT DataView m Int
122+anyInt16be = anyPrim BE (Proxy :: Proxy Int16)
123+
124+-- | Parse one 16-bit little-endian two’s-complement signed integer.
125+anyInt16le :: forall m. MonadEffect m => ParserT DataView m Int
126+anyInt16le = anyPrim LE (Proxy :: Proxy Int16)
127+
128+-- | Parse one 32-bit big-endian two’s-complement signed integer.
129+anyInt32be :: forall m. MonadEffect m => ParserT DataView m Int
130+anyInt32be = anyPrim BE (Proxy :: Proxy Int32)
131+
132+-- | Parse one 32-bit little-endian two’s-complement signed integer.
133+anyInt32le :: forall m. MonadEffect m => ParserT DataView m Int
134+anyInt32le = anyPrim LE (Proxy :: Proxy Int32)
135+
136+-- | Parse one 8-bit unsigned integer (octet).
137+anyUint8 :: forall m. MonadEffect m => ParserT DataView m UInt
138+anyUint8 = anyPrim LE (Proxy :: Proxy Uint8)
139+
140+-- | Parse one 16-bit big-endian unsigned integer.
141+anyUint16be :: forall m. MonadEffect m => ParserT DataView m UInt
142+anyUint16be = anyPrim BE (Proxy :: Proxy Uint16)
143+
144+-- | Parse one 16-bit little-endian unsigned integer.
145+anyUint16le :: forall m. MonadEffect m => ParserT DataView m UInt
146+anyUint16le = anyPrim LE (Proxy :: Proxy Uint16)
147+
148+-- | Parse one 32-bit big-endian unsigned integer.
149+anyUint32be :: forall m. MonadEffect m => ParserT DataView m UInt
150+anyUint32be = anyPrim BE (Proxy :: Proxy Uint32)
151+
152+-- | Parse one 32-bit little-endian unsigned integer.
153+anyUint32le :: forall m. MonadEffect m => ParserT DataView m UInt
154+anyUint32le = anyPrim LE (Proxy :: Proxy Uint32)
155+
156+-- | Parse one 32-bit big-endian IEEE 754 floating-point number.
157+anyFloat32be :: forall m. MonadEffect m => ParserT DataView m Float32.Float32
158+anyFloat32be = anyPrim BE (Proxy :: Proxy Float32)
159+
160+-- | Parse one 32-bit little-endian IEEE 754 floating-point number.
161+anyFloat32le :: forall m. MonadEffect m => ParserT DataView m Float32.Float32
162+anyFloat32le = anyPrim LE (Proxy :: Proxy Float32)
163+
164+-- | Parse one 64-bit big-endian IEEE 754 floating-point number.
165+anyFloat64be :: forall m. MonadEffect m => ParserT DataView m Number
166+anyFloat64be = anyPrim BE (Proxy :: Proxy Float64)
167+
168+-- | Parse one 64-bit little-endian IEEE 754 floating-point number.
169+anyFloat64le :: forall m. MonadEffect m => ParserT DataView m Number
170+anyFloat64le = anyPrim LE (Proxy :: Proxy Float64)
171+
172+-- | Parse one fixed-bit-width primitive that satisfies the given predicate.
173+-- |
174+-- | #### Example
175+-- |
176+-- | Parse a little-endian 32-bit signed integer that is equal to *3*:
177+-- |
178+-- | satisfy LE (Proxy :: Proxy Int32) (_ == 3)
179+-- |
180+-- | or just use the convenience function `satisfyInt32le`, see below.
181+satisfy
182+ :: forall a name m t
183+ . BinaryValue a t
184+ => BytesPerType a
185+ => ShowArrayViewType a name
186+ => IsSymbol name
187+ => Show t
188+ => MonadEffect m
189+ => Endian
190+ -> Proxy a
191+ -> (t -> Boolean)
192+ -> ParserT DataView m t
193+satisfy endian proxy f = tryRethrow do
194+ i <- anyPrim endian proxy
195+ if f i then pure i
196+ else fail "satisfy predicate failed"
197+
198+-- | Parse one 8-bit signed integer that satisfies the given predicate.
199+satisfyInt8 :: forall m. MonadEffect m => (Int -> Boolean) -> ParserT DataView m Int
200+satisfyInt8 = satisfy LE (Proxy :: Proxy Int8)
201+
202+-- | Parse one 16-bit big-endian signed integer that satisfies the given predicate.
203+satisfyInt16be :: forall m. MonadEffect m => (Int -> Boolean) -> ParserT DataView m Int
204+satisfyInt16be = satisfy BE (Proxy :: Proxy Int16)
205+
206+-- | Parse one 16-bit little-endian signed integer that satisfies the given predicate.
207+satisfyInt16le :: forall m. MonadEffect m => (Int -> Boolean) -> ParserT DataView m Int
208+satisfyInt16le = satisfy LE (Proxy :: Proxy Int16)
209+
210+-- | Parse one 32-bit big-endian signed integer that satisfies the given predicate.
211+satisfyInt32be :: forall m. MonadEffect m => (Int -> Boolean) -> ParserT DataView m Int
212+satisfyInt32be = satisfy BE (Proxy :: Proxy Int32)
213+
214+-- | Parse one 32-bit little-endian signed integer that satisfies the given predicate.
215+satisfyInt32le :: forall m. MonadEffect m => (Int -> Boolean) -> ParserT DataView m Int
216+satisfyInt32le = satisfy LE (Proxy :: Proxy Int32)
217+
218+-- | Parse one 8-bit unsigned integer that satisfies the given predicate.
219+satisfyUint8 :: forall m. MonadEffect m => (UInt -> Boolean) -> ParserT DataView m UInt
220+satisfyUint8 = satisfy LE (Proxy :: Proxy Uint8)
221+
222+-- | Parse one 16-bit big-endian unsigned integer that satisfies the given predicate.
223+satisfyUint16be :: forall m. MonadEffect m => (UInt -> Boolean) -> ParserT DataView m UInt
224+satisfyUint16be = satisfy BE (Proxy :: Proxy Uint16)
225+
226+-- | Parse one 16-bit little-endian unsigned integer that satisfies the given predicate.
227+satisfyUint16le :: forall m. MonadEffect m => (UInt -> Boolean) -> ParserT DataView m UInt
228+satisfyUint16le = satisfy LE (Proxy :: Proxy Uint16)
229+
230+-- | Parse one 32-bit big-endian unsigned integer that satisfies the given predicate.
231+satisfyUint32be :: forall m. MonadEffect m => (UInt -> Boolean) -> ParserT DataView m UInt
232+satisfyUint32be = satisfy BE (Proxy :: Proxy Uint32)
233+
234+-- | Parse one 32-bit little-endian unsigned integer that satisfies the given predicate.
235+satisfyUint32le :: forall m. MonadEffect m => (UInt -> Boolean) -> ParserT DataView m UInt
236+satisfyUint32le = satisfy LE (Proxy :: Proxy Uint32)
237+
238+-- | Parse one 32-bit big-endian floating-point number that satisfies the given predicate.
239+satisfyFloat32be :: forall m. MonadEffect m => (Float32.Float32 -> Boolean) -> ParserT DataView m Float32.Float32
240+satisfyFloat32be = satisfy BE (Proxy :: Proxy Float32)
241+
242+-- | Parse one 32-bit little-endian floating-point number that satisfies the given predicate.
243+satisfyFloat32le :: forall m. MonadEffect m => (Float32.Float32 -> Boolean) -> ParserT DataView m Float32.Float32
244+satisfyFloat32le = satisfy LE (Proxy :: Proxy Float32)
245+
246+-- | Parse one 64-bit big-endian floating-point number that satisfies the given predicate.
247+satisfyFloat64be :: forall m. MonadEffect m => (Number -> Boolean) -> ParserT DataView m Number
248+satisfyFloat64be = satisfy BE (Proxy :: Proxy Float64)
249+
250+-- | Parse one 64-bit little-endian floating-point number that satisfies the given predicate.
251+satisfyFloat64le :: forall m. MonadEffect m => (Number -> Boolean) -> ParserT DataView m Number
252+satisfyFloat64le = satisfy LE (Proxy :: Proxy Float64)
253+
254+-- | Take *N* bytes starting from the current parser position. Will fail
255+-- | if not enough bytes remain in the input. Will fail if *N* is negative.
256+-- |
257+-- | #### Example
258+-- |
259+-- | Parse three bytes.
260+-- |
261+-- | takeN 3
262+-- |
263+takeN :: forall m. MonadEffect m => ByteLength -> ParserT DataView m DataView
264+takeN n = do
265+ ParseState input (Position { index }) _ <- getParserT
266+ if (n < 0) then
267+ fail "takeN cannot take negative number of bytes"
268+ else if (index + n > DV.byteLength input) then
269+ fail "takeN expected N bytes"
270+ else do
271+ p <- lift $ liftEffect $ DV.part (DV.buffer input) (DV.byteOffset input + index) n
272+ stateParserT \_ -> Tuple p $ ParseState input (Position { line: 1, column: 1, index: index + n }) true
273+
274+-- | Take the rest of the input, however many bytes remain. Always succeeds.
275+takeRest :: forall m. MonadEffect m => ParserT DataView m DataView
276+takeRest = do
277+ ParseState input (Position { index }) _ <- getParserT
278+ p <- lift $ liftEffect $ DV.part (DV.buffer input) (DV.byteOffset input + index)
279+ (DV.byteLength input - index)
280+ stateParserT \_ -> Tuple p $ ParseState input (Position { line: 1, column: 1, index: DV.byteLength input + 1 }) true
281+
282+-- | Parse succeeds at the end of the input DataView.
283+eof :: forall m. Monad m => ParserT DataView m Unit
284+eof = do
285+ ParseState input (Position { index }) _ <- getParserT
286+ if (index + 1 > DV.byteLength input) then do
287+ -- We must consume so this combines correctly with notFollowedBy
288+ consume
289+ else do
290+ fail "eof expected end of DataView"
291+
292+-- | The
293+-- | [famous `match`](http://www.serpentine.com/blog/2014/05/31/attoparsec/#from-strings-to-buffers-and-cursors)
294+-- | combinator.
295+-- |
296+-- | Return both the result of a parse and the portion of the input that
297+-- | was consumed while it was being parsed.
298+match :: forall a m. MonadEffect m => ParserT DataView m a -> ParserT DataView m (Tuple DataView a)
299+match p = do
300+ ParseState input (Position { index: index0 }) _ <- getParserT
301+ x <- p
302+ ParseState _ (Position { index: index1 }) _ <- getParserT
303+ part <- lift $ liftEffect $ DV.part (DV.buffer input) (DV.byteOffset input + index0) (index1 - index0)
304+ pure $ Tuple part x
305+
306+-- | Combinator which finds the first position in the input `DataView` where the
307+-- | phrase can parse. Returns both the
308+-- | parsed result and the unparsable input section searched before the parse.
309+-- | Will fail if no section of the input is parseable. To backtrack the input
310+-- | stream on failure, combine with `tryRethrow`.
311+-- |
312+-- | This combinator is equivalent to `manyTill_ anyInt8`, but it will be
313+-- | faster because it returns a slice of the input `DataView` for the
314+-- | section preceding the parse instead of a `List Int`.
315+-- |
316+-- | Be careful not to look too far
317+-- | ahead; if the phrase parser looks to the end of the input then `anyTill`
318+-- | could be *O(n²)*.
319+anyTill
320+ :: forall m a
321+ . MonadEffect m
322+ => ParserT DataView m a
323+ -> ParserT DataView m (Tuple DataView a)
324+anyTill p = do
325+ ParseState input1 (Position { index: index0 }) _ <- getParserT
326+ Tuple index1 t <- tailRecM go unit
327+ part <- lift $ liftEffect $ DV.part (DV.buffer input1) (DV.byteOffset input1 + index0) (index1 - index0)
328+ pure $ Tuple part t
329+ where
330+ go unit = alt
331+ ( do
332+ ParseState _ (Position { index: index1 }) _ <- getParserT
333+ t <- try p
334+ pure $ Done $ Tuple index1 t
335+ )
336+ ( do
337+ _ <- anyInt8
338+ pure $ Loop unit
339+ )
340+
341+-- ****************************** Notes ****************************************
342+--
343+-- We cannot have a primitive parser which parses a `DataView` and produces
344+-- an `ArrayView` (a Javascript Typed Array). Javascript DataViews are
345+-- endianess-aware, but Javascript Typed Arrays assume the native endianness
346+-- of the local machine. DataViews are intended to be used for I/O, ArrayViews
347+-- are intended to be used internally for graphics in a process, and they're
348+-- not intended to be both applied to the same ArrayBuffer.
349+-- The exception: `Uint8Array`
350+--
351+-- The failure messages are all constant strings form performance reasons.
352+-- If failure messages were constructed lazily then we could have more
353+-- descriptive messages.
src/Text/Parsing/Parser.pursdeleted−138
@@ -1,138 +0,0 @@
1−module Text.Parsing.Parser
2− ( ParseError(..)
3− , parseErrorMessage
4− , parseErrorPosition
5− , ParseState(..)
6− , ParserT(..)
7− , Parser
8− , runParser
9− , runParserT
10− , hoistParserT
11− , mapParserT
12− , consume
13− , position
14− , fail
15− , failWithPosition
16− ) where
17−
18−import Prelude
19−
20−import Control.Alt (class Alt)
21−import Control.Apply (lift2)
22−import Control.Lazy (defer, class Lazy)
23−import Control.Monad.Error.Class (class MonadThrow, throwError)
24−import Control.Monad.Except (class MonadError, ExceptT(..), runExceptT, mapExceptT)
25−import Control.Monad.Rec.Class (class MonadRec)
26−import Control.Monad.State (class MonadState, StateT(..), evalStateT, gets, mapStateT, modify_, runStateT)
27−import Control.Monad.Trans.Class (class MonadTrans, lift)
28−import Control.MonadPlus (class Alternative, class MonadZero, class MonadPlus, class Plus)
29−import Data.Either (Either(..))
30−import Data.Identity (Identity)
31−import Data.Newtype (class Newtype, unwrap, over)
32−import Data.Tuple (Tuple(..))
33−import Text.Parsing.Parser.Pos (Position, initialPos)
34−
35−-- | A parsing error, consisting of a message and position information.
36−data ParseError = ParseError String Position
37−
38−parseErrorMessage :: ParseError -> String
39−parseErrorMessage (ParseError msg _) = msg
40−
41−parseErrorPosition :: ParseError -> Position
42−parseErrorPosition (ParseError _ pos) = pos
43−
44−instance showParseError :: Show ParseError where
45− show (ParseError msg pos) =
46− "(ParseError " <> show msg <> " " <> show pos <> ")"
47−
48−derive instance eqParseError :: Eq ParseError
49−derive instance ordParseError :: Ord ParseError
50−
51−-- | Contains the remaining input and current position.
52−data ParseState s = ParseState s Position Boolean
53−
54−-- | The Parser monad transformer.
55−-- |
56−-- | The first type argument is the stream type. Typically, this is either `String`,
57−-- | or some sort of token stream.
58−newtype ParserT s m a = ParserT (ExceptT ParseError (StateT (ParseState s) m) a)
59−
60−derive instance newtypeParserT :: Newtype (ParserT s m a) _
61−
62−-- | Apply a parser, keeping only the parsed result.
63−runParserT :: forall m s a. Monad m => s -> ParserT s m a -> m (Either ParseError a)
64−runParserT s p = evalStateT (runExceptT (unwrap p)) initialState where
65− initialState = ParseState s initialPos false
66−
67−-- | The `Parser` monad is a synonym for the parser monad transformer applied to the `Identity` monad.
68−type Parser s = ParserT s Identity
69−
70−-- | Apply a parser, keeping only the parsed result.
71−runParser :: forall s a. s -> Parser s a -> Either ParseError a
72−runParser s = unwrap <<< runParserT s
73−
74−hoistParserT :: forall s m n a. (m ~> n) -> ParserT s m a -> ParserT s n a
75−hoistParserT = mapParserT
76−
77−-- | Change the underlying monad action and data type in a ParserT monad action.
78−mapParserT :: forall b n s a m.
79− ( m (Tuple (Either ParseError a) (ParseState s))
80− -> n (Tuple (Either ParseError b) (ParseState s))
81− ) -> ParserT s m a -> ParserT s n b
82−mapParserT = over ParserT <<< mapExceptT <<< mapStateT
83−
84−instance lazyParserT :: Lazy (ParserT s m a) where
85− defer f = ParserT (ExceptT (defer (runExceptT <<< unwrap <<< f)))
86−
87−instance semigroupParserT :: (Monad m, Semigroup a) => Semigroup (ParserT s m a) where
88− append = lift2 (<>)
89−
90−instance monoidParserT :: (Monad m, Monoid a) => Monoid (ParserT s m a) where
91− mempty = pure mempty
92−
93−derive newtype instance functorParserT :: Functor m => Functor (ParserT s m)
94−derive newtype instance applyParserT :: Monad m => Apply (ParserT s m)
95−derive newtype instance applicativeParserT :: Monad m => Applicative (ParserT s m)
96−derive newtype instance bindParserT :: Monad m => Bind (ParserT s m)
97−derive newtype instance monadParserT :: Monad m => Monad (ParserT s m)
98−derive newtype instance monadRecParserT :: MonadRec m => MonadRec (ParserT s m)
99−derive newtype instance monadStateParserT :: Monad m => MonadState (ParseState s) (ParserT s m)
100−derive newtype instance monadThrowParserT :: Monad m => MonadThrow ParseError (ParserT s m)
101−derive newtype instance monadErrorParserT :: Monad m => MonadError ParseError (ParserT s m)
102−
103−instance altParserT :: Monad m => Alt (ParserT s m) where
104− alt p1 p2 = (ParserT <<< ExceptT <<< StateT) \(s@(ParseState i p _)) -> do
105− Tuple e s'@(ParseState i' p' c') <- runStateT (runExceptT (unwrap p1)) (ParseState i p false)
106− case e of
107− Left err
108− | not c' -> runStateT (runExceptT (unwrap p2)) s
109− _ -> pure (Tuple e s')
110−
111−instance plusParserT :: Monad m => Plus (ParserT s m) where
112− empty = fail "No alternative"
113−
114−instance alternativeParserT :: Monad m => Alternative (ParserT s m)
115−
116−instance monadZeroParserT :: Monad m => MonadZero (ParserT s m)
117−
118−instance monadPlusParserT :: Monad m => MonadPlus (ParserT s m)
119−
120−instance monadTransParserT :: MonadTrans (ParserT s) where
121− lift = ParserT <<< lift <<< lift
122−
123−-- | Set the consumed flag.
124−consume :: forall s m. Monad m => ParserT s m Unit
125−consume = modify_ \(ParseState input pos _) ->
126− ParseState input pos true
127−
128−-- | Returns the current position in the stream.
129−position :: forall s m. Monad m => ParserT s m Position
130−position = gets \(ParseState _ pos _) -> pos
131−
132−-- | Fail with a message.
133−fail :: forall m s a. Monad m => String -> ParserT s m a
134−fail message = failWithPosition message =<< position
135−
136−-- | Fail with a message and a position.
137−failWithPosition :: forall m s a. Monad m => String -> Position -> ParserT s m a
138−failWithPosition message pos = throwError (ParseError message pos)
src/Text/Parsing/Parser/Combinators.pursdeleted−200
@@ -1,200 +0,0 @@
1−-- | Combinators for creating parsers.
2−-- |
3−-- | ### Notes
4−-- |
5−-- | A few of the known combinators from Parsec are missing in this module. That
6−-- | is because they have already been defined in other libraries.
7−-- |
8−-- | ```purescript
9−-- | Text.Parsec.many = Data.(Array|List).many
10−-- | Text.Parsec.many1 = Data.(Array|List).some
11−-- | Text.Parsec.(<|>) = Control.Alt.alt (<|>)
12−-- | ```
13−-- |
14−-- | Because Strings are not Char Arrays in PureScript `many` and `some` on Char Parsers need to
15−-- | be used in conjunction with `Data.String.CodeUnits.fromCharArray` to achieve "Parsec-like" results.
16−-- |
17−-- | ```purescript
18−-- | Text.Parsec.many (char 'x') <=> fromCharArray <$> Data.Array.many (char 'x')
19−-- | ```
20−-- |
21−-- | Note that `Data.(Array|List).(many|some)` are not stack safe. If you need to parse
22−-- | large numbers of items then consider using `Data.List.(manyRec|someRec)` instead.
23−
24−module Text.Parsing.Parser.Combinators where
25−
26−import Prelude
27−import Control.Monad.Except (runExceptT, ExceptT(..))
28−import Control.Monad.State (StateT(..), runStateT)
29−import Control.Plus (empty, (<|>))
30−import Data.Either (Either(..))
31−import Data.Foldable (class Foldable, foldl)
32−import Data.List (List(..), (:), many, some, singleton)
33−import Data.Maybe (Maybe(..))
34−import Data.Newtype (unwrap)
35−import Data.Tuple (Tuple(..))
36−import Text.Parsing.Parser (ParseState(..), ParserT(..), ParseError(..), fail)
37−
38−-- | Provide an error message in the case of failure.
39−withErrorMessage :: forall m s a. Monad m => ParserT s m a -> String -> ParserT s m a
40−withErrorMessage p msg = p <|> fail ("Expected " <> msg)
41−
42−infixl 3 withErrorMessage as <?>
43−
44−-- | Flipped `(<?>)`.
45−asErrorMessage :: forall m s a. Monad m => String -> ParserT s m a -> ParserT s m a
46−asErrorMessage = flip (<?>)
47−
48−infixl 3 asErrorMessage as <??>
49−
50−-- | Wrap a parser with opening and closing markers.
51−-- |
52−-- | For example:
53−-- |
54−-- | ```purescript
55−-- | parens = between (string "(") (string ")")
56−-- | ```
57−between :: forall m s a open close. Monad m => ParserT s m open -> ParserT s m close -> ParserT s m a -> ParserT s m a
58−between open close p = open *> p <* close
59−
60−-- | Provide a default result in the case where a parser fails without consuming input.
61−option :: forall m s a. Monad m => a -> ParserT s m a -> ParserT s m a
62−option a p = p <|> pure a
63−
64−-- | Optionally parse something, failing quietly.
65−optional :: forall m s a. Monad m => ParserT s m a -> ParserT s m Unit
66−optional p = void p <|> pure unit
67−
68−-- | pure `Nothing` in the case where a parser fails without consuming input.
69−optionMaybe :: forall m s a. Monad m => ParserT s m a -> ParserT s m (Maybe a)
70−optionMaybe p = option Nothing (Just <$> p)
71−
72−-- | In case of failure, reset the stream to the unconsumed state.
73−try :: forall m s a. Monad m => ParserT s m a -> ParserT s m a
74−try p = (ParserT <<< ExceptT <<< StateT) \(s@(ParseState _ _ consumed)) -> do
75− Tuple e s'@(ParseState input position _) <- runStateT (runExceptT (unwrap p)) s
76− case e of
77− Left _ -> pure (Tuple e (ParseState input position consumed))
78− _ -> pure (Tuple e s')
79−
80−-- | Like `try`, but will reannotate the error location to the `try` point.
81−tryRethrow :: forall m s a. Monad m => ParserT s m a -> ParserT s m a
82−tryRethrow p = (ParserT <<< ExceptT <<< StateT) \(s@(ParseState _ position consumed)) -> do
83− Tuple e s'@(ParseState input' position' _) <- runStateT (runExceptT (unwrap p)) s
84− case e of
85− Left (ParseError err _) -> pure (Tuple (Left (ParseError err position)) (ParseState input' position' consumed))
86− _ -> pure (Tuple e s')
87−
88−-- | Parse a phrase, without modifying the consumed state or stream position.
89−lookAhead :: forall s a m. Monad m => ParserT s m a -> ParserT s m a
90−lookAhead p = (ParserT <<< ExceptT <<< StateT) \s -> do
91− Tuple e _ <- runStateT (runExceptT (unwrap p)) s
92− pure (Tuple e s)
93−
94−-- | Parse phrases delimited by a separator.
95−-- |
96−-- | For example:
97−-- |
98−-- | ```purescript
99−-- | digit `sepBy` string ","
100−-- | ```
101−sepBy :: forall m s a sep. Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a)
102−sepBy p sep = sepBy1 p sep <|> pure Nil
103−
104−-- | Parse phrases delimited by a separator, requiring at least one match.
105−sepBy1 :: forall m s a sep. Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a)
106−sepBy1 p sep = do
107− a <- p
108− as <- many $ sep *> p
109− pure (a : as)
110−
111−-- | Parse phrases delimited and optionally terminated by a separator.
112−sepEndBy :: forall m s a sep. Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a)
113−sepEndBy p sep = sepEndBy1 p sep <|> pure Nil
114−
115−-- | Parse phrases delimited and optionally terminated by a separator, requiring at least one match.
116−sepEndBy1 :: forall m s a sep. Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a)
117−sepEndBy1 p sep = do
118− a <- p
119− (do _ <- sep
120− as <- sepEndBy p sep
121− pure (a : as)) <|> pure (singleton a)
122−
123−-- | Parse phrases delimited and terminated by a separator, requiring at least one match.
124−endBy1 :: forall m s a sep. Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a)
125−endBy1 p sep = some $ p <* sep
126−
127−-- | Parse phrases delimited and terminated by a separator.
128−endBy :: forall m s a sep. Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a)
129−endBy p sep = many $ p <* sep
130−
131−-- | Parse phrases delimited by a right-associative operator.
132−-- |
133−-- | For example:
134−-- |
135−-- | ```purescript
136−-- | chainr digit (string "+" *> add) 0
137−-- | ```
138−chainr :: forall m s a. Monad m => ParserT s m a -> ParserT s m (a -> a -> a) -> a -> ParserT s m a
139−chainr p f a = chainr1 p f <|> pure a
140−
141−-- | Parse phrases delimited by a left-associative operator.
142−chainl :: forall m s a. Monad m => ParserT s m a -> ParserT s m (a -> a -> a) -> a -> ParserT s m a
143−chainl p f a = chainl1 p f <|> pure a
144−
145−-- | Parse phrases delimited by a left-associative operator, requiring at least one match.
146−chainl1 :: forall m s a. Monad m => ParserT s m a -> ParserT s m (a -> a -> a) -> ParserT s m a
147−chainl1 p f = do
148− a <- p
149− chainl1' p f a
150−
151−chainl1' :: forall m s a. Monad m => ParserT s m a -> ParserT s m (a -> a -> a) -> a -> ParserT s m a
152−chainl1' p f a = (do f' <- f
153− a' <- p
154− chainl1' p f (f' a a')) <|> pure a
155−
156−-- | Parse phrases delimited by a right-associative operator, requiring at least one match.
157−chainr1 :: forall m s a. Monad m => ParserT s m a -> ParserT s m (a -> a -> a) -> ParserT s m a
158−chainr1 p f = do
159− a <- p
160− chainr1' p f a
161−
162−chainr1' :: forall m s a. Monad m => ParserT s m a -> ParserT s m (a -> a -> a) -> a -> ParserT s m a
163−chainr1' p f a = (do f' <- f
164− a' <- chainr1 p f
165− pure $ f' a a') <|> pure a
166−
167−-- | Parse one of a set of alternatives.
168−choice :: forall f m s a. Foldable f => Monad m => f (ParserT s m a) -> ParserT s m a
169−choice = foldl (<|>) empty
170−
171−-- | Skip many instances of a phrase.
172−skipMany :: forall s a m. Monad m => ParserT s m a -> ParserT s m Unit
173−skipMany p = skipMany1 p <|> pure unit
174−
175−-- | Skip at least one instance of a phrase.
176−skipMany1 :: forall s a m. Monad m => ParserT s m a -> ParserT s m Unit
177−skipMany1 p = do
178− x <- p
179− xs <- skipMany p
180− pure unit
181−
182−-- | Fail if the specified parser matches.
183−notFollowedBy :: forall s a m. Monad m => ParserT s m a -> ParserT s m Unit
184−notFollowedBy p = try $ (try p *> fail "Negated parser succeeded") <|> pure unit
185−
186−-- | Parse several phrases until the specified terminator matches.
187−manyTill :: forall s a m e. Monad m => ParserT s m a -> ParserT s m e -> ParserT s m (List a)
188−manyTill p end = scan
189− where
190− scan = (end $> Nil)
191− <|> do x <- p
192− xs <- scan
193− pure (x:xs)
194−
195−-- | Parse several phrases until the specified terminator matches, requiring at least one match.
196−many1Till :: forall s a m e. Monad m => ParserT s m a -> ParserT s m e -> ParserT s m (List a)
197−many1Till p end = do
198− x <- p
199− xs <- manyTill p end
200− pure (x:xs)
src/Text/Parsing/Parser/DataView.pursdeleted−314
@@ -1,314 +0,0 @@
1−-- | Primitive parsers for parsing Javascript ArrayBuffers with the
2−-- | `Text.Parsing.Parser` module in package __purescript-parsing__.
3−-- |
4−-- | All of the parsers in this module operate on an input stream of
5−-- | `Data.ArrayBuffer.Types.DataView`, which represents a range of an
6−-- | `Data.ArrayBuffer.Types.ArrayBuffer`.
7−-- |
8−-- | For operations for working with `ArrayBuffer` and `DataView`, see
9−-- | module `Data.ArrayBuffer.DataView` in package __purescript-arraybuffer__.
10−-- |
11−-- | Reading from an `ArrayBuffer` is an `Effect`ful activity, so
12−-- | all parsers in this module must be run in a
13−-- | `MonadEffect m => ParserT DataView m` context, with
14−-- | `Text.Parsing.Parser.runParserT`.
15−-- |
16−-- | ## References
17−-- |
18−-- | * [MDN `ArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)
19−-- | * [MDN `DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView)
20−module Text.Parsing.Parser.DataView
21− ( anyPrim
22− , anyInt8
23− , anyInt16be
24− , anyInt16le
25− , anyInt32be
26− , anyInt32le
27− , anyUint8
28− , anyUint16be
29− , anyUint16le
30− , anyUint32be
31− , anyUint32le
32− , anyFloat32be
33− , anyFloat32le
34− , anyFloat64be
35− , anyFloat64le
36− , satisfy
37− , satisfyInt8
38− , satisfyInt16be
39− , satisfyInt16le
40− , satisfyInt32be
41− , satisfyInt32le
42− , satisfyUint8
43− , satisfyUint16be
44− , satisfyUint16le
45− , satisfyUint32be
46− , satisfyUint32le
47− , satisfyFloat32be
48− , satisfyFloat32le
49− , satisfyFloat64be
50− , satisfyFloat64le
51− , takeN
52− , takeRest
53− , eof
54− , module Data.ArrayBuffer.Types
55− , module Data.ArrayBuffer.DataView
56− )
57− where
58−
59−import Prelude
60−
61−import Control.Monad.Trans.Class (lift)
62−import Control.Monad.State (get, put)
63−import Data.Maybe (Maybe(..))
64−import Data.Symbol (SProxy(..), class IsSymbol, reflectSymbol)
65−import Data.Typelevel.Num (class Nat, toInt')
66−import Data.UInt (UInt)
67−import Data.Float32 as Float32
68−import Effect.Class (class MonadEffect, liftEffect)
69−import Type.Proxy (Proxy(..))
70−
71−import Text.Parsing.Parser (ParserT, ParseState(..), fail)
72−import Text.Parsing.Parser.Pos (Position(..))
73−import Text.Parsing.Parser.Combinators (tryRethrow)
74−import Data.ArrayBuffer.Types
75− ( DataView
76− , ArrayView
77− , Int16
78− , Int32
79− , Int8
80− , Uint16
81− , Uint32
82− , Uint8
83− , Float32
84− , Float64
85− , ByteLength
86− )
87−import Data.ArrayBuffer.ValueMapping
88− ( class BytesPerValue
89− , class BinaryValue
90− , class ShowArrayViewType
91− )
92−import Data.ArrayBuffer.DataView
93− ( AProxy(..)
94− , Endian(LE,BE)
95− )
96−import Data.ArrayBuffer.DataView (byteLength, byteOffset, get, part, buffer) as DV
97−
98−-- | Parse one fixed-bit-width `Data.ArrayBuffer.Types.ArrayViewType` primitive
99−-- | of a given endianness.
100−-- |
101−-- | #### Example
102−-- |
103−-- | Parse a little-endian 32-bit signed integer (4 bytes):
104−-- |
105−-- | anyPrim LE (AProxy :: AProxy Int32)
106−-- |
107−-- | or just use the convenience function `anyInt32le`, see below.
108−anyPrim :: forall a name b m t
109− . BinaryValue a t
110− => BytesPerValue a b
111− => ShowArrayViewType a name
112− => IsSymbol name
113− => Nat b
114− => MonadEffect m
115− => Endian
116− -> AProxy a
117− -> ParserT DataView m t
118−anyPrim endian aproxy = do
119− ParseState input (Position{line,column}) _ <- get
120− lift (liftEffect (DV.get endian (AProxy :: AProxy a) input (column-1))) >>= case _ of
121− Nothing -> fail $ "Cannot parse " <> reflectSymbol (SProxy :: SProxy name) <>
122− ", unexpected end of DataView"
123− Just i -> do
124− put $ ParseState input (Position {line, column:column + toInt' (Proxy :: Proxy b) }) true
125− pure i
126−
127−-- | Parse one 8-bit signed integer (byte).
128−anyInt8 :: forall m. MonadEffect m => ParserT DataView m Int
129−anyInt8 = anyPrim LE (AProxy :: AProxy Int8)
130−
131−-- | Parse one 16-bit big-endian signed integer.
132−anyInt16be :: forall m. MonadEffect m => ParserT DataView m Int
133−anyInt16be = anyPrim BE (AProxy :: AProxy Int16)
134−
135−-- | Parse one 16-bit little-endian signed integer.
136−anyInt16le :: forall m. MonadEffect m => ParserT DataView m Int
137−anyInt16le = anyPrim LE (AProxy :: AProxy Int16)
138−
139−-- | Parse one 32-bit big-endian signed integer.
140−anyInt32be :: forall m. MonadEffect m => ParserT DataView m Int
141−anyInt32be = anyPrim BE (AProxy :: AProxy Int32)
142−
143−-- | Parse one 32-bit little-endian signed integer.
144−anyInt32le :: forall m. MonadEffect m => ParserT DataView m Int
145−anyInt32le = anyPrim LE (AProxy :: AProxy Int32)
146−
147−-- | Parse one 8-bit unsigned integer (octet).
148−anyUint8 :: forall m. MonadEffect m => ParserT DataView m UInt
149−anyUint8 = anyPrim LE (AProxy :: AProxy Uint8)
150−
151−-- | Parse one 16-bit big-endian unsigned integer.
152−anyUint16be :: forall m. MonadEffect m => ParserT DataView m UInt
153−anyUint16be = anyPrim BE (AProxy :: AProxy Uint16)
154−
155−-- | Parse one 16-bit little-endian unsigned integer.
156−anyUint16le :: forall m. MonadEffect m => ParserT DataView m UInt
157−anyUint16le = anyPrim LE (AProxy :: AProxy Uint16)
158−
159−-- | Parse one 32-bit big-endian unsigned integer.
160−anyUint32be :: forall m. MonadEffect m => ParserT DataView m UInt
161−anyUint32be = anyPrim BE (AProxy :: AProxy Uint32)
162−
163−-- | Parse one 32-bit little-endian unsigned integer.
164−anyUint32le :: forall m. MonadEffect m => ParserT DataView m UInt
165−anyUint32le = anyPrim LE (AProxy :: AProxy Uint32)
166−
167−-- | Parse one 32-bit big-endian floating point number.
168−anyFloat32be :: forall m. MonadEffect m => ParserT DataView m Float32.Float32
169−anyFloat32be = anyPrim BE (AProxy :: AProxy Float32)
170−
171−-- | Parse one 32-bit little-endian floating point number.
172−anyFloat32le :: forall m. MonadEffect m => ParserT DataView m Float32.Float32
173−anyFloat32le = anyPrim LE (AProxy :: AProxy Float32)
174−
175−-- | Parse one 64-bit big-endian floating point number.
176−anyFloat64be :: forall m. MonadEffect m => ParserT DataView m Number
177−anyFloat64be = anyPrim BE (AProxy :: AProxy Float64)
178−
179−-- | Parse one 64-bit little-endian floating point number.
180−anyFloat64le :: forall m. MonadEffect m => ParserT DataView m Number
181−anyFloat64le = anyPrim LE (AProxy :: AProxy Float64)
182−
183−-- | Parse one fixed-bit-width primitive that satisfies the given predicate.
184−-- |
185−-- | #### Example
186−-- |
187−-- | Parse a little-endian 32-bit signed integer that is equal to *3*:
188−-- |
189−-- | satisfy LE (AProxy :: AProxy Int32) (_ == 3)
190−-- |
191−-- | or just use the convenience function `satisfyInt32le`, see below.
192−satisfy :: forall a name b m t
193− . BinaryValue a t
194− => BytesPerValue a b
195− => ShowArrayViewType a name
196− => IsSymbol name
197− => Nat b
198− => Show t
199− => MonadEffect m
200− => Endian
201− -> AProxy a
202− -> (t -> Boolean)
203− -> ParserT DataView m t
204−satisfy endian aproxy f = tryRethrow do
205− i <- anyPrim endian aproxy
206− if f i then pure i
207− else fail $ reflectSymbol (SProxy :: SProxy name) <>
208− " " <> show i <> " did not satisfy predicate."
209−
210−-- | Parse one 8-bit signed integer that satisfies the given predicate.
211−satisfyInt8 :: forall m. MonadEffect m => (Int -> Boolean) -> ParserT DataView m Int
212−satisfyInt8 = satisfy LE (AProxy :: AProxy Int8)
213−
214−-- | Parse one 16-bit big-endian signed integer that satisfies the given predicate.
215−satisfyInt16be :: forall m. MonadEffect m => (Int -> Boolean) -> ParserT DataView m Int
216−satisfyInt16be = satisfy BE (AProxy :: AProxy Int16)
217−
218−-- | Parse one 16-bit little-endian signed integer that satisfies the given predicate.
219−satisfyInt16le :: forall m. MonadEffect m => (Int -> Boolean) -> ParserT DataView m Int
220−satisfyInt16le = satisfy LE (AProxy :: AProxy Int16)
221−
222−-- | Parse one 32-bit big-endian signed integer that satisfies the given predicate.
223−satisfyInt32be :: forall m. MonadEffect m => (Int -> Boolean) -> ParserT DataView m Int
224−satisfyInt32be = satisfy BE (AProxy :: AProxy Int32)
225−
226−-- | Parse one 32-bit little-endian signed integer that satisfies the given predicate.
227−satisfyInt32le :: forall m. MonadEffect m => (Int -> Boolean) -> ParserT DataView m Int
228−satisfyInt32le = satisfy LE (AProxy :: AProxy Int32)
229−
230−-- | Parse one 8-bit unsigned integer that satisfies the given predicate.
231−satisfyUint8 :: forall m. MonadEffect m => (UInt -> Boolean) -> ParserT DataView m UInt
232−satisfyUint8 = satisfy LE (AProxy :: AProxy Uint8)
233−
234−-- | Parse one 16-bit big-endian unsigned integer that satisfies the given predicate.
235−satisfyUint16be :: forall m. MonadEffect m => (UInt -> Boolean) -> ParserT DataView m UInt
236−satisfyUint16be = satisfy BE (AProxy :: AProxy Uint16)
237−
238−-- | Parse one 16-bit little-endian unsigned integer that satisfies the given predicate.
239−satisfyUint16le :: forall m. MonadEffect m => (UInt -> Boolean) -> ParserT DataView m UInt
240−satisfyUint16le = satisfy LE (AProxy :: AProxy Uint16)
241−
242−-- | Parse one 32-bit big-endian unsigned integer that satisfies the given predicate.
243−satisfyUint32be :: forall m. MonadEffect m => (UInt -> Boolean) -> ParserT DataView m UInt
244−satisfyUint32be = satisfy BE (AProxy :: AProxy Uint32)
245−
246−-- | Parse one 32-bit little-endian unsigned integer that satisfies the given predicate.
247−satisfyUint32le :: forall m. MonadEffect m => (UInt -> Boolean) -> ParserT DataView m UInt
248−satisfyUint32le = satisfy LE (AProxy :: AProxy Uint32)
249−
250−-- | Parse one 32-bit big-endian floating-point number that satisfies the given predicate.
251−satisfyFloat32be :: forall m. MonadEffect m => (Float32.Float32 -> Boolean) -> ParserT DataView m Float32.Float32
252−satisfyFloat32be = satisfy BE (AProxy :: AProxy Float32)
253−
254−-- | Parse one 32-bit little-endian floating-point number that satisfies the given predicate.
255−satisfyFloat32le :: forall m. MonadEffect m => (Float32.Float32 -> Boolean) -> ParserT DataView m Float32.Float32
256−satisfyFloat32le = satisfy LE (AProxy :: AProxy Float32)
257−
258−-- | Parse one 64-bit big-endian floating-point number that satisfies the given predicate.
259−satisfyFloat64be :: forall m. MonadEffect m => (Number -> Boolean) -> ParserT DataView m Number
260−satisfyFloat64be = satisfy BE (AProxy :: AProxy Float64)
261−
262−-- | Parse one 64-bit little-endian floating-point number that satisfies the given predicate.
263−satisfyFloat64le :: forall m. MonadEffect m => (Number -> Boolean) -> ParserT DataView m Number
264−satisfyFloat64le = satisfy LE (AProxy :: AProxy Float64)
265−
266−-- | Take *N* bytes starting from the current parser position. Will fail
267−-- | if not enough bytes remain in the input. Will fail if *N* is negative.
268−-- |
269−-- | #### Example
270−-- |
271−-- | Parse three bytes.
272−-- |
273−-- | takeViewN 3
274−-- |
275−takeN :: forall m. MonadEffect m => ByteLength -> ParserT DataView m DataView
276−takeN n = do
277− ParseState input (Position {line,column}) _ <- get
278− unless (n >= 0) $ fail $ "Cannot take negative number of bytes."
279− unless (column + n - 1 <= DV.byteLength input) $
280− fail $ "Cannot take " <> show n <> " bytes, only " <>
281− show (DV.byteLength input - column + 1) <> " bytes remain."
282− p <- lift $ liftEffect $ DV.part (DV.buffer input) (DV.byteOffset input + (column-1)) n
283− put $ ParseState input (Position {line,column:column+n}) true
284− pure p
285−
286−-- | Take the rest of the input, however many bytes remain. Always succeeds.
287−takeRest :: forall m. MonadEffect m => ParserT DataView m DataView
288−takeRest = do
289− ParseState input (Position {line,column}) _ <- get
290− p <- lift $ liftEffect $ DV.part (DV.buffer input) (DV.byteOffset input + (column-1))
291− (DV.byteLength input - (column-1))
292− put $ ParseState input (Position {line,column:DV.byteLength input + 1}) true
293− pure p
294−
295−-- | Parse succeeds at the end of the input DataView. Consumes no input.
296−eof :: forall m. Monad m => ParserT DataView m Unit
297−eof = do
298− ParseState input (Position {column}) _ <- get
299− unless (column > DV.byteLength input) $ fail "Expected end of DataView"
300−
301−-- ****************************** Notes ****************************************
302−--
303−-- The `initialPostion` in a `ParserT` is `Postion{line:1,column:1)`.
304−-- We keep `line` invariant and use `column-1` to denote the offset into the
305−-- `DataView`, that's why there are so many plus 1 and minus 1 operations
306−-- in this module.
307−-- https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html
308−--
309−-- We cannot have a primitive parser which parses a `DataView` and produces
310−-- an `ArrayView` (a Javascript Typed Array). Javascript DataViews are
311−-- endianess-aware, but Javascript Typed Arrays assume the native endianness
312−-- of the local machine. DataViews are intended to be used for I/O, ArrayViews
313−-- are intended to be used internally for graphics in a process, and they're
314−-- not intended to be both applied to the same ArrayBuffer.
src/Text/Parsing/Parser/Expr.pursdeleted−107
@@ -1,107 +0,0 @@
1−module Text.Parsing.Parser.Expr
2− ( Assoc(..)
3− , Operator(..)
4− , OperatorTable()
5− , buildExprParser
6− ) where
7−
8−import Prelude hiding (between)
9−
10−import Control.Alt ((<|>))
11−import Data.Foldable (foldr, foldl)
12−import Data.List (List(..), (:))
13−import Text.Parsing.Parser (ParserT)
14−import Text.Parsing.Parser.Combinators (choice, (<?>))
15−
16−data Assoc = AssocNone | AssocLeft | AssocRight
17−
18−data Operator m s a = Infix (ParserT s m (a -> a -> a)) Assoc
19− | Prefix (ParserT s m (a -> a))
20− | Postfix (ParserT s m (a -> a))
21−
22−type OperatorTable m s a = Array (Array (Operator m s a))
23−
24−type SplitAccum m s a = { rassoc :: List (ParserT s m (a -> a -> a))
25− , lassoc :: List (ParserT s m (a -> a -> a))
26− , nassoc :: List (ParserT s m (a -> a -> a))
27− , prefix :: List (ParserT s m (a -> a))
28− , postfix :: List (ParserT s m (a -> a)) }
29−
30−-- | Build a parser from an `OperatorTable`.
31−-- |
32−-- | For example:
33−-- |
34−-- | ```purescript
35−-- | buildExprParser [ [ Infix (string "/" $> div) AssocRight ]
36−-- | , [ Infix (string "*" $> mul) AssocRight ]
37−-- | , [ Infix (string "-" $> sub) AssocRight ]
38−-- | , [ Infix (string "+" $> add) AssocRight ]
39−-- | ] digit
40−-- | ```
41−buildExprParser :: forall m s a. Monad m => OperatorTable m s a -> ParserT s m a -> ParserT s m a
42−buildExprParser operators simpleExpr = foldl makeParser simpleExpr operators
43−
44−makeParser :: forall m s a. Monad m => ParserT s m a -> Array (Operator m s a) -> ParserT s m a
45−makeParser term ops = do
46− x <- termP prefixP term postfixP
47− rassocP x rassocOp prefixP term postfixP
48− <|> lassocP x lassocOp prefixP term postfixP
49− <|> nassocP x nassocOp prefixP term postfixP
50− <|> pure x
51− <?> "operator"
52− where
53− accum = foldr splitOp { rassoc: Nil
54− , lassoc: Nil
55− , nassoc: Nil
56− , prefix: Nil
57− , postfix: Nil
58− } ops
59−
60− rassocOp = choice accum.rassoc
61− lassocOp = choice accum.lassoc
62− nassocOp = choice accum.nassoc
63− prefixOp = choice accum.prefix <?> ""
64− postfixOp = choice accum.postfix <?> ""
65−
66− postfixP = postfixOp <|> pure identity
67− prefixP = prefixOp <|> pure identity
68−
69−splitOp :: forall m s a. Operator m s a -> SplitAccum m s a -> SplitAccum m s a
70−splitOp (Infix op AssocNone) accum = accum { nassoc = op : accum.nassoc }
71−splitOp (Infix op AssocLeft) accum = accum { lassoc = op : accum.lassoc }
72−splitOp (Infix op AssocRight) accum = accum { rassoc = op : accum.rassoc }
73−splitOp (Prefix op) accum = accum { prefix = op : accum.prefix }
74−splitOp (Postfix op) accum = accum { postfix = op : accum.postfix }
75−
76−rassocP :: forall m a b c s. Monad m => a -> ParserT s m (a -> a -> a) -> ParserT s m (b -> c) -> ParserT s m b -> ParserT s m (c -> a) -> ParserT s m a
77−rassocP x rassocOp prefixP term postfixP = do
78− f <- rassocOp
79− y <- do
80− z <- termP prefixP term postfixP
81− rassocP1 z rassocOp prefixP term postfixP
82− pure (f x y)
83−
84−rassocP1 :: forall m a b c s. Monad m => a -> ParserT s m (a -> a -> a) -> ParserT s m (b -> c) -> ParserT s m b -> ParserT s m (c -> a) -> ParserT s m a
85−rassocP1 x rassocOp prefixP term postfixP = rassocP x rassocOp prefixP term postfixP <|> pure x
86−
87−lassocP :: forall m a b c s. Monad m => a -> ParserT s m (a -> a -> a) -> ParserT s m (b -> c) -> ParserT s m b -> ParserT s m (c -> a) -> ParserT s m a
88−lassocP x lassocOp prefixP term postfixP = do
89− f <- lassocOp
90− y <- termP prefixP term postfixP
91− lassocP1 (f x y) lassocOp prefixP term postfixP
92−
93−lassocP1 :: forall m a b c s. Monad m => a -> ParserT s m (a -> a -> a) -> ParserT s m (b -> c) -> ParserT s m b -> ParserT s m (c -> a) -> ParserT s m a
94−lassocP1 x lassocOp prefixP term postfixP = lassocP x lassocOp prefixP term postfixP <|> pure x
95−
96−nassocP :: forall m a b c d e s. Monad m => a -> ParserT s m (a -> d -> e) -> ParserT s m (b -> c) -> ParserT s m b -> ParserT s m (c -> d) -> ParserT s m e
97−nassocP x nassocOp prefixP term postfixP = do
98− f <- nassocOp
99− y <- termP prefixP term postfixP
100− pure (f x y)
101−
102−termP :: forall m s a b c. Monad m => ParserT s m (a -> b) -> ParserT s m a -> ParserT s m (b -> c) -> ParserT s m c
103−termP prefixP term postfixP = do
104− pre <- prefixP
105− x <- term
106− post <- postfixP
107− pure (post (pre x))
src/Text/Parsing/Parser/Indent.pursdeleted−219
@@ -1,219 +0,0 @@
1−-- | This is purescript-port of Text.Parsing.Indent
2−-- | <https://hackage.haskell.org/package/indents-0.3.3/docs/Text-Parsec-Indent.html>, 05.07.2016.
3−-- | A module to construct indentation aware parsers. Many programming
4−-- | language have indentation based syntax rules e.g. python and Haskell.
5−-- | This module exports combinators to create such parsers.
6−-- |
7−-- | The input source can be thought of as a list of tokens. Abstractly
8−-- | each token occurs at a line and a column and has a width. The column
9−-- | number of a token measures is indentation. If t1 and t2 are two tokens
10−-- | then we say that indentation of t1 is more than t2 if the column
11−-- | number of occurrence of t1 is greater than that of t2.
12−-- |
13−-- | Currently this module supports two kind of indentation based syntactic
14−-- | structures which we now describe:
15−-- |
16−-- | - **Block**
17−-- |
18−-- | A block of indentation /c/ is a sequence of tokens with
19−-- | indentation at least /c/. Examples for a block is a where clause of
20−-- | Haskell with no explicit braces.
21−-- |
22−-- | - **Line fold**
23−-- |
24−-- | A line fold starting at line /l/ and indentation /c/ is a
25−-- | sequence of tokens that start at line /l/ and possibly continue to
26−-- | subsequent lines as long as the indentation is greater than /c/. Such
27−-- | a sequence of lines need to be /folded/ to a single line. An example
28−-- | is MIME headers. Line folding based binding separation is used in
29−-- | Haskell as well.
30−module Text.Parsing.Indent
31− ( IndentParser
32− , runIndent
33− , withBlock
34− , withBlock'
35− , block
36− , block1
37− , indented
38− , indented'
39− , sameLine
40− , sameOrIndented
41− , checkIndent
42− , withPos
43− , indentAp
44− , (<+/>)
45− , indentNoAp
46− , (<-/>)
47− , indentMany
48− , (<*/>)
49− , indentOp
50− , (<?/>)
51− , Optional(..)
52− ) where
53−
54−import Prelude
55−import Control.Alt ((<|>))
56−import Control.Apply (lift2)
57−import Control.Monad.State (gets, State, evalState)
58−import Control.Monad.State.Trans (get, put)
59−import Control.Monad.Trans.Class (lift)
60−import Data.List (List(..), many)
61−import Data.Maybe (Maybe(..))
62−import Text.Parsing.Parser (ParserT, ParseState(ParseState), fail)
63−import Text.Parsing.Parser.Combinators (option, optionMaybe)
64−import Text.Parsing.Parser.Pos (Position(..), initialPos)
65−import Text.Parsing.Parser.String (string, oneOf)
66−
67−-- | Indentation sensitive parser type. Usually @ m @ will
68−-- | be @ Identity @ as with any @ ParserT @
69−type IndentParser s a = ParserT s (State Position) a
70−
71−-- | @ getPosition @ returns current position
72−-- | should probably be added to Text.Parsing.Parser.Pos
73−getPosition :: forall m s. (Monad m) => ParserT s m Position
74−getPosition = gets \(ParseState _ pos _) -> pos
75−
76−-- | simple helper function to avoid typ-problems with MonadState instance
77−get' :: forall s. IndentParser s Position
78−get' = do
79− g <- lift get
80− pure g
81−
82−-- | simple helper function to avoid typ-problems with MonadState instance
83−put' :: forall s. Position -> IndentParser s Unit
84−put' p = lift (put p)
85−
86−sourceColumn :: Position -> Int
87−sourceColumn (Position {line: _, column: c}) = c
88−
89−sourceLine :: Position -> Int
90−sourceLine (Position {line: l, column: _}) = l
91−
92−setSourceLine :: Position -> Int -> Position
93−setSourceLine (Position {line: _, column: c}) l = Position {line: l, column: c}
94−
95−biAp :: forall a b c. (a -> b) -> (b -> b -> c) -> a -> a -> c
96−biAp f c v1 v2 = c (f v1) (f v2)
97−
98−-- | @ many1 @ should prabably be inside Text.Parsing.Parser.Combinators
99−many1 :: forall s m a. (Monad m) => ParserT s m a -> ParserT s m (List a)
100−many1 p = lift2 Cons p (many p)
101−
102−symbol :: forall m. (Monad m) => String -> ParserT String m String
103−symbol name = (many $ oneOf [' ','\t']) *> (string name)
104−
105−-- | `withBlock f a p` parses `a`
106−-- | followed by an indented block of `p`
107−-- | combining them with `f`.
108−withBlock :: forall a b c s. (a -> List b -> c) -> IndentParser s a -> IndentParser s b -> IndentParser s c
109−withBlock f a p = withPos $ do
110− r1 <- a
111− r <- optionMaybe $ indented *> block p
112− case r of
113− Nothing -> pure (f r1 Nil)
114− Just r2 -> pure (f r1 r2)
115−
116−-- | Like 'withBlock', but throws away initial parse result
117−withBlock' :: forall a b s. IndentParser s a -> IndentParser s b -> IndentParser s (List b)
118−withBlock' = withBlock (flip const)
119−
120−-- | Parses only when indented past the level of the reference
121−indented :: forall s. IndentParser s Unit
122−indented = do
123− pos <- getPosition
124− s <- get'
125− if biAp sourceColumn (<=) pos s then fail "not indented" else do
126− put' $ setSourceLine s (sourceLine pos)
127− pure unit
128−
129−-- | Same as `indented`, but does not change internal state
130−indented' :: forall s. IndentParser s Unit
131−indented' = do
132− pos <- getPosition
133− s <- get'
134− if biAp sourceColumn (<=) pos s then fail "not indented" else pure unit
135−
136−-- | Parses only when indented past the level of the reference or on the same line
137−sameOrIndented :: forall s. IndentParser s Unit
138−sameOrIndented = sameLine <|> indented
139−
140−-- | Parses only on the same line as the reference
141−sameLine :: forall s. IndentParser s Unit
142−sameLine = do
143− pos <- getPosition
144− s <- get'
145− if biAp sourceLine (==) pos s then pure unit else fail "over one line"
146−
147−-- | Parses a block of lines at the same indentation level
148−block1 :: forall s a. IndentParser s a -> IndentParser s (List a)
149−block1 p = withPos $ do
150− r <- many1 $ checkIndent *> p
151− pure r
152−
153−-- | Parses a block of lines at the same indentation level , empty Blocks allowed
154−block :: forall s a. IndentParser s a -> IndentParser s (List a)
155−block p = withPos $ do
156− r <- many $ checkIndent *> p
157− pure r
158−
159−-- | Parses using the current location for indentation reference
160−withPos :: forall s a. IndentParser s a -> IndentParser s a
161−withPos x = do
162− a <- get'
163− p <- getPosition
164− r <- put' p *> x
165− put' a *> pure r
166−
167−-- | Ensures the current indentation level matches that of the reference
168−checkIndent :: forall s. IndentParser s Unit
169−checkIndent = do
170− s <- get'
171− p <- getPosition
172− if biAp sourceColumn (==) p s then pure unit else fail "indentation doesn't match"
173−
174−-- | Run the result of an indentation sensitive parse
175−runIndent :: forall a. State Position a -> a
176−runIndent = flip evalState initialPos
177−
178−-- | `<+/>` is to indentation sensitive parsers what `ap` is to monads
179−indentAp :: forall s a b. IndentParser s (a -> b) -> IndentParser s a -> IndentParser s b
180−indentAp a b = ap a $ sameOrIndented *> b
181−
182−infixl 9 indentAp as <+/>
183−
184−-- | Like `<+/>` but doesn't apply the function to the parsed value
185−indentNoAp :: forall s a b. IndentParser s a -> IndentParser s b -> IndentParser s a
186−indentNoAp a b = lift2 const a $ sameOrIndented *> b
187−
188−infixl 10 indentNoAp as <-/>
189−
190−-- | Like `<+/>` but applies the second parser many times
191−indentMany :: forall s a b. IndentParser s (List a -> b) -> IndentParser s a -> IndentParser s b
192−indentMany a b = ap a (many (sameOrIndented *> b))
193−
194−infixl 11 indentMany as <*/>
195−
196−-- | Data type used to optional parsing
197−data Optional s a = Opt a (IndentParser s a)
198−
199−-- | Like `<+/>` but applies the second parser optionally using the `Optional` datatype
200−indentOp :: forall s a b. IndentParser s (a -> b) -> Optional s a -> IndentParser s b
201−indentOp a (Opt b c) = ap a (option b (sameOrIndented *> c))
202−
203−infixl 12 indentOp as <?/>
204−
205−-- | Parses with surrounding brackets
206−indentBrackets :: forall a. IndentParser String a -> IndentParser String a
207−indentBrackets p = withPos $ pure identity <-/> symbol "[" <+/> p <-/> symbol "]"
208−
209−-- | Parses with surrounding angle brackets
210−indentAngles :: forall a. IndentParser String a -> IndentParser String a
211−indentAngles p = withPos $ pure identity <-/> symbol "<" <+/> p <-/> symbol ">"
212−
213−-- | Parses with surrounding braces
214−indentBraces :: forall a. IndentParser String a -> IndentParser String a
215−indentBraces p = withPos $ pure identity <-/> symbol "{" <+/> p <-/> symbol "}"
216−
217−-- | Parses with surrounding parentheses
218−indentParens :: forall a. IndentParser String a -> IndentParser String a
219−indentParens p = withPos $ pure identity <-/> symbol "(" <+/> p <-/> symbol ")"
src/Text/Parsing/Parser/Language.pursdeleted−118
@@ -1,118 +0,0 @@
1−
2−module Text.Parsing.Parser.Language
3− ( haskellDef
4− , haskell
5− , emptyDef
6− , haskellStyle
7− , javaStyle
8− )
9− where
10−
11−import Prelude
12−
13−import Control.Alt ((<|>))
14−import Text.Parsing.Parser (ParserT)
15−import Text.Parsing.Parser.String (char, oneOf)
16−import Text.Parsing.Parser.Token (LanguageDef, TokenParser, GenLanguageDef(..), unGenLanguageDef, makeTokenParser, alphaNum, letter)
17−
18−-----------------------------------------------------------
19−-- Styles: haskellStyle, javaStyle
20−-----------------------------------------------------------
21−
22−-- | This is a minimal token definition for Haskell style languages. It
23−-- | defines the style of comments, valid identifiers and case
24−-- | sensitivity. It does not define any reserved words or operators.
25−haskellStyle :: LanguageDef
26−haskellStyle = LanguageDef (unGenLanguageDef emptyDef)
27− { commentStart = "{-"
28− , commentEnd = "-}"
29− , commentLine = "--"
30− , nestedComments = true
31− , identStart = letter
32− , identLetter = alphaNum <|> oneOf ['_', '\'']
33− , opStart = op'
34− , opLetter = op'
35− , reservedOpNames = []
36− , reservedNames = []
37− , caseSensitive = true
38− }
39− where
40− op' :: forall m . (Monad m) => ParserT String m Char
41− op' = oneOf [':', '!', '#', '$', '%', '&', '*', '+', '.', '/', '<', '=', '>', '?', '@', '\\', '^', '|', '-', '~']
42−
43−-- | This is a minimal token definition for Java style languages. It
44−-- | defines the style of comments, valid identifiers and case
45−-- | sensitivity. It does not define any reserved words or operators.
46−javaStyle :: LanguageDef
47−javaStyle = LanguageDef (unGenLanguageDef emptyDef)
48− { commentStart = "/*"
49− , commentEnd = "*/"
50− , commentLine = "//"
51− , nestedComments = true
52− , identStart = letter <|> oneOf ['_', '$']
53− , identLetter = alphaNum <|> oneOf ['_', '$']
54− , reservedNames = []
55− , reservedOpNames = []
56− , caseSensitive = false
57− }
58−
59−-----------------------------------------------------------
60−-- minimal language definition
61−--------------------------------------------------------
62−
63−-- | This is the most minimal token definition. It is recommended to use
64−-- | this definition as the basis for other definitions. `emptyDef` has
65−-- | no reserved names or operators, is case sensitive and doesn't accept
66−-- | comments, identifiers or operators.
67−emptyDef :: LanguageDef
68−emptyDef = LanguageDef
69− { commentStart: ""
70− , commentEnd: ""
71− , commentLine: ""
72− , nestedComments: true
73− , identStart: letter <|> char '_'
74− , identLetter: alphaNum <|> oneOf ['_', '\'']
75− , opStart: op'
76− , opLetter: op'
77− , reservedOpNames: []
78− , reservedNames: []
79− , caseSensitive: true
80− }
81− where
82− op' :: forall m . (Monad m) => ParserT String m Char
83− op' = oneOf [':', '!', '#', '$', '%', '&', '*', '+', '.', '/', '<', '=', '>', '?', '@', '\\', '^', '|', '-', '~']
84−
85−-- -----------------------------------------------------------
86−-- -- Haskell
87−-- -----------------------------------------------------------
88−
89−-- | A lexer for the haskell language.
90−haskell :: TokenParser
91−haskell = makeTokenParser haskellDef
92−
93−-- | The language definition for the Haskell language.
94−haskellDef :: LanguageDef
95−haskellDef =
96− case haskell98Def of
97− (LanguageDef def) -> LanguageDef def
98− { identLetter = def.identLetter <|> char '#'
99− , reservedNames = def.reservedNames <>
100− ["foreign","import","export","primitive"
101− ,"_ccall_","_casm_"
102− ,"forall"
103− ]
104− }
105−
106−-- | The language definition for the language Haskell98.
107−haskell98Def :: LanguageDef
108−haskell98Def = LanguageDef (unGenLanguageDef haskellStyle)
109− { reservedOpNames = ["::","..","=","\\","|","<-","->","@","~","=>"]
110− , reservedNames = [ "let","in","case","of","if","then","else"
111− , "data","type"
112− , "class","default","deriving","do","import"
113− , "infix","infixl","infixr","instance","module"
114− , "newtype","where"
115− , "primitive"
116− -- "as","qualified","hiding"
117− ]
118− }
src/Text/Parsing/Parser/Pos.pursdeleted−36
@@ -1,36 +0,0 @@
1−module Text.Parsing.Parser.Pos where
2−
3−import Prelude
4−import Data.Foldable (foldl)
5−import Data.Newtype (wrap)
6−import Data.String (split)
7−
8−-- | `Position` represents the position of the parser in the input.
9−-- |
10−-- | - `line` is the current line in the input
11−-- | - `column` is the column of the next character in the current line that will be parsed
12−newtype Position = Position
13− { line :: Int
14− , column :: Int
15− }
16−
17−instance showPosition :: Show Position where
18− show (Position { line: line, column: column }) =
19− "(Position { line: " <> show line <> ", column: " <> show column <> " })"
20−
21−derive instance eqPosition :: Eq Position
22−derive instance ordPosition :: Ord Position
23−
24−-- | The `Position` before any input has been parsed is line 1, column 1.
25−initialPos :: Position
26−initialPos = Position { line: 1, column: 1 }
27−
28−-- | Updates a `Position` by adding the columns and lines in `String`.
29−updatePosString :: Position -> String -> Position
30−updatePosString pos' str = foldl updatePosChar pos' (split (wrap "") str)
31− where
32− updatePosChar (Position pos) c = case c of
33− "\n" -> Position { line: pos.line + 1, column: 1 }
34− "\r" -> Position { line: pos.line + 1, column: 1 }
35− "\t" -> Position { line: pos.line, column: pos.column + 8 - ((pos.column - 1) `mod` 8) }
36− _ -> Position { line: pos.line, column: pos.column + 1 }
src/Text/Parsing/Parser/String.pursdeleted−92
@@ -1,92 +0,0 @@
1−-- | Primitive parsers for working with an input stream of type `String`.
2−
3−module Text.Parsing.Parser.String where
4−
5−import Prelude hiding (between)
6−
7−import Control.Monad.State (gets, modify_)
8−import Data.Array (many)
9−import Data.Foldable (elem, notElem)
10−import Data.Maybe (Maybe(..))
11−import Data.Newtype (wrap)
12−import Data.String (Pattern, length)
13−import Data.String as S
14−import Data.String.CodeUnits as SCU
15−import Text.Parsing.Parser (ParseState(..), ParserT, fail)
16−import Text.Parsing.Parser.Combinators (tryRethrow, (<?>))
17−import Text.Parsing.Parser.Pos (updatePosString)
18−
19−-- | This class exists to abstract over streams which support the string-like
20−-- | operations which this modules needs.
21−class StringLike s where
22− drop :: Int -> s -> s
23− indexOf :: Pattern -> s -> Maybe Int
24− null :: s -> Boolean
25− uncons :: s -> Maybe { head :: Char, tail :: s }
26−
27−instance stringLikeString :: StringLike String where
28− uncons = SCU.uncons
29− drop = S.drop
30− indexOf = S.indexOf
31− null = S.null
32−
33−-- | Match end-of-file.
34−eof :: forall s m. StringLike s => Monad m => ParserT s m Unit
35−eof = do
36− input <- gets \(ParseState input _ _) -> input
37− unless (null input) (fail "Expected EOF")
38−
39−-- | Match the specified string.
40−string :: forall s m. StringLike s => Monad m => String -> ParserT s m String
41−string str = do
42− input <- gets \(ParseState input _ _) -> input
43− case indexOf (wrap str) input of
44− Just 0 -> do
45− modify_ \(ParseState _ position _) ->
46− ParseState (drop (length str) input)
47− (updatePosString position str)
48− true
49− pure str
50− _ -> fail ("Expected " <> show str)
51−
52−-- | Match any character.
53−anyChar :: forall s m. StringLike s => Monad m => ParserT s m Char
54−anyChar = do
55− input <- gets \(ParseState input _ _) -> input
56− case uncons input of
57− Nothing -> fail "Unexpected EOF"
58− Just { head, tail } -> do
59− modify_ \(ParseState _ position _) ->
60− ParseState tail
61− (updatePosString position (SCU.singleton head))
62− true
63− pure head
64−
65−-- | Match a character satisfying the specified predicate.
66−satisfy :: forall s m. StringLike s => Monad m => (Char -> Boolean) -> ParserT s m Char
67−satisfy f = tryRethrow do
68− c <- anyChar
69− if f c then pure c
70− else fail $ "Character '" <> SCU.singleton c <> "' did not satisfy predicate"
71−
72−-- | Match the specified character
73−char :: forall s m. StringLike s => Monad m => Char -> ParserT s m Char
74−char c = satisfy (_ == c) <?> show c
75−
76−-- | Match zero or more whitespace characters.
77−whiteSpace :: forall s m. StringLike s => Monad m => ParserT s m String
78−whiteSpace = do
79− cs <- many $ satisfy \c -> c == '\n' || c == '\r' || c == ' ' || c == '\t'
80− pure $ SCU.fromCharArray cs
81−
82−-- | Skip whitespace characters.
83−skipSpaces :: forall s m. StringLike s => Monad m => ParserT s m Unit
84−skipSpaces = void whiteSpace
85−
86−-- | Match one of the characters in the array.
87−oneOf :: forall s m. StringLike s => Monad m => Array Char -> ParserT s m Char
88−oneOf ss = satisfy (flip elem ss) <?> ("one of " <> show ss)
89−
90−-- | Match any character not in the array.
91−noneOf :: forall s m. StringLike s => Monad m => Array Char -> ParserT s m Char
92−noneOf ss = satisfy (flip notElem ss) <?> ("none of " <> show ss)
src/Text/Parsing/Parser/Token.pursdeleted−809
@@ -1,809 +0,0 @@
1−-- | Functions for working with streams of tokens.
2−
3−module Text.Parsing.Parser.Token
4− ( token
5− , when
6− , match
7− , LanguageDef
8− , GenLanguageDef(LanguageDef)
9− , unGenLanguageDef
10− , TokenParser
11− , GenTokenParser
12− , makeTokenParser
13− -- should these be exported? Maybe they should go in a different module?
14− , digit
15− , hexDigit
16− , octDigit
17− , upper
18− , space
19− , letter
20− , alphaNum
21− )
22− where
23−
24−import Prelude hiding (when,between)
25−
26−import Control.Lazy (fix)
27−import Control.Monad.State (gets, modify_)
28−import Control.MonadPlus (guard, (<|>))
29−import Data.Array as Array
30−import Data.Char (fromCharCode, toCharCode)
31−import Data.Char.Unicode (digitToInt, isAlpha, isAlphaNum, isDigit, isHexDigit, isOctDigit, isSpace, isUpper)
32−import Data.Char.Unicode as Unicode
33−import Data.Either (Either(..))
34−import Data.Foldable (foldl, foldr)
35−import Data.Identity (Identity)
36−import Data.Int (toNumber)
37−import Data.List (List(..))
38−import Data.List as List
39−import Data.Maybe (Maybe(..), maybe)
40−import Data.String (null, toLower)
41−import Data.String.CodeUnits as SCU
42−import Data.Tuple (Tuple(..))
43−import Math (pow)
44−import Text.Parsing.Parser (ParseState(..), ParserT, fail)
45−import Text.Parsing.Parser.Combinators (skipMany1, try, tryRethrow, skipMany, notFollowedBy, option, choice, between, sepBy1, sepBy, (<?>), (<??>))
46−import Text.Parsing.Parser.Pos (Position)
47−import Text.Parsing.Parser.String (satisfy, oneOf, noneOf, string, char)
48−
49−-- | Create a parser which Returns the first token in the stream.
50−token :: forall m a. Monad m => (a -> Position) -> ParserT (List a) m a
51−token tokpos = do
52− input <- gets \(ParseState input _ _) -> input
53− case List.uncons input of
54− Nothing -> fail "Unexpected EOF"
55− Just { head, tail } -> do
56− modify_ \(ParseState _ position _) ->
57− ParseState tail (tokpos head) true
58− pure head
59−
60−-- | Create a parser which matches any token satisfying the predicate.
61−when :: forall m a. Monad m => (a -> Position) -> (a -> Boolean) -> ParserT (List a) m a
62−when tokpos f = tryRethrow do
63− a <- token tokpos
64− guard $ f a
65− pure a
66−
67−-- | Match the specified token at the head of the stream.
68−match :: forall a m. Monad m => Eq a => (a -> Position) -> a -> ParserT (List a) m a
69−match tokpos tok = when tokpos (_ == tok)
70−
71−type LanguageDef = GenLanguageDef String Identity
72−
73−-- | The `GenLanguageDef` type is a record that contains all parameterizable
74−-- | features of the "Text.Parsec.Token" module. The module `Text.Parsec.Language`
75−-- | contains some default definitions.
76−newtype GenLanguageDef s m
77− = LanguageDef {
78− -- | Describes the start of a block comment. Use the empty string if the
79− -- | language doesn't support block comments. For example `/*`.
80− commentStart :: String,
81− -- | Describes the end of a block comment. Use the empty string if the
82− -- | language doesn't support block comments. For example `*/`.
83− commentEnd :: String,
84− -- | Describes the start of a line comment. Use the empty string if the
85− -- | language doesn't support line comments. For example `//`.
86− commentLine :: String,
87− -- | Set to `true` if the language supports nested block comments.
88− nestedComments :: Boolean,
89− -- | This parser should accept any start characters of identifiers. For
90− -- | example `letter <|> char '_'`.
91− identStart :: ParserT s m Char,
92− -- | This parser should accept any legal tail characters of identifiers.
93− -- | For example `alphaNum <|> char '_'`.
94− identLetter :: ParserT s m Char,
95− -- | This parser should accept any start characters of operators. For
96− -- | example `oneOf [':', '+', '=']`.
97− opStart :: ParserT s m Char,
98− -- | This parser should accept any legal tail characters of operators.
99− -- | Note that this parser should even be defined if the language doesn't
100− -- | support user-defined operators, or otherwise the `reservedOp`
101− -- | parser won't work correctly.
102− opLetter :: ParserT s m Char,
103− -- | The list of reserved identifiers.
104− reservedNames :: Array String,
105− -- | The list of reserved operators.
106− reservedOpNames:: Array String,
107− -- | Set to `true` if the language is case sensitive.
108− caseSensitive :: Boolean
109− }
110−
111−unGenLanguageDef :: forall s m . GenLanguageDef s m -> { caseSensitive :: Boolean
112− , reservedOpNames :: Array String
113− , reservedNames :: Array String
114− , opLetter :: ParserT s m Char
115− , opStart :: ParserT s m Char
116− , identLetter :: ParserT s m Char
117− , identStart :: ParserT s m Char
118− , nestedComments :: Boolean
119− , commentLine :: String
120− , commentEnd :: String
121− , commentStart :: String
122− }
123−unGenLanguageDef (LanguageDef langDef) = langDef
124−
125−-----------------------------------------------------------
126−-- A first class module: TokenParser
127−-----------------------------------------------------------
128−
129−type TokenParser = GenTokenParser String Identity
130−
131−-- | The type of the record that holds lexical parsers that work on
132−-- | `s` streams over a monad `m`.
133−type GenTokenParser s m
134− = {
135− -- | This lexeme parser parses a legal identifier. Returns the identifier
136− -- | string. This parser will fail on identifiers that are reserved
137− -- | words. Legal identifier (start) characters and reserved words are
138− -- | defined in the `LanguageDef` that is passed to
139− -- | `makeTokenParser`. An `identifier` is treated as
140− -- | a single token using `try`.
141− identifier :: ParserT s m String,
142− -- | The lexeme parser `reserved name` parses `symbol
143− -- | name`, but it also checks that the `name` is not a prefix of a
144− -- | valid identifier. A `reserved` word is treated as a single token
145− -- | using `try`.
146− reserved :: String -> ParserT s m Unit,
147− -- | This lexeme parser parses a legal operator. Returns the name of the
148− -- | operator. This parser will fail on any operators that are reserved
149− -- | operators. Legal operator (start) characters and reserved operators
150− -- | are defined in the `LanguageDef` that is passed to
151− -- | `makeTokenParser`. An `operator` is treated as a
152− -- | single token using `try`.
153− operator :: ParserT s m String,
154− -- |The lexeme parser `reservedOp name` parses `symbol
155− -- | name`, but it also checks that the `name` is not a prefix of a
156− -- | valid operator. A `reservedOp` is treated as a single token using
157− -- | `try`.
158− reservedOp :: String -> ParserT s m Unit,
159− -- | This lexeme parser parses a single literal character. Returns the
160− -- | literal character value. This parsers deals correctly with escape
161− -- | sequences. The literal character is parsed according to the grammar
162− -- | rules defined in the Haskell report (which matches most programming
163− -- | languages quite closely).
164− charLiteral :: ParserT s m Char,
165− -- | This lexeme parser parses a literal string. Returns the literal
166− -- | string value. This parsers deals correctly with escape sequences and
167− -- | gaps. The literal string is parsed according to the grammar rules
168− -- | defined in the Haskell report (which matches most programming
169− -- | languages quite closely).
170− stringLiteral :: ParserT s m String,
171− -- | This lexeme parser parses a natural number (a positive whole
172− -- | number). Returns the value of the number. The number can be
173− -- | specified in `decimal`, `hexadecimal` or
174− -- | `octal`. The number is parsed according to the grammar
175− -- | rules in the Haskell report.
176− natural :: ParserT s m Int,
177− -- | This lexeme parser parses an integer (a whole number). This parser
178− -- | is like `natural` except that it can be prefixed with
179− -- | sign (i.e. `-` or `+`). Returns the value of the number. The
180− -- | number can be specified in `decimal`, `hexadecimal`
181− -- | or `octal`. The number is parsed according
182− -- | to the grammar rules in the Haskell report.
183− integer :: ParserT s m Int,
184− -- | This lexeme parser parses a floating point value. Returns the value
185− -- | of the number. The number is parsed according to the grammar rules
186− -- | defined in the Haskell report.
187− float :: ParserT s m Number,
188− -- | This lexeme parser parses either `natural` or a `float`.
189− -- | Returns the value of the number. This parsers deals with
190− -- | any overlap in the grammar rules for naturals and floats. The number
191− -- | is parsed according to the grammar rules defined in the Haskell report.
192− naturalOrFloat :: ParserT s m (Either Int Number),
193− -- | Parses a positive whole number in the decimal system. Returns the
194− -- | value of the number.
195− decimal :: ParserT s m Int,
196− -- | Parses a positive whole number in the hexadecimal system. The number
197− -- | should be prefixed with `0x` or `0X`. Returns the value of the
198− -- | number.
199− hexadecimal :: ParserT s m Int,
200− -- | Parses a positive whole number in the octal system. The number
201− -- | should be prefixed with `0o` or `0O`. Returns the value of the
202− -- | number.
203− octal :: ParserT s m Int,
204− -- | Lexeme parser `symbol s` parses `string` `s` and skips
205− -- | trailing white space.
206− symbol :: String -> ParserT s m String,
207− -- | `lexeme p` first applies parser `p` and than the `whiteSpace`
208− -- | parser, returning the value of `p`. Every lexical
209− -- | token (lexeme) is defined using `lexeme`, this way every parse
210− -- | starts at a point without white space. Parsers that use `lexeme` are
211− -- | called *lexeme* parsers in this document.
212− -- |
213− -- | The only point where the `whiteSpace` parser should be
214− -- | called explicitly is the start of the main parser in order to skip
215− -- | any leading white space.
216− -- |
217− -- | ```purescript
218− -- | mainParser = do
219− -- | whiteSpace
220− -- | ds <- many (lexeme digit)
221− -- | eof
222− -- | pure (sum ds)
223− -- | ```
224− lexeme :: forall a. ParserT s m a -> ParserT s m a,
225− -- | Parses any white space. White space consists of *zero* or more
226− -- | occurrences of a `space`, a line comment or a block (multi
227− -- | line) comment. Block comments may be nested. How comments are
228− -- | started and ended is defined in the `LanguageDef`
229− -- | that is passed to `makeTokenParser`.
230− whiteSpace :: ParserT s m Unit,
231− -- | Lexeme parser `parens p` parses `p` enclosed in parenthesis,
232− -- | returning the value of `p`.
233− parens :: forall a. ParserT s m a -> ParserT s m a,
234− -- | Lexeme parser `braces p` parses `p` enclosed in braces (`{` and
235− -- | `}`), returning the value of `p`.
236− braces :: forall a. ParserT s m a -> ParserT s m a,
237− -- | Lexeme parser `angles p` parses `p` enclosed in angle brackets (`<`
238− -- | and `>`), returning the value of `p`.
239− angles :: forall a. ParserT s m a -> ParserT s m a,
240− -- | Lexeme parser `brackets p` parses `p` enclosed in brackets (`[`
241− -- | and `]`), returning the value of `p`.
242− brackets :: forall a. ParserT s m a -> ParserT s m a,
243− -- | Lexeme parser `semi` parses the character `;` and skips any
244− -- | trailing white space. Returns the string `;`.
245− semi :: ParserT s m String,
246− -- | Lexeme parser `comma` parses the character `,` and skips any
247− -- | trailing white space. Returns the string `,`.
248− comma :: ParserT s m String,
249− -- | Lexeme parser `colon` parses the character `:` and skips any
250− -- | trailing white space. Returns the string `:`.
251− colon :: ParserT s m String,
252− -- | Lexeme parser `dot` parses the character `.` and skips any
253− -- | trailing white space. Returns the string `.`.
254− dot :: ParserT s m String,
255− -- | Lexeme parser `semiSep p` parses *zero* or more occurrences of `p`
256− -- | separated by `semi`. Returns a list of values pureed by
257− -- | `p`.
258− semiSep :: forall a . ParserT s m a -> ParserT s m (List a),
259− -- | Lexeme parser `semiSep1 p` parses *one* or more occurrences of `p`
260− -- | separated by `semi`. Returns a list of values pureed by `p`.
261− semiSep1 :: forall a . ParserT s m a -> ParserT s m (List a),
262− -- | Lexeme parser `commaSep p` parses *zero* or more occurrences of
263− -- | `p` separated by `comma`. Returns a list of values pureed
264− -- | by `p`.
265− commaSep :: forall a . ParserT s m a -> ParserT s m (List a),
266− -- | Lexeme parser `commaSep1 p` parses *one* or more occurrences of
267− -- | `p` separated by `comma`. Returns a list of values pureed
268− -- | by `p`.
269− commaSep1 :: forall a . ParserT s m a -> ParserT s m (List a)
270− }
271−
272−-----------------------------------------------------------
273−-- Given a LanguageDef, create a token parser.
274−-----------------------------------------------------------
275−
276−-- | The expression `makeTokenParser language` creates a `GenTokenParser`
277−-- | record that contains lexical parsers that are
278−-- | defined using the definitions in the `language` record.
279−-- |
280−-- | The use of this function is quite stylized - one imports the
281−-- | appropiate language definition and selects the lexical parsers that
282−-- | are needed from the resulting `GenTokenParser`.
283−-- |
284−-- | ```purescript
285−-- | module Main where
286−-- |
287−-- | import Text.Parsing.Parser.Language (haskellDef)
288−-- | import Text.Parsing.Parser.Token (makeTokenParser)
289−-- |
290−-- | -- The parser
291−-- | expr = parens expr
292−-- | <|> identifier
293−-- | <|> ...
294−-- |
295−-- |
296−-- | -- The lexer
297−-- | tokenParser = makeTokenParser haskellDef
298−-- | parens = tokenParser.parens
299−-- | braces = tokenParser.braces
300−-- | identifier = tokenParser.identifier
301−-- | reserved = tokenParser.reserved
302−-- | ...
303−-- | ```
304−makeTokenParser :: forall m . Monad m => GenLanguageDef String m -> GenTokenParser String m
305−makeTokenParser (LanguageDef languageDef)
306− = { identifier: identifier
307− , reserved: reserved
308− , operator: operator
309− , reservedOp: reservedOp
310−
311− , charLiteral: charLiteral
312− , stringLiteral: stringLiteral
313− , natural: natural
314− , integer: integer
315− , float: float
316− , naturalOrFloat: naturalOrFloat
317− , decimal: decimal
318− , hexadecimal: hexadecimal
319− , octal: octal
320−
321− , symbol: symbol
322− , lexeme: lexeme
323− , whiteSpace: whiteSpace' (LanguageDef languageDef)
324−
325− , parens: parens
326− , braces: braces
327− , angles: angles
328− , brackets: brackets
329− , semi: semi
330− , comma: comma
331− , colon: colon
332− , dot: dot
333− , semiSep: semiSep
334− , semiSep1: semiSep1
335− , commaSep: commaSep
336− , commaSep1: commaSep1
337− }
338− where
339− -----------------------------------------------------------
340− -- Bracketing
341− -----------------------------------------------------------
342− parens :: forall a . ParserT String m a -> ParserT String m a
343− parens p = between (symbol "(") (symbol ")") p
344−
345− braces :: forall a . ParserT String m a -> ParserT String m a
346− braces p = between (symbol "{") (symbol "}") p
347−
348− angles :: forall a . ParserT String m a -> ParserT String m a
349− angles p = between (symbol "<") (symbol ">") p
350−
351− brackets :: forall a . ParserT String m a -> ParserT String m a
352− brackets p = between (symbol "[") (symbol "]") p
353−
354− semi :: ParserT String m String
355− semi = symbol ";"
356−
357− comma :: ParserT String m String
358− comma = symbol ","
359−
360− dot :: ParserT String m String
361− dot = symbol "."
362−
363− colon :: ParserT String m String
364− colon = symbol ":"
365−
366− commaSep :: forall a . ParserT String m a -> ParserT String m (List a)
367− commaSep p = sepBy p comma
368−
369− semiSep :: forall a . ParserT String m a -> ParserT String m (List a)
370− semiSep p = sepBy p semi
371−
372− commaSep1 :: forall a . ParserT String m a -> ParserT String m (List a)
373− commaSep1 p = sepBy1 p comma
374−
375− semiSep1 :: forall a . ParserT String m a -> ParserT String m (List a)
376− semiSep1 p = sepBy1 p semi
377−
378− -----------------------------------------------------------
379− -- Chars & Strings
380− -----------------------------------------------------------
381− charLiteral :: ParserT String m Char
382− charLiteral = lexeme go <?> "character"
383− where
384− go :: ParserT String m Char
385− go = between (char '\'') (char '\'' <?> "end of character") characterChar
386−
387− characterChar :: ParserT String m Char
388− characterChar = charLetter <|> charEscape <?> "literal character"
389−
390− charEscape :: ParserT String m Char
391− charEscape = char '\\' *> escapeCode
392−
393− charLetter :: ParserT String m Char
394− charLetter = satisfy \c -> (c /= '\'') && (c /= '\\') && (c > '\x1A')
395−
396− stringLiteral :: ParserT String m String
397− stringLiteral = lexeme (go <?> "literal string")
398− where
399− go :: ParserT String m String
400− go = do
401− maybeChars <- between (char '"') (char '"' <?> "end of string") (List.many stringChar)
402− pure $ SCU.fromCharArray $ List.toUnfoldable $ foldr folder Nil maybeChars
403−
404− folder :: Maybe Char -> List Char -> List Char
405− folder Nothing chars = chars
406− folder (Just c) chars = Cons c chars
407−
408−
409− stringChar :: ParserT String m (Maybe Char)
410− stringChar = (Just <$> stringLetter)
411− <|> stringEscape
412− <?> "string character"
413−
414− stringLetter :: ParserT String m Char
415− stringLetter = satisfy (\c -> (c /= '"') && (c /= '\\') && (c > '\x1A'))
416−
417− stringEscape :: ParserT String m (Maybe Char)
418− stringEscape = do
419− _ <- char '\\'
420− (escapeGap $> Nothing) <|> (escapeEmpty $> Nothing) <|> (Just <$> escapeCode)
421−
422− escapeEmpty :: ParserT String m Char
423− escapeEmpty = char '&'
424−
425− escapeGap :: ParserT String m Char
426− escapeGap = Array.some space *> char '\\' <?> "end of string gap"
427−
428− -- -- escape codes
429− escapeCode :: ParserT String m Char
430− escapeCode = charEsc <|> charNum <|> charAscii <|> charControl
431− <?> "escape code"
432−
433− charControl :: ParserT String m Char
434− charControl = do
435− _ <- char '^'
436− code <- upper
437− case fromCharCode (toCharCode code - toCharCode 'A' + 1) of
438− Just c -> pure c
439− Nothing -> fail "invalid character code (should not happen)"
440−
441− charNum :: ParserT String m Char
442− charNum = do
443− code <- decimal
444− <|> ( char 'o' *> number 8 octDigit )
445− <|> ( char 'x' *> number 16 hexDigit )
446− if code > 0x10FFFF
447− then fail "invalid escape sequence"
448− else case fromCharCode code of
449− Just c -> pure c
450− Nothing -> fail "invalid character code (should not happen)"
451−
452− charEsc :: ParserT String m Char
453− charEsc = choice (map parseEsc escMap)
454− where
455− parseEsc :: Tuple Char Char -> ParserT String m Char
456− parseEsc (Tuple c code) = char c $> code
457−
458− charAscii :: ParserT String m Char
459− charAscii = choice (map parseAscii asciiMap)
460− where
461− parseAscii :: Tuple String Char -> ParserT String m Char
462− parseAscii (Tuple asc code) = try $ string asc $> code
463−
464− -- escape code tables
465− escMap :: Array (Tuple Char Char)
466− escMap = Array.zip [ 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '\"', '\'' ]
467− [ '\x7', '\x8', '\xC', '\n', '\r', '\t', '\xB', '\\', '\"', '\'' ]
468−
469− asciiMap :: Array (Tuple String Char)
470− asciiMap = Array.zip (ascii3codes <> ascii2codes) (ascii3 <> ascii2)
471−
472− ascii2codes :: Array String
473− ascii2codes = [ "BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI", "EM", "FS", "GS", "RS", "US", "SP" ]
474−
475− ascii3codes :: Array String
476− ascii3codes = [ "NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL"
477− , "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB"
478− , "CAN", "SUB", "ESC", "DEL"
479− ]
480−
481− ascii2 :: Array Char
482− ascii2 = [ '\x8', '\x9', '\xA', '\xB', '\xC', '\xD', '\xE', '\xF'
483− , '\x19', '\x1C', '\x1D', '\x1E', '\x1F', '\x20'
484− ]
485−
486− ascii3 :: Array Char
487− ascii3 = [ '\x0', '\x1', '\x2', '\x3', '\x4', '\x5', '\x6'
488− , '\x7', '\x10', '\x11', '\x12', '\x13', '\x14', '\x15'
489− , '\x16', '\x17', '\x18', '\x1A', '\x1B', '\x7F'
490− ]
491−
492− -----------------------------------------------------------
493− -- Numbers
494− -----------------------------------------------------------
495−
496− naturalOrFloat :: ParserT String m (Either Int Number)
497− naturalOrFloat = lexeme (natFloat) <?> "number"
498−
499− float :: ParserT String m Number
500− float = lexeme floating <?> "float"
501−
502− integer :: ParserT String m Int
503− integer = lexeme int <?> "integer"
504−
505− natural :: ParserT String m Int
506− natural = lexeme nat <?> "natural"
507−
508− -- floats
509− floating :: ParserT String m Number
510− floating = decimal >>= fractExponent
511−
512− natFloat :: ParserT String m (Either Int Number)
513− natFloat = char '0' *> zeroNumFloat
514− <|> decimalFloat
515−
516− zeroNumFloat :: ParserT String m (Either Int Number)
517− zeroNumFloat = Left <$> (hexadecimal <|> octal)
518− <|> decimalFloat
519− <|> fractFloat 0
520− <|> pure (Left 0)
521−
522− decimalFloat :: ParserT String m (Either Int Number)
523− decimalFloat = do
524− n <- decimal
525− option (Left n) (fractFloat n)
526−
527− fractFloat :: forall a . Int -> ParserT String m (Either a Number)
528− fractFloat n = Right <$> fractExponent n
529−
530− fractExponent :: Int -> ParserT String m Number
531− fractExponent n = fractExponent' <|> justExponent
532− where
533− fractExponent' :: ParserT String m Number
534− fractExponent' = do
535− fract <- fraction
536− expo <- option 1.0 exponent'
537− pure $ (toNumber n + fract) * expo
538−
539− justExponent :: ParserT String m Number
540− justExponent = do
541− expo <- exponent'
542− pure $ (toNumber n * expo)
543−
544− fraction :: ParserT String m Number
545− fraction = "fraction" <??> do
546− _ <- char '.'
547− digits <- Array.some digit <?> "fraction"
548− maybe (fail "not digit") pure $ foldr op (Just 0.0) digits
549− where
550− op :: Char -> Maybe Number -> Maybe Number
551− op _ Nothing = Nothing
552− op d (Just f) = do
553− int' <- digitToInt d
554− pure $ ( f + toNumber int' ) / 10.0
555−
556− exponent' :: ParserT String m Number
557− exponent' = "exponent" <??> do
558− _ <- oneOf ['e', 'E']
559− f <- sign
560− e <- decimal <?> "exponent"
561− pure $ power (f e)
562− where
563− power :: Int -> Number
564− power e | e < 0 = 1.0 / power (-e)
565− | otherwise = 10.0 `pow` toNumber e
566−
567− -- integers and naturals
568− int :: ParserT String m Int
569− int = do
570− f <- lexeme sign
571− n <- nat
572− pure $ f n
573−
574− sign :: forall a . (Ring a) => ParserT String m (a -> a)
575− sign = (char '-' $> negate)
576− <|> (char '+' $> identity)
577− <|> pure identity
578−
579− nat :: ParserT String m Int
580− nat = zeroNumber <|> decimal
581−
582− zeroNumber :: ParserT String m Int
583− zeroNumber = char '0' *>
584− ( hexadecimal <|> octal <|> decimal <|> pure 0 ) <?> ""
585−
586− decimal :: ParserT String m Int
587− decimal = number 10 digit
588−
589− hexadecimal :: ParserT String m Int
590− hexadecimal = oneOf ['x', 'X'] *> number 16 hexDigit
591−
592− octal :: ParserT String m Int
593− octal = oneOf ['o', 'O'] *> number 8 octDigit
594−
595− number :: Int -> ParserT String m Char -> ParserT String m Int
596− number base baseDigit = do
597− digits <- Array.some baseDigit
598− maybe (fail "not digits") pure $ foldl folder (Just 0) digits
599− where
600− folder :: Maybe Int -> Char -> Maybe Int
601− folder Nothing _ = Nothing
602− folder (Just x) d = ((base * x) + _) <$> digitToInt d
603−
604− -----------------------------------------------------------
605− -- Operators & reserved ops
606− -----------------------------------------------------------
607−
608− reservedOp :: String -> ParserT String m Unit
609− reservedOp name = lexeme $ try go
610− where
611− go :: ParserT String m Unit
612− go = do
613− _ <- string name
614− notFollowedBy languageDef.opLetter <?> "end of " <> name
615−
616− operator :: ParserT String m String
617− operator = lexeme $ try go
618− where
619− go :: ParserT String m String
620− go = do
621− name <- oper
622− if (isReservedOp name)
623− then fail ("reserved operator " <> name)
624− else pure name
625−
626− oper :: ParserT String m String
627− oper = go <?> "operator"
628− where
629− go :: ParserT String m String
630− go = do
631− c <- languageDef.opStart
632− cs <- Array.many languageDef.opLetter
633− pure $ SCU.singleton c <> SCU.fromCharArray cs
634−
635− isReservedOp :: String -> Boolean
636− isReservedOp name = isReserved (Array.sort languageDef.reservedOpNames) name
637−
638−
639− -----------------------------------------------------------
640− -- Identifiers & Reserved words
641− -----------------------------------------------------------
642−
643− reserved :: String -> ParserT String m Unit
644− reserved name = lexeme $ try go
645− where
646− go :: ParserT String m Unit
647− go = caseString name *> (notFollowedBy languageDef.identLetter <?> "end of " <> name)
648−
649− caseString :: String -> ParserT String m String
650− caseString name | languageDef.caseSensitive = string name $> name
651− | otherwise = walk name $> name
652− where
653− walk :: String -> ParserT String m Unit
654− walk name' = case SCU.uncons name' of
655− Nothing -> pure unit
656− Just { head: c, tail: cs } -> (caseChar c <?> msg) *> walk cs
657−
658− caseChar :: Char -> ParserT String m Char
659− caseChar c | isAlpha c = char (Unicode.toLower c) <|> char (Unicode.toUpper c)
660− | otherwise = char c
661−
662− msg :: String
663− msg = show name
664−
665−
666− identifier :: ParserT String m String
667− identifier = lexeme $ try go
668− where
669− go :: ParserT String m String
670− go = do
671− name <- ident
672− if (isReservedName (LanguageDef languageDef) name)
673− then fail ("reserved word " <> show name)
674− else pure name
675−
676−
677− ident :: ParserT String m String
678− ident = go <?> "identifier"
679− where
680− go :: ParserT String m String
681− go = do
682− c <- languageDef.identStart
683− cs <- Array.many languageDef.identLetter
684− pure $ SCU.singleton c <> SCU.fromCharArray cs
685−
686−
687− -----------------------------------------------------------
688− -- White space & symbols
689− -----------------------------------------------------------
690− symbol :: String -> ParserT String m String
691− symbol name = lexeme (string name) $> name
692−
693− lexeme :: forall a . ParserT String m a -> ParserT String m a
694− lexeme p = p <* whiteSpace' (LanguageDef languageDef)
695−
696−
697−-- ================================================================================ --
698−-- The following functions should really be in the where-clause of makeTokenParser, --
699−-- but they can't go there because they are mutually recursive. --
700−-- ================================================================================ --
701−
702−-----------------------------------------------------------
703−-- Identifiers & Reserved words
704−-----------------------------------------------------------
705−
706−isReservedName :: forall m . Monad m => GenLanguageDef String m -> String -> Boolean
707−isReservedName langDef@(LanguageDef languageDef) name =
708− isReserved (theReservedNames langDef) caseName
709− where
710− caseName | languageDef.caseSensitive = name
711− | otherwise = toLower name
712−
713−isReserved :: Array String -> String -> Boolean
714−isReserved names name =
715− case Array.uncons names of
716− Nothing -> false
717− Just { head: r, tail: rs } -> case (compare r name) of
718− LT -> isReserved rs name
719− EQ -> true
720− GT -> false
721−
722−theReservedNames :: forall m . Monad m => GenLanguageDef String m -> Array String
723−theReservedNames (LanguageDef languageDef)
724− | languageDef.caseSensitive = Array.sort languageDef.reservedNames
725− | otherwise = Array.sort $ map toLower languageDef.reservedNames
726−
727−-----------------------------------------------------------
728−-- White space & symbols
729−-----------------------------------------------------------
730−
731−whiteSpace' :: forall m . Monad m => GenLanguageDef String m -> ParserT String m Unit
732−whiteSpace' langDef@(LanguageDef languageDef)
733− | null languageDef.commentLine && null languageDef.commentStart =
734− skipMany (simpleSpace <?> "")
735− | null languageDef.commentLine =
736− skipMany (simpleSpace <|> multiLineComment langDef <?> "")
737− | null languageDef.commentStart =
738− skipMany (simpleSpace <|> oneLineComment langDef <?> "")
739− | otherwise =
740− skipMany (simpleSpace <|> oneLineComment langDef <|> multiLineComment langDef <?> "")
741−
742−simpleSpace :: forall m . Monad m => ParserT String m Unit
743−simpleSpace = skipMany1 (satisfy isSpace)
744−
745−oneLineComment :: forall m . Monad m => GenLanguageDef String m -> ParserT String m Unit
746−oneLineComment (LanguageDef languageDef) =
747− try (string languageDef.commentLine) *> skipMany (satisfy (_ /= '\n'))
748−
749−multiLineComment :: forall m . Monad m => GenLanguageDef String m -> ParserT String m Unit
750−multiLineComment langDef@(LanguageDef languageDef) =
751− try (string languageDef.commentStart) *> inComment langDef
752−
753−inComment :: forall m . Monad m => GenLanguageDef String m -> ParserT String m Unit
754−inComment langDef@(LanguageDef languageDef) =
755− if languageDef.nestedComments then inCommentMulti langDef else inCommentSingle langDef
756−
757−inCommentMulti :: forall m . Monad m => GenLanguageDef String m -> ParserT String m Unit
758−inCommentMulti langDef@(LanguageDef languageDef) =
759− fix \p -> ( void $ try (string languageDef.commentEnd) )
760− <|> ( multiLineComment langDef *> p )
761− <|> ( skipMany1 (noneOf startEnd) *> p )
762− <|> ( oneOf startEnd *> p )
763− <?> "end of comment"
764− where
765− startEnd :: Array Char
766− startEnd = SCU.toCharArray languageDef.commentEnd <> SCU.toCharArray languageDef.commentStart
767−
768−inCommentSingle :: forall m . Monad m => GenLanguageDef String m -> ParserT String m Unit
769−inCommentSingle (LanguageDef languageDef) =
770− fix \p -> ( void $ try (string languageDef.commentEnd) )
771− <|> ( skipMany1 (noneOf startEnd) *> p )
772− <|> ( oneOf startEnd *> p )
773− <?> "end of comment"
774− where
775− startEnd :: Array Char
776− startEnd = SCU.toCharArray languageDef.commentEnd <> SCU.toCharArray languageDef.commentStart
777−
778−-------------------------------------------------------------------------
779−-- Helper functions that should maybe go in Text.Parsing.Parser.String --
780−-------------------------------------------------------------------------
781−
782−-- | Parse a digit. Matches any char that satisfies `Data.Char.Unicode.isDigit`.
783−digit :: forall m . Monad m => ParserT String m Char
784−digit = satisfy isDigit <?> "digit"
785−
786−-- | Parse a hex digit. Matches any char that satisfies `Data.Char.Unicode.isHexDigit`.
787−hexDigit :: forall m . Monad m => ParserT String m Char
788−hexDigit = satisfy isHexDigit <?> "hex digit"
789−
790−-- | Parse an octal digit. Matches any char that satisfies `Data.Char.Unicode.isOctDigit`.
791−octDigit :: forall m . Monad m => ParserT String m Char
792−octDigit = satisfy isOctDigit <?> "oct digit"
793−
794−-- | Parse an uppercase letter. Matches any char that satisfies `Data.Char.Unicode.isUpper`.
795−upper :: forall m . Monad m => ParserT String m Char
796−upper = satisfy isUpper <?> "uppercase letter"
797−
798−-- | Parse a space character. Matches any char that satisfies `Data.Char.Unicode.isSpace`.
799−space :: forall m . Monad m => ParserT String m Char
800−space = satisfy isSpace <?> "space"
801−
802−-- | Parse an alphabetical character. Matches any char that satisfies `Data.Char.Unicode.isAlpha`.
803−letter :: forall m . Monad m => ParserT String m Char
804−letter = satisfy isAlpha <?> "letter"
805−
806−-- | Parse an alphabetical or numerical character.
807−-- | Matches any char that satisfies `Data.Char.Unicode.isAlphaNum`.
808−alphaNum :: forall m . Monad m => ParserT String m Char
809−alphaNum = satisfy isAlphaNum <?> "letter or digit"
test/Main.purs+153−502
@@ -1,46 +1,35 @@
11module Test.Main where
22
3−import Prelude hiding (between,when)
3+import Prelude
44
5−import Control.Alt ((<|>))
6−import Control.Lazy (fix)
7−import Data.Array (some)
5+import Control.Monad.Except (ExceptT(..))
6+import Control.Monad.Trans.Class (lift)
7+import Data.ArrayBuffer.ArrayBuffer as AB
8+import Data.ArrayBuffer.Cast (fromUint8Array, toUint8Array)
9+import Data.ArrayBuffer.DataView as DataView
10+import Data.ArrayBuffer.Typed (fromArray)
11+import Data.ArrayBuffer.Types (Uint8Array)
812import Data.Either (Either(..))
9−import Data.List (List(..), fromFoldable, many)
13+import Data.Enum (fromEnum)
14+import Data.List (fromFoldable)
15+import Data.List as List
1016import Data.Maybe (Maybe(..))
11−import Data.String.CodeUnits (fromCharArray, singleton)
12−import Data.Traversable(for_)
17+import Data.Traversable (for_)
1318import Data.Tuple (Tuple(..))
1419import Data.UInt (fromInt)
1520import Effect (Effect)
21+import Effect.Class (liftEffect)
1622import Effect.Console (logShow)
17−import Control.Monad.Trans.Class (lift)
18−import Test.Assert (assert')
19−import Text.Parsing.Parser (Parser, ParserT, runParser, runParserT, parseErrorPosition, fail)
20−import Text.Parsing.Parser.Combinators (endBy1, sepBy1, optionMaybe, try, chainl, between, manyTill)
21−import Text.Parsing.Parser.Expr (Assoc(..), Operator(..), buildExprParser)
22−import Text.Parsing.Parser.Language (javaStyle, haskellStyle, haskellDef)
23−import Text.Parsing.Parser.Pos (Position(..), initialPos)
24−import Text.Parsing.Parser.String (eof, string, char, satisfy, anyChar)
25−import Text.Parsing.Parser.Token (TokenParser, match, when, token, makeTokenParser)
26−import Data.ArrayBuffer.ArrayBuffer (empty) as AB
27−import Data.ArrayBuffer.DataView (setInt8, whole) as AB
28−import Text.Parsing.Parser.DataView as DV
29−
30−parens :: forall m a. Monad m => ParserT String m a -> ParserT String m a
31−parens = between (string "(") (string ")")
32−
33−nested :: forall m. Monad m => ParserT String m Int
34−nested = fix \p -> (do
35− _ <- string "a"
36− pure 0) <|> ((+) 1) <$> parens p
37−
38−parseTest :: forall s a. Show a => Eq a => s -> a -> Parser s a -> Effect Unit
39−parseTest input expected p = case runParser input p of
40− Right actual -> do
41− assert' ("expected: " <> show expected <> ", actual: " <> show actual) (expected == actual)
42− logShow actual
43− Left err -> assert' ("error: " <> show err) false
23+import Effect.Exception (catchException, message)
24+import Parsing (ParseError(..), ParserT, Position(..), fail, liftExceptT, parseErrorPosition, runParserT)
25+import Parsing.Combinators (many, manyTill)
26+import Parsing.DataView (anyInt8, anyTill, eof, satisfyInt8)
27+import Parsing.DataView as DV
28+import Parsing.DataView.Basic (anyCodePointUTF8)
29+import Test.Assert (assert', assertEqual')
30+import Web.Encoding.TextDecoder as TextDecoder
31+import Web.Encoding.TextEncoder as TextEncoder
32+import Web.Encoding.UtfLabel as UtfLabel
4433
4534parseTestT :: forall s a. Show a => Eq a => s -> a -> ParserT s Effect a -> Effect Unit
4635parseTestT input expected p = do
@@ -51,520 +40,81 @@ parseTestT input expected p = do
5140 logShow actual
5241 Left err -> assert' (show err) false
5342
54−parseErrorTestPosition :: forall s a. Show a => Parser s a -> s -> Position -> Effect Unit
55−parseErrorTestPosition p input expected = case runParser input p of
56− Right _ -> assert' "error: ParseError expected!" false
57− Left err -> do
58− let pos = parseErrorPosition err
59− assert' ("expected: " <> show expected <> ", pos: " <> show pos) (expected == pos)
60− logShow expected
61−
62−parseFailTestPositionT :: forall s a. s -> Position -> ParserT s Effect a -> Effect Unit
63−parseFailTestPositionT input failPos p = do
43+parseFailT :: forall s a. s -> Position -> ParserT s Effect a -> Effect Unit
44+parseFailT input failPos p = do
6445 result <- runParserT input p
6546 case result of
66− Right _ -> assert' ("ParseError expected at " <> show failPos) false
47+ Right _ -> assert' ("ParseError expected at " <> show failPos) false
6748 Left err -> do
6849 let pos = parseErrorPosition err
6950 assert' ("ParseError expected at " <> show failPos <> " but parser failed at " <> show pos)
70− (pos == failPos)
51+ (pos == failPos)
7152 logShow $ show failPos
7253
73−opTest :: Parser String String
74−opTest = chainl (singleton <$> anyChar) (char '+' $> append) ""
75−
76−digit :: Parser String Int
77−digit = (string "0" >>= \_ -> pure 0)
78− <|> (string "1" >>= \_ -> pure 1)
79− <|> (string "2" >>= \_ -> pure 2)
80− <|> (string "3" >>= \_ -> pure 3)
81− <|> (string "4" >>= \_ -> pure 4)
82− <|> (string "5" >>= \_ -> pure 5)
83− <|> (string "6" >>= \_ -> pure 6)
84− <|> (string "7" >>= \_ -> pure 7)
85− <|> (string "8" >>= \_ -> pure 8)
86− <|> (string "9" >>= \_ -> pure 9)
87−
88−exprTest :: Parser String Int
89−exprTest = buildExprParser [ [ Infix (string "/" >>= \_ -> pure (/)) AssocRight ]
90− , [ Infix (string "*" >>= \_ -> pure (*)) AssocRight ]
91− , [ Infix (string "-" >>= \_ -> pure (-)) AssocRight ]
92− , [ Infix (string "+" >>= \_ -> pure (+)) AssocRight ]
93− ] digit
94−
95−
96−manySatisfyTest :: Parser String String
97−manySatisfyTest = do
98− r <- some $ satisfy (\s -> s /= '?')
99− _ <- char '?'
100− pure (fromCharArray r)
101−
102−data TestToken = A | B
103−
104−instance showTestTokens :: Show TestToken where
105− show A = "A"
106− show B = "B"
107−
108−instance testTokensEq :: Eq TestToken where
109− eq A A = true
110− eq B B = true
111− eq _ _ = false
112−
113−isA :: TestToken -> Boolean
114−isA A = true
115−isA _ = false
116−
117−testTokenParser :: TokenParser
118−testTokenParser = makeTokenParser haskellDef
119−
12054mkPos :: Int -> Position
121−mkPos n = mkPos' n 1
122−
123−mkPos' :: Int -> Int -> Position
124−mkPos' column line = Position { column: column, line: line }
125−
126−type TestM = Effect Unit
127−
128−tokenParserIdentifierTest :: TestM
129−tokenParserIdentifierTest = do
130− -- parse normal identifier
131− parseTest "hello" "hello" testTokenParser.identifier
132−
133− -- error on reserved words
134− parseErrorTestPosition testTokenParser.identifier "let" $ mkPos 4
135−
136− -- parse whitespace after identifier
137− parseTest "hello twice " "twice" (testTokenParser.identifier *> testTokenParser.identifier)
138−
139− -- can't start identifiers with numbers
140− parseErrorTestPosition testTokenParser.identifier "3hello" $ mkPos 1
141−
142− -- but numbers can be in the identifier
143− parseTest "h3ll0 " "h3ll0" testTokenParser.identifier
144−
145− -- comments count as whitespace
146− parseTest "h3ll0 -- this is a comment\nbye {- this is another comment -}" (Tuple "h3ll0" "bye")
147− (Tuple <$> testTokenParser.identifier <*> testTokenParser.identifier)
148−
149− -- multiline comments work well
150− parseTest "hello {- this \nis a comment -} bye" (Tuple "hello" "bye")
151− (Tuple <$> testTokenParser.identifier <*> testTokenParser.identifier)
152−
153− -- nested comments are okay
154− parseTest "hello {- this {- \nis a comment -} foo -} bye" (Tuple "hello" "bye")
155− (Tuple <$> testTokenParser.identifier <*> testTokenParser.identifier)
156−
157− -- fail on non-matching comments
158− parseErrorTestPosition testTokenParser.identifier "hello {-" $ mkPos 9
159−
160−
161−tokenParserReservedTest :: TestM
162−tokenParserReservedTest = do
163− -- parse reserved identifier
164− parseTest "forall" unit $ testTokenParser.reserved "forall"
165−
166− -- fail on nonmatching reserved identifier
167− parseErrorTestPosition (testTokenParser.reserved "forall") "forall3" $ mkPos 7
168−
169− -- fail on nonmatching reserved identifier
170− parseErrorTestPosition (testTokenParser.reserved "forall") "forall3" $ mkPos 7
171−
172−tokenParserOperatorTest :: TestM
173−tokenParserOperatorTest = do
174− -- parse operator
175− parseTest "<>" "<>" testTokenParser.operator
176−
177− -- fail on nonoperator
178− parseErrorTestPosition testTokenParser.operator "foo" $ mkPos 1
179−
180− -- fail on reserved operator
181− parseErrorTestPosition testTokenParser.operator "=" $ mkPos 2
182−
183−-- TODO
184−tokenParserReservedOpTest :: TestM
185−tokenParserReservedOpTest = pure unit
186−
187−tokenParserCharLiteralTest :: TestM
188−tokenParserCharLiteralTest = do
189− -- parse char literal
190− parseTest "'c'" 'c' testTokenParser.charLiteral
191−
192− -- fail on slash
193− parseErrorTestPosition testTokenParser.charLiteral "'\'" $ mkPos 2
194−
195− -- parse escape code
196− parseTest "'\\n'" '\n' testTokenParser.charLiteral
197−
198− -- parse oct number
199− parseTest "'\\o101'" 'A' testTokenParser.charLiteral
200−
201− -- parse hex number
202− parseTest "'\\x41'" 'A' testTokenParser.charLiteral
203−
204− -- fail on bad oct
205− parseErrorTestPosition testTokenParser.charLiteral "'\\o389'" $ mkPos 5
206−
207− -- parse ascii
208− parseTest "'\\^I'" '\t' testTokenParser.charLiteral
209−
210−tokenParserStringLiteralTest :: TestM
211−tokenParserStringLiteralTest = do
212− -- parse string char
213− parseTest "\"hello\"" "hello" testTokenParser.stringLiteral
214−
215− -- fail on non-operator
216− parseErrorTestPosition testTokenParser.stringLiteral "he\"llo" $ mkPos 1
217−
218− -- parse string gap
219− parseTest "\"he\\ \\llo\"" "hello" testTokenParser.stringLiteral
220−
221− -- parse string empty
222− parseTest "\"he\\&llo\"" "hello" testTokenParser.stringLiteral
223−
224− -- parse string escape
225− parseTest "\"he\\nllo\"" "he\nllo" testTokenParser.stringLiteral
226−
227−tokenParserNaturalTest :: TestM
228−tokenParserNaturalTest = do
229− -- parse natural
230− parseTest "1" 1 testTokenParser.natural
231−
232− -- parse hex natural
233− parseTest "0xFF" 255 testTokenParser.natural
234−
235− -- parse oct natural
236− parseTest "0o10 " 8 testTokenParser.natural
237−
238− -- fail on nonoct
239− parseErrorTestPosition testTokenParser.natural "0o8" $ mkPos 3
240−
241− -- fail on no digits
242− parseErrorTestPosition testTokenParser.natural "0o" $ mkPos 3
243−
244−tokenParserIntegerTest :: TestM
245−tokenParserIntegerTest = do
246− -- parse integer
247− parseTest "100" 100 testTokenParser.integer
248−
249− -- parse plus
250− parseTest "+200" 200 testTokenParser.integer
251−
252− -- parse minus
253− parseTest "- 100" (-100) testTokenParser.integer
254−
255−tokenParserFloatTest :: TestM
256−tokenParserFloatTest = do
257− -- parse float
258− parseTest "100.5" 100.5 testTokenParser.float
259−
260− -- parse float with exponent
261− parseTest "100e1" 1000.0 testTokenParser.float
262−
263− -- parse float with exponent
264− parseTest "100.5e1" 1005.0 testTokenParser.float
265−
266− -- fail on nonfloat
267− parseErrorTestPosition testTokenParser.float "100.e1" $ mkPos 5
268−
269−-- TODO
270−tokenParserNaturalOrFloatTest :: TestM
271−tokenParserNaturalOrFloatTest = do
272− pure unit
273−
274−tokenParserDecimalTest :: TestM
275−tokenParserDecimalTest = do
276− -- parse decimal
277− parseTest "0202" 202 testTokenParser.decimal
278−
279− -- fail on nondecimal
280− parseErrorTestPosition testTokenParser.decimal "foo" $ mkPos 1
281−
282−-- TODO
283−tokenParserHexadecimalTest :: TestM
284−tokenParserHexadecimalTest = do
285− pure unit
286−
287−-- TODO
288−tokenParserOctalTest :: TestM
289−tokenParserOctalTest = do
290− pure unit
291−
292−tokenParserSymbolTest :: TestM
293−tokenParserSymbolTest = do
294− -- parse symbol
295− parseTest "hello " "hello" $ testTokenParser.symbol "hello"
296−
297−-- TODO
298−tokenParserLexemeTest :: TestM
299−tokenParserLexemeTest = do
300− pure unit
301−
302−-- TODO
303−tokenParserWhiteSpaceTest :: TestM
304−tokenParserWhiteSpaceTest = do
305− pure unit
306−
307−tokenParserParensTest :: TestM
308−tokenParserParensTest = do
309− -- parse parens
310− parseTest "(hello)" "hello" $ testTokenParser.parens $ string "hello"
311−
312− -- fail on non-closed parens
313− parseErrorTestPosition (testTokenParser.parens $ string "hello") "(hello" $ mkPos 7
314−
315−tokenParserBracesTest :: TestM
316−tokenParserBracesTest = do
317− -- parse braces
318− parseTest "{hello}" "hello" $ testTokenParser.braces $ string "hello"
319−
320− -- fail on non-closed braces
321− parseErrorTestPosition (testTokenParser.braces $ string "hello") "{hello" $ mkPos 7
322−
323−tokenParserAnglesTest :: TestM
324−tokenParserAnglesTest = do
325− -- parse angles
326− parseTest "<hello>" "hello" $ testTokenParser.angles $ string "hello"
327−
328− -- fail on non-closed angles
329− parseErrorTestPosition (testTokenParser.angles $ string "hello") "<hello" $ mkPos 7
330−
331−tokenParserBracketsTest :: TestM
332−tokenParserBracketsTest = do
333− -- parse brackets
334− parseTest "[hello]" "hello" $ testTokenParser.brackets $ string "hello"
335−
336− -- fail on non-closed brackets
337− parseErrorTestPosition (testTokenParser.brackets $ string "hello") "[hello" $ mkPos 7
338−
339−tokenParserSemiTest :: TestM
340−tokenParserSemiTest = do
341− -- parse semicolon
342− parseTest ";" ";" testTokenParser.semi
343−
344− -- fail on non-semicolon
345− parseErrorTestPosition testTokenParser.semi "a" $ mkPos 1
346−
347−tokenParserCommaTest :: TestM
348−tokenParserCommaTest = do
349− -- parse comma
350− parseTest "," "," testTokenParser.comma
351−
352− -- fail on non-comma
353− parseErrorTestPosition testTokenParser.comma "a" $ mkPos 1
354−
355−tokenParserColonTest :: TestM
356−tokenParserColonTest = do
357− -- parse colon
358− parseTest ":" ":" testTokenParser.colon
359−
360− -- fail on non-colon
361− parseErrorTestPosition testTokenParser.colon "a" $ mkPos 1
362−
363−tokenParserDotTest :: TestM
364−tokenParserDotTest = do
365− -- parse dot
366− parseTest "." "." testTokenParser.dot
367−
368− -- fail on non-dot
369− parseErrorTestPosition testTokenParser.dot "a" $ mkPos 1
370−
371−tokenParserSemiSepTest :: TestM
372−tokenParserSemiSepTest = do
373− -- parse semi sep
374− parseTest "foo; foo" (fromFoldable ["foo", "foo"]) $ testTokenParser.semiSep $ string "foo"
375−
376− -- parse semi sep with newline
377− parseTest "foo; \nfoo" (fromFoldable ["foo", "foo"]) $ testTokenParser.semiSep $ string "foo"
378−
379− -- parse no semi sep
380− parseTest "" (fromFoldable []) $ testTokenParser.semiSep $ string "foo"
381− -- parseErrorTestPosition testTokenParser.operator "foo" $ mkPos 1
382−
383−tokenParserSemiSep1Test :: TestM
384−tokenParserSemiSep1Test = do
385− -- parse semi sep1
386− parseTest "foo; foo" (fromFoldable ["foo", "foo"]) $ testTokenParser.semiSep1 $ string "foo"
387−
388− -- parse semi sep1 with newline
389− parseTest "foo; \nfoo" (fromFoldable ["foo", "foo"]) $ testTokenParser.semiSep1 $ string "foo"
390−
391− -- no parse on empty string
392− parseErrorTestPosition (testTokenParser.semiSep1 $ string "foo") "" $ mkPos 1
393−
394−tokenParserCommaSepTest :: TestM
395−tokenParserCommaSepTest = do
396− -- parse comma sep
397− parseTest "foo, foo" (fromFoldable ["foo", "foo"]) $ testTokenParser.commaSep $ string "foo"
398−
399− -- parse comma sep with newline
400− parseTest "foo, \nfoo" (fromFoldable ["foo", "foo"]) $ testTokenParser.commaSep $ string "foo"
401−
402− -- parse no comma sep
403− parseTest "" (fromFoldable []) $ testTokenParser.commaSep $ string "foo"
404−
405−tokenParserCommaSep1Test :: TestM
406−tokenParserCommaSep1Test = do
407− -- parse comma sep1
408− parseTest "foo, foo" (fromFoldable ["foo", "foo"]) $ testTokenParser.commaSep1 $ string "foo"
409−
410− -- parse comma sep1 with newline
411− parseTest "foo, \nfoo" (fromFoldable ["foo", "foo"]) $ testTokenParser.commaSep1 $ string "foo"
412−
413− -- no parse on empty string
414− parseErrorTestPosition (testTokenParser.commaSep1 $ string "foo") "" $ mkPos 1
415−
416−haskellStyleTest :: TestM
417−haskellStyleTest = do
418− let haskellTokParser = makeTokenParser haskellStyle
419−
420− -- make sure haskell-style comments work
421− parseTest "hello {- comment\n -} fo_" "fo_" $ haskellTokParser.identifier *> haskellTokParser.identifier
422−
423− -- make sure java-style comments do not work
424− parseErrorTestPosition
425− (haskellTokParser.identifier *> haskellTokParser.identifier)
426− "hello /* comment\n */ foo"
427− (mkPos 7)
428−
429−javaStyleTest :: TestM
430−javaStyleTest = do
431− let javaTokParser = makeTokenParser javaStyle
432− -- make sure java-style comments work
433− parseTest "hello /* comment\n */ fo_" "fo_" $ javaTokParser.identifier *> javaTokParser.identifier
434−
435− -- make sure java-style identifier work
436− parseTest "$hello /* comment\n */ _f$o_" "_f$o_" $ javaTokParser.identifier *> javaTokParser.identifier
437−
438− -- make sure haskell-style comments do not work
439− parseErrorTestPosition
440− (javaTokParser.identifier *> javaTokParser.identifier)
441− "hello {- comment\n -} foo"
442− (mkPos 7)
55+mkPos n = Position { index: n, line: 1, column: 1 }
44356
44457main :: Effect Unit
44558main = do
44659
447− parseErrorTestPosition
448− (many $ char 'f' *> char '?')
449− "foo"
450− (Position { column: 2, line: 1 })
451−
452− parseErrorTestPosition
453− (satisfy (_ == '?'))
454− "foo"
455− (Position { column: 1, line: 1 })
456−
457− parseTest
458− "foo"
459− Nil
460− (many $ try $ char 'f' *> char '?')
461−
462− parseTest "(((a)))" 3 nested
463− parseTest "aaa" (Cons "a" (Cons "a" (Cons "a" Nil))) $ many (string "a")
464− parseTest "(ab)" (Just "b") $ parens do
465− _ <- string "a"
466− optionMaybe $ string "b"
467− parseTest "a,a,a" (Cons "a" (Cons "a" (Cons "a" Nil))) $ string "a" `sepBy1` string ","
468− parseTest "a,a,a," (Cons "a" (Cons "a" (Cons "a" Nil))) $ do
469− as <- string "a" `endBy1` string ","
470− eof
471− pure as
472− parseTest "a+b+c" "abc" opTest
473− parseTest "1*2+3/4-5" (-3) exprTest
474− parseTest "ab?" "ab" manySatisfyTest
475− parseTest "aaab" (fromFoldable ['a','a','a']) $ manyTill (char 'a') (char 'b')
476−
477− let tokpos = const initialPos
478− parseTest (fromFoldable [A, B]) A (token tokpos)
479− parseTest (fromFoldable [B, A]) B (token tokpos)
480−
481− parseTest (fromFoldable [A, B]) A (when tokpos isA)
482−
483− parseTest (fromFoldable [A]) A (match tokpos A)
484− parseTest (fromFoldable [B]) B (match tokpos B)
485− parseTest (fromFoldable [A, B]) A (match tokpos A)
486−
487− parseErrorTestPosition (string "abc") "bcd" (Position { column: 1, line: 1 })
488− parseErrorTestPosition (string "abc" *> eof) "abcdefg" (Position { column: 4, line: 1 })
489− parseErrorTestPosition (string "a\nb\nc\n" *> eof) "a\nb\nc\nd\n" (Position { column: 1, line: 4 })
490− parseErrorTestPosition (string "\ta" *> eof) "\tab" (Position { column: 10, line: 1 })
491−
492− tokenParserIdentifierTest
493− tokenParserReservedTest
494− tokenParserOperatorTest
495− tokenParserReservedOpTest
496−
497− tokenParserCharLiteralTest
498− tokenParserStringLiteralTest
499− tokenParserNaturalTest
500− tokenParserIntegerTest
501− tokenParserFloatTest
502− tokenParserNaturalOrFloatTest
503− tokenParserDecimalTest
504− tokenParserHexadecimalTest
505− tokenParserOctalTest
506−
507− tokenParserSymbolTest
508− tokenParserLexemeTest
509− tokenParserWhiteSpaceTest
510−
511− tokenParserParensTest
512− tokenParserBracesTest
513− tokenParserAnglesTest
514− tokenParserBracketsTest
515− tokenParserSemiTest
516− tokenParserCommaTest
517− tokenParserColonTest
518− tokenParserDotTest
519− tokenParserSemiSepTest
520− tokenParserSemiSep1Test
521− tokenParserCommaSepTest
522− tokenParserCommaSep1Test
523−
524− haskellStyleTest
525− javaStyleTest
526−
60+ -- Test input is DataView = [5,6,7,8,9]
52761 ab <- AB.empty 5
528− let dv = AB.whole ab
529− for_ [0,1,2,3,4] $ \i -> AB.setInt8 dv i (i+5)
62+ let dv = DataView.whole ab
63+ for_ [ 0, 1, 2, 3, 4 ] $ \i -> DataView.setInt8 dv i (i + 5)
64+ -- anyInt8
53065 parseTestT dv 5 DV.anyInt8
531− parseTestT dv (fromFoldable [5,6,7,8,9]) $ manyTill DV.anyInt8 DV.eof
532− parseTestT dv (fromFoldable [5,6,7,8]) $ manyTill DV.anyInt8 (DV.satisfyInt8 (_ == 9))
66+ -- manyTill eof
67+ parseTestT dv (fromFoldable [ 5, 6, 7, 8, 9 ]) $ manyTill DV.anyInt8 DV.eof
68+ -- manyTill satisfy
69+ parseTestT dv (fromFoldable [ 5, 6, 7, 8 ]) $ manyTill DV.anyInt8 (DV.satisfyInt8 (_ == 9))
70+ -- anyInt16be
53371 parseTestT dv 0x0506 DV.anyInt16be
72+ -- anyInt16le
53473 parseTestT dv 0x0605 DV.anyInt16le
74+ -- anyUint16be
53575 parseTestT dv (fromInt 0x0506) DV.anyUint16be
76+ -- anyUint16le
53677 parseTestT dv (fromInt 0x0605) DV.anyUint16le
537− parseFailTestPositionT dv (mkPos 5) $ DV.anyInt16le *> DV.anyInt16le *> DV.anyInt16le
78+ -- fail on anyInt16le past end of DataView
79+ parseFailT dv (mkPos 4) $ DV.anyInt16le *> DV.anyInt16le *> DV.anyInt16le
80+ -- anyInt32be and anyInt8
53881 parseTestT dv (Tuple 0x05060708 0x09) $ do
53982 l <- DV.anyInt32be
54083 r <- DV.anyInt8
54184 DV.eof
54285 pure $ Tuple l r
86+ -- anyInt32le and anyInt8
54387 parseTestT dv (Tuple 0x08070605 0x09) $ do
54488 l <- DV.anyInt32le
54589 r <- DV.anyInt8
54690 DV.eof
54791 pure $ Tuple l r
92+ -- anyUint32be and anyInt8
54893 parseTestT dv (Tuple (fromInt 0x05060708) 0x09) $ do
54994 l <- DV.anyUint32be
55095 r <- DV.anyInt8
55196 DV.eof
55297 pure $ Tuple l r
98+ -- anyUint32le and anyInt8
55399 parseTestT dv (Tuple (fromInt 0x08070605) 0x09) $ do
554100 l <- DV.anyUint32le
555101 r <- DV.anyInt8
556102 DV.eof
557103 pure $ Tuple l r
104+ -- takeN
558105 parseTestT dv 0x0908 do
559106 _ <- DV.takeN 3
560107 DV.anyInt16le <* DV.eof
108+ -- takeRest then a new parse then anyInt16le
561109 parseTestT dv 0x0908 do
562110 _ <- DV.takeN 3
563111 remain <- DV.takeRest
564112 lift (runParserT remain DV.anyInt16le) >>= case _ of
565113 Right actual -> pure actual
566114 Left err -> fail $ show err
567− parseFailTestPositionT dv (mkPos 1) $ DV.takeN 6
115+ -- fail on takeN past end of DataView
116+ parseFailT dv (mkPos 0) $ DV.takeN 6
117+ -- takeRest then new parse on takeRest then anyInt8
568118 parseTestT dv 0x07 do
569119 _ <- DV.takeN 1
570120 DV.takeRest >>= \dv2 ->
@@ -573,8 +123,109 @@ main = do
573123 Right dv3 -> lift (runParserT dv3 $ DV.anyInt8) >>= case _ of
574124 Left err -> fail $ show err
575125 Right x -> pure x
576− parseFailTestPositionT dv (mkPos 2) $ do
126+ -- takeN then a new parse then fail on anyInt16le past end of DataView
127+ parseFailT dv (mkPos 1) $ do
577128 dv2 <- DV.takeN 1
578129 lift (runParserT dv2 DV.anyInt16le) >>= case _ of
579130 Left err -> fail $ show err
580131 Right x -> pure x
132+ parseTestT dv unit $ DV.takeN 5 *> pure unit
133+
134+ -- test match combinator
135+ runParserT dv (DV.match (DV.anyInt8 *> DV.anyInt8)) >>= case _ of
136+ Right (Tuple matchresult _) -> do
137+ r0 <- DataView.getInt8 matchresult 0
138+ r1 <- DataView.getInt8 matchresult 1
139+ assert' ("match failed " <> show r0 <> " " <> show r1) $ r0 == Just 5 && r1 == Just 6
140+ logShow $ show r0 <> " " <> show r1
141+ Left err -> assert' ("match failed " <> show err) false
142+
143+ do
144+ ablarge <- AB.empty 200000
145+ let dvlarge = DataView.whole ablarge
146+ -- forE 0 (AB.byteLength ablarge - 1) \i -> void $ DataView.setInt8 dvlarge i i
147+ x <- map List.length <$> runParserT dvlarge (many anyInt8)
148+ assertEqual' "stack safety"
149+ { actual: x
150+ , expected: Right 200000
151+ }
152+
153+ do
154+ let
155+ teststring = "test string 👓"
156+
157+ textDecoder <- TextDecoder.new UtfLabel.utf8
158+
159+ textEncoder <- TextEncoder.new
160+
161+ let testarray = TextEncoder.encode teststring textEncoder
162+
163+ testview <- fromUint8Array testarray
164+
165+ result <- runParserT testview do
166+ let length = DataView.byteLength testview
167+ stringview <- DV.takeN length
168+ stringarray <- lift $ liftEffect $ toUint8Array stringview
169+ liftExceptT $ ExceptT $ catchException (pure <<< Left <<< message) do
170+ Right <$> TextDecoder.decode stringarray textDecoder
171+
172+ assertEqual' "UTF-8 decoding example"
173+ { expected: Right teststring
174+ , actual: result
175+ }
176+
177+ do
178+ result <- runParserT dv do
179+ Tuple pre _ <- anyTill do
180+ _ <- satisfyInt8 (_ == 7)
181+ _ <- satisfyInt8 (_ == 8)
182+ pure unit
183+ pure pre
184+
185+ assertEqual' "anyTill"
186+ { expected: Right 2
187+ , actual: DataView.byteLength <$> result
188+ }
189+
190+ do
191+ -- Test one code point from each byte group
192+ -- a 97
193+ -- λ 955
194+ -- 月 0x6708
195+ -- 👓 0x1F453
196+ let teststring = "aλ月👓a"
197+ textEncoder <- TextEncoder.new
198+ let testarray = TextEncoder.encode teststring textEncoder
199+ testview <- fromUint8Array testarray
200+
201+ result <- (map <<< map <<< map) fromEnum $ runParserT testview do
202+ c0 <- anyCodePointUTF8
203+ c1 <- anyCodePointUTF8
204+ c2 <- anyCodePointUTF8
205+ c3 <- anyCodePointUTF8
206+ c4 <- anyCodePointUTF8
207+ eof
208+ pure [ c0, c1, c2, c3, c4 ]
209+
210+ assertEqual' "anyCodePointUTF8 basic"
211+ { expected: Right [ 97, 955, 0x6708, 0x1F453, 97 ]
212+ , actual: result
213+ }
214+
215+ do
216+ test :: Uint8Array <- fromArray (map fromInt [ 0x00BF ])
217+ testv <- fromUint8Array test
218+ result <- runParserT testv anyCodePointUTF8
219+ assertEqual' "anyCodePointUTF8 invalid 1"
220+ { expected: Left (ParseError "Invalid UTF-8 encoding" (Position { index: 0, column: 1, line: 1 }))
221+ , actual: result
222+ }
223+
224+ do
225+ test :: Uint8Array <- fromArray (map fromInt [ 0x00C0, 0 ])
226+ testv <- fromUint8Array test
227+ result <- runParserT testv anyCodePointUTF8
228+ assertEqual' "anyCodePointUTF8 invalid 2"
229+ { expected: Left (ParseError "Invalid UTF-8 encoding" (Position { index: 0, column: 1, line: 1 }))
230+ , actual: result
231+ }