Merge pull request #2732 from stiga-huang/fix-perror
THRIFT-5670: lib: cpp: Fix wrong timeout error message
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index c3d98b0..c5d66f6 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -43,9 +43,10 @@
strategy:
matrix:
os: [ubuntu-20.04, ubuntu-22.04]
+ fail-fast: false
runs-on: ${{ matrix.os }}
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Install dependencies
run: |
@@ -82,10 +83,11 @@
strategy:
matrix:
go:
- - '1.19'
- '1.20'
+ - '1.21'
+ fail-fast: false
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: actions/setup-go@v4
with:
@@ -126,7 +128,7 @@
run: make -C test/go precross
- name: Upload go precross artifacts
- if: matrix.go == '1.20'
+ if: matrix.go == '1.21'
uses: actions/upload-artifact@v3
with:
name: go-precross
@@ -139,9 +141,9 @@
needs: compiler
runs-on: ubuntu-20.04
env:
- GRADLE_VERSION: "8.0.2"
+ GRADLE_VERSION: "8.4"
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: actions/setup-java@v3
with:
@@ -158,7 +160,7 @@
- name: Setup gradle
run: |
wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip
- (echo "ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7 /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -)
+ (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -)
unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip
sudo mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle
sudo ln -s /usr/local/gradle/bin/gradle /usr/local/bin
@@ -247,7 +249,7 @@
needs: compiler
runs-on: ubuntu-20.04
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Run bootstrap
run: ./bootstrap.sh
@@ -285,7 +287,7 @@
env:
TOOLCHAIN_VERSION: 1.61.0
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Install dependencies
run: |
@@ -349,9 +351,11 @@
runs-on: ubuntu-20.04
strategy:
matrix:
- python-version: ["2.x", "3.x"]
+ python-version:
+ - "3.x"
+ fail-fast: false
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Install dependencies
run: |
@@ -370,21 +374,11 @@
python --version
pip --version
- - name: Python 2.x backport setup
- if: matrix.python-version == '2.x'
- run: |
- python -m pip install --upgrade ipaddress backports.ssl_match_hostname
-
- name: Run bootstrap
run: ./bootstrap.sh
- - name: Run configure 2.x
- if: matrix.python-version == '2.x'
- run: |
- ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-python/with-python/')
-
- name: Run configure 3.x
- if: matrix.python-version != '2.x'
+ if: matrix.python-version == '3.x'
run: |
./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-py3/with-py3/')
@@ -425,7 +419,7 @@
client_lang: ['java,kotlin', 'go,rs', 'swift']
fail-fast: false
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
@@ -435,7 +429,7 @@
with:
distribution: temurin
# here we intentionally use an older version so that we also verify Java 17 compiles to it
- java-version: 11
+ java-version: 8
cache: "gradle"
- name: Install openssl and certificates (for SSL tests)
diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml
index 69b8cbe..71748e8 100644
--- a/.github/workflows/cmake.yml
+++ b/.github/workflows/cmake.yml
@@ -16,7 +16,7 @@
compiler:
runs-on: ubuntu-20.04
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Install dependencies
run: |
diff --git a/.gitignore b/.gitignore
index 232ed2c..cb8029c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -210,7 +210,6 @@
/lib/delphi/**/*.dcu
/lib/delphi/**/*.2007
/lib/delphi/**/codegen/*.bat
-/lib/erl/_build/
/lib/erl/.eunit
/lib/erl/.generated
/lib/erl/.rebar/
diff --git a/ApacheThrift.nuspec b/ApacheThrift.nuspec
index 0e6f09e..cd9a29c 100644
--- a/ApacheThrift.nuspec
+++ b/ApacheThrift.nuspec
@@ -19,14 +19,14 @@
the "Thrift" project.
2. nuget setApiKey <your-api-key>
3. nuget pack ApacheThrift.nuspec -Symbols -SymbolPackageFormat snupkg
- 4. nuget push ApacheThrift.0.19.0.nupkg -Source https://api.nuget.org/v3/index.json
+ 4. nuget push ApacheThrift.0.20.0.nupkg -Source https://api.nuget.org/v3/index.json
-->
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata>
<id>ApacheThrift</id>
- <version>0.19.0</version>
- <title>Apache Thrift 0.19.0</title>
+ <version>0.20.0</version>
+ <title>Apache Thrift 0.20.0</title>
<authors>Apache Thrift Developers</authors>
<owners>Apache Software Foundation</owners>
<license type="expression">Apache-2.0</license>
@@ -36,7 +36,7 @@
<description>
Contains runtime libraries from lib/netstd for netstandard2.0 framework development.
</description>
- <repository type="GitHub" url="https://github.com/apache/thrift" branch="release/0.19.0" />
+ <repository type="GitHub" url="https://github.com/apache/thrift" branch="release/0.20.0" />
<tags>Apache Thrift RPC</tags>
</metadata>
<files>
diff --git a/CHANGES.md b/CHANGES.md
index 0173f6f..a8de336 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,5 +1,71 @@
# Apache Thrift Changelog
+## 0.19.0
+
+### Known Open Issues (Blocker or Critical)
+
+- [THRIFT-3877](https://issues.apache.org/jira/browse/THRIFT-3877) - C++ library don't work with HTTP (csharp server, cpp client; need cross test enhancement)
+- [THRIFT-5468](https://issues.apache.org/jira/browse/THRIFT-5468) - Swift service generator doesn't support oneway
+- [THRIFT-5654](https://issues.apache.org/jira/browse/THRIFT-5654) - LNK4042 and LNK2019 in go_validator_generator.cc
+
+## Build Process
+
+- [THRIFT-5701](https://issues.apache.org/jira/browse/THRIFT-5701) - Add dependabot
+
+## C++
+
+- [THRIFT-5725](https://issues.apache.org/jira/browse/THRIFT-5725) - Thrift SSL server stops working if the file descriptor returned is zero
+- [THRIFT-5716](https://issues.apache.org/jira/browse/THRIFT-5716) - TMemoryBuffer resizing might shrink the buffer size due to uint32_t overflow
+
+## Compiler (General)
+
+- [THRIFT-5690](https://issues.apache.org/jira/browse/THRIFT-5690) - Constant expects type to be defined before
+
+## Delphi
+
+- [THRIFT-5686](https://issues.apache.org/jira/browse/THRIFT-5686) - Add comparer and capacity arguments to container classes
+
+## Go
+- [THRIFT-5731](https://issues.apache.org/jira/browse/THRIFT-5731) - Handle ErrAbandonRequest automatically
+
+
+## Haxe
+
+- [THRIFT-5717](https://issues.apache.org/jira/browse/THRIFT-5717) - uuid sets and map keys may throw on some Haxe targets
+- [THRIFT-5704](https://issues.apache.org/jira/browse/THRIFT-5704) - Superfluous block scope in generated write() code
+- [THRIFT-5703](https://issues.apache.org/jira/browse/THRIFT-5703) - Haxe 4.30 emits "Local variable retval used without being initialized" on generated code
+- [THRIFT-5692](https://issues.apache.org/jira/browse/THRIFT-5692) - Support for deprecated methods (via annotation)
+- [THRIFT-5707](https://issues.apache.org/jira/browse/THRIFT-5707) - deprecation warning fixes for @:extern and @:enum
+
+## Java
+
+- [THRIFT-5700](https://issues.apache.org/jira/browse/THRIFT-5700) - Migration to JakartaEE and Apache HttpComponents 5
+- [THRIFT-5711](https://issues.apache.org/jira/browse/THRIFT-5711) - FutureClient does not extend when service extends from another service
+- [THRIFT-5702](https://issues.apache.org/jira/browse/THRIFT-5702) - Support Java 8
+- [THRIFT-5696](https://issues.apache.org/jira/browse/THRIFT-5696) - TByteBuffer.java does not allow non-default TConfiguration
+- [THRIFT-5653](https://issues.apache.org/jira/browse/THRIFT-5653) - Fix Java UUID typeid
+
+
+## JavaScript
+
+- [THRIFT-5674](https://issues.apache.org/jira/browse/THRIFT-5674) - Server implementation exceptions are not sent to client in ES6 promise-style invocation
+
+## netstd
+
+- [THRIFT-5684](https://issues.apache.org/jira/browse/THRIFT-5684) - Upgrade to net7.0
+
+## Node.js
+
+- [THRIFT-5710](https://issues.apache.org/jira/browse/THRIFT-5710) - NodeJS header transport leaks headers between all instances
+
+## PHP
+
+- [THRIFT-5723](https://issues.apache.org/jira/browse/THRIFT-5723) - Php8.1 fix warnings
+
+## Swift
+
+- [THRIFT-5714](https://issues.apache.org/jira/browse/THRIFT-5714) - add TJSONProtocol support in thrift-swift
+
## 0.18.1
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f056629..a685e4f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,7 +28,7 @@
# PACKAGE_VERSION is used by cpack scripts currently
# Both thrift_VERSION and PACKAGE_VERSION should be the same for now
-set(thrift_VERSION "0.19.0")
+set(thrift_VERSION "0.20.0")
set(PACKAGE_VERSION ${thrift_VERSION})
project("thrift" VERSION ${PACKAGE_VERSION})
diff --git a/LANGUAGES.md b/LANGUAGES.md
index 2f1f4f1..6cb6018 100644
--- a/LANGUAGES.md
+++ b/LANGUAGES.md
@@ -163,7 +163,7 @@
<td align=left><a href="https://github.com/apache/thrift/blob/master/lib/go/README.md">Go</a></td>
<!-- Since -----------------><td>0.7.0</td>
<!-- Build Systems ---------><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cred.png" alt=""/></td>
-<!-- Language Levels -------><td>1.19.5</td><td>1.20</td>
+<!-- Language Levels -------><td>1.20</td><td>1.21</td>
<!-- Field types -----------><td><img src="/doc/images/cred.png" alt=""/></td>
<!-- Low-Level Transports --><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
<!-- Transport Wrappers ----><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
diff --git a/Thrift.podspec b/Thrift.podspec
index fe5bcc3..8bf70f6 100644
--- a/Thrift.podspec
+++ b/Thrift.podspec
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'Thrift'
- s.version = '0.19.0'
+ s.version = '0.20.0'
s.summary = "Apache Thrift is a lightweight, language-independent software stack with an associated code generation mechanism for RPC."
s.description = <<-DESC
The Apache Thrift scalable cross-language software framework for networked services development combines a software stack with a code generation engine to build services that work efficiently and seamlessly between many programming languages.
@@ -10,6 +10,6 @@
s.author = { 'Apache Thrift Developers' => 'dev@thrift.apache.org' }
s.ios.deployment_target = '9.0'
s.osx.deployment_target = '10.10'
- s.source = { :git => 'https://github.com/apache/thrift.git', :tag => 'v0.19.0' }
+ s.source = { :git => 'https://github.com/apache/thrift.git', :tag => 'v0.20.0' }
s.source_files = 'lib/swift/Sources/*.swift'
end
diff --git a/appveyor.yml b/appveyor.yml
index 1f5abeb..5847ea9 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -19,7 +19,7 @@
# build Apache Thrift on AppVeyor - https://ci.appveyor.com
-version: '0.19.0.{build}'
+version: '0.20.0.{build}'
shallow_clone: true
diff --git a/bower.json b/bower.json
index 51913da..84f3a98 100644
--- a/bower.json
+++ b/bower.json
@@ -1,6 +1,6 @@
{
"name": "thrift",
- "version": "0.19.0",
+ "version": "0.20.0",
"homepage": "https://github.com/apache/thrift.git",
"authors": [
"Apache Thrift <dev@thrift.apache.org>"
diff --git a/build/cmake/DefinePlatformSpecifc.cmake b/build/cmake/DefinePlatformSpecifc.cmake
index 84409e6..a78d80c 100644
--- a/build/cmake/DefinePlatformSpecifc.cmake
+++ b/build/cmake/DefinePlatformSpecifc.cmake
@@ -25,8 +25,12 @@
# basic options
foreach(lang IN ITEMS C CXX)
- if("CMAKE_${lang}_COMPILER_ID" STREQUAL "MSVC" OR "${CMAKE_${lang}_SIMULATE_ID}" STREQUAL "MSVC")
+ if("CMAKE_${lang}_COMPILER_ID" STREQUAL "MSVC")
+ # These flags are not supported (or needed) with Clang-Cl on Windows:
set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS} /MP") # parallel build
+ endif()
+
+ if("CMAKE_${lang}_COMPILER_ID" STREQUAL "MSVC" OR "${CMAKE_${lang}_SIMULATE_ID}" STREQUAL "MSVC")
set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS} /W3") # warning level 3
include(CheckCXXCompilerFlag)
set(CMAKE_REQUIRED_QUIET ON)
diff --git a/build/cmake/GenerateConfigModule.cmake b/build/cmake/GenerateConfigModule.cmake
index 26f018a..597ffd8 100644
--- a/build/cmake/GenerateConfigModule.cmake
+++ b/build/cmake/GenerateConfigModule.cmake
@@ -40,6 +40,9 @@
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/ThriftConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/ThriftConfigVersion.cmake"
- "${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/FindLibevent.cmake"
DESTINATION "${CMAKE_INSTALL_DIR}/thrift")
+ if(WITH_LIBEVENT)
+ install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/FindLibevent.cmake"
+ DESTINATION "${CMAKE_INSTALL_DIR}/thrift")
+ endif()
endif()
diff --git a/build/docker/README.md b/build/docker/README.md
index 9635e6f..abf0823 100644
--- a/build/docker/README.md
+++ b/build/docker/README.md
@@ -177,7 +177,7 @@
| d | 2.087.0 | 2.087.0 | |
| dart | 2.0.0 | 2.4.0 | |
| delphi | | | Not in CI |
-| erlang | OTP-18 | OTP-23 | |
+| erlang | OTP-20 | OTP-25 | |
| go | 1.15.10 | 1.16.2 | |
| haxe | 3.2.1 | 3.4.4 | THRIFT-4352: avoid 3.4.2 |
| java | 1.8.0\_191 | 17 | |
diff --git a/build/docker/old/ubuntu-disco/Dockerfile b/build/docker/old/ubuntu-disco/Dockerfile
index 55dc853..43f4a00 100644
--- a/build/docker/old/ubuntu-disco/Dockerfile
+++ b/build/docker/old/ubuntu-disco/Dockerfile
@@ -160,7 +160,7 @@
haxelib setup --always /usr/share/haxe/lib && \
haxelib install --always hxcpp 2>&1 > /dev/null
-ENV GRADLE_VERSION="8.0.2"
+ENV GRADLE_VERSION="8.4"
RUN apt-get install -y --no-install-recommends \
`# Java dependencies` \
ant \
@@ -169,7 +169,7 @@
openjdk-11-jdk-headless && \
`# Gradle` \
wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip && \
- (echo "ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7 /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \
+ (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \
unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip && \
mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle && \
ln -s /usr/local/gradle/bin/gradle /usr/local/bin
diff --git a/build/docker/old/ubuntu-xenial/Dockerfile b/build/docker/old/ubuntu-xenial/Dockerfile
index 64d4804..7351085 100644
--- a/build/docker/old/ubuntu-xenial/Dockerfile
+++ b/build/docker/old/ubuntu-xenial/Dockerfile
@@ -121,7 +121,7 @@
dotnet-apphost-pack-7.0
# Erlang dependencies
-ARG ERLANG_OTP_VERSION=18.3.4.11
+ARG ERLANG_OTP_VERSION=20.3.8.9
ARG ERLANG_REBAR_VERSION=3.13.2
RUN apt-get update && apt-get install -y --no-install-recommends automake libncurses5-dev && \
curl https://raw.githubusercontent.com/kerl/kerl/master/kerl -o /usr/local/bin/kerl && chmod +x /usr/local/bin/kerl && \
@@ -155,7 +155,7 @@
haxelib install --always hxcpp 3.4.64 2>&1 > /dev/null
# note: hxcpp 3.4.185 (latest) no longer ships static libraries, and caused a build failure
-ENV GRADLE_VERSION="8.0.2"
+ENV GRADLE_VERSION="8.4"
RUN apt-get install -y --no-install-recommends \
`# Java dependencies` \
ant \
@@ -165,7 +165,7 @@
unzip && \
`# Gradle` \
wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip && \
- (echo "ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7 /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \
+ (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \
unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip && \
mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle && \
ln -s /usr/local/gradle/bin/gradle /usr/local/bin
diff --git a/build/docker/ubuntu-bionic/Dockerfile b/build/docker/ubuntu-bionic/Dockerfile
index d6d2bda..57a8aee 100644
--- a/build/docker/ubuntu-bionic/Dockerfile
+++ b/build/docker/ubuntu-bionic/Dockerfile
@@ -161,7 +161,7 @@
haxelib setup --always /usr/share/haxe/lib && \
haxelib install --always hxcpp 2>&1 > /dev/null
-ENV GRADLE_VERSION="8.0.2"
+ENV GRADLE_VERSION="8.4"
RUN apt-get install -y --no-install-recommends \
`# Java dependencies` \
ant \
@@ -170,7 +170,7 @@
openjdk-17-jdk-headless && \
`# Gradle` \
wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip && \
- (echo "ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7 /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \
+ (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \
unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip && \
mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle && \
ln -s /usr/local/gradle/bin/gradle /usr/local/bin
diff --git a/build/docker/ubuntu-focal/Dockerfile b/build/docker/ubuntu-focal/Dockerfile
index 1f30573..a6121fa 100644
--- a/build/docker/ubuntu-focal/Dockerfile
+++ b/build/docker/ubuntu-focal/Dockerfile
@@ -162,7 +162,7 @@
haxelib setup --always /usr/share/haxe/lib && \
haxelib install --always hxcpp 2>&1 > /dev/null
-ENV GRADLE_VERSION="8.0.2"
+ENV GRADLE_VERSION="8.4"
RUN apt-get install -y --no-install-recommends \
`# Java dependencies` \
ant \
@@ -171,7 +171,7 @@
openjdk-17-jdk-headless && \
`# Gradle` \
wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip && \
- (echo "ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7 /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \
+ (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \
unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip && \
mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle && \
ln -s /usr/local/gradle/bin/gradle /usr/local/bin
diff --git a/build/docker/ubuntu-jammy/Dockerfile b/build/docker/ubuntu-jammy/Dockerfile
index c7724e7..bbb46d7 100644
--- a/build/docker/ubuntu-jammy/Dockerfile
+++ b/build/docker/ubuntu-jammy/Dockerfile
@@ -162,7 +162,7 @@
haxelib setup --always /usr/share/haxe/lib && \
haxelib install --always hxcpp 2>&1 > /dev/null
-ENV GRADLE_VERSION="8.0.2"
+ENV GRADLE_VERSION="8.4"
RUN apt-get install -y --no-install-recommends \
`# Java dependencies` \
ant \
@@ -171,7 +171,7 @@
openjdk-11-jdk-headless && \
`# Gradle` \
wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip && \
- (echo "ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7 /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \
+ (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \
unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip && \
mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle && \
ln -s /usr/local/gradle/bin/gradle /usr/local/bin
diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.cc b/compiler/cpp/src/thrift/generate/t_go_generator.cc
index 90353ce..54422c8 100644
--- a/compiler/cpp/src/thrift/generate/t_go_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_go_generator.cc
@@ -2797,13 +2797,13 @@
f_types_ << indent() << "if thrift.ServerConnectivityCheckInterval > 0 {" << endl;
indent_up();
- f_types_ << indent() << "var cancel context.CancelFunc" << endl;
- f_types_ << indent() << "ctx, cancel = context.WithCancel(ctx)" << endl;
- f_types_ << indent() << "defer cancel()" << endl;
+ f_types_ << indent() << "var cancel context.CancelCauseFunc" << endl;
+ f_types_ << indent() << "ctx, cancel = context.WithCancelCause(ctx)" << endl;
+ f_types_ << indent() << "defer cancel(nil)" << endl;
f_types_ << indent() << "var tickerCtx context.Context" << endl;
f_types_ << indent() << "tickerCtx, tickerCancel = context.WithCancel(context.Background())" << endl;
f_types_ << indent() << "defer tickerCancel()" << endl;
- f_types_ << indent() << "go func(ctx context.Context, cancel context.CancelFunc) {" << endl;
+ f_types_ << indent() << "go func(ctx context.Context, cancel context.CancelCauseFunc) {" << endl;
indent_up();
f_types_ << indent() << "ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)" << endl;
@@ -2821,7 +2821,7 @@
indent_up();
f_types_ << indent() << "if !iprot.Transport().IsOpen() {" << endl;
indent_up();
- f_types_ << indent() << "cancel()" << endl;
+ f_types_ << indent() << "cancel(thrift.ErrAbandonRequest)" << endl;
f_types_ << indent() << "return" << endl;
indent_down();
f_types_ << indent() << "}" << endl;
@@ -2901,6 +2901,15 @@
f_types_ << indent() << "return false, thrift.WrapTException(err2)" << endl;
indent_down();
f_types_ << indent() << "}" << endl;
+ f_types_ << indent() << "if errors.Is(err2, context.Canceled) {" << endl;
+ indent_up();
+ f_types_ << indent() << "if err := context.Cause(ctx); errors.Is(err, thrift.ErrAbandonRequest) {" << endl;
+ indent_up();
+ f_types_ << indent() << "return false, thrift.WrapTException(err)" << endl;
+ indent_down();
+ f_types_ << indent() << "}" << endl;
+ indent_down();
+ f_types_ << indent() << "}" << endl;
string exc(tmp("_exc"));
f_types_ << indent() << exc << " := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "
diff --git a/compiler/cpp/src/thrift/generate/t_haxe_generator.cc b/compiler/cpp/src/thrift/generate/t_haxe_generator.cc
index 166f78e..b236e0b 100644
--- a/compiler/cpp/src/thrift/generate/t_haxe_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_haxe_generator.cc
@@ -358,7 +358,7 @@
string package = make_package_name( program->get_namespace("haxe"));
if (!package.empty()) {
if (imports.find(package + "." + (*m_iter)->get_type()->get_name()) == string::npos) {
- imports.append("import " + package + "." + (*m_iter)->get_type()->get_name() + ";\n");
+ imports.append("import " + package + "." + get_cap_name((*m_iter)->get_type()->get_name()) + ";\n");
}
}
}
@@ -383,7 +383,7 @@
string package = make_package_name( program->get_namespace("haxe"));
if (!package.empty()) {
if (imports.find(package + "." + (*f_iter)->get_returntype()->get_name()) == string::npos) {
- imports.append("import " + package + "." + (*f_iter)->get_returntype()->get_name()+ ";\n");
+ imports.append("import " + package + "." + get_cap_name((*f_iter)->get_returntype()->get_name())+ ";\n");
}
}
}
@@ -1536,7 +1536,7 @@
t_type* parent = tservice->get_extends();
string parent_namespace = make_package_name( parent->get_program()->get_namespace("haxe"));
if (!parent_namespace.empty() && parent_namespace != package_name_) {
- f_service_ << "import " << type_name(parent) << "_service;" << endl;
+ f_service_ << "import " << get_cap_name(type_name(parent)) << "_service;" << endl;
}
}
@@ -1558,7 +1558,7 @@
t_type* parent = tservice->get_extends();
string parent_namespace = make_package_name( parent->get_program()->get_namespace("haxe"));
if (!parent_namespace.empty() && parent_namespace != package_name_) {
- f_service_ << "import " << type_name(parent) << ";" << endl;
+ f_service_ << "import " << get_cap_name(type_name(parent)) << ";" << endl;
}
}
@@ -1578,7 +1578,7 @@
t_type* parent = tservice->get_extends();
string parent_namespace = make_package_name( parent->get_program()->get_namespace("haxe"));
if (!parent_namespace.empty() && parent_namespace != package_name_) {
- f_service_ << "import " << type_name(parent) << "Impl;" << endl;
+ f_service_ << "import " << get_cap_name(type_name(parent)) << "Impl;" << endl;
}
}
@@ -1752,7 +1752,7 @@
string extends_iface = "";
if (tservice->get_extends() != nullptr) {
- extends_iface = " extends " + tservice->get_extends()->get_name() + cbk_postfix;
+ extends_iface = " extends " + get_cap_name(type_name(tservice->get_extends())) + cbk_postfix;
}
vector<t_function*> functions = tservice->get_functions();
@@ -1797,7 +1797,7 @@
string extends = "";
string extends_client = "";
if (tservice->get_extends() != nullptr) {
- extends = get_cap_name(tservice->get_extends()->get_name());
+ extends = get_cap_name(type_name(tservice->get_extends()));
extends_client = " extends " + extends + "Impl";
}
@@ -2637,6 +2637,8 @@
return "StringMap< " + type_name(tval) + ">";
}
break; // default to ObjectMap<>
+ case t_base_type::TYPE_UUID:
+ return "StringMap< " + type_name(tval) + ">"; // uuids are stored as strings
case t_base_type::TYPE_I8:
case t_base_type::TYPE_I16:
case t_base_type::TYPE_I32:
@@ -2663,6 +2665,8 @@
return "StringSet";
}
break; // default to ObjectSet
+ case t_base_type::TYPE_UUID:
+ return "StringSet"; // uuids are stored as strings
case t_base_type::TYPE_I8:
case t_base_type::TYPE_I16:
case t_base_type::TYPE_I32:
diff --git a/compiler/cpp/src/thrift/generate/t_java_generator.cc b/compiler/cpp/src/thrift/generate/t_java_generator.cc
index 172d137..d7e0b65 100644
--- a/compiler/cpp/src/thrift/generate/t_java_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_java_generator.cc
@@ -5756,7 +5756,6 @@
}
indent(out) << "oprot.writeBitSet(optionals, " << optional_count << ");" << endl;
- int j = 0;
for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
if ((*f_iter)->get_req() == t_field::T_OPTIONAL
|| (*f_iter)->get_req() == t_field::T_OPT_IN_REQ_OUT) {
@@ -5765,7 +5764,6 @@
generate_serialize_field(out, (*f_iter), "struct.", "", false);
indent_down();
indent(out) << "}" << endl;
- j++;
}
}
}
diff --git a/compiler/cpp/src/thrift/generate/t_js_generator.cc b/compiler/cpp/src/thrift/generate/t_js_generator.cc
index f5937d0..96250c9 100644
--- a/compiler/cpp/src/thrift/generate/t_js_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_js_generator.cc
@@ -28,6 +28,7 @@
#include <cassert>
#include <unordered_map>
+#include <stdint.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sstream>
diff --git a/compiler/cpp/src/thrift/generate/t_py_generator.cc b/compiler/cpp/src/thrift/generate/t_py_generator.cc
index 857cb77..ffabd56 100644
--- a/compiler/cpp/src/thrift/generate/t_py_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_py_generator.cc
@@ -607,7 +607,7 @@
int64_t int_val = value->get_integer();
if (gen_enum_) {
t_enum_value* enum_val = ((t_enum*)type)->get_constant_by_value(int_val);
- out << type->get_name() << "." << enum_val->get_name();
+ out << type_name(type) << "." << enum_val->get_name();
} else {
out << int_val;
}
@@ -871,7 +871,12 @@
}
if (is_immutable(tstruct)) {
- if (gen_newstyle_ || gen_dynamic_) {
+ if (gen_enum_ && type->is_enum()) {
+ indent(out) << "super(" << tstruct->get_name() << ", self).__setattr__('"
+ << (*m_iter)->get_name() << "', " << (*m_iter)->get_name()
+ << " if hasattr(" << (*m_iter)->get_name() << ", 'value') else "
+ << type_name(type) << ".__members__.get(" << (*m_iter)->get_name() << "))" << endl;
+ } else if (gen_newstyle_ || gen_dynamic_) {
indent(out) << "super(" << tstruct->get_name() << ", self).__setattr__('"
<< (*m_iter)->get_name() << "', " << (*m_iter)->get_name() << ")" << endl;
} else {
@@ -888,12 +893,42 @@
if (is_immutable(tstruct)) {
out << endl;
- out << indent() << "def __setattr__(self, *args):" << endl
- << indent() << indent_str() << "raise TypeError(\"can't modify immutable instance\")" << endl
- << endl;
- out << indent() << "def __delattr__(self, *args):" << endl
- << indent() << indent_str() << "raise TypeError(\"can't modify immutable instance\")" << endl
- << endl;
+ out << indent() << "def __setattr__(self, *args):" << endl;
+ indent_up();
+
+ // Not user-provided fields should be editable so that the Python Standard Library can edit
+ // internal fields of std library base classes. For example, in Python 3.11 ContextManager
+ // edits the `__traceback__` field on Exceptions. Allowing this to work with `__slots__` is
+ // trivial because we know which fields are user-provided, without slots we need to build a
+ // way to know which fields are user-provided.
+ if (gen_slots_ && !gen_dynamic_) {
+ out << indent() << "if args[0] not in self.__slots__:" << endl;
+ indent_up();
+ out << indent() << "super().__setattr__(*args)" << endl
+ << indent() << "return" << endl;
+ indent_down();
+ }
+ out << indent() << "raise TypeError(\"can't modify immutable instance\")" << endl;
+ indent_down();
+ out << endl;
+ out << indent() << "def __delattr__(self, *args):" << endl;
+ indent_up();
+
+ // Not user-provided fields should be editable so that the Python Standard Library can edit
+ // internal fields of std library base classes. For example, in Python 3.11 ContextManager
+ // edits the `__traceback__` field on Exceptions. Allowing this to work with `__slots__` is
+ // trivial because we know which fields are user-provided, without slots we need to build a
+ // way to know which fields are user-provided.
+ if (gen_slots_ && !gen_dynamic_) {
+ out << indent() << "if args[0] not in self.__slots__:" << endl;
+ indent_up();
+ out << indent() << "super().__delattr__(*args)" << endl
+ << indent() << "return" << endl;
+ indent_down();
+ }
+ out << indent() << "raise TypeError(\"can't modify immutable instance\")" << endl;
+ indent_down();
+ out << endl;
// Hash all of the members in order, and also hash in the class
// to avoid collisions for stuff like single-field structures.
@@ -905,6 +940,32 @@
}
out << "))" << endl;
+ } else if (gen_enum_) {
+ bool has_enum = false;
+ for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+ t_type* type = (*m_iter)->get_type();
+ if (type->is_enum()) {
+ has_enum = true;
+ break;
+ }
+ }
+
+ if (has_enum) {
+ out << endl;
+ indent(out) << "def __setattr__(self, name, value):" << endl;
+ indent_up();
+ for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+ t_type* type = (*m_iter)->get_type();
+ if (type->is_enum()) {
+ out << indent() << "if name == \"" << (*m_iter)->get_name() << "\":" << endl
+ << indent() << indent_str() << "super().__setattr__(name, value if hasattr(value, 'value') else "
+ << type_name(type) << ".__members__.get(value))" << endl
+ << indent() << indent_str() << "return" << endl;
+ }
+ }
+ indent(out) << "super().__setattr__(name, value)" << endl << endl;
+ indent_down();
+ }
}
if (!gen_dynamic_) {
@@ -2287,7 +2348,7 @@
out << endl;
} else if (type->is_enum()) {
if (gen_enum_) {
- indent(out) << name << " = " << type_name(type) << "(iprot.readI32()).name";
+ indent(out) << name << " = " << type_name(type) << "(iprot.readI32())";
} else {
indent(out) << name << " = iprot.readI32()";
}
@@ -2477,7 +2538,7 @@
}
} else if (type->is_enum()) {
if (gen_enum_){
- out << "writeI32(" << type_name(type) << "[" << name << "].value)";
+ out << "writeI32(" << name << ".value)";
} else {
out << "writeI32(" << name << ")";
}
diff --git a/compiler/cpp/src/thrift/generate/t_rs_generator.cc b/compiler/cpp/src/thrift/generate/t_rs_generator.cc
index f454d9b..2742724 100644
--- a/compiler/cpp/src/thrift/generate/t_rs_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_rs_generator.cc
@@ -17,11 +17,11 @@
* under the License.
*/
-#include <string>
#include <iostream>
+#include <string>
-#include "thrift/platform.h"
#include "thrift/generate/t_generator.h"
+#include "thrift/platform.h"
using std::map;
using std::ofstream;
@@ -34,25 +34,17 @@
static const string endl("\n"); // avoid ostream << std::endl flushes
static const string SERVICE_RESULT_VARIABLE("result_value");
static const string RESULT_STRUCT_SUFFIX("Result");
-static const string RUST_RESERVED_WORDS[] = {
- "abstract", "alignof", "as", "become",
- "box", "break", "const", "continue",
- "crate", "do", "else", "enum",
- "extern", "false", "final", "fn",
- "for", "if", "impl", "in",
- "let", "loop", "macro", "match",
- "mod", "move", "mut", "offsetof",
- "override", "priv", "proc", "pub",
- "pure", "ref", "return", "Self",
- "self", "sizeof", "static", "struct",
- "super", "trait", "true", "type",
- "typeof", "unsafe", "unsized", "use",
- "virtual", "where", "while", "yield"
-};
-const set<string> RUST_RESERVED_WORDS_SET(
- RUST_RESERVED_WORDS,
- RUST_RESERVED_WORDS + sizeof(RUST_RESERVED_WORDS)/sizeof(RUST_RESERVED_WORDS[0])
-);
+static const string RUST_RESERVED_WORDS[]
+ = {"abstract", "alignof", "as", "become", "box", "break", "const", "continue", "crate",
+ "do", "else", "enum", "extern", "false", "final", "fn", "for", "if",
+ "impl", "in", "let", "loop", "macro", "match", "mod", "move", "mut",
+ "offsetof", "override", "priv", "proc", "pub", "pure", "ref", "return", "Self",
+ "self", "sizeof", "static", "struct", "super", "trait", "true", "type", "typeof",
+ "unsafe", "unsized", "use", "virtual", "where", "while", "yield"};
+const set<string> RUST_RESERVED_WORDS_SET(RUST_RESERVED_WORDS,
+ RUST_RESERVED_WORDS
+ + sizeof(RUST_RESERVED_WORDS)
+ / sizeof(RUST_RESERVED_WORDS[0]));
static const string SYNC_CLIENT_GENERIC_BOUND_VARS("<IP, OP>");
static const string SYNC_CLIENT_GENERIC_BOUNDS("where IP: TInputProtocol, OP: TOutputProtocol");
@@ -62,11 +54,8 @@
class t_rs_generator : public t_generator {
public:
- t_rs_generator(
- t_program* program,
- const std::map<std::string, std::string>&,
- const std::string&
- ) : t_generator(program) {
+ t_rs_generator(t_program* program, const std::map<std::string, std::string>&, const std::string&)
+ : t_generator(program) {
gen_dir_ = get_out_dir();
}
@@ -107,7 +96,8 @@
void render_attributes_and_includes();
// Create the closure of Rust modules referenced by this service.
- void compute_service_referenced_modules(t_service *tservice, set<pair<string, string>> &referenced_modules);
+ void compute_service_referenced_modules(t_service* tservice,
+ set<pair<string, string>>& referenced_modules);
// Write the rust representation of an enum.
void render_enum_definition(t_enum* tenum, const string& enum_name);
@@ -122,13 +112,16 @@
// Write a simple rust const value (ie. `pub const FOO: foo...`).
void render_const_value(const string& name, t_type* ttype, t_const_value* tvalue);
- // Write a constant list, set, map or struct. These constants require allocation and cannot be defined
- // using a 'pub const'. As a result, I create a holder struct with a single `const_value` method that
- // returns the initialized instance.
+ // Write a constant list, set, map or struct. These constants require allocation and cannot be
+ // defined using a 'pub const'. As a result, I create a holder struct with a single `const_value`
+ // method that returns the initialized instance.
void render_const_value_holder(const string& name, t_type* ttype, t_const_value* tvalue);
// Write the actual const value - the right side of a const definition.
- void render_const_value(t_type* ttype, t_const_value* tvalue, bool is_owned = true, bool is_inline = true);
+ void render_const_value(t_type* ttype,
+ t_const_value* tvalue,
+ bool is_owned = true,
+ bool is_inline = true);
// Write a const struct (returned from `const_value` method).
void render_const_struct(t_type* ttype, t_const_value* tvalue);
@@ -142,12 +135,14 @@
// Write a const map (returned from `const_value` method).
void render_const_map(t_type* ttype, t_const_value* tvalue);
- // Write the rust representation of a thrift struct to the generated file. Set `struct_type` to `T_ARGS`
- // if rendering the struct used to pack arguments for a service call. When `struct_type` is `T_ARGS` the
- // struct and its members have module visibility, and all fields are required. When `struct_type` is
- // anything else the struct and its members have public visibility and fields have the visibility set
- // in their definition.
- void render_struct(const string& struct_name, t_struct* tstruct, t_rs_generator::e_struct_type struct_type);
+ // Write the rust representation of a thrift struct to the generated file. Set `struct_type` to
+ // `T_ARGS` if rendering the struct used to pack arguments for a service call. When `struct_type`
+ // is `T_ARGS` the struct and its members have module visibility, and all fields are required.
+ // When `struct_type` is anything else the struct and its members have public visibility and
+ // fields have the visibility set in their definition.
+ void render_struct(const string& struct_name,
+ t_struct* tstruct,
+ t_rs_generator::e_struct_type struct_type);
// Write the comment block preceding a type definition (and implementation).
void render_type_comment(const string& struct_name);
@@ -156,79 +151,77 @@
// user-defined structs and exception structs. The exact struct type to be generated is controlled
// by the `struct_type` parameter, which (among other things) modifies the visibility of the
// written struct and members, controls which trait implementations are generated.
- void render_struct_definition(
- const string& struct_name,
- t_struct* tstruct,
- t_rs_generator::e_struct_type struct_type
- );
+ void render_struct_definition(const string& struct_name,
+ t_struct* tstruct,
+ t_rs_generator::e_struct_type struct_type);
// Writes the impl block associated with the rust representation of a struct. At minimum this
// contains the methods to read from a protocol and write to a protocol. Additional methods may
// be generated depending on `struct_type`.
- void render_struct_impl(
- const string& struct_name,
- t_struct* tstruct,
- t_rs_generator::e_struct_type struct_type
- );
+ void render_struct_impl(const string& struct_name,
+ t_struct* tstruct,
+ t_rs_generator::e_struct_type struct_type);
- // Generate a `fn new(...)` for a struct with name `struct_name` and type `t_struct`. The auto-generated
- // code may include generic type parameters to make the constructor more ergonomic. `struct_type` controls
- // the visibility of the generated constructor.
- void render_struct_constructor(
- const string& struct_name,
- t_struct* tstruct,
- t_rs_generator::e_struct_type struct_type
- );
+ // Generate a `fn new(...)` for a struct with name `struct_name` and type `t_struct`. The
+ // auto-generated code may include generic type parameters to make the constructor more ergonomic.
+ // `struct_type` controls the visibility of the generated constructor.
+ void render_struct_constructor(const string& struct_name,
+ t_struct* tstruct,
+ t_rs_generator::e_struct_type struct_type);
- // Write the `ok_or` method added to all Thrift service call result structs. You can use this method
- // to convert a struct into a `Result` and use it in a `try!` or combinator chain.
+ // Write the `ok_or` method added to all Thrift service call result structs. You can use this
+ // method to convert a struct into a `Result` and use it in a `try!` or combinator chain.
void render_result_struct_to_result_method(t_struct* tstruct);
// Write the implementations for the `Error` and `Debug` traits. These traits are necessary for a
// user-defined exception to be properly handled as Rust errors.
void render_exception_struct_error_trait_impls(const string& struct_name, t_struct* tstruct);
- // Write the function that serializes a struct to its wire representation. If `struct_type` is `T_ARGS`
- // then all fields are considered "required", if not, the default optionality is used.
- void render_struct_sync_write(t_struct *tstruct, t_rs_generator::e_struct_type struct_type);
+ // Write the function that serializes a struct to its wire representation. If `struct_type` is
+ // `T_ARGS` then all fields are considered "required", if not, the default optionality is used.
+ void render_struct_sync_write(t_struct* tstruct, t_rs_generator::e_struct_type struct_type);
// Helper function that serializes a single struct field to its wire representation. Unpacks the
- // variable (since it may be optional) and serializes according to the optionality rules required by `req`.
- // Variables in auto-generated code are passed by reference. Since this function may be called in
- // contexts where the variable is *already* a reference you can set `field_var_is_ref` to `true` to avoid
- // generating an extra, unnecessary `&` that the compiler will have to automatically dereference.
- void render_struct_field_sync_write(
- const string &field_var,
- bool field_var_is_ref,
- t_field *tfield,
- t_field::e_req req);
+ // variable (since it may be optional) and serializes according to the optionality rules required
+ // by `req`. Variables in auto-generated code are passed by reference. Since this function may be
+ // called in contexts where the variable is *already* a reference you can set `field_var_is_ref`
+ // to `true` to avoid generating an extra, unnecessary `&` that the compiler will have to
+ // automatically dereference.
+ void render_struct_field_sync_write(const string& field_var,
+ bool field_var_is_ref,
+ t_field* tfield,
+ t_field::e_req req);
- // Write the rust function that serializes a single type (i.e. a i32 etc.) to its wire representation.
- // Variables in auto-generated code are passed by reference. Since this function may be called in
- // contexts where the variable is *already* a reference you can set `type_var_is_ref` to `true` to avoid
- // generating an extra, unnecessary `&` that the compiler will have to automatically dereference.
- void render_type_sync_write(const string &type_var, bool type_var_is_ref, t_type *ttype);
+ // Write the rust function that serializes a single type (i.e. a i32 etc.) to its wire
+ // representation. Variables in auto-generated code are passed by reference. Since this function
+ // may be called in contexts where the variable is *already* a reference you can set
+ // `type_var_is_ref` to `true` to avoid generating an extra, unnecessary `&` that the compiler
+ // will have to automatically dereference.
+ void render_type_sync_write(const string& type_var, bool type_var_is_ref, t_type* ttype);
// Write a list to the output protocol. `list_variable` is the variable containing the list
// that will be written to the output protocol.
// Variables in auto-generated code are passed by reference. Since this function may be called in
- // contexts where the variable is *already* a reference you can set `list_var_is_ref` to `true` to avoid
- // generating an extra, unnecessary `&` that the compiler will have to automatically dereference.
- void render_list_sync_write(const string &list_var, bool list_var_is_ref, t_list *tlist);
+ // contexts where the variable is *already* a reference you can set `list_var_is_ref` to `true` to
+ // avoid generating an extra, unnecessary `&` that the compiler will have to automatically
+ // dereference.
+ void render_list_sync_write(const string& list_var, bool list_var_is_ref, t_list* tlist);
// Write a set to the output protocol. `set_variable` is the variable containing the set that will
// be written to the output protocol.
// Variables in auto-generated code are passed by reference. Since this function may be called in
- // contexts where the variable is *already* a reference you can set `set_var_is_ref` to `true` to avoid
- // generating an extra, unnecessary `&` that the compiler will have to automatically dereference.
- void render_set_sync_write(const string &set_var, bool set_var_is_ref, t_set *tset);
+ // contexts where the variable is *already* a reference you can set `set_var_is_ref` to `true` to
+ // avoid generating an extra, unnecessary `&` that the compiler will have to automatically
+ // dereference.
+ void render_set_sync_write(const string& set_var, bool set_var_is_ref, t_set* tset);
// Write a map to the output protocol. `map_variable` is the variable containing the map that will
// be written to the output protocol.
// Variables in auto-generated code are passed by reference. Since this function may be called in
- // contexts where the variable is *already* a reference you can set `map_var_is_ref` to `true` to avoid
- // generating an extra, unnecessary `&` that the compiler will have to automatically dereference.
- void render_map_sync_write(const string &map_var, bool map_var_is_ref, t_map *tset);
+ // contexts where the variable is *already* a reference you can set `map_var_is_ref` to `true` to
+ // avoid generating an extra, unnecessary `&` that the compiler will have to automatically
+ // dereference.
+ void render_map_sync_write(const string& map_var, bool map_var_is_ref, t_map* tset);
// Return `true` if we need to dereference ths type when writing an element from a container.
// Iterations on rust containers are performed as follows: `for v in &values { ... }`
@@ -237,38 +230,41 @@
bool needs_deref_on_container_write(t_type* ttype);
// Return the variable (including all dereferences) required to write values from a rust container
- // to the output protocol. For example, if you were iterating through a container and using the temp
- // variable `v` to represent each element, then `ttype` is the type stored in the container and
- // `base_var` is "v". The return value is the actual string you will have to use to properly reference
- // the temp variable for writing to the output protocol.
+ // to the output protocol. For example, if you were iterating through a container and using the
+ // temp variable `v` to represent each element, then `ttype` is the type stored in the container
+ // and `base_var` is "v". The return value is the actual string you will have to use to properly
+ // reference the temp variable for writing to the output protocol.
string string_container_write_variable(t_type* ttype, const string& base_var);
// Write the code to read bytes from the wire into the given `t_struct`. `struct_name` is the
// actual Rust name of the `t_struct`. If `struct_type` is `T_ARGS` then all struct fields are
// necessary. Otherwise, the field's default optionality is used.
- void render_struct_sync_read(const string &struct_name, t_struct *tstruct, t_rs_generator::e_struct_type struct_type);
+ void render_struct_sync_read(const string& struct_name,
+ t_struct* tstruct,
+ t_rs_generator::e_struct_type struct_type);
- // Write the rust function that deserializes a single type (i.e. i32 etc.) from its wire representation.
- // Set `is_boxed` to `true` if the resulting value should be wrapped in a `Box::new(...)`.
- void render_type_sync_read(const string &type_var, t_type *ttype, bool is_boxed = false);
+ // Write the rust function that deserializes a single type (i.e. i32 etc.) from its wire
+ // representation. Set `is_boxed` to `true` if the resulting value should be wrapped in a
+ // `Box::new(...)`.
+ void render_type_sync_read(const string& type_var, t_type* ttype, bool is_boxed = false);
// Read the wire representation of a list and convert it to its corresponding rust implementation.
// The deserialized list is stored in `list_variable`.
- void render_list_sync_read(t_list *tlist, const string &list_variable);
+ void render_list_sync_read(t_list* tlist, const string& list_variable);
// Read the wire representation of a set and convert it to its corresponding rust implementation.
// The deserialized set is stored in `set_variable`.
- void render_set_sync_read(t_set *tset, const string &set_variable);
+ void render_set_sync_read(t_set* tset, const string& set_variable);
// Read the wire representation of a map and convert it to its corresponding rust implementation.
// The deserialized map is stored in `map_variable`.
- void render_map_sync_read(t_map *tmap, const string &map_variable);
+ void render_map_sync_read(t_map* tmap, const string& map_variable);
// Return a temporary variable used to store values when deserializing nested containers.
string struct_field_read_temp_variable(t_field* tfield);
- // Top-level function that calls the various render functions necessary to write the rust representation
- // of a thrift union (i.e. an enum).
+ // Top-level function that calls the various render functions necessary to write the rust
+ // representation of a thrift union (i.e. an enum).
void render_union(t_struct* tstruct);
// Write the enum corresponding to the Thrift union.
@@ -278,20 +274,21 @@
void render_union_impl(const string& union_name, t_struct* tstruct);
// Write the `ENUM::write_to_out_protocol` function.
- void render_union_sync_write(const string &union_name, t_struct *tstruct);
+ void render_union_sync_write(const string& union_name, t_struct* tstruct);
// Write the `ENUM::read_from_in_protocol` function.
- void render_union_sync_read(const string &union_name, t_struct *tstruct);
+ void render_union_sync_read(const string& union_name, t_struct* tstruct);
- // Top-level function that calls the various render functions necessary to write the rust representation
- // of a Thrift client.
+ // Top-level function that calls the various render functions necessary to write the rust
+ // representation of a Thrift client.
void render_sync_client(t_service* tservice);
// Write the trait with the service-call methods for `tservice`.
- void render_sync_client_trait(t_service *tservice);
+ void render_sync_client_trait(t_service* tservice);
- // Write the trait to be implemented by the client impl if end users can use it to make service calls.
- void render_sync_client_marker_trait(t_service *tservice);
+ // Write the trait to be implemented by the client impl if end users can use it to make service
+ // calls.
+ void render_sync_client_marker_trait(t_service* tservice);
// Write the code to create the Thrift service sync client struct and its matching 'impl' block.
void render_sync_client_definition_and_impl(const string& client_impl_name);
@@ -303,14 +300,14 @@
// Write the code to create the impl block for the `TThriftClient` trait. Since generated
// Rust Thrift clients perform all their operations using methods defined in this trait, we
// have to implement it for the client structs.
- void render_sync_client_tthriftclient_impl(const string &client_impl_name);
+ void render_sync_client_tthriftclient_impl(const string& client_impl_name);
// Write the marker traits for any service(s) being extended, including the one for the current
// service itself (i.e. `tservice`)
- void render_sync_client_marker_trait_impls(t_service *tservice, const string &impl_struct_name);
+ void render_sync_client_marker_trait_impls(t_service* tservice, const string& impl_struct_name);
// Generate a list of all the traits this Thrift client struct extends.
- string sync_client_marker_traits_for_extension(t_service *tservice);
+ string sync_client_marker_traits_for_extension(t_service* tservice);
// Top-level function that writes the code to make the Thrift service calls.
void render_sync_client_process_impl(t_service* tservice);
@@ -318,26 +315,28 @@
// Write the actual function that calls out to the remote service and processes its response.
void render_sync_send_recv_wrapper(t_function* tfunc);
- // Write the `send` functionality for a Thrift service call represented by a `t_service->t_function`.
+ // Write the `send` functionality for a Thrift service call represented by a
+ // `t_service->t_function`.
void render_sync_send(t_function* tfunc);
- // Write the `recv` functionality for a Thrift service call represented by a `t_service->t_function`.
- // This method is only rendered if the function is *not* oneway.
+ // Write the `recv` functionality for a Thrift service call represented by a
+ // `t_service->t_function`. This method is only rendered if the function is *not* oneway.
void render_sync_recv(t_function* tfunc);
- void render_sync_processor(t_service *tservice);
+ void render_sync_processor(t_service* tservice);
- void render_sync_handler_trait(t_service *tservice);
- void render_sync_processor_definition_and_impl(t_service *tservice);
- void render_sync_process_delegation_functions(t_service *tservice);
- void render_sync_process_function(t_function *tfunc, const string &handler_type);
+ void render_sync_handler_trait(t_service* tservice);
+ void render_sync_processor_definition_and_impl(t_service* tservice);
+ void render_sync_process_delegation_functions(t_service* tservice);
+ void render_sync_process_function(t_function* tfunc, const string& handler_type);
void render_process_match_statements(t_service* tservice);
- void render_sync_handler_succeeded(t_function *tfunc);
- void render_sync_handler_failed(t_function *tfunc);
- void render_sync_handler_failed_user_exception_branch(t_function *tfunc);
- void render_sync_handler_failed_application_exception_branch(t_function *tfunc, const string &app_err_var);
- void render_sync_handler_failed_default_exception_branch(t_function *tfunc);
- void render_sync_handler_send_exception_response(t_function *tfunc, const string &err_var);
+ void render_sync_handler_succeeded(t_function* tfunc);
+ void render_sync_handler_failed(t_function* tfunc);
+ void render_sync_handler_failed_user_exception_branch(t_function* tfunc);
+ void render_sync_handler_failed_application_exception_branch(t_function* tfunc,
+ const string& app_err_var);
+ void render_sync_handler_failed_default_exception_branch(t_function* tfunc);
+ void render_sync_handler_send_exception_response(t_function* tfunc, const string& err_var);
void render_service_call_structs(t_service* tservice);
void render_service_call_args_struct(t_function* tfunc);
void render_service_call_result_value_struct(t_function* tfunc);
@@ -345,12 +344,10 @@
string handler_successful_return_struct(t_function* tfunc);
// Writes the result of `render_thrift_error_struct` wrapped in an `Err(thrift::Error(...))`.
- void render_thrift_error(
- const string& error_kind,
- const string& error_struct,
- const string& sub_error_kind,
- const string& error_message
- );
+ void render_thrift_error(const string& error_kind,
+ const string& error_struct,
+ const string& sub_error_kind,
+ const string& error_message);
// Write a thrift::Error variant struct. Error structs take the form:
// ```
@@ -366,11 +363,9 @@
// message: "This is some error message",
// }
// ```
- void render_thrift_error_struct(
- const string& error_struct,
- const string& sub_error_kind,
- const string& error_message
- );
+ void render_thrift_error_struct(const string& error_struct,
+ const string& sub_error_kind,
+ const string& error_message);
// Return a string containing all the unpacked service call args given a service call function
// `t_function`. Prepends the args with either `&mut self` or `&self` and includes the arg types
@@ -383,8 +378,8 @@
// `field_prefix`, for example: `self.field_0`.
string rust_sync_service_call_invocation(t_function* tfunc, const string& field_prefix = "");
- // Return a string containing all fields in the struct `tstruct` for use in a function declaration.
- // Each field is followed by its type, for example: `field_0: String`.
+ // Return a string containing all fields in the struct `tstruct` for use in a function
+ // declaration. Each field is followed by its type, for example: `field_0: String`.
string struct_to_declaration(t_struct* tstruct, t_rs_generator::e_struct_type struct_type);
// Return a string containing all fields in the struct `tstruct` for use in a function call,
@@ -413,7 +408,8 @@
// Return `true` if we can write a const of the form `pub const FOO: ...`.
bool can_generate_simple_const(t_type* ttype);
- // Return `true` if we cannot write a standard Rust constant (because the type needs some allocation).
+ // Return `true` if we cannot write a standard Rust constant (because the type needs some
+ // allocation).
bool can_generate_const_holder(t_type* ttype);
// Return `true` if this type is a void, and should be represented by the rust `()` type.
@@ -421,8 +417,9 @@
t_field::e_req actual_field_req(t_field* tfield, t_rs_generator::e_struct_type struct_type);
- // Return `true` if this `t_field::e_req` is either `t_field::T_OPTIONAL` or `t_field::T_OPT_IN_REQ_OUT`
- // and needs to be wrapped by an `Option<TYPE_NAME>`, `false` otherwise.
+ // Return `true` if this `t_field::e_req` is either `t_field::T_OPTIONAL` or
+ // `t_field::T_OPT_IN_REQ_OUT` and needs to be wrapped by an `Option<TYPE_NAME>`, `false`
+ // otherwise.
bool is_optional(t_field::e_req req);
// Return `true` if the service call has arguments, `false` otherwise.
@@ -431,30 +428,32 @@
// Return `true` if a service call has non-`()` arguments, `false` otherwise.
bool has_non_void_args(t_function* tfunc);
- // Return `pub ` (notice trailing whitespace!) if the struct should be public, `` (empty string) otherwise.
+ // Return `pub ` (notice trailing whitespace!) if the struct should be public, `` (empty string)
+ // otherwise.
string visibility_qualifier(t_rs_generator::e_struct_type struct_type);
- // Returns the namespace prefix for a given Thrift service. If the type is defined in the presently-computed
- // Thrift program, then an empty string is returned.
+ // Returns the namespace prefix for a given Thrift service. If the type is defined in the
+ // presently-computed Thrift program, then an empty string is returned.
string rust_namespace(t_service* tservice);
- // Returns the namespace prefix for a given Thrift type. If the type is defined in the presently-computed
- // Thrift program, then an empty string is returned.
+ // Returns the namespace prefix for a given Thrift type. If the type is defined in the
+ // presently-computed Thrift program, then an empty string is returned.
string rust_namespace(t_type* ttype);
- // Returns the camel-cased name for a Rust struct type. Handles the case where `tstruct->get_name()` is
- // a reserved word.
+ // Returns the camel-cased name for a Rust struct type. Handles the case where
+ // `tstruct->get_name()` is a reserved word.
string rust_struct_name(t_struct* tstruct);
// Returns the snake-cased name for a Rust field or local variable. Handles the case where
// `tfield->get_name()` is a reserved word.
string rust_field_name(t_field* tstruct);
- // Returns the camel-cased name for a Rust union type. Handles the case where `tstruct->get_name()` is
- // a reserved word.
+ // Returns the camel-cased name for a Rust union type. Handles the case where
+ // `tstruct->get_name()` is a reserved word.
string rust_union_field_name(t_field* tstruct);
- // Converts any variable name into a 'safe' variant that does not clash with any Rust reserved keywords.
+ // Converts any variable name into a 'safe' variant that does not clash with any Rust reserved
+ // keywords.
string rust_safe_name(const string& name);
// Return `true` if the name is a reserved Rust keyword, `false` otherwise.
@@ -463,7 +462,8 @@
// Return the name of the function that users will invoke to make outgoing service calls.
string service_call_client_function_name(t_function* tfunc);
- // Return the name of the function that users will have to implement to handle incoming service calls.
+ // Return the name of the function that users will have to implement to handle incoming service
+ // calls.
string service_call_handler_function_name(t_function* tfunc);
// Return the name of the struct used to pack the arguments for the thrift service call.
@@ -481,7 +481,8 @@
// Return the name for the sync service client struct given a `t_service`.
string rust_sync_client_impl_name(t_service* tservice);
- // Return the trait name that users will have to implement for the server half of a Thrift service.
+ // Return the trait name that users will have to implement for the server half of a Thrift
+ // service.
string rust_sync_handler_trait_name(t_service* tservice);
// Return the struct name for the server half of a Thrift service.
@@ -489,7 +490,7 @@
// Return the struct name for the struct that contains all the service-call implementations for
// the server half of a Thrift service.
- string rust_sync_processor_impl_name(t_service *tservice);
+ string rust_sync_processor_impl_name(t_service* tservice);
// Return the variant name for an enum variant
string rust_enum_variant_name(const string& name);
@@ -537,14 +538,17 @@
// code might not include imports from crates
f_gen_ << "#![allow(unused_extern_crates)]" << endl;
// constructors take *all* struct parameters, which can trigger the "too many arguments" warning
- // some auto-gen'd types can be deeply nested. clippy recommends factoring them out which is hard to autogen
- // some methods may start with "is_"
- // FIXME: re-enable the 'vec_box' lint see: [THRIFT-5364](https://issues.apache.org/jira/browse/THRIFT-5364)
- // This can happen because we automatically generate a Vec<Box<Type>> when the type is a typedef
- // and it's a forward typedef. This (typedef + forward typedef) can happen in two situations:
+ // some auto-gen'd types can be deeply nested. clippy recommends factoring them out which is hard
+ // to autogen some methods may start with "is_"
+ // FIXME: re-enable the 'vec_box' lint see:
+ // [THRIFT-5364](https://issues.apache.org/jira/browse/THRIFT-5364) This can happen because we
+ // automatically generate a Vec<Box<Type>> when the type is a typedef and it's a forward typedef.
+ // This (typedef + forward typedef) can happen in two situations:
// 1. When the type is recursive
// 2. When you define types out of order
- f_gen_ << "#![allow(clippy::too_many_arguments, clippy::type_complexity, clippy::vec_box, clippy::wrong_self_convention)]" << endl;
+ f_gen_ << "#![allow(clippy::too_many_arguments, clippy::type_complexity, clippy::vec_box, "
+ "clippy::wrong_self_convention)]"
+ << endl;
// prevent rustfmt from running against this file
// lines are too long, code is (thankfully!) not visual-indented, etc.
// can't use #[rustfmt::skip] see: https://github.com/rust-lang/rust/issues/54726
@@ -562,8 +566,13 @@
f_gen_ << "use std::rc::Rc;" << endl;
f_gen_ << endl;
f_gen_ << "use thrift::OrderedFloat;" << endl;
- f_gen_ << "use thrift::{ApplicationError, ApplicationErrorKind, ProtocolError, ProtocolErrorKind, TThriftClient};" << endl;
- f_gen_ << "use thrift::protocol::{TFieldIdentifier, TListIdentifier, TMapIdentifier, TMessageIdentifier, TMessageType, TInputProtocol, TOutputProtocol, TSerializable, TSetIdentifier, TStructIdentifier, TType};" << endl;
+ f_gen_ << "use thrift::{ApplicationError, ApplicationErrorKind, ProtocolError, "
+ "ProtocolErrorKind, TThriftClient};"
+ << endl;
+ f_gen_ << "use thrift::protocol::{TFieldIdentifier, TListIdentifier, TMapIdentifier, "
+ "TMessageIdentifier, TMessageType, TInputProtocol, TOutputProtocol, TSerializable, "
+ "TSetIdentifier, TStructIdentifier, TType};"
+ << endl;
f_gen_ << "use thrift::protocol::field_id;" << endl;
f_gen_ << "use thrift::protocol::verify_expected_message_type;" << endl;
f_gen_ << "use thrift::protocol::verify_expected_sequence_number;" << endl;
@@ -574,18 +583,21 @@
// add all the program includes
// NOTE: this is more involved than you would expect because of service extension
- // Basically, I have to find the closure of all the services and include their modules at the top-level
+ // Basically, I have to find the closure of all the services and include their modules at the
+ // top-level
set<pair<string, string>> referenced_modules; // set<module, namespace>
// first, start by adding explicit thrift includes
const vector<t_program*> includes = get_program()->get_includes();
vector<t_program*>::const_iterator includes_iter;
- for(includes_iter = includes.begin(); includes_iter != includes.end(); ++includes_iter) {
- referenced_modules.insert(std::make_pair((*includes_iter)->get_name(), (*includes_iter)->get_namespace("rs")));
+ for (includes_iter = includes.begin(); includes_iter != includes.end(); ++includes_iter) {
+ referenced_modules.insert(
+ std::make_pair((*includes_iter)->get_name(), (*includes_iter)->get_namespace("rs")));
}
- // next, recursively iterate through all the services and add the names of any programs they reference
+ // next, recursively iterate through all the services and add the names of any programs they
+ // reference
const vector<t_service*> services = get_program()->get_services();
vector<t_service*>::const_iterator service_iter;
for (service_iter = services.begin(); service_iter != services.end(); ++service_iter) {
@@ -595,7 +607,8 @@
// finally, write all the "pub use..." declarations
if (!referenced_modules.empty()) {
set<pair<string, string>>::iterator module_iter;
- for (module_iter = referenced_modules.begin(); module_iter != referenced_modules.end(); ++module_iter) {
+ for (module_iter = referenced_modules.begin(); module_iter != referenced_modules.end();
+ ++module_iter) {
string module_name((*module_iter).first);
string module_namespace((*module_iter).second);
@@ -604,7 +617,8 @@
if (module_namespace.empty()) {
f_gen_ << "use crate::" << rust_snake_case(module_name) << ";" << endl;
} else {
- f_gen_ << "use crate::" << module_namespace << "::" << rust_snake_case(module_name) << ";" << endl;
+ f_gen_ << "use crate::" << module_namespace << "::" << rust_snake_case(module_name) << ";"
+ << endl;
}
}
f_gen_ << endl;
@@ -612,13 +626,13 @@
}
void t_rs_generator::compute_service_referenced_modules(
- t_service *tservice,
- set<pair<string, string>> &referenced_modules
-) {
+ t_service* tservice,
+ set<pair<string, string>>& referenced_modules) {
t_service* extends = tservice->get_extends();
if (extends) {
if (extends->get_program() != get_program()) {
- referenced_modules.insert(std::make_pair(extends->get_program()->get_name(), extends->get_program()->get_namespace("rs")));
+ referenced_modules.insert(std::make_pair(extends->get_program()->get_name(),
+ extends->get_program()->get_namespace("rs")));
}
compute_service_referenced_modules(extends, referenced_modules);
}
@@ -663,7 +677,9 @@
f_gen_ << endl;
}
-void t_rs_generator::render_const_value_holder(const string& name, t_type* ttype, t_const_value* tvalue) {
+void t_rs_generator::render_const_value_holder(const string& name,
+ t_type* ttype,
+ t_const_value* tvalue) {
if (!can_generate_const_holder(ttype)) {
throw "cannot generate constant holder for " + ttype->get_name();
}
@@ -685,7 +701,10 @@
f_gen_ << endl;
}
-void t_rs_generator::render_const_value(t_type* ttype, t_const_value* tvalue, bool is_owned, bool is_inline) {
+void t_rs_generator::render_const_value(t_type* ttype,
+ t_const_value* tvalue,
+ bool is_owned,
+ bool is_inline) {
if (!is_inline) {
f_gen_ << indent();
}
@@ -696,7 +715,8 @@
case t_base_type::TYPE_STRING:
if (tbase_type->is_binary()) {
if (is_owned) {
- f_gen_ << "\"" << tvalue->get_string() << "\""<< ".to_owned().into_bytes()";
+ f_gen_ << "\"" << tvalue->get_string() << "\""
+ << ".to_owned().into_bytes()";
} else {
f_gen_ << "b\"" << tvalue->get_string() << "\"";
}
@@ -707,6 +727,9 @@
}
}
break;
+ case t_base_type::TYPE_UUID:
+ f_gen_ << "Uuid::parse_str(\"" << tvalue->get_string() << "\").unwrap()";
+ break;
case t_base_type::TYPE_BOOL:
f_gen_ << (tvalue->get_integer() ? "true" : "false");
break;
@@ -727,13 +750,8 @@
} else if (ttype->is_enum()) {
f_gen_ << "{" << endl;
indent_up();
- f_gen_
- << indent()
- << to_rust_type(ttype)
- << "::try_from("
- << tvalue->get_integer()
- << ").expect(\"expecting valid const value\")"
- << endl;
+ f_gen_ << indent() << to_rust_type(ttype) << "::try_from(" << tvalue->get_integer()
+ << ").expect(\"expecting valid const value\")" << endl;
indent_down();
f_gen_ << indent() << "}";
} else if (ttype->is_struct() || ttype->is_xception()) {
@@ -780,7 +798,7 @@
indent_up();
const vector<t_const_value*>& elems = tvalue->get_list();
vector<t_const_value*>::const_iterator elem_iter;
- for(elem_iter = elems.begin(); elem_iter != elems.end(); ++elem_iter) {
+ for (elem_iter = elems.begin(); elem_iter != elems.end(); ++elem_iter) {
f_gen_ << indent();
t_const_value* elem_value = (*elem_iter);
render_const_value(elem_type, elem_value);
@@ -796,7 +814,7 @@
indent_up();
const vector<t_const_value*>& elems = tvalue->get_list();
vector<t_const_value*>::const_iterator elem_iter;
- for(elem_iter = elems.begin(); elem_iter != elems.end(); ++elem_iter) {
+ for (elem_iter = elems.begin(); elem_iter != elems.end(); ++elem_iter) {
f_gen_ << indent();
t_const_value* elem_value = (*elem_iter);
render_const_value(elem_type, elem_value);
@@ -811,7 +829,8 @@
t_type* val_type = ((t_map*)ttype)->get_val_type();
f_gen_ << "BTreeMap::from([" << endl;
indent_up();
- const map<t_const_value*, t_const_value*, t_const_value::value_compare>& elems = tvalue->get_map();
+ const map<t_const_value*, t_const_value*, t_const_value::value_compare>& elems
+ = tvalue->get_map();
map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator elem_iter;
for (elem_iter = elems.begin(); elem_iter != elems.end(); ++elem_iter) {
t_const_value* key_value = elem_iter->first;
@@ -840,7 +859,8 @@
void t_rs_generator::generate_typedef(t_typedef* ttypedef) {
std::string actual_type = to_rust_type(ttypedef->get_type());
- f_gen_ << "pub type " << rust_safe_name(ttypedef->get_symbolic()) << " = " << actual_type << ";" << endl;
+ f_gen_ << "pub type " << rust_safe_name(ttypedef->get_symbolic()) << " = " << actual_type << ";"
+ << endl;
f_gen_ << endl;
}
@@ -858,7 +878,7 @@
}
void t_rs_generator::render_enum_definition(t_enum* tenum, const string& enum_name) {
- render_rustdoc((t_doc*) tenum);
+ render_rustdoc((t_doc*)tenum);
f_gen_ << "#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]" << endl;
f_gen_ << "pub struct " << enum_name << "(pub i32);" << endl;
f_gen_ << endl;
@@ -872,18 +892,14 @@
// associated constants for each IDL-defined enum variant
{
- vector<t_enum_value*>::iterator constants_iter;
- for (constants_iter = constants.begin(); constants_iter != constants.end(); ++constants_iter) {
- t_enum_value* val = (*constants_iter);
- render_rustdoc((t_doc*) val);
- f_gen_
- << indent()
- << "pub const " << rust_enum_variant_name(val->get_name()) << ": " << enum_name
- << " = "
- << enum_name << "(" << val->get_value() << ")"
- << ";"
- << endl;
- }
+ vector<t_enum_value*>::iterator constants_iter;
+ for (constants_iter = constants.begin(); constants_iter != constants.end(); ++constants_iter) {
+ t_enum_value* val = (*constants_iter);
+ render_rustdoc((t_doc*)val);
+ f_gen_ << indent() << "pub const " << rust_enum_variant_name(val->get_name()) << ": "
+ << enum_name << " = " << enum_name << "(" << val->get_value() << ")"
+ << ";" << endl;
+ }
}
// array containing all IDL-defined enum variants
@@ -893,11 +909,7 @@
vector<t_enum_value*>::iterator constants_iter;
for (constants_iter = constants.begin(); constants_iter != constants.end(); ++constants_iter) {
t_enum_value* val = (*constants_iter);
- f_gen_
- << indent()
- << "Self::" << rust_enum_variant_name(val->get_name())
- << ","
- << endl;
+ f_gen_ << indent() << "Self::" << rust_enum_variant_name(val->get_name()) << "," << endl;
}
indent_down();
f_gen_ << indent() << "];" << endl;
@@ -912,21 +924,21 @@
f_gen_ << indent() << "#[allow(clippy::trivially_copy_pass_by_ref)]" << endl;
f_gen_
- << indent()
- << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
- << endl;
+ << indent()
+ << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
+ << endl;
indent_up();
f_gen_ << indent() << "o_prot.write_i32(self.0)" << endl;
indent_down();
f_gen_ << indent() << "}" << endl;
- f_gen_
- << indent()
- << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<" << enum_name << "> {"
- << endl;
+ f_gen_ << indent()
+ << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<"
+ << enum_name << "> {" << endl;
indent_up();
f_gen_ << indent() << "let enum_value = i_prot.read_i32()?;" << endl;
- f_gen_ << indent() << "Ok(" << enum_name << "::from(enum_value)" << ")" << endl;
+ f_gen_ << indent() << "Ok(" << enum_name << "::from(enum_value)"
+ << ")" << endl;
indent_down();
f_gen_ << indent() << "}" << endl;
@@ -947,11 +959,8 @@
vector<t_enum_value*>::iterator constants_iter;
for (constants_iter = constants.begin(); constants_iter != constants.end(); ++constants_iter) {
t_enum_value* val = (*constants_iter);
- f_gen_
- << indent()
- << val->get_value()
- << " => " << enum_name << "::" << rust_enum_variant_name(val->get_name()) << ","
- << endl;
+ f_gen_ << indent() << val->get_value() << " => " << enum_name
+ << "::" << rust_enum_variant_name(val->get_name()) << "," << endl;
}
f_gen_ << indent() << "_ => " << enum_name << "(i)" << endl;
indent_down();
@@ -1019,11 +1028,9 @@
}
}
-void t_rs_generator::render_struct(
- const string& struct_name,
- t_struct* tstruct,
- t_rs_generator::e_struct_type struct_type
-) {
+void t_rs_generator::render_struct(const string& struct_name,
+ t_struct* tstruct,
+ t_rs_generator::e_struct_type struct_type) {
render_type_comment(struct_name);
render_struct_definition(struct_name, tstruct, struct_type);
render_struct_impl(struct_name, tstruct, struct_type);
@@ -1032,46 +1039,40 @@
}
}
-void t_rs_generator::render_struct_definition(
- const string& struct_name,
- t_struct* tstruct,
- t_rs_generator::e_struct_type struct_type
-) {
- render_rustdoc((t_doc*) tstruct);
+void t_rs_generator::render_struct_definition(const string& struct_name,
+ t_struct* tstruct,
+ t_rs_generator::e_struct_type struct_type) {
+ render_rustdoc((t_doc*)tstruct);
const vector<t_field*> members = tstruct->get_sorted_members();
vector<t_field*>::const_iterator members_iter;
- bool need_default = struct_type == t_rs_generator::T_REGULAR || struct_type == t_rs_generator::T_EXCEPTION;
- for (members_iter = members.begin(); need_default && members_iter != members.end(); ++members_iter) {
+ bool need_default
+ = struct_type == t_rs_generator::T_REGULAR || struct_type == t_rs_generator::T_EXCEPTION;
+ for (members_iter = members.begin(); need_default && members_iter != members.end();
+ ++members_iter) {
t_field* member = *members_iter;
if (!is_optional(member->get_req())) {
need_default = false;
}
}
- f_gen_
- << "#[derive(Clone, Debug"
- << (need_default ? ", Default" : "")
- << ", Eq, Hash, Ord, PartialEq, PartialOrd)]"
- << endl;
+ f_gen_ << "#[derive(Clone, Debug" << (need_default ? ", Default" : "")
+ << ", Eq, Hash, Ord, PartialEq, PartialOrd)]" << endl;
f_gen_ << visibility_qualifier(struct_type) << "struct " << struct_name << " {" << endl;
// render the members
if (!members.empty()) {
indent_up();
- for(members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
+ for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
t_field* member = (*members_iter);
t_field::e_req member_req = actual_field_req(member, struct_type);
string rust_type = to_rust_type(member->get_type());
rust_type = is_optional(member_req) ? "Option<" + rust_type + ">" : rust_type;
- render_rustdoc((t_doc*) member);
- f_gen_
- << indent()
- << visibility_qualifier(struct_type)
- << rust_field_name(member) << ": " << rust_type << ","
- << endl;
+ render_rustdoc((t_doc*)member);
+ f_gen_ << indent() << visibility_qualifier(struct_type) << rust_field_name(member) << ": "
+ << rust_type << "," << endl;
}
indent_down();
@@ -1081,7 +1082,8 @@
f_gen_ << endl;
}
-void t_rs_generator::render_exception_struct_error_trait_impls(const string& struct_name, t_struct* tstruct) {
+void t_rs_generator::render_exception_struct_error_trait_impls(const string& struct_name,
+ t_struct* tstruct) {
// error::Error trait
f_gen_ << "impl Error for " << struct_name << " {}" << endl;
f_gen_ << endl;
@@ -1103,12 +1105,9 @@
indent_up();
f_gen_ << indent() << "fn fmt(&self, f: &mut Formatter) -> fmt::Result {" << endl;
indent_up();
- f_gen_
- << indent()
- << "write!(f, "
- << "\"remote service threw " << tstruct->get_name() << "\"" // use *original* name
- << ")"
- << endl;
+ f_gen_ << indent() << "write!(f, "
+ << "\"remote service threw " << tstruct->get_name() << "\"" // use *original* name
+ << ")" << endl;
indent_down();
f_gen_ << indent() << "}" << endl;
indent_down();
@@ -1116,11 +1115,9 @@
f_gen_ << endl;
}
-void t_rs_generator::render_struct_impl(
- const string& struct_name,
- t_struct* tstruct,
- t_rs_generator::e_struct_type struct_type
-) {
+void t_rs_generator::render_struct_impl(const string& struct_name,
+ t_struct* tstruct,
+ t_rs_generator::e_struct_type struct_type) {
f_gen_ << "impl " << struct_name << " {" << endl;
indent_up();
@@ -1149,21 +1146,19 @@
f_gen_ << endl;
}
-void t_rs_generator::render_struct_constructor(
- const string& struct_name,
- t_struct* tstruct,
- t_rs_generator::e_struct_type struct_type
-) {
+void t_rs_generator::render_struct_constructor(const string& struct_name,
+ t_struct* tstruct,
+ t_rs_generator::e_struct_type struct_type) {
const vector<t_field*>& members = tstruct->get_sorted_members();
vector<t_field*>::const_iterator members_iter;
- // build the convenience type parameters that allows us to pass unwrapped values to a constructor and
- // have them automatically converted into Option<value>
+ // build the convenience type parameters that allows us to pass unwrapped values to a constructor
+ // and have them automatically converted into Option<value>
bool first_arg = true;
ostringstream generic_type_parameters;
ostringstream generic_type_qualifiers;
- for(members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
+ for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
t_field* member = (*members_iter);
t_field::e_req member_req = actual_field_req(member, struct_type);
@@ -1175,7 +1170,8 @@
generic_type_qualifiers << ", ";
}
generic_type_parameters << "F" << rust_safe_field_id(member->get_key());
- generic_type_qualifiers << "F" << rust_safe_field_id(member->get_key()) << ": Into<Option<" << to_rust_type(member->get_type()) << ">>";
+ generic_type_qualifiers << "F" << rust_safe_field_id(member->get_key()) << ": Into<Option<"
+ << to_rust_type(member->get_type()) << ">>";
}
}
@@ -1190,11 +1186,11 @@
}
// now build the actual constructor arg list
- // when we're building this list we have to use the type parameters in place of the actual type names
- // if necessary
+ // when we're building this list we have to use the type parameters in place of the actual type
+ // names if necessary
ostringstream args;
first_arg = true;
- for(members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
+ for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
t_field* member = (*members_iter);
t_field::e_req member_req = actual_field_req(member, struct_type);
string member_name(rust_field_name(member));
@@ -1206,7 +1202,8 @@
}
if (is_optional(member_req)) {
- args << member_name << ": " << "F" << rust_safe_field_id(member->get_key());
+ args << member_name << ": "
+ << "F" << rust_safe_field_id(member->get_key());
} else {
args << member_name << ": " << to_rust_type(member->get_type());
}
@@ -1215,19 +1212,8 @@
string arg_string = args.str();
string visibility(visibility_qualifier(struct_type));
- f_gen_
- << indent()
- << visibility
- << "fn new"
- << type_parameter_string
- << "("
- << arg_string
- << ") -> "
- << struct_name
- << " "
- << type_qualifier_string
- << "{"
- << endl;
+ f_gen_ << indent() << visibility << "fn new" << type_parameter_string << "(" << arg_string
+ << ") -> " << struct_name << " " << type_qualifier_string << "{" << endl;
indent_up();
if (members.empty()) {
@@ -1236,7 +1222,7 @@
f_gen_ << indent() << struct_name << " {" << endl;
indent_up();
- for(members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
+ for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
t_field* member = (*members_iter);
t_field::e_req member_req = actual_field_req(member, struct_type);
string member_name(rust_field_name(member));
@@ -1265,7 +1251,7 @@
if (index == std::string::npos) {
throw "result struct " + service_call_name + " missing result suffix";
} else {
- service_call_name.replace(index, 6, "");
+ service_call_name.replace(index, 6, "");
}
const vector<t_field*>& members = tstruct->get_sorted_members();
@@ -1273,7 +1259,7 @@
// find out what the call's expected return type was
string rust_return_type = "()";
- for(members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
+ for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
t_field* member = (*members_iter);
if (member->get_name() == SERVICE_RESULT_VARIABLE) { // don't have to check safe name here
rust_return_type = to_rust_type(member->get_type());
@@ -1292,7 +1278,7 @@
int rendered_branch_count = 0;
// render the exception branches
- for(members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
+ for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
t_field* tfield = (*members_iter);
if (tfield->get_name() != SERVICE_RESULT_VARIABLE) { // don't have to check safe name here
string field_name("self." + rust_field_name(tfield));
@@ -1300,7 +1286,8 @@
f_gen_ << indent() << branch_statement << " " << field_name << ".is_some() {" << endl;
indent_up();
- f_gen_ << indent() << "Err(thrift::Error::User(Box::new(" << field_name << ".unwrap())))" << endl;
+ f_gen_ << indent() << "Err(thrift::Error::User(Box::new(" << field_name << ".unwrap())))"
+ << endl;
indent_down();
rendered_branch_count++;
@@ -1324,7 +1311,8 @@
}
} else {
string branch_statement = rendered_branch_count == 0 ? "if" : "} else if";
- f_gen_ << indent() << branch_statement << " self." << SERVICE_RESULT_VARIABLE << ".is_some() {" << endl;
+ f_gen_ << indent() << branch_statement << " self." << SERVICE_RESULT_VARIABLE << ".is_some() {"
+ << endl;
indent_up();
f_gen_ << indent() << "Ok(self." << SERVICE_RESULT_VARIABLE << ".unwrap())" << endl;
indent_down();
@@ -1332,12 +1320,8 @@
indent_up();
// if we haven't found a valid return value *or* a user exception
// then we're in trouble; return a default error
- render_thrift_error(
- "Application",
- "ApplicationError",
- "ApplicationErrorKind::MissingResult",
- "\"no result received for " + service_call_name + "\""
- );
+ render_thrift_error("Application", "ApplicationError", "ApplicationErrorKind::MissingResult",
+ "\"no result received for " + service_call_name + "\"");
indent_down();
f_gen_ << indent() << "}" << endl;
}
@@ -1364,13 +1348,10 @@
indent_up();
vector<t_field*>::const_iterator member_iter;
- for(member_iter = members.begin(); member_iter != members.end(); ++member_iter) {
+ for (member_iter = members.begin(); member_iter != members.end(); ++member_iter) {
t_field* tfield = (*member_iter);
- f_gen_
- << indent()
- << rust_union_field_name(tfield)
- << "(" << to_rust_type(tfield->get_type()) << "),"
- << endl;
+ f_gen_ << indent() << rust_union_field_name(tfield) << "(" << to_rust_type(tfield->get_type())
+ << ")," << endl;
}
indent_down();
@@ -1396,26 +1377,25 @@
//
//-----------------------------------------------------------------------------
-void t_rs_generator::render_struct_sync_write(
- t_struct *tstruct,
- t_rs_generator::e_struct_type struct_type
-) {
+void t_rs_generator::render_struct_sync_write(t_struct* tstruct,
+ t_rs_generator::e_struct_type struct_type) {
f_gen_
- << indent()
- << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
- << endl;
+ << indent()
+ << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
+ << endl;
indent_up();
// write struct header to output protocol
// note: use the *original* struct name here
- f_gen_ << indent() << "let struct_ident = TStructIdentifier::new(\"" + tstruct->get_name() + "\");" << endl;
+ f_gen_ << indent()
+ << "let struct_ident = TStructIdentifier::new(\"" + tstruct->get_name() + "\");" << endl;
f_gen_ << indent() << "o_prot.write_struct_begin(&struct_ident)?;" << endl;
// write struct members to output protocol
vector<t_field*> members = tstruct->get_sorted_members();
if (!members.empty()) {
vector<t_field*>::iterator members_iter;
- for(members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
+ for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
t_field* member = (*members_iter);
t_field::e_req member_req = actual_field_req(member, struct_type);
string member_var("self." + rust_field_name(member));
@@ -1431,16 +1411,17 @@
f_gen_ << indent() << "}" << endl;
}
-void t_rs_generator::render_union_sync_write(const string &union_name, t_struct *tstruct) {
+void t_rs_generator::render_union_sync_write(const string& union_name, t_struct* tstruct) {
f_gen_
- << indent()
- << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
- << endl;
+ << indent()
+ << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
+ << endl;
indent_up();
// write struct header to output protocol
// note: use the *original* struct name here
- f_gen_ << indent() << "let struct_ident = TStructIdentifier::new(\"" + tstruct->get_name() + "\");" << endl;
+ f_gen_ << indent()
+ << "let struct_ident = TStructIdentifier::new(\"" + tstruct->get_name() + "\");" << endl;
f_gen_ << indent() << "o_prot.write_struct_begin(&struct_ident)?;" << endl;
// write the enum field to the output protocol
@@ -1449,7 +1430,7 @@
f_gen_ << indent() << "match *self {" << endl;
indent_up();
vector<t_field*>::iterator members_iter;
- for(members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
+ for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
t_field* member = (*members_iter);
t_field::e_req member_req = t_field::T_REQUIRED;
t_type* ttype = member->get_type();
@@ -1458,11 +1439,8 @@
ttype = ((t_typedef*)ttype)->get_type();
}
string match_var((ttype->is_base_type() && !ttype->is_string()) ? "f" : "ref f");
- f_gen_
- << indent()
- << union_name << "::" << rust_union_field_name(member)
- << "(" << match_var << ") => {"
- << endl;
+ f_gen_ << indent() << union_name << "::" << rust_union_field_name(member) << "(" << match_var
+ << ") => {" << endl;
indent_up();
render_struct_field_sync_write("f", true, member, member_req);
indent_down();
@@ -1480,25 +1458,23 @@
f_gen_ << indent() << "}" << endl;
}
-void t_rs_generator::render_struct_field_sync_write(
- const string &field_var,
- bool field_var_is_ref,
- t_field *tfield,
- t_field::e_req req
-) {
+void t_rs_generator::render_struct_field_sync_write(const string& field_var,
+ bool field_var_is_ref,
+ t_field* tfield,
+ t_field::e_req req) {
t_type* field_type = tfield->get_type();
t_type* actual_type = get_true_type(field_type);
ostringstream field_stream;
- field_stream
- << "TFieldIdentifier::new("
- << "\"" << tfield->get_name() << "\"" << ", " // note: use *original* name
- << to_rust_field_type_enum(field_type) << ", "
- << tfield->get_key() << ")";
+ field_stream << "TFieldIdentifier::new("
+ << "\"" << tfield->get_name() << "\""
+ << ", " // note: use *original* name
+ << to_rust_field_type_enum(field_type) << ", " << tfield->get_key() << ")";
string field_ident_string = field_stream.str();
if (is_optional(req)) {
- string let_var((actual_type->is_base_type() && !actual_type->is_string()) ? "fld_var" : "ref fld_var");
+ string let_var((actual_type->is_base_type() && !actual_type->is_string()) ? "fld_var"
+ : "ref fld_var");
f_gen_ << indent() << "if let Some(" << let_var << ") = " << field_var << " {" << endl;
indent_up();
f_gen_ << indent() << "o_prot.write_field_begin(&" << field_ident_string << ")?;" << endl;
@@ -1519,7 +1495,9 @@
}
}
-void t_rs_generator::render_type_sync_write(const string &type_var, bool type_var_is_ref, t_type *ttype) {
+void t_rs_generator::render_type_sync_write(const string& type_var,
+ bool type_var_is_ref,
+ t_type* ttype) {
if (ttype->is_base_type()) {
t_base_type* tbase_type = (t_base_type*)ttype;
switch (tbase_type->get_base()) {
@@ -1534,6 +1512,9 @@
}
return;
}
+ case t_base_type::TYPE_UUID:
+ f_gen_ << indent() << "o_prot.write_uuid(&" + type_var + ")?;" << endl;
+ return;
case t_base_type::TYPE_BOOL:
f_gen_ << indent() << "o_prot.write_bool(" + type_var + ")?;" << endl;
return;
@@ -1556,37 +1537,36 @@
throw "compiler error: unhandled type";
}
} else if (ttype->is_typedef()) {
- t_typedef* ttypedef = (t_typedef*) ttype;
+ t_typedef* ttypedef = (t_typedef*)ttype;
render_type_sync_write(type_var, type_var_is_ref, ttypedef->get_type());
return;
} else if (ttype->is_enum() || ttype->is_struct() || ttype->is_xception()) {
f_gen_ << indent() << type_var + ".write_to_out_protocol(o_prot)?;" << endl;
return;
} else if (ttype->is_map()) {
- render_map_sync_write(type_var, type_var_is_ref, (t_map *) ttype);
+ render_map_sync_write(type_var, type_var_is_ref, (t_map*)ttype);
return;
} else if (ttype->is_set()) {
- render_set_sync_write(type_var, type_var_is_ref, (t_set *) ttype);
+ render_set_sync_write(type_var, type_var_is_ref, (t_set*)ttype);
return;
} else if (ttype->is_list()) {
- render_list_sync_write(type_var, type_var_is_ref, (t_list *) ttype);
+ render_list_sync_write(type_var, type_var_is_ref, (t_list*)ttype);
return;
}
throw "cannot write unsupported type " + ttype->get_name();
}
-void t_rs_generator::render_list_sync_write(const string &list_var, bool list_var_is_ref, t_list *tlist) {
+void t_rs_generator::render_list_sync_write(const string& list_var,
+ bool list_var_is_ref,
+ t_list* tlist) {
t_type* elem_type = tlist->get_elem_type();
- f_gen_
- << indent()
- << "o_prot.write_list_begin("
- << "&TListIdentifier::new("
- << to_rust_field_type_enum(elem_type) << ", "
- << list_var << ".len() as i32" << ")"
- << ")?;"
- << endl;
+ f_gen_ << indent() << "o_prot.write_list_begin("
+ << "&TListIdentifier::new(" << to_rust_field_type_enum(elem_type) << ", " << list_var
+ << ".len() as i32"
+ << ")"
+ << ")?;" << endl;
string ref(list_var_is_ref ? "" : "&");
f_gen_ << indent() << "for e in " << ref << list_var << " {" << endl;
@@ -1597,17 +1577,16 @@
f_gen_ << indent() << "o_prot.write_list_end()?;" << endl;
}
-void t_rs_generator::render_set_sync_write(const string &set_var, bool set_var_is_ref, t_set *tset) {
+void t_rs_generator::render_set_sync_write(const string& set_var,
+ bool set_var_is_ref,
+ t_set* tset) {
t_type* elem_type = tset->get_elem_type();
- f_gen_
- << indent()
- << "o_prot.write_set_begin("
- << "&TSetIdentifier::new("
- << to_rust_field_type_enum(elem_type) << ", "
- << set_var << ".len() as i32" << ")"
- << ")?;"
- << endl;
+ f_gen_ << indent() << "o_prot.write_set_begin("
+ << "&TSetIdentifier::new(" << to_rust_field_type_enum(elem_type) << ", " << set_var
+ << ".len() as i32"
+ << ")"
+ << ")?;" << endl;
string ref(set_var_is_ref ? "" : "&");
f_gen_ << indent() << "for e in " << ref << set_var << " {" << endl;
@@ -1618,19 +1597,16 @@
f_gen_ << indent() << "o_prot.write_set_end()?;" << endl;
}
-void t_rs_generator::render_map_sync_write(const string &map_var, bool map_var_is_ref, t_map *tmap) {
+void t_rs_generator::render_map_sync_write(const string& map_var,
+ bool map_var_is_ref,
+ t_map* tmap) {
t_type* key_type = tmap->get_key_type();
t_type* val_type = tmap->get_val_type();
- f_gen_
- << indent()
- << "o_prot.write_map_begin("
- << "&TMapIdentifier::new("
- << to_rust_field_type_enum(key_type) << ", "
- << to_rust_field_type_enum(val_type) << ", "
- << map_var << ".len() as i32)"
- << ")?;"
- << endl;
+ f_gen_ << indent() << "o_prot.write_map_begin("
+ << "&TMapIdentifier::new(" << to_rust_field_type_enum(key_type) << ", "
+ << to_rust_field_type_enum(val_type) << ", " << map_var << ".len() as i32)"
+ << ")?;" << endl;
string ref(map_var_is_ref ? "" : "&");
f_gen_ << indent() << "for (k, v) in " << ref << map_var << " {" << endl;
@@ -1670,14 +1646,12 @@
//
//-----------------------------------------------------------------------------
-void t_rs_generator::render_struct_sync_read(
- const string &struct_name,
- t_struct *tstruct, t_rs_generator::e_struct_type struct_type
-) {
- f_gen_
- << indent()
- << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<" << struct_name << "> {"
- << endl;
+void t_rs_generator::render_struct_sync_read(const string& struct_name,
+ t_struct* tstruct,
+ t_rs_generator::e_struct_type struct_type) {
+ f_gen_ << indent()
+ << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<"
+ << struct_name << "> {" << endl;
indent_up();
@@ -1690,16 +1664,14 @@
t_field* member = (*members_iter);
t_field::e_req member_req = actual_field_req(member, struct_type);
- f_gen_
- << indent()
- << "let mut " << struct_field_read_temp_variable(member)
- << ": Option<" << to_rust_type(member->get_type()) << "> = ";
- if (member_req == t_field::T_OPT_IN_REQ_OUT) {
- f_gen_ << opt_in_req_out_value(member->get_type()) << ";";
- } else {
- f_gen_ << "None;";
- }
- f_gen_ << endl;
+ f_gen_ << indent() << "let mut " << struct_field_read_temp_variable(member) << ": Option<"
+ << to_rust_type(member->get_type()) << "> = ";
+ if (member_req == t_field::T_OPT_IN_REQ_OUT) {
+ f_gen_ << opt_in_req_out_value(member->get_type()) << ";";
+ } else {
+ f_gen_ << "None;";
+ }
+ f_gen_ << endl;
}
// now loop through the fields we've received
@@ -1746,7 +1718,7 @@
f_gen_ << indent() << "i_prot.read_field_end()?;" << endl;
indent_down();
- f_gen_ << indent() << "}" << endl; // finish loop
+ f_gen_ << indent() << "}" << endl; // finish loop
f_gen_ << indent() << "i_prot.read_struct_end()?;" << endl; // read message footer from the wire
// verify that all required fields exist
@@ -1754,13 +1726,10 @@
t_field* tfield = (*members_iter);
t_field::e_req req = actual_field_req(tfield, struct_type);
if (!is_optional(req)) {
- f_gen_
- << indent()
- << "verify_required_field_exists("
- << "\"" << struct_name << "." << rust_field_name(tfield) << "\""
- << ", "
- << "&" << struct_field_read_temp_variable(tfield)
- << ")?;" << endl;
+ f_gen_ << indent() << "verify_required_field_exists("
+ << "\"" << struct_name << "." << rust_field_name(tfield) << "\""
+ << ", "
+ << "&" << struct_field_read_temp_variable(tfield) << ")?;" << endl;
}
}
@@ -1779,14 +1748,10 @@
if (is_optional(req)) {
f_gen_ << indent() << field_name << ": " << field_key << "," << endl;
} else {
- f_gen_
- << indent()
- << field_name
- << ": "
- << field_key
- << ".expect(\"auto-generated code should have checked for presence of required fields\")"
- << ","
- << endl;
+ f_gen_ << indent() << field_name << ": " << field_key
+ << ".expect(\"auto-generated code should have checked for presence of required "
+ "fields\")"
+ << "," << endl;
}
}
@@ -1801,11 +1766,10 @@
f_gen_ << indent() << "}" << endl;
}
-void t_rs_generator::render_union_sync_read(const string &union_name, t_struct *tstruct) {
- f_gen_
- << indent()
- << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<" << union_name << "> {"
- << endl;
+void t_rs_generator::render_union_sync_read(const string& union_name, t_struct* tstruct) {
+ f_gen_ << indent()
+ << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<"
+ << union_name << "> {" << endl;
indent_up();
// create temporary variables to hold the
@@ -1842,10 +1806,8 @@
render_type_sync_read("val", member->get_type());
f_gen_ << indent() << "if ret.is_none() {" << endl;
indent_up();
- f_gen_
- << indent()
- << "ret = Some(" << union_name << "::" << rust_union_field_name(member) << "(val));"
- << endl;
+ f_gen_ << indent() << "ret = Some(" << union_name << "::" << rust_union_field_name(member)
+ << "(val));" << endl;
indent_down();
f_gen_ << indent() << "}" << endl;
f_gen_ << indent() << "received_field_count += 1;" << endl;
@@ -1865,27 +1827,19 @@
f_gen_ << indent() << "};" << endl; // finish match
f_gen_ << indent() << "i_prot.read_field_end()?;" << endl;
indent_down();
- f_gen_ << indent() << "}" << endl; // finish loop
+ f_gen_ << indent() << "}" << endl; // finish loop
f_gen_ << indent() << "i_prot.read_struct_end()?;" << endl; // finish reading message from wire
// return the value or an error
f_gen_ << indent() << "if received_field_count == 0 {" << endl;
indent_up();
- render_thrift_error(
- "Protocol",
- "ProtocolError",
- "ProtocolErrorKind::InvalidData",
- "\"received empty union from remote " + union_name + "\""
- );
+ render_thrift_error("Protocol", "ProtocolError", "ProtocolErrorKind::InvalidData",
+ "\"received empty union from remote " + union_name + "\"");
indent_down();
f_gen_ << indent() << "} else if received_field_count > 1 {" << endl;
indent_up();
- render_thrift_error(
- "Protocol",
- "ProtocolError",
- "ProtocolErrorKind::InvalidData",
- "\"received multiple fields for union from remote " + union_name + "\""
- );
+ render_thrift_error("Protocol", "ProtocolError", "ProtocolErrorKind::InvalidData",
+ "\"received multiple fields for union from remote " + union_name + "\"");
indent_down();
f_gen_ << indent() << "} else {" << endl;
indent_up();
@@ -1898,7 +1852,7 @@
}
// Construct the rust representation of all supported types from the wire.
-void t_rs_generator::render_type_sync_read(const string &type_var, t_type *ttype, bool is_boxed) {
+void t_rs_generator::render_type_sync_read(const string& type_var, t_type* ttype, bool is_boxed) {
if (ttype->is_base_type()) {
t_base_type* tbase_type = (t_base_type*)ttype;
switch (tbase_type->get_base()) {
@@ -1911,6 +1865,9 @@
f_gen_ << indent() << "let " << type_var << " = i_prot.read_string()?;" << endl;
}
return;
+ case t_base_type::TYPE_UUID:
+ f_gen_ << indent() << "let " << type_var << " = i_prot.read_uuid()?;" << endl;
+ return;
case t_base_type::TYPE_BOOL:
f_gen_ << indent() << "let " << type_var << " = i_prot.read_bool()?;" << endl;
return;
@@ -1927,7 +1884,8 @@
f_gen_ << indent() << "let " << type_var << " = i_prot.read_i64()?;" << endl;
return;
case t_base_type::TYPE_DOUBLE:
- f_gen_ << indent() << "let " << type_var << " = OrderedFloat::from(i_prot.read_double()?);" << endl;
+ f_gen_ << indent() << "let " << type_var << " = OrderedFloat::from(i_prot.read_double()?);"
+ << endl;
return;
default:
throw "compiler error: unhandled type";
@@ -1947,19 +1905,16 @@
} else if (ttype->is_enum() || ttype->is_struct() || ttype->is_xception()) {
string read_call(to_rust_type(ttype) + "::read_from_in_protocol(i_prot)?");
read_call = is_boxed ? "Box::new(" + read_call + ")" : read_call;
- f_gen_
- << indent()
- << "let " << type_var << " = " << read_call << ";"
- << endl;
+ f_gen_ << indent() << "let " << type_var << " = " << read_call << ";" << endl;
return;
} else if (ttype->is_map()) {
- render_map_sync_read((t_map *) ttype, type_var);
+ render_map_sync_read((t_map*)ttype, type_var);
return;
} else if (ttype->is_set()) {
- render_set_sync_read((t_set *) ttype, type_var);
+ render_set_sync_read((t_set*)ttype, type_var);
return;
} else if (ttype->is_list()) {
- render_list_sync_read((t_list *) ttype, type_var);
+ render_list_sync_read((t_list*)ttype, type_var);
return;
}
@@ -1967,15 +1922,12 @@
}
// Construct the rust representation of a list from the wire.
-void t_rs_generator::render_list_sync_read(t_list *tlist, const string &list_var) {
+void t_rs_generator::render_list_sync_read(t_list* tlist, const string& list_var) {
t_type* elem_type = tlist->get_elem_type();
f_gen_ << indent() << "let list_ident = i_prot.read_list_begin()?;" << endl;
- f_gen_
- << indent()
- << "let mut " << list_var << ": " << to_rust_type((t_type*) tlist)
- << " = Vec::with_capacity(list_ident.size as usize);"
- << endl;
+ f_gen_ << indent() << "let mut " << list_var << ": " << to_rust_type((t_type*)tlist)
+ << " = Vec::with_capacity(list_ident.size as usize);" << endl;
f_gen_ << indent() << "for _ in 0..list_ident.size {" << endl;
indent_up();
@@ -1991,15 +1943,12 @@
}
// Construct the rust representation of a set from the wire.
-void t_rs_generator::render_set_sync_read(t_set *tset, const string &set_var) {
+void t_rs_generator::render_set_sync_read(t_set* tset, const string& set_var) {
t_type* elem_type = tset->get_elem_type();
f_gen_ << indent() << "let set_ident = i_prot.read_set_begin()?;" << endl;
- f_gen_
- << indent()
- << "let mut " << set_var << ": " << to_rust_type((t_type*) tset)
- << " = BTreeSet::new();"
- << endl;
+ f_gen_ << indent() << "let mut " << set_var << ": " << to_rust_type((t_type*)tset)
+ << " = BTreeSet::new();" << endl;
f_gen_ << indent() << "for _ in 0..set_ident.size {" << endl;
indent_up();
@@ -2015,16 +1964,13 @@
}
// Construct the rust representation of a map from the wire.
-void t_rs_generator::render_map_sync_read(t_map *tmap, const string &map_var) {
+void t_rs_generator::render_map_sync_read(t_map* tmap, const string& map_var) {
t_type* key_type = tmap->get_key_type();
t_type* val_type = tmap->get_val_type();
f_gen_ << indent() << "let map_ident = i_prot.read_map_begin()?;" << endl;
- f_gen_
- << indent()
- << "let mut " << map_var << ": " << to_rust_type((t_type*) tmap)
- << " = BTreeMap::new();"
- << endl;
+ f_gen_ << indent() << "let mut " << map_var << ": " << to_rust_type((t_type*)tmap)
+ << " = BTreeMap::new();" << endl;
f_gen_ << indent() << "for _ in 0..map_ident.size {" << endl;
indent_up();
@@ -2033,7 +1979,8 @@
render_type_sync_read(key_elem_var, key_type);
string val_elem_var = tmp("map_val_");
render_type_sync_read(val_elem_var, val_type);
- f_gen_ << indent() << map_var << ".insert(" << key_elem_var << ", " << val_elem_var << ");" << endl;
+ f_gen_ << indent() << map_var << ".insert(" << key_elem_var << ", " << val_elem_var << ");"
+ << endl;
indent_down();
@@ -2071,7 +2018,7 @@
// that's passed over the wire, so, generate the struct
// for that too. Note that this result struct *also*
// contains the exceptions as well
- for(func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
+ for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
t_function* tfunc = (*func_iter);
render_service_call_args_struct(tfunc);
if (!tfunc->is_oneway()) {
@@ -2088,30 +2035,32 @@
render_sync_client_marker_trait(tservice);
render_sync_client_definition_and_impl(client_impl_name);
render_sync_client_tthriftclient_impl(client_impl_name);
- render_sync_client_marker_trait_impls(tservice, client_impl_name); f_gen_ << endl;
+ render_sync_client_marker_trait_impls(tservice, client_impl_name);
+ f_gen_ << endl;
render_sync_client_process_impl(tservice);
}
-void t_rs_generator::render_sync_client_trait(t_service *tservice) {
+void t_rs_generator::render_sync_client_trait(t_service* tservice) {
string extension = "";
if (tservice->get_extends()) {
t_service* extends = tservice->get_extends();
extension = " : " + rust_namespace(extends) + rust_sync_client_trait_name(extends);
}
- render_rustdoc((t_doc*) tservice);
+ render_rustdoc((t_doc*)tservice);
f_gen_ << "pub trait " << rust_sync_client_trait_name(tservice) << extension << " {" << endl;
indent_up();
const std::vector<t_function*> functions = tservice->get_functions();
std::vector<t_function*>::const_iterator func_iter;
- for(func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
+ for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
t_function* tfunc = (*func_iter);
string func_name = service_call_client_function_name(tfunc);
string func_args = rust_sync_service_call_declaration(tfunc, true);
string func_return = to_rust_type(tfunc->get_returntype());
- render_rustdoc((t_doc*) tfunc);
- f_gen_ << indent() << "fn " << func_name << func_args << " -> thrift::Result<" << func_return << ">;" << endl;
+ render_rustdoc((t_doc*)tfunc);
+ f_gen_ << indent() << "fn " << func_name << func_args << " -> thrift::Result<" << func_return
+ << ">;" << endl;
}
indent_down();
@@ -2119,24 +2068,17 @@
f_gen_ << endl;
}
-void t_rs_generator::render_sync_client_marker_trait(t_service *tservice) {
- f_gen_ << indent() << "pub trait " << rust_sync_client_marker_trait_name(tservice) << " {}" << endl;
+void t_rs_generator::render_sync_client_marker_trait(t_service* tservice) {
+ f_gen_ << indent() << "pub trait " << rust_sync_client_marker_trait_name(tservice) << " {}"
+ << endl;
f_gen_ << endl;
}
-void t_rs_generator::render_sync_client_marker_trait_impls(t_service *tservice, const string &impl_struct_name) {
- f_gen_
- << indent()
- << "impl "
- << SYNC_CLIENT_GENERIC_BOUND_VARS
- << " "
- << rust_namespace(tservice) << rust_sync_client_marker_trait_name(tservice)
- << " for "
- << impl_struct_name << SYNC_CLIENT_GENERIC_BOUND_VARS
- << " "
- << SYNC_CLIENT_GENERIC_BOUNDS
- << " {}"
- << endl;
+void t_rs_generator::render_sync_client_marker_trait_impls(t_service* tservice,
+ const string& impl_struct_name) {
+ f_gen_ << indent() << "impl " << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << rust_namespace(tservice)
+ << rust_sync_client_marker_trait_name(tservice) << " for " << impl_struct_name
+ << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << SYNC_CLIENT_GENERIC_BOUNDS << " {}" << endl;
t_service* extends = tservice->get_extends();
if (extends) {
@@ -2147,14 +2089,8 @@
void t_rs_generator::render_sync_client_definition_and_impl(const string& client_impl_name) {
// render the definition for the client struct
- f_gen_
- << "pub struct "
- << client_impl_name
- << SYNC_CLIENT_GENERIC_BOUND_VARS
- << " "
- << SYNC_CLIENT_GENERIC_BOUNDS
- << " {"
- << endl;
+ f_gen_ << "pub struct " << client_impl_name << SYNC_CLIENT_GENERIC_BOUND_VARS << " "
+ << SYNC_CLIENT_GENERIC_BOUNDS << " {" << endl;
indent_up();
f_gen_ << indent() << "_i_prot: IP," << endl;
f_gen_ << indent() << "_o_prot: OP," << endl;
@@ -2165,16 +2101,8 @@
// render the struct implementation
// this includes the new() function as well as the helper send/recv methods for each service call
- f_gen_
- << "impl "
- << SYNC_CLIENT_GENERIC_BOUND_VARS
- << " "
- << client_impl_name
- << SYNC_CLIENT_GENERIC_BOUND_VARS
- << " "
- << SYNC_CLIENT_GENERIC_BOUNDS
- << " {"
- << endl;
+ f_gen_ << "impl " << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << client_impl_name
+ << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << SYNC_CLIENT_GENERIC_BOUNDS << " {" << endl;
indent_up();
render_sync_client_lifecycle_functions(client_impl_name);
indent_down();
@@ -2183,45 +2111,32 @@
}
void t_rs_generator::render_sync_client_lifecycle_functions(const string& client_struct) {
- f_gen_
- << indent()
- << "pub fn new(input_protocol: IP, output_protocol: OP) -> "
- << client_struct
- << SYNC_CLIENT_GENERIC_BOUND_VARS
- << " {"
- << endl;
+ f_gen_ << indent() << "pub fn new(input_protocol: IP, output_protocol: OP) -> " << client_struct
+ << SYNC_CLIENT_GENERIC_BOUND_VARS << " {" << endl;
indent_up();
- f_gen_
- << indent()
- << client_struct
- << " { _i_prot: input_protocol, _o_prot: output_protocol, _sequence_number: 0 }"
- << endl;
+ f_gen_ << indent() << client_struct
+ << " { _i_prot: input_protocol, _o_prot: output_protocol, _sequence_number: 0 }" << endl;
indent_down();
f_gen_ << indent() << "}" << endl;
}
-void t_rs_generator::render_sync_client_tthriftclient_impl(const string &client_impl_name) {
- f_gen_
- << indent()
- << "impl "
- << SYNC_CLIENT_GENERIC_BOUND_VARS
- << " TThriftClient for "
- << client_impl_name
- << SYNC_CLIENT_GENERIC_BOUND_VARS
- << " "
- << SYNC_CLIENT_GENERIC_BOUNDS
- << " {" << endl;
+void t_rs_generator::render_sync_client_tthriftclient_impl(const string& client_impl_name) {
+ f_gen_ << indent() << "impl " << SYNC_CLIENT_GENERIC_BOUND_VARS << " TThriftClient for "
+ << client_impl_name << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << SYNC_CLIENT_GENERIC_BOUNDS
+ << " {" << endl;
indent_up();
- f_gen_ << indent() << "fn i_prot_mut(&mut self) -> &mut dyn TInputProtocol { &mut self._i_prot }" << endl;
- f_gen_ << indent() << "fn o_prot_mut(&mut self) -> &mut dyn TOutputProtocol { &mut self._o_prot }" << endl;
+ f_gen_ << indent() << "fn i_prot_mut(&mut self) -> &mut dyn TInputProtocol { &mut self._i_prot }"
+ << endl;
+ f_gen_ << indent() << "fn o_prot_mut(&mut self) -> &mut dyn TOutputProtocol { &mut self._o_prot }"
+ << endl;
f_gen_ << indent() << "fn sequence_number(&self) -> i32 { self._sequence_number }" << endl;
- f_gen_
- << indent()
- << "fn increment_sequence_number(&mut self) -> i32 { self._sequence_number += 1; self._sequence_number }"
- << endl;
+ f_gen_ << indent()
+ << "fn increment_sequence_number(&mut self) -> i32 { self._sequence_number += 1; "
+ "self._sequence_number }"
+ << endl;
indent_down();
f_gen_ << indent() << "}" << endl;
@@ -2231,15 +2146,13 @@
void t_rs_generator::render_sync_client_process_impl(t_service* tservice) {
string marker_extension = "" + sync_client_marker_traits_for_extension(tservice);
- f_gen_
- << "impl <C: TThriftClient + " << rust_sync_client_marker_trait_name(tservice) << marker_extension << "> "
- << rust_sync_client_trait_name(tservice)
- << " for C {" << endl;
+ f_gen_ << "impl <C: TThriftClient + " << rust_sync_client_marker_trait_name(tservice)
+ << marker_extension << "> " << rust_sync_client_trait_name(tservice) << " for C {" << endl;
indent_up();
const std::vector<t_function*> functions = tservice->get_functions();
std::vector<t_function*>::const_iterator func_iter;
- for(func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
+ for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
t_function* func = (*func_iter);
render_sync_send_recv_wrapper(func);
}
@@ -2249,12 +2162,13 @@
f_gen_ << endl;
}
-string t_rs_generator::sync_client_marker_traits_for_extension(t_service *tservice) {
+string t_rs_generator::sync_client_marker_traits_for_extension(t_service* tservice) {
string marker_extension;
t_service* extends = tservice->get_extends();
if (extends) {
- marker_extension = " + " + rust_namespace(extends) + rust_sync_client_marker_trait_name(extends);
+ marker_extension
+ = " + " + rust_namespace(extends) + rust_sync_client_marker_trait_name(extends);
marker_extension = marker_extension + sync_client_marker_traits_for_extension(extends);
}
@@ -2267,11 +2181,8 @@
string func_call_args = rust_sync_service_call_invocation(tfunc);
string func_return = to_rust_type(tfunc->get_returntype());
- f_gen_
- << indent()
- << "fn " << func_name << func_decl_args << " -> thrift::Result<" << func_return
- << "> {"
- << endl;
+ f_gen_ << indent() << "fn " << func_name << func_decl_args << " -> thrift::Result<" << func_return
+ << "> {" << endl;
indent_up();
f_gen_ << indent() << "(" << endl;
@@ -2296,13 +2207,10 @@
// increment the sequence number and generate the call header
string message_type = tfunc->is_oneway() ? "TMessageType::OneWay" : "TMessageType::Call";
f_gen_ << indent() << "self.increment_sequence_number();" << endl;
- f_gen_
- << indent()
- << "let message_ident = "
- << "TMessageIdentifier::new(\"" << tfunc->get_name() << "\", " // note: use *original* name
- << message_type << ", "
- << "self.sequence_number());"
- << endl;
+ f_gen_ << indent() << "let message_ident = "
+ << "TMessageIdentifier::new(\"" << tfunc->get_name() << "\", " // note: use *original* name
+ << message_type << ", "
+ << "self.sequence_number());" << endl;
// pack the arguments into the containing struct that we'll write out over the wire
// note that this struct is generated even if we have 0 args
ostringstream struct_definition;
@@ -2317,17 +2225,12 @@
if (struct_fields.size() > 0) {
struct_fields = struct_fields.substr(0, struct_fields.size() - 2); // strip trailing comma
}
- f_gen_
- << indent()
- << "let call_args = "
- << service_call_args_struct_name(tfunc)
- << " { "
- << struct_fields
- << " };"
- << endl;
+ f_gen_ << indent() << "let call_args = " << service_call_args_struct_name(tfunc) << " { "
+ << struct_fields << " };" << endl;
// write everything over the wire
f_gen_ << indent() << "self.o_prot_mut().write_message_begin(&message_ident)?;" << endl;
- f_gen_ << indent() << "call_args.write_to_out_protocol(self.o_prot_mut())?;" << endl; // written even if we have 0 args
+ f_gen_ << indent() << "call_args.write_to_out_protocol(self.o_prot_mut())?;"
+ << endl; // written even if we have 0 args
f_gen_ << indent() << "self.o_prot_mut().write_message_end()?;" << endl;
f_gen_ << indent() << "self.o_prot_mut().flush()" << endl;
@@ -2340,18 +2243,28 @@
indent_up();
f_gen_ << indent() << "let message_ident = self.i_prot_mut().read_message_begin()?;" << endl;
- f_gen_ << indent() << "verify_expected_sequence_number(self.sequence_number(), message_ident.sequence_number)?;" << endl;
- f_gen_ << indent() << "verify_expected_service_call(\"" << tfunc->get_name() <<"\", &message_ident.name)?;" << endl; // note: use *original* name
+ f_gen_
+ << indent()
+ << "verify_expected_sequence_number(self.sequence_number(), message_ident.sequence_number)?;"
+ << endl;
+ f_gen_ << indent() << "verify_expected_service_call(\"" << tfunc->get_name()
+ << "\", &message_ident.name)?;" << endl; // note: use *original* name
// FIXME: replace with a "try" block
f_gen_ << indent() << "if message_ident.message_type == TMessageType::Exception {" << endl;
indent_up();
- f_gen_ << indent() << "let remote_error = thrift::Error::read_application_error_from_in_protocol(self.i_prot_mut())?;" << endl;
+ f_gen_ << indent()
+ << "let remote_error = "
+ "thrift::Error::read_application_error_from_in_protocol(self.i_prot_mut())?;"
+ << endl;
f_gen_ << indent() << "self.i_prot_mut().read_message_end()?;" << endl;
f_gen_ << indent() << "return Err(thrift::Error::Application(remote_error))" << endl;
indent_down();
f_gen_ << indent() << "}" << endl;
- f_gen_ << indent() << "verify_expected_message_type(TMessageType::Reply, message_ident.message_type)?;" << endl;
- f_gen_ << indent() << "let result = " << service_call_result_struct_name(tfunc) << "::read_from_in_protocol(self.i_prot_mut())?;" << endl;
+ f_gen_ << indent()
+ << "verify_expected_message_type(TMessageType::Reply, message_ident.message_type)?;"
+ << endl;
+ f_gen_ << indent() << "let result = " << service_call_result_struct_name(tfunc)
+ << "::read_from_in_protocol(self.i_prot_mut())?;" << endl;
f_gen_ << indent() << "self.i_prot_mut().read_message_end()?;" << endl;
f_gen_ << indent() << "result.ok_or()" << endl;
@@ -2377,7 +2290,8 @@
return func_args.str();
}
-string t_rs_generator::rust_sync_service_call_invocation(t_function* tfunc, const string& field_prefix) {
+string t_rs_generator::rust_sync_service_call_invocation(t_function* tfunc,
+ const string& field_prefix) {
ostringstream func_args;
func_args << "(";
@@ -2389,7 +2303,8 @@
return func_args.str();
}
-string t_rs_generator::struct_to_declaration(t_struct* tstruct, t_rs_generator::e_struct_type struct_type) {
+string t_rs_generator::struct_to_declaration(t_struct* tstruct,
+ t_rs_generator::e_struct_type struct_type) {
ostringstream args;
bool first_arg = true;
@@ -2435,8 +2350,8 @@
}
void t_rs_generator::render_service_call_args_struct(t_function* tfunc) {
- string args_struct_name(service_call_args_struct_name(tfunc));
- render_struct(args_struct_name, tfunc->get_arglist(), t_rs_generator::T_ARGS);
+ string args_struct_name(service_call_args_struct_name(tfunc));
+ render_struct(args_struct_name, tfunc->get_arglist(), t_rs_generator::T_ARGS);
}
void t_rs_generator::render_service_call_result_value_struct(t_function* tfunc) {
@@ -2452,7 +2367,8 @@
t_struct* exceptions = tfunc->get_xceptions();
const vector<t_field*>& exception_types = exceptions->get_members();
vector<t_field*>::const_iterator exception_iter;
- for(exception_iter = exception_types.begin(); exception_iter != exception_types.end(); ++exception_iter) {
+ for (exception_iter = exception_types.begin(); exception_iter != exception_types.end();
+ ++exception_iter) {
t_field* exception_type = *exception_iter;
exception_type->set_req(t_field::T_OPTIONAL);
result.append(exception_type);
@@ -2467,13 +2383,13 @@
//
//-----------------------------------------------------------------------------
-void t_rs_generator::render_sync_processor(t_service *tservice) {
+void t_rs_generator::render_sync_processor(t_service* tservice) {
render_type_comment(tservice->get_name() + " service processor"); // note: use *original* name
render_sync_handler_trait(tservice);
render_sync_processor_definition_and_impl(tservice);
}
-void t_rs_generator::render_sync_handler_trait(t_service *tservice) {
+void t_rs_generator::render_sync_handler_trait(t_service* tservice) {
string extension = "";
if (tservice->get_extends() != nullptr) {
t_service* extends = tservice->get_extends();
@@ -2483,38 +2399,30 @@
const std::vector<t_function*> functions = tservice->get_functions();
std::vector<t_function*>::const_iterator func_iter;
- render_rustdoc((t_doc*) tservice);
+ render_rustdoc((t_doc*)tservice);
f_gen_ << "pub trait " << rust_sync_handler_trait_name(tservice) << extension << " {" << endl;
indent_up();
- for(func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
+ for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
t_function* tfunc = (*func_iter);
string func_name = service_call_handler_function_name(tfunc);
string func_args = rust_sync_service_call_declaration(tfunc, false);
string func_return = to_rust_type(tfunc->get_returntype());
- render_rustdoc((t_doc*) tfunc);
- f_gen_
- << indent()
- << "fn "
- << func_name << func_args
- << " -> thrift::Result<" << func_return << ">;"
- << endl;
+ render_rustdoc((t_doc*)tfunc);
+ f_gen_ << indent() << "fn " << func_name << func_args << " -> thrift::Result<" << func_return
+ << ">;" << endl;
}
indent_down();
f_gen_ << indent() << "}" << endl;
f_gen_ << endl;
}
-void t_rs_generator::render_sync_processor_definition_and_impl(t_service *tservice) {
+void t_rs_generator::render_sync_processor_definition_and_impl(t_service* tservice) {
string service_processor_name = rust_sync_processor_name(tservice);
string handler_trait_name = rust_sync_handler_trait_name(tservice);
// struct
- f_gen_
- << indent()
- << "pub struct " << service_processor_name
- << "<H: " << handler_trait_name
- << "> {"
- << endl;
+ f_gen_ << indent() << "pub struct " << service_processor_name << "<H: " << handler_trait_name
+ << "> {" << endl;
indent_up();
f_gen_ << indent() << "handler: H," << endl;
indent_down();
@@ -2522,12 +2430,8 @@
f_gen_ << endl;
// delegating impl
- f_gen_
- << indent()
- << "impl <H: " << handler_trait_name << "> "
- << service_processor_name
- << "<H> {"
- << endl;
+ f_gen_ << indent() << "impl <H: " << handler_trait_name << "> " << service_processor_name
+ << "<H> {" << endl;
indent_up();
f_gen_ << indent() << "pub fn new(handler: H) -> " << service_processor_name << "<H> {" << endl;
indent_up();
@@ -2552,7 +2456,7 @@
vector<t_function*> functions = tservice->get_functions();
vector<t_function*>::iterator func_iter;
- for(func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
+ for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
t_function* tfunc = (*func_iter);
render_sync_process_function(tfunc, handler_trait_name);
}
@@ -2562,40 +2466,33 @@
f_gen_ << endl;
// processor impl
- f_gen_
- << indent()
- << "impl <H: "
- << handler_trait_name << "> TProcessor for "
- << service_processor_name
- << "<H> {"
- << endl;
+ f_gen_ << indent() << "impl <H: " << handler_trait_name << "> TProcessor for "
+ << service_processor_name << "<H> {" << endl;
indent_up();
- f_gen_
- << indent()
- << "fn process(&self, i_prot: &mut dyn TInputProtocol, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
- << endl;
+ f_gen_ << indent()
+ << "fn process(&self, i_prot: &mut dyn TInputProtocol, o_prot: &mut dyn TOutputProtocol) "
+ "-> thrift::Result<()> {"
+ << endl;
indent_up();
f_gen_ << indent() << "let message_ident = i_prot.read_message_begin()?;" << endl;
- f_gen_ << indent() << "let res = match &*message_ident.name {" << endl; // [sigh] explicit deref coercion
+ f_gen_ << indent() << "let res = match &*message_ident.name {"
+ << endl; // [sigh] explicit deref coercion
indent_up();
render_process_match_statements(tservice);
f_gen_ << indent() << "method => {" << endl;
indent_up();
- render_thrift_error(
- "Application",
- "ApplicationError",
- "ApplicationErrorKind::UnknownMethod",
- "format!(\"unknown method {}\", method)"
- );
+ render_thrift_error("Application", "ApplicationError", "ApplicationErrorKind::UnknownMethod",
+ "format!(\"unknown method {}\", method)");
indent_down();
f_gen_ << indent() << "}," << endl;
indent_down();
f_gen_ << indent() << "};" << endl;
- f_gen_ << indent() << "thrift::server::handle_process_result(&message_ident, res, o_prot)" << endl;
+ f_gen_ << indent() << "thrift::server::handle_process_result(&message_ident, res, o_prot)"
+ << endl;
indent_down();
f_gen_ << indent() << "}" << endl;
@@ -2605,36 +2502,27 @@
f_gen_ << endl;
}
-void t_rs_generator::render_sync_process_delegation_functions(t_service *tservice) {
+void t_rs_generator::render_sync_process_delegation_functions(t_service* tservice) {
string actual_processor(rust_namespace(tservice) + rust_sync_processor_impl_name(tservice));
vector<t_function*> functions = tservice->get_functions();
vector<t_function*>::iterator func_iter;
- for(func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
+ for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
t_function* tfunc = (*func_iter);
string function_name("process_" + rust_snake_case(tfunc->get_name()));
- f_gen_
- << indent()
- << "fn " << function_name
- << "(&self, "
- << "incoming_sequence_number: i32, "
- << "i_prot: &mut dyn TInputProtocol, "
- << "o_prot: &mut dyn TOutputProtocol) "
- << "-> thrift::Result<()> {"
- << endl;
+ f_gen_ << indent() << "fn " << function_name << "(&self, "
+ << "incoming_sequence_number: i32, "
+ << "i_prot: &mut dyn TInputProtocol, "
+ << "o_prot: &mut dyn TOutputProtocol) "
+ << "-> thrift::Result<()> {" << endl;
indent_up();
- f_gen_
- << indent()
- << actual_processor
- << "::" << function_name
- << "("
- << "&self.handler, "
- << "incoming_sequence_number, "
- << "i_prot, "
- << "o_prot"
- << ")"
- << endl;
+ f_gen_ << indent() << actual_processor << "::" << function_name << "("
+ << "&self.handler, "
+ << "incoming_sequence_number, "
+ << "i_prot, "
+ << "o_prot"
+ << ")" << endl;
indent_down();
f_gen_ << indent() << "}" << endl;
@@ -2649,15 +2537,13 @@
void t_rs_generator::render_process_match_statements(t_service* tservice) {
vector<t_function*> functions = tservice->get_functions();
vector<t_function*>::iterator func_iter;
- for(func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
+ for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
t_function* tfunc = (*func_iter);
- f_gen_ << indent() << "\"" << tfunc->get_name() << "\"" << " => {" << endl; // note: use *original* name
+ f_gen_ << indent() << "\"" << tfunc->get_name() << "\""
+ << " => {" << endl; // note: use *original* name
indent_up();
- f_gen_
- << indent()
- << "self.process_" << rust_snake_case(tfunc->get_name())
- << "(message_ident.sequence_number, i_prot, o_prot)"
- << endl;
+ f_gen_ << indent() << "self.process_" << rust_snake_case(tfunc->get_name())
+ << "(message_ident.sequence_number, i_prot, o_prot)" << endl;
indent_down();
f_gen_ << indent() << "}," << endl;
}
@@ -2668,7 +2554,7 @@
}
}
-void t_rs_generator::render_sync_process_function(t_function *tfunc, const string &handler_type) {
+void t_rs_generator::render_sync_process_function(t_function* tfunc, const string& handler_type) {
string sequence_number_param("incoming_sequence_number");
string output_protocol_param("o_prot");
@@ -2677,40 +2563,26 @@
output_protocol_param = "_";
}
- f_gen_
- << indent()
- << "pub fn process_" << rust_snake_case(tfunc->get_name())
- << "<H: " << handler_type << ">"
- << "(handler: &H, "
- << sequence_number_param << ": i32, "
- << "i_prot: &mut dyn TInputProtocol, "
- << output_protocol_param << ": &mut dyn TOutputProtocol) "
- << "-> thrift::Result<()> {"
- << endl;
+ f_gen_ << indent() << "pub fn process_" << rust_snake_case(tfunc->get_name())
+ << "<H: " << handler_type << ">"
+ << "(handler: &H, " << sequence_number_param << ": i32, "
+ << "i_prot: &mut dyn TInputProtocol, " << output_protocol_param
+ << ": &mut dyn TOutputProtocol) "
+ << "-> thrift::Result<()> {" << endl;
indent_up();
// *always* read arguments from the input protocol
- f_gen_
- << indent()
- << "let "
- << (has_non_void_args(tfunc) ? "args" : "_")
- << " = "
- << service_call_args_struct_name(tfunc)
- << "::read_from_in_protocol(i_prot)?;"
- << endl;
+ f_gen_ << indent() << "let " << (has_non_void_args(tfunc) ? "args" : "_") << " = "
+ << service_call_args_struct_name(tfunc) << "::read_from_in_protocol(i_prot)?;" << endl;
- f_gen_
- << indent()
- << "match handler."
- << service_call_handler_function_name(tfunc)
- << rust_sync_service_call_invocation(tfunc, "args.")
- << " {"
- << endl; // start match
+ f_gen_ << indent() << "match handler." << service_call_handler_function_name(tfunc)
+ << rust_sync_service_call_invocation(tfunc, "args.") << " {" << endl; // start match
indent_up();
// handler succeeded
- string handler_return_variable = tfunc->is_oneway() || tfunc->get_returntype()->is_void() ? "_" : "handler_return";
+ string handler_return_variable
+ = tfunc->is_oneway() || tfunc->get_returntype()->is_void() ? "_" : "handler_return";
f_gen_ << indent() << "Ok(" << handler_return_variable << ") => {" << endl;
indent_up();
render_sync_handler_succeeded(tfunc);
@@ -2730,33 +2602,31 @@
f_gen_ << indent() << "}" << endl; // end function
}
-void t_rs_generator::render_sync_handler_succeeded(t_function *tfunc) {
+void t_rs_generator::render_sync_handler_succeeded(t_function* tfunc) {
if (tfunc->is_oneway()) {
f_gen_ << indent() << "Ok(())" << endl;
} else {
- f_gen_
- << indent()
- << "let message_ident = TMessageIdentifier::new("
- << "\"" << tfunc->get_name() << "\", " // note: use *original* name
- << "TMessageType::Reply, "
- << "incoming_sequence_number);"
- << endl;
+ f_gen_ << indent() << "let message_ident = TMessageIdentifier::new("
+ << "\"" << tfunc->get_name() << "\", " // note: use *original* name
+ << "TMessageType::Reply, "
+ << "incoming_sequence_number);" << endl;
f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << endl;
- f_gen_ << indent() << "let ret = " << handler_successful_return_struct(tfunc) <<";" << endl;
+ f_gen_ << indent() << "let ret = " << handler_successful_return_struct(tfunc) << ";" << endl;
f_gen_ << indent() << "ret.write_to_out_protocol(o_prot)?;" << endl;
f_gen_ << indent() << "o_prot.write_message_end()?;" << endl;
f_gen_ << indent() << "o_prot.flush()" << endl;
}
}
-void t_rs_generator::render_sync_handler_failed(t_function *tfunc) {
+void t_rs_generator::render_sync_handler_failed(t_function* tfunc) {
string err_var("e");
f_gen_ << indent() << "match " << err_var << " {" << endl;
indent_up();
// if there are any user-defined exceptions for this service call handle them first
- if (tfunc->get_xceptions() != nullptr && tfunc->get_xceptions()->get_sorted_members().size() > 0) {
+ if (tfunc->get_xceptions() != nullptr
+ && tfunc->get_xceptions()->get_sorted_members().size() > 0) {
string user_err_var("usr_err");
f_gen_ << indent() << "thrift::Error::User(" << user_err_var << ") => {" << endl;
indent_up();
@@ -2784,7 +2654,7 @@
f_gen_ << indent() << "}" << endl;
}
-void t_rs_generator::render_sync_handler_failed_user_exception_branch(t_function *tfunc) {
+void t_rs_generator::render_sync_handler_failed_user_exception_branch(t_function* tfunc) {
if (tfunc->get_xceptions() == nullptr || tfunc->get_xceptions()->get_sorted_members().empty()) {
throw "cannot render user exception branches if no user exceptions defined";
}
@@ -2799,13 +2669,12 @@
string if_statement(branches_rendered == 0 ? "if usr_err" : "} else if usr_err");
string exception_type(to_rust_type(xception_field->get_type()));
- f_gen_ << indent() << if_statement << ".downcast_ref::<" << exception_type << ">().is_some() {" << endl;
+ f_gen_ << indent() << if_statement << ".downcast_ref::<" << exception_type << ">().is_some() {"
+ << endl;
indent_up();
- f_gen_
- << indent()
- << "let err = usr_err.downcast::<" << exception_type << ">().expect(\"downcast already checked\");"
- << endl;
+ f_gen_ << indent() << "let err = usr_err.downcast::<" << exception_type
+ << ">().expect(\"downcast already checked\");" << endl;
// render the members of the return struct
ostringstream members;
@@ -2816,7 +2685,8 @@
}
vector<t_field*>::const_iterator xception_members_iter;
- for(xception_members_iter = txceptions.begin(); xception_members_iter != txceptions.end(); ++xception_members_iter) {
+ for (xception_members_iter = txceptions.begin(); xception_members_iter != txceptions.end();
+ ++xception_members_iter) {
t_field* member = (*xception_members_iter);
string member_name(rust_field_name(member));
if (member == xception_field) {
@@ -2830,21 +2700,14 @@
member_string.replace(member_string.size() - 2, 2, " "); // trim trailing comma
// now write out the return struct
- f_gen_
- << indent()
- << "let ret_err = "
- << service_call_result_struct_name(tfunc)
- << "{ " << member_string << "};"
- << endl;
+ f_gen_ << indent() << "let ret_err = " << service_call_result_struct_name(tfunc) << "{ "
+ << member_string << "};" << endl;
- f_gen_
- << indent()
- << "let message_ident = "
- << "TMessageIdentifier::new("
- << "\"" << tfunc->get_name() << "\", " // note: use *original* name
- << "TMessageType::Reply, "
- << "incoming_sequence_number);"
- << endl;
+ f_gen_ << indent() << "let message_ident = "
+ << "TMessageIdentifier::new("
+ << "\"" << tfunc->get_name() << "\", " // note: use *original* name
+ << "TMessageType::Reply, "
+ << "incoming_sequence_number);" << endl;
f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << endl;
f_gen_ << indent() << "ret_err.write_to_out_protocol(o_prot)?;" << endl;
f_gen_ << indent() << "o_prot.write_message_end()?;" << endl;
@@ -2863,7 +2726,8 @@
f_gen_ << indent() << "let ret_err = {" << endl;
indent_up();
- render_thrift_error_struct("ApplicationError", "ApplicationErrorKind::Unknown", "usr_err.to_string()");
+ render_thrift_error_struct("ApplicationError", "ApplicationErrorKind::Unknown",
+ "usr_err.to_string()");
indent_down();
f_gen_ << indent() << "};" << endl;
render_sync_handler_send_exception_response(tfunc, "ret_err");
@@ -2873,9 +2737,8 @@
}
void t_rs_generator::render_sync_handler_failed_application_exception_branch(
- t_function *tfunc,
- const string &app_err_var
-) {
+ t_function* tfunc,
+ const string& app_err_var) {
if (tfunc->is_oneway()) {
f_gen_ << indent() << "Err(thrift::Error::Application(" << app_err_var << "))" << endl;
} else {
@@ -2883,7 +2746,7 @@
}
}
-void t_rs_generator::render_sync_handler_failed_default_exception_branch(t_function *tfunc) {
+void t_rs_generator::render_sync_handler_failed_default_exception_branch(t_function* tfunc) {
f_gen_ << indent() << "let ret_err = {" << endl;
indent_up();
render_thrift_error_struct("ApplicationError", "ApplicationErrorKind::Unknown", "e.to_string()");
@@ -2896,16 +2759,15 @@
}
}
-void t_rs_generator::render_sync_handler_send_exception_response(t_function *tfunc, const string &err_var) {
- f_gen_
- << indent()
- << "let message_ident = TMessageIdentifier::new("
- << "\"" << tfunc->get_name() << "\", " // note: use *original* name
- << "TMessageType::Exception, "
- << "incoming_sequence_number);"
- << endl;
+void t_rs_generator::render_sync_handler_send_exception_response(t_function* tfunc,
+ const string& err_var) {
+ f_gen_ << indent() << "let message_ident = TMessageIdentifier::new("
+ << "\"" << tfunc->get_name() << "\", " // note: use *original* name
+ << "TMessageType::Exception, "
+ << "incoming_sequence_number);" << endl;
f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << endl;
- f_gen_ << indent() << "thrift::Error::write_application_error_to_out_protocol(&" << err_var << ", o_prot)?;" << endl;
+ f_gen_ << indent() << "thrift::Error::write_application_error_to_out_protocol(&" << err_var
+ << ", o_prot)?;" << endl;
f_gen_ << indent() << "o_prot.write_message_end()?;" << endl;
f_gen_ << indent() << "o_prot.flush()" << endl;
}
@@ -2929,7 +2791,9 @@
vector<t_field*>::const_iterator members_iter;
for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
t_field* xception_field = (*members_iter);
- if (member_count > 0) { return_struct << ", "; }
+ if (member_count > 0) {
+ return_struct << ", ";
+ }
return_struct << rust_field_name(xception_field) << ": None";
member_count++;
}
@@ -2937,7 +2801,7 @@
return_struct << " }";
- return return_struct.str();
+ return return_struct.str();
}
//-----------------------------------------------------------------------------
@@ -2963,12 +2827,10 @@
generate_docstring_comment(f_gen_, "", "/// ", tdoc->get_doc(), "");
}
-void t_rs_generator::render_thrift_error(
- const string& error_kind,
- const string& error_struct,
- const string& sub_error_kind,
- const string& error_message
-) {
+void t_rs_generator::render_thrift_error(const string& error_kind,
+ const string& error_struct,
+ const string& sub_error_kind,
+ const string& error_message) {
f_gen_ << indent() << "Err(" << endl;
indent_up();
f_gen_ << indent() << "thrift::Error::" << error_kind << "(" << endl;
@@ -2980,11 +2842,9 @@
f_gen_ << indent() << ")" << endl;
}
-void t_rs_generator::render_thrift_error_struct(
- const string& error_struct,
- const string& sub_error_kind,
- const string& error_message
-) {
+void t_rs_generator::render_thrift_error_struct(const string& error_struct,
+ const string& sub_error_kind,
+ const string& error_message) {
f_gen_ << indent() << error_struct << "::new(" << endl;
indent_up();
f_gen_ << indent() << sub_error_kind << "," << endl;
@@ -3018,6 +2878,8 @@
} else {
return "String";
}
+ case t_base_type::TYPE_UUID:
+ return "uuid::Uuid";
case t_base_type::TYPE_BOOL:
return "bool";
case t_base_type::TYPE_I8:
@@ -3036,7 +2898,7 @@
} else if (ttype->is_typedef()) {
t_typedef* ttypedef = (t_typedef*)ttype;
string rust_type = rust_namespace(ttype) + ttypedef->get_symbolic();
- rust_type = ttypedef->is_forward_typedef() ? "Box<" + rust_type + ">" : rust_type;
+ rust_type = ttypedef->is_forward_typedef() ? "Box<" + rust_type + ">" : rust_type;
return rust_type;
} else if (ttype->is_enum()) {
return rust_namespace(ttype) + rust_camel_case(ttype->get_name());
@@ -3044,7 +2906,8 @@
return rust_namespace(ttype) + rust_camel_case(ttype->get_name());
} else if (ttype->is_map()) {
t_map* tmap = (t_map*)ttype;
- return "BTreeMap<" + to_rust_type(tmap->get_key_type()) + ", " + to_rust_type(tmap->get_val_type()) + ">";
+ return "BTreeMap<" + to_rust_type(tmap->get_key_type()) + ", "
+ + to_rust_type(tmap->get_val_type()) + ">";
} else if (ttype->is_set()) {
t_set* tset = (t_set*)ttype;
return "BTreeSet<" + to_rust_type(tset->get_elem_type()) + ">";
@@ -3080,6 +2943,8 @@
throw "will not generate protocol::TType for TYPE_VOID";
case t_base_type::TYPE_STRING: // both strings and binary are actually encoded as TType::String
return "TType::String";
+ case t_base_type::TYPE_UUID:
+ return "TType::Uuid";
case t_base_type::TYPE_BOOL:
return "TType::Bool";
case t_base_type::TYPE_I8:
@@ -3123,6 +2988,8 @@
} else {
return "Some(\"\".to_owned())";
}
+ case t_base_type::TYPE_UUID:
+ return "Some(uuid::Uuid::nil())";
case t_base_type::TYPE_BOOL:
return "Some(false)";
case t_base_type::TYPE_I8:
@@ -3172,7 +3039,8 @@
return req == t_field::T_OPTIONAL || req == t_field::T_OPT_IN_REQ_OUT;
}
-t_field::e_req t_rs_generator::actual_field_req(t_field* tfield, t_rs_generator::e_struct_type struct_type) {
+t_field::e_req t_rs_generator::actual_field_req(t_field* tfield,
+ t_rs_generator::e_struct_type struct_type) {
return struct_type == t_rs_generator::T_ARGS ? t_field::T_REQUIRED : tfield->get_req();
}
@@ -3197,7 +3065,7 @@
}
string t_rs_generator::visibility_qualifier(t_rs_generator::e_struct_type struct_type) {
- switch(struct_type) {
+ switch (struct_type) {
case t_rs_generator::T_ARGS:
case t_rs_generator::T_RESULT:
return "";
@@ -3286,11 +3154,11 @@
return rust_camel_case(tservice->get_name()) + "SyncProcessor";
}
-string t_rs_generator::rust_sync_processor_impl_name(t_service *tservice) {
+string t_rs_generator::rust_sync_processor_impl_name(t_service* tservice) {
return "T" + rust_camel_case(tservice->get_name()) + "ProcessFunctions";
}
-string t_rs_generator::rust_enum_variant_name(const string &name) {
+string t_rs_generator::rust_enum_variant_name(const string& name) {
bool all_uppercase = true;
for (char i : name) {
@@ -3341,17 +3209,19 @@
}
string t_rs_generator::rust_safe_field_id(int32_t id) {
- string id_str = std::to_string(abs(id));
- if (id >= 0) {
- return id_str;
- } else {
- string str("neg");
- str += id_str;
- return str;
- }
+ string id_str = std::to_string(abs(id));
+ if (id >= 0) {
+ return id_str;
+ } else {
+ string str("neg");
+ str += id_str;
+ return str;
+ }
}
-void t_rs_generator::string_replace(string& target, const string& search_string, const string& replace_string) {
+void t_rs_generator::string_replace(string& target,
+ const string& search_string,
+ const string& replace_string) {
if (target.empty()) {
return;
}
@@ -3371,8 +3241,4 @@
return "Rust";
}
-
-THRIFT_REGISTER_GENERATOR(
- rs,
- "Rust",
- "\n") // no Rust-generator-specific options
+THRIFT_REGISTER_GENERATOR(rs, "Rust", "\n") // no Rust-generator-specific options
diff --git a/compiler/cpp/src/thrift/main.cc b/compiler/cpp/src/thrift/main.cc
index 485ec00..5177076 100644
--- a/compiler/cpp/src/thrift/main.cc
+++ b/compiler/cpp/src/thrift/main.cc
@@ -911,9 +911,12 @@
/**
* Parses a program
*/
-void parse(t_program* program, t_program* parent_program) {
+void parse(t_program* program, t_program* parent_program, std::set<std::string>& known_includes) {
// Get scope file path
string path = program->get_path();
+ if( ! known_includes.insert(path).second) {
+ failure("Recursion detected, file: \"%s\"", path.c_str());
+ }
// Set current dir global, which is used in the include_file function
g_curdir = directory_name(path);
@@ -947,7 +950,7 @@
vector<t_program*>& includes = program->get_includes();
vector<t_program*>::iterator iter;
for (iter = includes.begin(); iter != includes.end(); ++iter) {
- parse(*iter, program);
+ parse(*iter, program, known_includes);
}
// reset program doctext status before parsing a new file
@@ -980,6 +983,8 @@
failure(x.c_str());
}
fclose(yyin);
+
+ known_includes.erase(path);
}
/**
@@ -1041,14 +1046,16 @@
g_incl_searchpath.push_back(old_thrift_include_path);
}
- parse(old_program, nullptr);
+ std::set<std::string> old_includes;
+ parse(old_program, nullptr, old_includes);
g_incl_searchpath = temp_incl_searchpath;
if (!new_thrift_include_path.empty()) {
g_incl_searchpath.push_back(new_thrift_include_path);
}
- parse(new_program, nullptr);
+ std::set<std::string> new_includes;
+ parse(new_program, nullptr, new_includes);
compare_namespace(new_program, old_program);
compare_services(new_program->get_services(), old_program->get_services());
@@ -1268,7 +1275,8 @@
program->set_include_prefix(include_prefix);
// Parse it!
- parse(program, nullptr);
+ std::set<std::string> known_includes;
+ parse(program, nullptr, known_includes);
// The current path is not really relevant when we are doing generation.
// Reset the variable to make warning messages clearer.
diff --git a/compiler/cpp/src/thrift/version.h b/compiler/cpp/src/thrift/version.h
index 4f979d9..65e0f43 100644
--- a/compiler/cpp/src/thrift/version.h
+++ b/compiler/cpp/src/thrift/version.h
@@ -24,6 +24,6 @@
#pragma once
#endif // _MSC_VER
-#define THRIFT_VERSION "0.19.0"
+#define THRIFT_VERSION "0.20.0"
#endif // _THRIFT_VERSION_H_
diff --git a/composer.json b/composer.json
index d1ada50..454beea 100644
--- a/composer.json
+++ b/composer.json
@@ -35,5 +35,19 @@
"branch-alias": {
"dev-master": "1.0.x-dev"
}
+ },
+ "archive": {
+ "exclude": [
+ "*",
+ ".*",
+ "!/CHANGES.md",
+ "!/LICENSE",
+ "!/NOTICE",
+ "!/README.md",
+ "!/composer.json",
+ "!/lib/php/README.apache.md",
+ "!/lib/php/README.md",
+ "!/lib/php/lib"
+ ]
}
}
diff --git a/configure.ac b/configure.ac
index 6331acd..ace48fc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -20,7 +20,7 @@
AC_PREREQ(2.65)
AC_CONFIG_MACRO_DIR([./aclocal])
-AC_INIT([thrift], [0.19.0])
+AC_INIT([thrift], [0.20.0])
AC_CONFIG_AUX_DIR([.])
diff --git a/contrib/Rebus/Properties/AssemblyInfo.cs b/contrib/Rebus/Properties/AssemblyInfo.cs
index ab40a65..33b0aa8 100644
--- a/contrib/Rebus/Properties/AssemblyInfo.cs
+++ b/contrib/Rebus/Properties/AssemblyInfo.cs
@@ -34,5 +34,5 @@
[assembly: Guid("0af10984-40d3-453d-b1e5-421529e8c7e2")]
-[assembly: AssemblyVersion("0.19.0.0")]
-[assembly: AssemblyFileVersion("0.19.0.0")]
+[assembly: AssemblyVersion("0.20.0.0")]
+[assembly: AssemblyFileVersion("0.20.0.0")]
diff --git a/contrib/thrift-maven-plugin/pom.xml b/contrib/thrift-maven-plugin/pom.xml
index 7f25538..e6e4324 100644
--- a/contrib/thrift-maven-plugin/pom.xml
+++ b/contrib/thrift-maven-plugin/pom.xml
@@ -29,7 +29,7 @@
<artifactId>thrift-maven-plugin</artifactId>
<packaging>maven-plugin</packaging>
<name>thrift-maven-plugin</name>
- <version>0.19.0</version>
+ <version>0.20.0</version>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
@@ -94,7 +94,7 @@
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
- <version>32.0.0-jre</version>
+ <version>32.0.1-jre</version>
</dependency>
<dependency>
<groupId>org.codehaus.plexus</groupId>
diff --git a/contrib/thrift.spec b/contrib/thrift.spec
index 5701116..90bf4aa 100644
--- a/contrib/thrift.spec
+++ b/contrib/thrift.spec
@@ -28,7 +28,7 @@
License: Apache License v2.0
Group: Development
Summary: RPC and serialization framework
-Version: 0.19.0
+Version: 0.20.0
Release: 0
URL: http://thrift.apache.org
Packager: Thrift Developers <dev@thrift.apache.org>
diff --git a/contrib/zeromq/csharp/AssemblyInfo.cs b/contrib/zeromq/csharp/AssemblyInfo.cs
index e785620..8d7ed39 100644
--- a/contrib/zeromq/csharp/AssemblyInfo.cs
+++ b/contrib/zeromq/csharp/AssemblyInfo.cs
@@ -36,7 +36,7 @@
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
-[assembly: AssemblyVersion("0.19.0.0")]
+[assembly: AssemblyVersion("0.20.0.0")]
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.
diff --git a/debian/changelog b/debian/changelog
index 93dc7aa..4089829 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+thrift (0.19.0) stable; urgency=low
+
+ * update to 0.19.0
+
+ -- Apache Thrift Developers <dev@thrift.apache.org> Sat, 15 Jul 2023 11:00:00 +0100
+
thrift (0.18.1) stable; urgency=low
* update to 0.18.1
diff --git a/doap.rdf b/doap.rdf
index 9c4d63c..6ad3026 100644
--- a/doap.rdf
+++ b/doap.rdf
@@ -57,6 +57,11 @@
<release rdf:parseType="Collection">
<Version>
<name>Apache Thrift</name>
+ <created>2022-07-15</created>
+ <revision>0.19.0</revision>
+ </Version>
+ <Version>
+ <name>Apache Thrift</name>
<created>2022-02-15</created>
<revision>0.18.1</revision>
</Version>
diff --git a/doc/ReleaseManagement.md b/doc/ReleaseManagement.md
index e659ad4..e06c9b4 100644
--- a/doc/ReleaseManagement.md
+++ b/doc/ReleaseManagement.md
@@ -159,6 +159,13 @@
The result will be a file named `thrift-1.0.0.tar.gz`. Check the size and make sure it is roughly 4MB. It could get larger over time, but it shouldn't jump by orders of magnitude. Once satisfied you can exit the docker container with `exit`.
+ 1. Validate the contents of the tarball
+
+ Unpack the tarball in some empty folder and do a fresh git clone of the branch into another.
+ Now compare both folders and check for any files missing. These need to be added to the appropriate `EXTRA_DIST`
+ makefile section(s). If necessary, commit the changes and repeat generating the source tarball until no more
+ differences can be found.
+
1. Generate signatures and checksums for the tarball:
```bash
diff --git a/doc/install/README.md b/doc/install/README.md
index b90e5c6..d073e91 100644
--- a/doc/install/README.md
+++ b/doc/install/README.md
@@ -29,7 +29,7 @@
* Qt (optional)
* Java
* Java 17 (latest LTS)
- * Gradle 8.0.2
+ * Gradle 8.4
* C#: Mono 1.2.4 (and pkg-config to detect it) or Visual Studio 2005+
* Python 2.6 (including header files for extension modules)
* PHP 5.0 (optionally including header files for extension modules)
diff --git a/doc/install/debian.md b/doc/install/debian.md
index 4718017..3d80531 100644
--- a/doc/install/debian.md
+++ b/doc/install/debian.md
@@ -18,7 +18,7 @@
If you would like to build Apache Thrift libraries for other programming languages you may need to install additional packages. The following languages require the specified additional packages:
* Java
- * packages: gradle (version 8.0.2)
+ * packages: gradle (version 8.4)
* You will also need Java JDK v1.8 or higher. Type **javac** to see a list of available packages, pick the one you prefer and **apt-get install** it (e.g. default-jdk).
* Ruby
* ruby-full ruby-dev ruby-rspec rake rubygems bundler
diff --git a/doc/licenses/lgpl-2.1.txt b/doc/licenses/lgpl-2.1.txt
deleted file mode 100644
index 5ab7695..0000000
--- a/doc/licenses/lgpl-2.1.txt
+++ /dev/null
@@ -1,504 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/doc/specs/idl.md b/doc/specs/idl.md
index cf8354f..0980f5b 100644
--- a/doc/specs/idl.md
+++ b/doc/specs/idl.md
@@ -1,6 +1,6 @@
## Thrift interface description language
-For Thrift version 0.19.0.
+For Thrift version 0.20.0.
The Thrift interface definition language (IDL) allows for the definition of [Thrift Types](/docs/types). A Thrift IDL file is processed by the Thrift code generator to produce code for the various target languages to support the defined structs and services in the IDL file.
diff --git a/go.mod b/go.mod
index 5f2a2c8..7be4256 100644
--- a/go.mod
+++ b/go.mod
@@ -1,3 +1,3 @@
module github.com/apache/thrift
-go 1.19
+go 1.20
diff --git a/lib/cpp/src/thrift/numeric_cast.h b/lib/cpp/src/thrift/numeric_cast.h
deleted file mode 100644
index d7063db..0000000
--- a/lib/cpp/src/thrift/numeric_cast.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#ifndef THRIFT_NUMERIC_CAST_H
-#define THRIFT_NUMERIC_CAST_H
-
-#include <limits>
-#include <stdexcept>
-
-#if defined(_MSC_VER)
-// avoid compiler warnings and errors in MSVC if max is defined as a macro
-#undef max
-#endif
-
-namespace apache {
-namespace thrift {
-
-/**
- * @brief Perform a safe numeric cast
- *
- * Previously this was provided by `boost::numeric_cast`. This
- * implementation reduces the dependency on `boost`.
- *
- * @tparam Dst The destination type
- * @tparam Src The source type
- * @param value The value to be converted
- * @return Dst The converted value
- *
- * @see <a href="https://stackoverflow.com/a/49658950/5636218">SA49658182</a>
- */
-template <typename Dst, typename Src>
-inline Dst numeric_cast(Src value) {
- typedef std::numeric_limits<Dst> DstLim;
- typedef std::numeric_limits<Src> SrcLim;
-
- const bool positive_overflow_possible = DstLim::max() < SrcLim::max();
- const bool negative_overflow_possible = DstLim::lowest() > SrcLim::lowest();
-
- if (positive_overflow_possible && value > DstLim::max()) {
- throw std::bad_cast();
- }
-
- if (negative_overflow_possible && (value < DstLim::lowest())) {
- throw std::bad_cast();
- }
-
- // limits have been checked, therefore safe to cast
- return static_cast<Dst>(value);
-}
-
-} // namespace thrift
-} // namespace apache
-
-#endif
diff --git a/lib/cpp/src/thrift/protocol/TProtocol.h b/lib/cpp/src/thrift/protocol/TProtocol.h
index c6ff360..237c1e5 100644
--- a/lib/cpp/src/thrift/protocol/TProtocol.h
+++ b/lib/cpp/src/thrift/protocol/TProtocol.h
@@ -21,8 +21,26 @@
#define _THRIFT_PROTOCOL_TPROTOCOL_H_ 1
#ifdef _WIN32
+// Including Winsock2.h adds problematic macros like min() and max().
+// Try to work around:
+#ifndef NOMINMAX
+#define NOMINMAX
+#define _THRIFT_UNDEF_NOMINMAX
+#endif
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#define _THRIFT_UNDEF_WIN32_LEAN_AND_MEAN
+#endif
// Need to come before any Windows.h includes
#include <winsock2.h>
+#ifdef _THRIFT_UNDEF_NOMINMAX
+#undef NOMINMAX
+#undef _THRIFT_UNDEF_NOMINMAX
+#endif
+#ifdef _THRIFT_UNDEF_WIN32_LEAN_AND_MEAN
+#undef WIN32_LEAN_AND_MEAN
+#undef _THRIFT_UNDEF_WIN32_LEAN_AND_MEAN
+#endif
#endif
#include <thrift/transport/TTransport.h>
@@ -558,14 +576,14 @@
void setRecurisionLimit(uint32_t depth) {recursion_limit_ = depth;}
// Returns the minimum amount of bytes needed to store the smallest possible instance of TType.
- virtual int getMinSerializedSize(TType type) {
+ virtual int getMinSerializedSize(TType type) {
THRIFT_UNUSED_VARIABLE(type);
return 0;
}
protected:
TProtocol(std::shared_ptr<TTransport> ptrans)
- : ptrans_(ptrans), input_recursion_depth_(0), output_recursion_depth_(0),
+ : ptrans_(ptrans), input_recursion_depth_(0), output_recursion_depth_(0),
recursion_limit_(ptrans->getConfiguration()->getRecursionLimit())
{}
diff --git a/lib/cpp/src/thrift/transport/TBufferTransports.cpp b/lib/cpp/src/thrift/transport/TBufferTransports.cpp
index efca5bd..f7cf8f0 100644
--- a/lib/cpp/src/thrift/transport/TBufferTransports.cpp
+++ b/lib/cpp/src/thrift/transport/TBufferTransports.cpp
@@ -363,9 +363,9 @@
throw TTransportException("Insufficient space in external MemoryBuffer");
}
- // Grow the buffer as necessary.
- const uint32_t current_used = bufferSize_ - avail;
- const uint32_t required_buffer_size = len + current_used;
+ // Grow the buffer as necessary. Use uint64_t to avoid overflow.
+ const uint64_t current_used = bufferSize_ - avail;
+ const uint64_t required_buffer_size = len + current_used;
if (required_buffer_size > maxBufferSize_) {
throw TTransportException(TTransportException::BAD_ARGS,
"Internal buffer size overflow when requesting a buffer of size " + std::to_string(required_buffer_size));
diff --git a/lib/cpp/src/thrift/transport/TSSLSocket.cpp b/lib/cpp/src/thrift/transport/TSSLSocket.cpp
index eb96a73..26ae2be 100644
--- a/lib/cpp/src/thrift/transport/TSSLSocket.cpp
+++ b/lib/cpp/src/thrift/transport/TSSLSocket.cpp
@@ -825,7 +825,7 @@
throw TSSLException("SSL_get_?bio returned nullptr");
}
- if (BIO_get_fd(bio, &fdSocket) <= 0) {
+ if (BIO_get_fd(bio, &fdSocket) < 0) {
throw TSSLException("BIO_get_fd failed");
}
diff --git a/lib/cpp/src/thrift/transport/TTransportException.h b/lib/cpp/src/thrift/transport/TTransportException.h
index 3ce55cb..dd5f361 100644
--- a/lib/cpp/src/thrift/transport/TTransportException.h
+++ b/lib/cpp/src/thrift/transport/TTransportException.h
@@ -20,9 +20,8 @@
#ifndef _THRIFT_TRANSPORT_TTRANSPORTEXCEPTION_H_
#define _THRIFT_TRANSPORT_TTRANSPORTEXCEPTION_H_ 1
+#include <boost/numeric/conversion/cast.hpp>
#include <string>
-
-#include <thrift/numeric_cast.h>
#include <thrift/Thrift.h>
namespace apache {
@@ -93,7 +92,7 @@
*/
template <typename To, typename From> To safe_numeric_cast(From i) {
try {
- return apache::thrift::numeric_cast<To>(i);
+ return boost::numeric_cast<To>(i);
}
catch (const std::bad_cast& bc) {
throw TTransportException(TTransportException::CORRUPTED_DATA,
diff --git a/lib/cpp/test/SecurityFromBufferTest.cpp b/lib/cpp/test/SecurityFromBufferTest.cpp
index 5fba5ee..65ec8b6 100644
--- a/lib/cpp/test/SecurityFromBufferTest.cpp
+++ b/lib/cpp/test/SecurityFromBufferTest.cpp
@@ -199,7 +199,7 @@
try {
// matrix of connection success between client and server with different SSLProtocol selections
static_assert(apache::thrift::transport::LATEST == 5, "Mismatch in assumed number of ssl protocols");
- bool ossl1 = OPENSSL_VERSION_MAJOR == 1;
+ bool ossl1 = (OPENSSL_VERSION_NUMBER < 0x30000000L);
bool matrix[apache::thrift::transport::LATEST + 1][apache::thrift::transport::LATEST + 1] =
{
// server = SSLTLS SSLv2 SSLv3 TLSv1_0 TLSv1_1 TLSv1_2
diff --git a/lib/cpp/test/SecurityTest.cpp b/lib/cpp/test/SecurityTest.cpp
index ab3d99b..06ee8fe 100644
--- a/lib/cpp/test/SecurityTest.cpp
+++ b/lib/cpp/test/SecurityTest.cpp
@@ -221,7 +221,7 @@
{
// matrix of connection success between client and server with different SSLProtocol selections
static_assert(apache::thrift::transport::LATEST == 5, "Mismatch in assumed number of ssl protocols");
- bool ossl1 = OPENSSL_VERSION_MAJOR == 1;
+ bool ossl1 = (OPENSSL_VERSION_NUMBER < 0x30000000L);
bool matrix[apache::thrift::transport::LATEST + 1][apache::thrift::transport::LATEST + 1] =
{
// server = SSLTLS SSLv2 SSLv3 TLSv1_0 TLSv1_1 TLSv1_2
diff --git a/lib/cpp/test/TMemoryBufferTest.cpp b/lib/cpp/test/TMemoryBufferTest.cpp
index 0ae4dc9..2f1aea6 100644
--- a/lib/cpp/test/TMemoryBufferTest.cpp
+++ b/lib/cpp/test/TMemoryBufferTest.cpp
@@ -385,6 +385,14 @@
BOOST_CHECK_THROW(buf.write(&small_buff[0], 1), TTransportException);
}
+BOOST_AUTO_TEST_CASE(test_buffer_overflow)
+{
+ TMemoryBuffer buf;
+ std::vector<uint8_t> small_buff(1);
+ buf.write(&small_buff[0], 1);
+ BOOST_CHECK_THROW(buf.getWritePtr(std::numeric_limits<uint32_t>::max()), TTransportException);
+}
+
BOOST_AUTO_TEST_CASE(test_memory_buffer_to_get_sizeof_objects)
{
// This is a demonstration of how to use TMemoryBuffer to determine
diff --git a/lib/cpp/test/concurrency/Tests.cpp b/lib/cpp/test/concurrency/Tests.cpp
index 8c734c2..45054a9 100644
--- a/lib/cpp/test/concurrency/Tests.cpp
+++ b/lib/cpp/test/concurrency/Tests.cpp
@@ -20,6 +20,7 @@
#include <iostream>
#include <vector>
#include <string>
+#include <chrono>
#include "ThreadFactoryTests.h"
#include "TimerManagerTests.h"
@@ -31,7 +32,7 @@
int main(int argc, char** argv) {
- std::vector<std::string> args(argc - 1 > 1 ? argc - 1 : 1);
+ std::vector<std::string> args((argc - 1) > 1 ? (argc - 1) : 1);
args[0] = "all";
@@ -44,7 +45,7 @@
WEIGHT = 1;
}
- bool runAll = args[0].compare("all") == 0;
+ const bool runAll = args[0].compare("all") == 0;
if (runAll || args[0].compare("thread-factory") == 0) {
@@ -52,10 +53,10 @@
std::cout << "ThreadFactory tests..." << std::endl;
- int reapLoops = 2 * WEIGHT;
- int reapCount = 100 * WEIGHT;
- size_t floodLoops = 3;
- size_t floodCount = 500 * WEIGHT;
+ const int reapLoops = 2 * WEIGHT;
+ const int reapCount = 100 * WEIGHT;
+ const size_t floodLoops = 3;
+ const size_t floodCount = 500 * WEIGHT;
std::cout << "\t\tThreadFactory reap N threads test: N = " << reapLoops << "x" << reapCount << std::endl;
diff --git a/lib/d/src/thrift/base.d b/lib/d/src/thrift/base.d
index dbf1429..e843a5c 100644
--- a/lib/d/src/thrift/base.d
+++ b/lib/d/src/thrift/base.d
@@ -50,7 +50,7 @@
/// The Thrift version string, used for informative purposes.
// Note: This is currently hardcoded, but will likely be filled in by the build
// system in future versions.
-enum VERSION = "0.19.0";
+enum VERSION = "0.20.0";
/**
* Functions used for logging inside Thrift.
diff --git a/lib/dart/pubspec.yaml b/lib/dart/pubspec.yaml
index f16c3ea..7e20548 100644
--- a/lib/dart/pubspec.yaml
+++ b/lib/dart/pubspec.yaml
@@ -16,7 +16,7 @@
# under the License.
name: thrift
-version: 0.19.0
+version: 0.20.0
description: >
A Dart library for Apache Thrift
author: Apache Thrift Developers <dev@thrift.apache.org>
diff --git a/lib/delphi/src/Thrift.pas b/lib/delphi/src/Thrift.pas
index b725ebc..6696a19 100644
--- a/lib/delphi/src/Thrift.pas
+++ b/lib/delphi/src/Thrift.pas
@@ -28,7 +28,7 @@
Thrift.Protocol;
const
- Version = '0.19.0';
+ Version = '0.20.0';
type
TException = Thrift.Exception.TException; // compatibility alias
diff --git a/lib/erl/include/thrift_constants.hrl b/lib/erl/include/thrift_constants.hrl
index 7cb29eb..4096854 100644
--- a/lib/erl/include/thrift_constants.hrl
+++ b/lib/erl/include/thrift_constants.hrl
@@ -41,10 +41,16 @@
% TApplicationException
-define(TApplicationException_Structure,
- {struct, [{1, string},
- {2, i32}]}).
+ {struct, [
+ {1, string},
+ {2, i32}
+ ]}
+).
--record('TApplicationException', {message, type}).
+-record('TApplicationException', {
+ message :: string(),
+ type :: integer()
+}).
-define(TApplicationException_UNKNOWN, 0).
-define(TApplicationException_UNKNOWN_METHOD, 1).
@@ -58,5 +64,5 @@
-define(TApplicationException_INVALID_PROTOCOL, 9).
-define(TApplicationException_UNSUPPORTED_CLIENT_TYPE, 10).
--define (MULTIPLEXED_SERVICE_SEPARATOR, ":").
--define (MULTIPLEXED_ERROR_HANDLER_KEY, "error_handler").
+-define(MULTIPLEXED_SERVICE_SEPARATOR, ":").
+-define(MULTIPLEXED_ERROR_HANDLER_KEY, "error_handler").
diff --git a/lib/erl/include/thrift_protocol.hrl b/lib/erl/include/thrift_protocol.hrl
index bc0acc8..f477423 100644
--- a/lib/erl/include/thrift_protocol.hrl
+++ b/lib/erl/include/thrift_protocol.hrl
@@ -21,46 +21,47 @@
-define(THRIFT_PROTOCOL_INCLUDED, true).
-record(protocol_message_begin, {name :: string(), type :: integer(), seqid :: integer()}).
--record(protocol_struct_begin, {name :: string()}).
--record(protocol_field_begin, {name :: string(), type :: integer(), id :: integer()}).
+-record(protocol_struct_begin, {name :: undefined | string()}).
+-record(protocol_field_begin, {
+ name :: undefined | string(), type :: integer(), id :: undefined | integer()
+}).
-record(protocol_map_begin, {ktype :: integer(), vtype :: integer(), size :: integer()}).
-record(protocol_list_begin, {etype :: integer(), size :: integer()}).
-record(protocol_set_begin, {etype :: integer(), size :: integer()}).
--type tprot_header_val() :: #protocol_message_begin{}
- | #protocol_struct_begin{}
- | #protocol_field_begin{}
- | #protocol_map_begin{}
- | #protocol_list_begin{}
- | #protocol_set_begin{}
- .
--type tprot_empty_tag() :: message_end
- | struct_begin
- | struct_end
- | field_end
- | map_end
- | list_end
- | set_end
- .
--type tprot_header_tag() :: message_begin
- | field_begin
- | map_begin
- | list_begin
- | set_begin
- .
--type tprot_data_tag() :: ui32
- | bool
- | byte
- | i16
- | i32
- | i64
- | double
- | string
- .
--type tprot_cont_tag() :: {list, _Type}
- | {map, _KType, _VType}
- | {set, _Type}
- .
-
+-type tprot_header_val() ::
+ #protocol_message_begin{}
+ | #protocol_struct_begin{}
+ | #protocol_field_begin{}
+ | #protocol_map_begin{}
+ | #protocol_list_begin{}
+ | #protocol_set_begin{}.
+-type tprot_empty_tag() ::
+ message_end
+ | struct_begin
+ | struct_end
+ | field_end
+ | map_end
+ | list_end
+ | set_end.
+-type tprot_header_tag() ::
+ message_begin
+ | field_begin
+ | map_begin
+ | list_begin
+ | set_begin.
+-type tprot_data_tag() ::
+ ui32
+ | bool
+ | byte
+ | i16
+ | i32
+ | i64
+ | double
+ | string.
+-type tprot_cont_tag() ::
+ {list, _Type}
+ | {map, _KType, _VType}
+ | {set, _Type}.
-endif.
diff --git a/lib/erl/include/thrift_protocol_behaviour.hrl b/lib/erl/include/thrift_protocol_behaviour.hrl
deleted file mode 100644
index abe300b..0000000
--- a/lib/erl/include/thrift_protocol_behaviour.hrl
+++ /dev/null
@@ -1,37 +0,0 @@
-%%
-%% Licensed to the Apache Software Foundation (ASF) under one
-%% or more contributor license agreements. See the NOTICE file
-%% distributed with this work for additional information
-%% regarding copyright ownership. The ASF licenses this file
-%% to you under the Apache License, Version 2.0 (the
-%% "License"); you may not use this file except in compliance
-%% with the License. You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing,
-%% software distributed under the License is distributed on an
-%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-%% KIND, either express or implied. See the License for the
-%% specific language governing permissions and limitations
-%% under the License.
-%%
-
-%% Signature specifications for protocol implementations.
-
--ifndef(THRIFT_PROTOCOL_BEHAVIOUR_INCLUDED).
--define(THRIFT_PROTOCOL_BEHAVIOUR_INCLUDED, true).
-
--spec flush_transport(state()) -> {state(), ok | {error, _Reason}}.
--spec close_transport(state()) -> {state(), ok | {error, _Reason}}.
-
--spec write(state(), any()) -> {state(), ok | {error, _Reason}}.
-
-%% NOTE: Keep this in sync with thrift_protocol:read and read_specific.
--spec read
- (state(), tprot_empty_tag()) -> {state(), ok | {error, _Reason}};
- (state(), tprot_header_tag()) -> {state(), tprot_header_val() | {error, _Reason}};
- (state(), tprot_data_tag()) -> {state(), {ok, any()} | {error, _Reason}}.
-
-
--endif.
diff --git a/lib/erl/include/thrift_transport_behaviour.hrl b/lib/erl/include/thrift_transport_behaviour.hrl
deleted file mode 100644
index dbc05aa..0000000
--- a/lib/erl/include/thrift_transport_behaviour.hrl
+++ /dev/null
@@ -1,31 +0,0 @@
-%%
-%% Licensed to the Apache Software Foundation (ASF) under one
-%% or more contributor license agreements. See the NOTICE file
-%% distributed with this work for additional information
-%% regarding copyright ownership. The ASF licenses this file
-%% to you under the Apache License, Version 2.0 (the
-%% "License"); you may not use this file except in compliance
-%% with the License. You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing,
-%% software distributed under the License is distributed on an
-%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-%% KIND, either express or implied. See the License for the
-%% specific language governing permissions and limitations
-%% under the License.
-%%
-
-%% Signature specifications for transport implementations.
-
--ifndef(THRIFT_TRANSPORT_BEHAVIOUR_INCLUDED).
--define(THRIFT_TRANSPORT_BEHAVIOUR_INCLUDED, true).
-
--spec write(state(), iolist() | binary()) -> {state(), ok | {error, _Reason}}.
--spec read(state(), non_neg_integer()) -> {state(), {ok, binary()} | {error, _Reason}}.
--spec flush(state()) -> {state(), ok | {error, _Reason}}.
--spec close(state()) -> {state(), ok | {error, _Reason}}.
-
-
--endif.
diff --git a/lib/erl/rebar.config b/lib/erl/rebar.config
index b5258a2..c3149b4 100644
--- a/lib/erl/rebar.config
+++ b/lib/erl/rebar.config
@@ -1,8 +1,55 @@
-{erl_opts, [debug_info]}.
+%% Common project erlang options.
+{erl_opts, [
+
+ % mandatory
+ debug_info,
+ warn_export_all,
+ warn_untyped_record,
+ warn_export_vars,
+
+ % by default
+ warn_unused_record,
+ warn_bif_clash,
+ warn_obsolete_guard,
+ warn_unused_vars,
+ warn_shadow_vars,
+ warn_unused_import,
+ warn_unused_function,
+ warn_deprecated_function
+]}.
+
+%% XRef checks
+{xref_checks, [
+ deprecated_functions_calls,
+ deprecated_functions
+]}.
+
+%% Dialyzer static analyzing
+{dialyzer, [
+ {warnings, [
+ % mandatory
+ unmatched_returns,
+ error_handling,
+ unknown
+ % hardcore mode
+ % overspecs,
+ % underspecs
+ ]},
+ {plt_extra_apps, [ssl, inets, public_key]}
+]}.
+
+{plugins, [
+ {erlfmt, "1.1.0"}
+]}.
+
+{erlfmt, [
+ {print_width, 100},
+ {files, "{src,include,test}/*.{hrl,erl,app.src}"}
+]}.
{profiles, [
{test, [
- {deps, [meck]},
+ {deps, [{meck, "0.9.2"}]},
{eunit_tests, [
{dir, "test"},
{dir, "test/gen-erl"}
diff --git a/lib/erl/src/thrift.app.src b/lib/erl/src/thrift.app.src
index c681a2f..0e25b67 100644
--- a/lib/erl/src/thrift.app.src
+++ b/lib/erl/src/thrift.app.src
@@ -18,57 +18,34 @@
%%
%%% -*- mode:erlang -*-
{application, thrift, [
- % A quick description of the application.
- {description, "Thrift bindings"},
+ % A quick description of the application.
+ {description, "Thrift bindings"},
% The version of the applicaton
- {vsn, "0.19.0"},
+ {vsn, "0.20.0"},
- % All modules used by the application.
- {modules, [
- thrift_base64_transport,
- thrift_binary_protocol,
- thrift_buffered_transport,
- thrift_client_util,
- thrift_client,
- thrift_disk_log_transport,
- thrift_file_transport,
- thrift_framed_transport,
- thrift_http_transport,
- thrift_json_parser,
- thrift_json_protocol,
- thrift_membuffer_transport,
- thrift_memory_buffer,
- thrift_processor,
- thrift_protocol,
- thrift_reconnecting_client,
- thrift_server,
- thrift_service,
- thrift_socket_server,
- thrift_socket_transport,
- thrift_transport_state_test,
- thrift_transport
- ]},
+ % All modules used by the application.
+ {modules, []},
- % All of the registered names the application uses. This can be ignored.
- {registered, []},
+ % All of the registered names the application uses. This can be ignored.
+ {registered, []},
- % Applications that are to be started prior to this one. This can be ignored
- % leave it alone unless you understand it well and let the .rel files in
- % your release handle this.
- {applications, [kernel, stdlib]},
+ % Applications that are to be started prior to this one. This can be ignored
+ % leave it alone unless you understand it well and let the .rel files in
+ % your release handle this.
+ {applications, [kernel, stdlib]},
- % OTP application loader will load, but not start, included apps. Again
- % this can be ignored as well. To load but not start an application it
- % is easier to include it in the .rel file followed by the atom 'none'
- {included_applications, []},
+ % OTP application loader will load, but not start, included apps. Again
+ % this can be ignored as well. To load but not start an application it
+ % is easier to include it in the .rel file followed by the atom 'none'
+ {included_applications, []},
- % configuration parameters similar to those in the config file specified
- % on the command line. can be fetched with gas:get_env
- {env, [
- % If an error/crash occurs during processing of a function,
- % should the TApplicationException serialized back to the client
- % include the erlang backtrace?
- {exceptions_include_traces, true}
- ]}
+ % configuration parameters similar to those in the config file specified
+ % on the command line. can be fetched with gas:get_env
+ {env, [
+ % If an error/crash occurs during processing of a function,
+ % should the TApplicationException serialized back to the client
+ % include the erlang backtrace?
+ {exceptions_include_traces, true}
+ ]}
]}.
diff --git a/lib/erl/src/thrift_base64_transport.erl b/lib/erl/src/thrift_base64_transport.erl
index d31f2ba..9aa629f 100644
--- a/lib/erl/src/thrift_base64_transport.erl
+++ b/lib/erl/src/thrift_base64_transport.erl
@@ -28,42 +28,37 @@
-export([write/2, read/2, flush/1, close/1]).
%% State
--record(b64_transport, {wrapped}).
--type state() :: #b64_transport{}.
--include("thrift_transport_behaviour.hrl").
+-record(b64_transport, {
+ wrapped :: thrift_transport:t_transport()
+}).
new(Wrapped) ->
State = #b64_transport{wrapped = Wrapped},
thrift_transport:new(?MODULE, State).
-
write(This = #b64_transport{wrapped = Wrapped}, Data) ->
{NewWrapped, Result} = thrift_transport:write(Wrapped, base64:encode(iolist_to_binary(Data))),
{This#b64_transport{wrapped = NewWrapped}, Result}.
-
%% base64 doesn't support reading quite yet since it would involve
%% nasty buffering and such
read(This = #b64_transport{}, _Data) ->
{This, {error, no_reads_allowed}}.
-
flush(This = #b64_transport{wrapped = Wrapped0}) ->
{Wrapped1, ok} = thrift_transport:write(Wrapped0, <<"\n">>),
{Wrapped2, ok} = thrift_transport:flush(Wrapped1),
{This#b64_transport{wrapped = Wrapped2}, ok}.
-
close(This0) ->
{This1 = #b64_transport{wrapped = Wrapped}, ok} = flush(This0),
{NewWrapped, ok} = thrift_transport:close(Wrapped),
{This1#b64_transport{wrapped = NewWrapped}, ok}.
-
%%%% FACTORY GENERATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
new_transport_factory(WrapFactory) ->
F = fun() ->
- {ok, Wrapped} = WrapFactory(),
- new(Wrapped)
- end,
+ {ok, Wrapped} = WrapFactory(),
+ new(Wrapped)
+ end,
{ok, F}.
diff --git a/lib/erl/src/thrift_binary_protocol.erl b/lib/erl/src/thrift_binary_protocol.erl
index 85abb62..d2c89d3 100644
--- a/lib/erl/src/thrift_binary_protocol.erl
+++ b/lib/erl/src/thrift_binary_protocol.erl
@@ -24,21 +24,21 @@
-include("thrift_constants.hrl").
-include("thrift_protocol.hrl").
--export([new/1, new/2,
- read/2,
- write/2,
- flush_transport/1,
- close_transport/1,
+-export([
+ new/1, new/2,
+ read/2,
+ write/2,
+ flush_transport/1,
+ close_transport/1,
- new_protocol_factory/2
- ]).
+ new_protocol_factory/2
+]).
--record(binary_protocol, {transport,
- strict_read=true,
- strict_write=true
- }).
--type state() :: #binary_protocol{}.
--include("thrift_protocol_behaviour.hrl").
+-record(binary_protocol, {
+ transport :: term(),
+ strict_read = true :: boolean(),
+ strict_write = true :: boolean()
+}).
-define(VERSION_MASK, 16#FFFF0000).
-define(VERSION_1, 16#80010000).
@@ -48,17 +48,16 @@
new(Transport, _Options = []).
new(Transport, Options) ->
- State = #binary_protocol{transport = Transport},
+ State = #binary_protocol{transport = Transport},
State1 = parse_options(Options, State),
thrift_protocol:new(?MODULE, State1).
parse_options([], State) ->
State;
parse_options([{strict_read, Bool} | Rest], State) when is_boolean(Bool) ->
- parse_options(Rest, State#binary_protocol{strict_read=Bool});
+ parse_options(Rest, State#binary_protocol{strict_read = Bool});
parse_options([{strict_write, Bool} | Rest], State) when is_boolean(Bool) ->
- parse_options(Rest, State#binary_protocol{strict_write=Bool}).
-
+ parse_options(Rest, State#binary_protocol{strict_write = Bool}).
flush_transport(This = #binary_protocol{transport = Transport}) ->
{NewTransport, Result} = thrift_transport:flush(Transport),
@@ -73,9 +72,10 @@
%%%
write(This0, #protocol_message_begin{
- name = Name,
- type = Type,
- seqid = Seqid}) ->
+ name = Name,
+ type = Type,
+ seqid = Seqid
+}) ->
case This0#binary_protocol.strict_write of
true ->
{This1, ok} = write(This0, {i32, ?VERSION_1 bor Type}),
@@ -88,82 +88,75 @@
{This3, ok} = write(This2, {i32, Seqid}),
{This3, ok}
end;
-
-write(This, message_end) -> {This, ok};
-
+write(This, message_end) ->
+ {This, ok};
write(This0, #protocol_field_begin{
- name = _Name,
- type = Type,
- id = Id}) ->
+ name = _Name,
+ type = Type,
+ id = Id
+}) ->
{This1, ok} = write(This0, {byte, Type}),
{This2, ok} = write(This1, {i16, Id}),
{This2, ok};
-
write(This, field_stop) ->
write(This, {byte, ?tType_STOP});
-
-write(This, field_end) -> {This, ok};
-
+write(This, field_end) ->
+ {This, ok};
write(This0, #protocol_map_begin{
- ktype = Ktype,
- vtype = Vtype,
- size = Size}) ->
+ ktype = Ktype,
+ vtype = Vtype,
+ size = Size
+}) ->
{This1, ok} = write(This0, {byte, Ktype}),
{This2, ok} = write(This1, {byte, Vtype}),
{This3, ok} = write(This2, {i32, Size}),
{This3, ok};
-
-write(This, map_end) -> {This, ok};
-
+write(This, map_end) ->
+ {This, ok};
write(This0, #protocol_list_begin{
- etype = Etype,
- size = Size}) ->
+ etype = Etype,
+ size = Size
+}) ->
{This1, ok} = write(This0, {byte, Etype}),
{This2, ok} = write(This1, {i32, Size}),
{This2, ok};
-
-write(This, list_end) -> {This, ok};
-
+write(This, list_end) ->
+ {This, ok};
write(This0, #protocol_set_begin{
- etype = Etype,
- size = Size}) ->
+ etype = Etype,
+ size = Size
+}) ->
{This1, ok} = write(This0, {byte, Etype}),
{This2, ok} = write(This1, {i32, Size}),
{This2, ok};
-
-write(This, set_end) -> {This, ok};
-
-write(This, #protocol_struct_begin{}) -> {This, ok};
-write(This, struct_end) -> {This, ok};
-
-write(This, {bool, true}) -> write(This, {byte, 1});
-write(This, {bool, false}) -> write(This, {byte, 0});
-
+write(This, set_end) ->
+ {This, ok};
+write(This, #protocol_struct_begin{}) ->
+ {This, ok};
+write(This, struct_end) ->
+ {This, ok};
+write(This, {bool, true}) ->
+ write(This, {byte, 1});
+write(This, {bool, false}) ->
+ write(This, {byte, 0});
write(This, {byte, Byte}) ->
write(This, <<Byte:8/big-signed>>);
-
write(This, {i16, I16}) ->
write(This, <<I16:16/big-signed>>);
-
write(This, {i32, I32}) ->
write(This, <<I32:32/big-signed>>);
-
write(This, {i64, I64}) ->
write(This, <<I64:64/big-signed>>);
-
write(This, {double, Double}) ->
write(This, <<Double:64/big-signed-float>>);
-
write(This0, {string, Str}) when is_list(Str) ->
{This1, ok} = write(This0, {i32, length(Str)}),
{This2, ok} = write(This1, list_to_binary(Str)),
{This2, ok};
-
write(This0, {string, Bin}) when is_binary(Bin) ->
{This1, ok} = write(This0, {i32, size(Bin)}),
{This2, ok} = write(This1, Bin),
{This2, ok};
-
%% Data :: iolist()
write(This = #binary_protocol{transport = Trans}, Data) ->
{NewTransport, Result} = thrift_transport:write(Trans, Data),
@@ -176,39 +169,39 @@
case Initial of
{ok, Sz} when Sz band ?VERSION_MASK =:= ?VERSION_1 ->
%% we're at version 1
- {This2, {ok, Name}} = read(This1, string),
+ {This2, {ok, Name}} = read(This1, string),
{This3, {ok, SeqId}} = read(This2, i32),
- Type = Sz band ?TYPE_MASK,
- {This3, #protocol_message_begin{name = binary_to_list(Name),
- type = Type,
- seqid = SeqId}};
-
+ Type = Sz band ?TYPE_MASK,
+ {This3, #protocol_message_begin{
+ name = binary_to_list(Name),
+ type = Type,
+ seqid = SeqId
+ }};
{ok, Sz} when Sz < 0 ->
%% there's a version number but it's unexpected
{This1, {error, {bad_binary_protocol_version, Sz}}};
-
{ok, _Sz} when This1#binary_protocol.strict_read =:= true ->
%% strict_read is true and there's no version header; that's an error
{This1, {error, no_binary_protocol_version}};
-
{ok, Sz} when This1#binary_protocol.strict_read =:= false ->
%% strict_read is false, so just read the old way
- {This2, {ok, Name}} = read_data(This1, Sz),
- {This3, {ok, Type}} = read(This2, byte),
+ {This2, {ok, Name}} = read_data(This1, Sz),
+ {This3, {ok, Type}} = read(This2, byte),
{This4, {ok, SeqId}} = read(This3, i32),
- {This4, #protocol_message_begin{name = binary_to_list(Name),
- type = Type,
- seqid = SeqId}};
-
+ {This4, #protocol_message_begin{
+ name = binary_to_list(Name),
+ type = Type,
+ seqid = SeqId
+ }};
Else ->
{This1, Else}
end;
-
-read(This, message_end) -> {This, ok};
-
-read(This, struct_begin) -> {This, ok};
-read(This, struct_end) -> {This, ok};
-
+read(This, message_end) ->
+ {This, ok};
+read(This, struct_begin) ->
+ {This, ok};
+read(This, struct_end) ->
+ {This, ok};
read(This0, field_begin) ->
{This1, Result} = read(This0, byte),
case Result of
@@ -216,39 +209,45 @@
{This1, #protocol_field_begin{type = Type}};
{ok, Type} ->
{This2, {ok, Id}} = read(This1, i16),
- {This2, #protocol_field_begin{type = Type,
- id = Id}}
+ {This2, #protocol_field_begin{
+ type = Type,
+ id = Id
+ }}
end;
-
-read(This, field_end) -> {This, ok};
-
+read(This, field_end) ->
+ {This, ok};
read(This0, map_begin) ->
{This1, {ok, Ktype}} = read(This0, byte),
{This2, {ok, Vtype}} = read(This1, byte),
- {This3, {ok, Size}} = read(This2, i32),
- {This3, #protocol_map_begin{ktype = Ktype,
- vtype = Vtype,
- size = Size}};
-read(This, map_end) -> {This, ok};
-
+ {This3, {ok, Size}} = read(This2, i32),
+ {This3, #protocol_map_begin{
+ ktype = Ktype,
+ vtype = Vtype,
+ size = Size
+ }};
+read(This, map_end) ->
+ {This, ok};
read(This0, list_begin) ->
{This1, {ok, Etype}} = read(This0, byte),
- {This2, {ok, Size}} = read(This1, i32),
- {This2, #protocol_list_begin{etype = Etype,
- size = Size}};
-read(This, list_end) -> {This, ok};
-
+ {This2, {ok, Size}} = read(This1, i32),
+ {This2, #protocol_list_begin{
+ etype = Etype,
+ size = Size
+ }};
+read(This, list_end) ->
+ {This, ok};
read(This0, set_begin) ->
{This1, {ok, Etype}} = read(This0, byte),
- {This2, {ok, Size}} = read(This1, i32),
- {This2, #protocol_set_begin{etype = Etype,
- size = Size}};
-read(This, set_end) -> {This, ok};
-
+ {This2, {ok, Size}} = read(This1, i32),
+ {This2, #protocol_set_begin{
+ etype = Etype,
+ size = Size
+ }};
+read(This, set_end) ->
+ {This, ok};
read(This0, field_stop) ->
{This1, {ok, ?tType_STOP}} = read(This0, byte),
{This1, ok};
-
%%
read(This0, bool) ->
@@ -257,28 +256,24 @@
{ok, Byte} -> {This1, {ok, Byte /= 0}};
Else -> {This1, Else}
end;
-
read(This0, byte) ->
{This1, Bytes} = read_data(This0, 1),
case Bytes of
{ok, <<Val:8/integer-signed-big, _/binary>>} -> {This1, {ok, Val}};
Else -> {This1, Else}
end;
-
read(This0, i16) ->
{This1, Bytes} = read_data(This0, 2),
case Bytes of
{ok, <<Val:16/integer-signed-big, _/binary>>} -> {This1, {ok, Val}};
Else -> {This1, Else}
end;
-
read(This0, i32) ->
{This1, Bytes} = read_data(This0, 4),
case Bytes of
{ok, <<Val:32/integer-signed-big, _/binary>>} -> {This1, {ok, Val}};
Else -> {This1, Else}
end;
-
%% unsigned ints aren't used by thrift itself, but it's used for the parsing
%% of the packet version header. Without this special function BEAM works fine
%% but hipe thinks it received a bad version header.
@@ -288,60 +283,60 @@
{ok, <<Val:32/integer-unsigned-big, _/binary>>} -> {This1, {ok, Val}};
Else -> {This1, Else}
end;
-
read(This0, i64) ->
{This1, Bytes} = read_data(This0, 8),
case Bytes of
{ok, <<Val:64/integer-signed-big, _/binary>>} -> {This1, {ok, Val}};
Else -> {This1, Else}
end;
-
read(This0, double) ->
{This1, Bytes} = read_data(This0, 8),
case Bytes of
{ok, <<Val:64/float-signed-big, _/binary>>} -> {This1, {ok, Val}};
Else -> {This1, Else}
end;
-
% returns a binary directly, call binary_to_list if necessary
read(This0, string) ->
- {This1, {ok, Sz}} = read(This0, i32),
+ {This1, {ok, Sz}} = read(This0, i32),
read_data(This1, Sz).
-spec read_data(#binary_protocol{}, non_neg_integer()) ->
{#binary_protocol{}, {ok, binary()} | {error, _Reason}}.
-read_data(This, 0) -> {This, {ok, <<>>}};
+read_data(This, 0) ->
+ {This, {ok, <<>>}};
read_data(This = #binary_protocol{transport = Trans}, Len) when is_integer(Len) andalso Len > 0 ->
{NewTransport, Result} = thrift_transport:read(Trans, Len),
{This#binary_protocol{transport = NewTransport}, Result}.
-
%%%% FACTORY GENERATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--record(tbp_opts, {strict_read = true,
- strict_write = true}).
+-record(tbp_opts, {
+ strict_read = true :: boolean(),
+ strict_write = true :: boolean()
+}).
parse_factory_options([], Opts) ->
Opts;
parse_factory_options([{strict_read, Bool} | Rest], Opts) when is_boolean(Bool) ->
- parse_factory_options(Rest, Opts#tbp_opts{strict_read=Bool});
+ parse_factory_options(Rest, Opts#tbp_opts{strict_read = Bool});
parse_factory_options([{strict_write, Bool} | Rest], Opts) when is_boolean(Bool) ->
- parse_factory_options(Rest, Opts#tbp_opts{strict_write=Bool}).
-
+ parse_factory_options(Rest, Opts#tbp_opts{strict_write = Bool}).
%% returns a (fun() -> thrift_protocol())
new_protocol_factory(TransportFactory, Options) ->
ParsedOpts = parse_factory_options(Options, #tbp_opts{}),
F = fun() ->
- case TransportFactory() of
- {ok, Transport} ->
- thrift_binary_protocol:new(
- Transport,
- [{strict_read, ParsedOpts#tbp_opts.strict_read},
- {strict_write, ParsedOpts#tbp_opts.strict_write}]);
- {error, Error} ->
- {error, Error}
- end
- end,
+ case TransportFactory() of
+ {ok, Transport} ->
+ thrift_binary_protocol:new(
+ Transport,
+ [
+ {strict_read, ParsedOpts#tbp_opts.strict_read},
+ {strict_write, ParsedOpts#tbp_opts.strict_write}
+ ]
+ );
+ {error, Error} ->
+ {error, Error}
+ end
+ end,
{ok, F}.
-
diff --git a/lib/erl/src/thrift_buffered_transport.erl b/lib/erl/src/thrift_buffered_transport.erl
index e9d3fff..423e89a 100644
--- a/lib/erl/src/thrift_buffered_transport.erl
+++ b/lib/erl/src/thrift_buffered_transport.erl
@@ -28,71 +28,59 @@
%% legacy api
-export([new_transport_factory/1]).
-
-record(t_buffered, {
- wrapped,
- write_buffer
+ wrapped :: thrift_transport:t_transport(),
+ write_buffer :: iodata()
}).
--type state() :: #t_buffered{}.
-
-
--spec new(Transport::thrift_transport:t_transport()) ->
- thrift_transport:t_transport().
+-spec new(Transport :: thrift_transport:t_transport()) -> {ok, thrift_transport:t_transport()}.
new(Wrapped) ->
- State = #t_buffered{
- wrapped = Wrapped,
- write_buffer = []
- },
- thrift_transport:new(?MODULE, State).
-
-
--include("thrift_transport_behaviour.hrl").
-
+ State = #t_buffered{
+ wrapped = Wrapped,
+ write_buffer = []
+ },
+ thrift_transport:new(?MODULE, State).
%% reads data through from the wrapped transport
-read(State = #t_buffered{wrapped = Wrapped}, Len)
-when is_integer(Len), Len >= 0 ->
- {NewState, Response} = thrift_transport:read(Wrapped, Len),
- {State#t_buffered{wrapped = NewState}, Response}.
-
+read(State = #t_buffered{wrapped = Wrapped}, Len) when
+ is_integer(Len), Len >= 0
+->
+ {NewState, Response} = thrift_transport:read(Wrapped, Len),
+ {State#t_buffered{wrapped = NewState}, Response}.
%% reads data through from the wrapped transport
-read_exact(State = #t_buffered{wrapped = Wrapped}, Len)
-when is_integer(Len), Len >= 0 ->
- {NewState, Response} = thrift_transport:read_exact(Wrapped, Len),
- {State#t_buffered{wrapped = NewState}, Response}.
-
+read_exact(State = #t_buffered{wrapped = Wrapped}, Len) when
+ is_integer(Len), Len >= 0
+->
+ {NewState, Response} = thrift_transport:read_exact(Wrapped, Len),
+ {State#t_buffered{wrapped = NewState}, Response}.
write(State = #t_buffered{write_buffer = Buffer}, Data) ->
- {State#t_buffered{write_buffer = [Buffer, Data]}, ok}.
-
+ {State#t_buffered{write_buffer = [Buffer, Data]}, ok}.
flush(State = #t_buffered{wrapped = Wrapped, write_buffer = Buffer}) ->
- case iolist_size(Buffer) of
- %% if write buffer is empty, do nothing
- 0 -> {State, ok};
- _ ->
- {Written, Response} = thrift_transport:write(Wrapped, Buffer),
- {Flushed, ok} = thrift_transport:flush(Written),
- {State#t_buffered{wrapped = Flushed, write_buffer = []}, Response}
- end.
-
+ case iolist_size(Buffer) of
+ %% if write buffer is empty, do nothing
+ 0 ->
+ {State, ok};
+ _ ->
+ {Written, Response} = thrift_transport:write(Wrapped, Buffer),
+ {Flushed, ok} = thrift_transport:flush(Written),
+ {State#t_buffered{wrapped = Flushed, write_buffer = []}, Response}
+ end.
close(State = #t_buffered{wrapped = Wrapped}) ->
- {Closed, Result} = thrift_transport:close(Wrapped),
- {State#t_buffered{wrapped = Closed}, Result}.
-
+ {Closed, Result} = thrift_transport:close(Wrapped),
+ {State#t_buffered{wrapped = Closed}, Result}.
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
%%%% FACTORY GENERATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
new_transport_factory(WrapFactory) ->
- F = fun() ->
- {ok, Wrapped} = WrapFactory(),
- new(Wrapped)
- end,
- {ok, F}.
-
+ F = fun() ->
+ {ok, Wrapped} = WrapFactory(),
+ new(Wrapped)
+ end,
+ {ok, F}.
diff --git a/lib/erl/src/thrift_client.erl b/lib/erl/src/thrift_client.erl
index 1a9cb50..1c27405 100644
--- a/lib/erl/src/thrift_client.erl
+++ b/lib/erl/src/thrift_client.erl
@@ -25,78 +25,91 @@
-include("thrift_constants.hrl").
-include("thrift_protocol.hrl").
--record(tclient, {service, protocol, seqid}).
+-record(tclient, {
+ service :: module(),
+ protocol :: thrift_protocol:state(),
+ seqid :: non_neg_integer()
+}).
+-type tclient() :: #tclient{}.
-
-new(Protocol, Service)
- when is_atom(Service) ->
- {ok, #tclient{protocol = Protocol,
- service = Service,
- seqid = 0}}.
+new(Protocol, Service) when
+ is_atom(Service)
+->
+ {ok, #tclient{
+ protocol = Protocol,
+ service = Service,
+ seqid = 0
+ }}.
-spec call(#tclient{}, atom(), list()) -> {#tclient{}, {ok, any()} | {error, any()}}.
-call(Client = #tclient{}, Function, Args)
-when is_atom(Function), is_list(Args) ->
- case send_function_call(Client, Function, Args) of
- {ok, Client1} -> receive_function_result(Client1, Function);
- {{error, X}, Client1} -> {Client1, {error, X}};
- Else -> Else
- end.
-
+call(Client = #tclient{}, Function, Args) when
+ is_atom(Function), is_list(Args)
+->
+ case send_function_call(Client, Function, Args) of
+ {ok, Client1} -> receive_function_result(Client1, Function);
+ {{error, X}, Client1} -> {Client1, {error, X}}
+ end.
%% Sends a function call but does not read the result. This is useful
%% if you're trying to log non-oneway function calls to write-only
%% transports like thrift_disk_log_transport.
-spec send_call(#tclient{}, atom(), list()) -> {#tclient{}, ok}.
-send_call(Client = #tclient{}, Function, Args)
- when is_atom(Function), is_list(Args) ->
+send_call(Client = #tclient{}, Function, Args) when
+ is_atom(Function), is_list(Args)
+->
case send_function_call(Client, Function, Args) of
- {ok, Client1} -> {Client1, ok};
- Else -> Else
+ {ok, Client1} -> {Client1, ok};
+ Else -> Else
end.
-spec close(#tclient{}) -> ok.
-close(#tclient{protocol=Protocol}) ->
+close(#tclient{protocol = Protocol}) ->
thrift_protocol:close_transport(Protocol).
-
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
-spec send_function_call(#tclient{}, atom(), list()) -> {ok | {error, any()}, #tclient{}}.
send_function_call(Client = #tclient{service = Service}, Function, Args) ->
- {Params, Reply} = try
- {Service:function_info(Function, params_type), Service:function_info(Function, reply_type)}
- catch error:function_clause -> {no_function, 0}
- end,
- MsgType = case Reply of
- oneway_void -> ?tMessageType_ONEWAY;
- _ -> ?tMessageType_CALL
- end,
- case Params of
- no_function ->
- {{error, {no_function, Function}}, Client};
- {struct, PList} when length(PList) =/= length(Args) ->
- {{error, {bad_args, Function, Args}}, Client};
- {struct, _PList} -> write_message(Client, Function, Args, Params, MsgType)
- end.
+ {Params, Reply} =
+ try
+ {
+ Service:function_info(Function, params_type),
+ Service:function_info(Function, reply_type)
+ }
+ catch
+ error:function_clause -> {no_function, 0}
+ end,
+ MsgType =
+ case Reply of
+ oneway_void -> ?tMessageType_ONEWAY;
+ _ -> ?tMessageType_CALL
+ end,
+ case Params of
+ no_function ->
+ {{error, {no_function, Function}}, Client};
+ {struct, PList} when length(PList) =/= length(Args) ->
+ {{error, {bad_args, Function, Args}}, Client};
+ {struct, _PList} ->
+ write_message(Client, Function, Args, Params, MsgType)
+ end.
-spec write_message(#tclient{}, atom(), list(), {struct, list()}, integer()) ->
- {ok | {error, any()}, #tclient{}}.
+ {ok | {error, any()}, #tclient{}}.
write_message(Client = #tclient{protocol = P0, seqid = Seq}, Function, Args, Params, MsgType) ->
- try
- {P1, ok} = thrift_protocol:write(P0, #protocol_message_begin{
- name = atom_to_list(Function),
- type = MsgType,
- seqid = Seq
- }),
- {P2, ok} = thrift_protocol:write(P1, {Params, list_to_tuple([Function|Args])}),
- {P3, ok} = thrift_protocol:write(P2, message_end),
- {P4, ok} = thrift_protocol:flush_transport(P3),
- {ok, Client#tclient{protocol = P4}}
- catch
- error:{badmatch, {_, {error, _} = Error}} -> {Error, Client}
- end.
+ try
+ {P1, ok} = thrift_protocol:write(P0, #protocol_message_begin{
+ name = atom_to_list(Function),
+ type = MsgType,
+ seqid = Seq
+ }),
+ {P2, ok} = thrift_protocol:write(P1, {Params, list_to_tuple([Function | Args])}),
+ {P3, ok} = thrift_protocol:write(P2, message_end),
+ {P4, ok} = thrift_protocol:flush_transport(P3),
+ {ok, Client#tclient{protocol = P4}}
+ catch
+ error:{badmatch, {_, {error, _} = Error}} -> {Error, Client}
+ end.
-spec receive_function_result(#tclient{}, atom()) -> {#tclient{}, {ok, any()} | {error, any()}}.
receive_function_result(Client = #tclient{service = Service}, Function) ->
@@ -105,32 +118,38 @@
read_result(Client, _Function, oneway_void) ->
{Client, {ok, ok}};
-
-read_result(Client = #tclient{protocol = Proto0,
- seqid = SeqId},
- Function,
- ReplyType) ->
+read_result(
+ Client = #tclient{
+ protocol = Proto0,
+ seqid = SeqId
+ },
+ Function,
+ ReplyType
+) ->
case thrift_protocol:read(Proto0, message_begin) of
- {Proto1, {error, Reason}} ->
- NewClient = Client#tclient{protocol = Proto1},
- {NewClient, {error, Reason}};
- {Proto1, MessageBegin} ->
- NewClient = Client#tclient{protocol = Proto1},
- case MessageBegin of
- #protocol_message_begin{seqid = RetSeqId} when RetSeqId =/= SeqId ->
- {NewClient, {error, {bad_seq_id, SeqId}}};
- #protocol_message_begin{type = ?tMessageType_EXCEPTION} ->
- handle_application_exception(NewClient);
- #protocol_message_begin{type = ?tMessageType_REPLY} ->
- handle_reply(NewClient, Function, ReplyType)
- end
+ {Proto1, {error, Reason}} ->
+ NewClient = Client#tclient{protocol = Proto1},
+ {NewClient, {error, Reason}};
+ {Proto1, MessageBegin} ->
+ NewClient = Client#tclient{protocol = Proto1},
+ case MessageBegin of
+ #protocol_message_begin{seqid = RetSeqId} when RetSeqId =/= SeqId ->
+ {NewClient, {error, {bad_seq_id, SeqId}}};
+ #protocol_message_begin{type = ?tMessageType_EXCEPTION} ->
+ handle_application_exception(NewClient);
+ #protocol_message_begin{type = ?tMessageType_REPLY} ->
+ handle_reply(NewClient, Function, ReplyType)
+ end
end.
-
-handle_reply(Client = #tclient{protocol = Proto0,
- service = Service},
- Function,
- ReplyType) ->
+handle_reply(
+ Client = #tclient{
+ protocol = Proto0,
+ service = Service
+ },
+ Function,
+ ReplyType
+) ->
{struct, ExceptionFields} = Service:function_info(Function, exceptions),
ReplyStructDef = {struct, [{0, ReplyType}] ++ ExceptionFields},
{Proto1, {ok, Reply}} = thrift_protocol:read(Proto0, ReplyStructDef),
@@ -139,8 +158,11 @@
ReplyList = tuple_to_list(Reply),
true = length(ReplyList) == length(ExceptionFields) + 1,
ExceptionVals = tl(ReplyList),
- Thrown = [X || X <- ExceptionVals,
- X =/= undefined],
+ Thrown = [
+ X
+ || X <- ExceptionVals,
+ X =/= undefined
+ ],
case Thrown of
[] when ReplyType == {struct, []} ->
{NewClient, {ok, ok}};
@@ -150,12 +172,14 @@
throw({NewClient, {exception, Exception}})
end.
+-spec handle_application_exception(tclient()) -> no_return().
handle_application_exception(Client = #tclient{protocol = Proto0}) ->
{Proto1, {ok, Exception}} =
thrift_protocol:read(Proto0, ?TApplicationException_Structure),
{Proto2, ok} = thrift_protocol:read(Proto1, message_end),
XRecord = list_to_tuple(
- ['TApplicationException' | tuple_to_list(Exception)]),
+ ['TApplicationException' | tuple_to_list(Exception)]
+ ),
error_logger:error_msg("X: ~p~n", [XRecord]),
true = is_record(XRecord, 'TApplicationException'),
NewClient = Client#tclient{protocol = Proto2},
diff --git a/lib/erl/src/thrift_client_util.erl b/lib/erl/src/thrift_client_util.erl
index 1dbe51e..7c5f094 100644
--- a/lib/erl/src/thrift_client_util.erl
+++ b/lib/erl/src/thrift_client_util.erl
@@ -22,9 +22,11 @@
-export([new/4]).
-export([new_multiplexed/3, new_multiplexed/4]).
--type service_name() :: nonempty_string().
--type service_module() :: atom().
--type multiplexed_service_map() :: [{ServiceName::service_name(), ServiceModule::service_module()}].
+-type service_name() :: nonempty_string().
+-type service_module() :: atom().
+-type multiplexed_service_map() :: [
+ {ServiceName :: service_name(), ServiceModule :: service_module()}
+].
%%
%% Splits client options into client, protocol, and transport options
@@ -36,44 +38,47 @@
split_options([], ProtoIn, TransIn) ->
{ProtoIn, TransIn};
-
-split_options([Opt = {OptKey, _} | Rest], ProtoIn, TransIn)
- when OptKey =:= strict_read;
- OptKey =:= strict_write;
- OptKey =:= protocol ->
+split_options([Opt = {OptKey, _} | Rest], ProtoIn, TransIn) when
+ OptKey =:= strict_read;
+ OptKey =:= strict_write;
+ OptKey =:= protocol
+->
split_options(Rest, [Opt | ProtoIn], TransIn);
-
-split_options([Opt = {OptKey, _} | Rest], ProtoIn, TransIn)
- when OptKey =:= framed;
- OptKey =:= connect_timeout;
- OptKey =:= recv_timeout;
- OptKey =:= sockopts;
- OptKey =:= ssltransport;
- OptKey =:= ssloptions->
+split_options([Opt = {OptKey, _} | Rest], ProtoIn, TransIn) when
+ OptKey =:= framed;
+ OptKey =:= connect_timeout;
+ OptKey =:= recv_timeout;
+ OptKey =:= sockopts;
+ OptKey =:= ssltransport;
+ OptKey =:= ssloptions
+->
split_options(Rest, ProtoIn, [Opt | TransIn]).
-
%% Client constructor for the common-case of socket transports
-new(Host, Port, Service, Options)
- when is_integer(Port), is_atom(Service), is_list(Options) ->
+new(Host, Port, Service, Options) when
+ is_integer(Port), is_atom(Service), is_list(Options)
+->
{ProtoOpts, TransOpts0} = split_options(Options),
- {TransportModule, TransOpts2} = case lists:keytake(ssltransport, 1, TransOpts0) of
- {value, {_, true}, TransOpts1} -> {thrift_sslsocket_transport, TransOpts1};
- false -> {thrift_socket_transport, TransOpts0}
- end,
+ {TransportModule, TransOpts2} =
+ case lists:keytake(ssltransport, 1, TransOpts0) of
+ {value, {_, true}, TransOpts1} -> {thrift_sslsocket_transport, TransOpts1};
+ false -> {thrift_socket_transport, TransOpts0}
+ end,
- {ProtocolModule, ProtoOpts1} = case lists:keytake(protocol, 1, ProtoOpts) of
- {value, {_, compact}, Opts} -> {thrift_compact_protocol, Opts};
- {value, {_, json}, Opts} -> {thrift_json_protocol, Opts};
- {value, {_, binary}, Opts} -> {thrift_binary_protocol, Opts};
- false -> {thrift_binary_protocol, ProtoOpts}
- end,
+ {ProtocolModule, ProtoOpts1} =
+ case lists:keytake(protocol, 1, ProtoOpts) of
+ {value, {_, compact}, Opts} -> {thrift_compact_protocol, Opts};
+ {value, {_, json}, Opts} -> {thrift_json_protocol, Opts};
+ {value, {_, binary}, Opts} -> {thrift_binary_protocol, Opts};
+ false -> {thrift_binary_protocol, ProtoOpts}
+ end,
{ok, TransportFactory} =
TransportModule:new_transport_factory(Host, Port, TransOpts2),
{ok, ProtocolFactory} = ProtocolModule:new_protocol_factory(
- TransportFactory, ProtoOpts1),
+ TransportFactory, ProtoOpts1
+ ),
case ProtocolFactory() of
{ok, Protocol} ->
@@ -83,30 +88,49 @@
end.
-spec new_multiplexed(Host, Port, Services, Options) -> {ok, ServiceThriftClientList} when
- Host :: nonempty_string(),
- Port :: non_neg_integer(),
- Services :: multiplexed_service_map(),
- Options :: list(),
- ServiceThriftClientList :: [{ServiceName::list(), ThriftClient::term()}].
-new_multiplexed(Host, Port, Services, Options) when is_integer(Port),
- is_list(Services),
- is_list(Options) ->
- new_multiplexed(thrift_socket_transport:new_transport_factory(Host, Port, Options), Services, Options).
+ Host :: nonempty_string(),
+ Port :: non_neg_integer(),
+ Services :: multiplexed_service_map(),
+ Options :: list(),
+ ServiceThriftClientList :: [{ServiceName :: list(), ThriftClient :: term()}].
+new_multiplexed(Host, Port, Services, Options) when
+ is_integer(Port),
+ is_list(Services),
+ is_list(Options)
+->
+ new_multiplexed(
+ thrift_socket_transport:new_transport_factory(Host, Port, Options), Services, Options
+ ).
--spec new_multiplexed(TransportFactoryTuple, Services, Options) -> {ok, ServiceThriftClientList} when
- TransportFactoryTuple :: {ok, TransportFactory::term()},
- Services :: multiplexed_service_map(),
- Options :: list(),
- ServiceThriftClientList :: [{ServiceName::service_name(), ThriftClient::term()}].
-new_multiplexed(TransportFactoryTuple, Services, Options) when is_list(Services),
- is_list(Options),
- is_tuple(TransportFactoryTuple) ->
+-spec new_multiplexed(TransportFactoryTuple, Services, Options) ->
+ {ok, ServiceThriftClientList}
+when
+ TransportFactoryTuple :: {ok, TransportFactory :: term()},
+ Services :: multiplexed_service_map(),
+ Options :: list(),
+ ServiceThriftClientList :: [{ServiceName :: service_name(), ThriftClient :: term()}].
+new_multiplexed(TransportFactoryTuple, Services, Options) when
+ is_list(Services),
+ is_list(Options),
+ is_tuple(TransportFactoryTuple)
+->
{ProtoOpts, _} = split_options(Options),
{ok, TransportFactory} = TransportFactoryTuple,
- {ok, ProtocolFactory} = thrift_binary_protocol:new_protocol_factory(TransportFactory, ProtoOpts),
+ {ok, ProtocolFactory} = thrift_binary_protocol:new_protocol_factory(
+ TransportFactory, ProtoOpts
+ ),
{ok, Protocol} = ProtocolFactory(),
- {ok, [{ServiceName, element(2, thrift_client:new(element(2, thrift_multiplexed_protocol:new(Protocol, ServiceName)), Service))} || {ServiceName, Service} <- Services]}.
+ {ok, [
+ {ServiceName,
+ element(
+ 2,
+ thrift_client:new(
+ element(2, thrift_multiplexed_protocol:new(Protocol, ServiceName)), Service
+ )
+ )}
+ || {ServiceName, Service} <- Services
+ ]}.
diff --git a/lib/erl/src/thrift_compact_protocol.erl b/lib/erl/src/thrift_compact_protocol.erl
index 0f14221..f852fcb 100644
--- a/lib/erl/src/thrift_compact_protocol.erl
+++ b/lib/erl/src/thrift_compact_protocol.erl
@@ -24,28 +24,32 @@
-include("thrift_constants.hrl").
-include("thrift_protocol.hrl").
--export([new/1, new/2,
- read/2,
- write/2,
- flush_transport/1,
- close_transport/1,
- new_protocol_factory/2
- ]).
+-export([
+ new/1, new/2,
+ read/2,
+ write/2,
+ flush_transport/1,
+ close_transport/1,
+ new_protocol_factory/2
+]).
-define(ID_NONE, 16#10000).
-define(CBOOL_NONE, 0).
-define(CBOOL_TRUE, 1).
-define(CBOOL_FALSE, 2).
--record(t_compact, {transport,
- % state for pending boolean fields
- read_stack=[],
- read_value=?CBOOL_NONE,
- write_stack=[],
- write_id=?ID_NONE
- }).
--type state() :: #t_compact{}.
--include("thrift_protocol_behaviour.hrl").
+-type cbool() :: ?CBOOL_NONE | ?CBOOL_TRUE | ?CBOOL_FALSE.
+
+-record(t_compact, {
+ transport :: term(),
+ % state for pending boolean fields
+ read_stack = [] :: iodata(),
+ read_value = ?CBOOL_NONE :: cbool(),
+ write_stack = [] :: iodata(),
+ write_id = ?ID_NONE :: non_neg_integer()
+}).
+
+-type t_compact() :: #t_compact{}.
-define(PROTOCOL_ID, 16#82).
-define(VERSION_MASK, 16#1f).
@@ -67,19 +71,19 @@
typeid_to_compact(?tType_SET) -> 16#A;
typeid_to_compact(?tType_LIST) -> 16#9.
-compact_to_typeid(16#0) -> ?tType_STOP;
-compact_to_typeid(?CBOOL_FALSE) -> ?tType_BOOL;
-compact_to_typeid(?CBOOL_TRUE) -> ?tType_BOOL;
-compact_to_typeid(16#7) -> ?tType_DOUBLE;
-compact_to_typeid(16#3) -> ?tType_I8;
-compact_to_typeid(16#4) -> ?tType_I16;
-compact_to_typeid(16#5) -> ?tType_I32;
-compact_to_typeid(16#6) -> ?tType_I64;
-compact_to_typeid(16#8) -> ?tType_STRING;
-compact_to_typeid(16#C) -> ?tType_STRUCT;
-compact_to_typeid(16#B) -> ?tType_MAP;
-compact_to_typeid(16#A) -> ?tType_SET;
-compact_to_typeid(16#9) -> ?tType_LIST.
+compact_to_typeid(16#0) -> ?tType_STOP;
+compact_to_typeid(?CBOOL_FALSE) -> ?tType_BOOL;
+compact_to_typeid(?CBOOL_TRUE) -> ?tType_BOOL;
+compact_to_typeid(16#7) -> ?tType_DOUBLE;
+compact_to_typeid(16#3) -> ?tType_I8;
+compact_to_typeid(16#4) -> ?tType_I16;
+compact_to_typeid(16#5) -> ?tType_I32;
+compact_to_typeid(16#6) -> ?tType_I64;
+compact_to_typeid(16#8) -> ?tType_STRING;
+compact_to_typeid(16#C) -> ?tType_STRUCT;
+compact_to_typeid(16#B) -> ?tType_MAP;
+compact_to_typeid(16#A) -> ?tType_SET;
+compact_to_typeid(16#9) -> ?tType_LIST.
bool_to_cbool(Value) when Value -> ?CBOOL_TRUE;
bool_to_cbool(_) -> ?CBOOL_FALSE.
@@ -88,30 +92,31 @@
new(Transport) -> new(Transport, _Options = []).
new(Transport, _Options) ->
- State = #t_compact{transport = Transport},
- thrift_protocol:new(?MODULE, State).
+ State = #t_compact{transport = Transport},
+ thrift_protocol:new(?MODULE, State).
flush_transport(This = #t_compact{transport = Transport}) ->
- {NewTransport, Result} = thrift_transport:flush(Transport),
- {This#t_compact{transport = NewTransport}, Result}.
+ {NewTransport, Result} = thrift_transport:flush(Transport),
+ {This#t_compact{transport = NewTransport}, Result}.
close_transport(This = #t_compact{transport = Transport}) ->
- {NewTransport, Result} = thrift_transport:close(Transport),
- {This#t_compact{transport = NewTransport}, Result}.
+ {NewTransport, Result} = thrift_transport:close(Transport),
+ {This#t_compact{transport = NewTransport}, Result}.
%%%
%%% instance methods
%%%
-write_field_begin(This0 = #t_compact{write_stack=[LastId|T]}, CompactType, Id) ->
- IdDiff = Id - LastId,
- This1 = This0#t_compact{write_stack=[Id|T]},
- case (IdDiff > 0) and (IdDiff < 16) of
- true -> write(This1, {byte, (IdDiff bsl 4) bor CompactType});
- false ->
- {This2, ok} = write(This1, {byte, CompactType}),
- write(This2, {i16, Id})
- end.
+write_field_begin(This0 = #t_compact{write_stack = [LastId | T]}, CompactType, Id) ->
+ IdDiff = Id - LastId,
+ This1 = This0#t_compact{write_stack = [Id | T]},
+ case (IdDiff > 0) and (IdDiff < 16) of
+ true ->
+ write(This1, {byte, (IdDiff bsl 4) bor CompactType});
+ false ->
+ {This2, ok} = write(This1, {byte, CompactType}),
+ write(This2, {i16, Id})
+ end.
-spec to_zigzag(integer()) -> non_neg_integer().
to_zigzag(Value) -> 16#FFFFFFFFFFFFFFFF band ((Value bsl 1) bxor (Value bsr 63)).
@@ -121,270 +126,270 @@
-spec to_varint(non_neg_integer(), iolist()) -> iolist().
to_varint(Value, Acc) when (Value < 16#80) -> [Acc, Value];
-to_varint(Value, Acc) ->
- to_varint(Value bsr 7, [Acc, ((Value band 16#7F) bor 16#80)]).
+to_varint(Value, Acc) -> to_varint(Value bsr 7, [Acc, ((Value band 16#7F) bor 16#80)]).
--spec read_varint(#t_compact{}, non_neg_integer(), non_neg_integer()) -> non_neg_integer().
+-spec read_varint(t_compact(), non_neg_integer(), non_neg_integer()) ->
+ {t_compact(), {'ok', integer()}}.
read_varint(This0, Acc, Count) ->
- {This1, {ok, Byte}} = read(This0, byte),
- case (Byte band 16#80) of
- 0 -> {This1, {ok, (Byte bsl (7 * Count)) + Acc}};
- _ -> read_varint(This1, ((Byte band 16#7f) bsl (7 * Count)) + Acc, Count + 1)
- end.
+ {This1, {ok, Byte}} = read(This0, byte),
+ case (Byte band 16#80) of
+ 0 -> {This1, {ok, (Byte bsl (7 * Count)) + Acc}};
+ _ -> read_varint(This1, ((Byte band 16#7f) bsl (7 * Count)) + Acc, Count + 1)
+ end.
write(This0, #protocol_message_begin{
- name = Name,
- type = Type,
- seqid = Seqid}) ->
- {This1, ok} = write(This0, {byte, ?PROTOCOL_ID}),
- {This2, ok} = write(This1, {byte, (?VERSION_1 band ?VERSION_MASK) bor (Type bsl ?TYPE_SHIFT_AMOUNT)}),
- {This3, ok} = write(This2, {ui32, Seqid}),
- {This4, ok} = write(This3, {string, Name}),
- {This4, ok};
-
-write(This, message_end) -> {This, ok};
-
+ name = Name,
+ type = Type,
+ seqid = Seqid
+}) ->
+ {This1, ok} = write(This0, {byte, ?PROTOCOL_ID}),
+ {This2, ok} = write(
+ This1, {byte, (?VERSION_1 band ?VERSION_MASK) bor (Type bsl ?TYPE_SHIFT_AMOUNT)}
+ ),
+ {This3, ok} = write(This2, {ui32, Seqid}),
+ {This4, ok} = write(This3, {string, Name}),
+ {This4, ok};
+write(This, message_end) ->
+ {This, ok};
write(This0, #protocol_field_begin{
- name = _Name,
- type = Type,
- id = Id})
-when (Type =:= ?tType_BOOL) -> {This0#t_compact{write_id = Id}, ok};
-
+ name = _Name,
+ type = Type,
+ id = Id
+}) when
+ (Type =:= ?tType_BOOL)
+->
+ {This0#t_compact{write_id = Id}, ok};
write(This0, #protocol_field_begin{
- name = _Name,
- type = Type,
- id = Id}) ->
- write_field_begin(This0, typeid_to_compact(Type), Id);
-
-write(This, field_stop) -> write(This, {byte, ?tType_STOP});
-
-write(This, field_end) -> {This, ok};
-
+ name = _Name,
+ type = Type,
+ id = Id
+}) ->
+ write_field_begin(This0, typeid_to_compact(Type), Id);
+write(This, field_stop) ->
+ write(This, {byte, ?tType_STOP});
+write(This, field_end) ->
+ {This, ok};
write(This0, #protocol_map_begin{
- ktype = _Ktype,
- vtype = _Vtype,
- size = Size})
-when Size =:= 0 ->
- write(This0, {byte, 0});
-
+ ktype = _Ktype,
+ vtype = _Vtype,
+ size = Size
+}) when
+ Size =:= 0
+->
+ write(This0, {byte, 0});
write(This0, #protocol_map_begin{
- ktype = Ktype,
- vtype = Vtype,
- size = Size}) ->
- {This1, ok} = write(This0, {ui32, Size}),
- write(This1, {byte, (typeid_to_compact(Ktype) bsl 4) bor typeid_to_compact(Vtype)});
-
-write(This, map_end) -> {This, ok};
-
+ ktype = Ktype,
+ vtype = Vtype,
+ size = Size
+}) ->
+ {This1, ok} = write(This0, {ui32, Size}),
+ write(This1, {byte, (typeid_to_compact(Ktype) bsl 4) bor typeid_to_compact(Vtype)});
+write(This, map_end) ->
+ {This, ok};
write(This0, #protocol_list_begin{
- etype = Etype,
- size = Size})
-when Size < 16#f ->
- write(This0, {byte, (Size bsl 4) bor typeid_to_compact(Etype)});
-
+ etype = Etype,
+ size = Size
+}) when
+ Size < 16#f
+->
+ write(This0, {byte, (Size bsl 4) bor typeid_to_compact(Etype)});
write(This0, #protocol_list_begin{
- etype = Etype,
- size = Size}) ->
- {This1, ok} = write(This0, {byte, 16#f0 bor typeid_to_compact(Etype)}),
- write(This1, {ui32, Size});
-
-write(This, list_end) -> {This, ok};
-
+ etype = Etype,
+ size = Size
+}) ->
+ {This1, ok} = write(This0, {byte, 16#f0 bor typeid_to_compact(Etype)}),
+ write(This1, {ui32, Size});
+write(This, list_end) ->
+ {This, ok};
write(This0, #protocol_set_begin{
- etype = Etype,
- size = Size}) ->
- write(This0, #protocol_list_begin{etype = Etype, size = Size});
-
-write(This, set_end) -> {This, ok};
-
+ etype = Etype,
+ size = Size
+}) ->
+ write(This0, #protocol_list_begin{etype = Etype, size = Size});
+write(This, set_end) ->
+ {This, ok};
write(This = #t_compact{write_stack = Stack}, #protocol_struct_begin{}) ->
- {This#t_compact{write_stack = [0|Stack]}, ok};
-write(This = #t_compact{write_stack = [_|T]}, struct_end) ->
- {This#t_compact{write_stack = T}, ok};
-
+ {This#t_compact{write_stack = [0 | Stack]}, ok};
+write(This = #t_compact{write_stack = [_ | T]}, struct_end) ->
+ {This#t_compact{write_stack = T}, ok};
write(This = #t_compact{write_id = ?ID_NONE}, {bool, Value}) ->
- write(This, {byte, bool_to_cbool(Value)});
-
+ write(This, {byte, bool_to_cbool(Value)});
write(This0 = #t_compact{write_id = Id}, {bool, Value}) ->
- {This1, ok} = write_field_begin(This0, bool_to_cbool(Value), Id),
- {This1#t_compact{write_id = ?ID_NONE}, ok};
-
+ {This1, ok} = write_field_begin(This0, bool_to_cbool(Value), Id),
+ {This1#t_compact{write_id = ?ID_NONE}, ok};
write(This, {byte, Value}) when is_integer(Value) ->
- write(This, <<Value:8/big-signed>>);
-
+ write(This, <<Value:8/big-signed>>);
write(This, {i16, Value}) when is_integer(Value) -> write(This, to_varint(to_zigzag(Value), []));
write(This, {ui32, Value}) when is_integer(Value) -> write(This, to_varint(Value, []));
write(This, {i32, Value}) when is_integer(Value) ->
- write(This, to_varint(to_zigzag(Value), []));
+ write(This, to_varint(to_zigzag(Value), []));
write(This, {i64, Value}) when is_integer(Value) -> write(This, to_varint(to_zigzag(Value), []));
-
write(This, {double, Double}) ->
- write(This, <<Double:64/float-signed-little>>);
-
+ write(This, <<Double:64/float-signed-little>>);
write(This0, {string, Str}) when is_list(Str) ->
- % TODO: limit length
- {This1, ok} = write(This0, {ui32, length(Str)}),
- {This2, ok} = write(This1, list_to_binary(Str)),
- {This2, ok};
-
+ % TODO: limit length
+ {This1, ok} = write(This0, {ui32, length(Str)}),
+ {This2, ok} = write(This1, list_to_binary(Str)),
+ {This2, ok};
write(This0, {string, Bin}) when is_binary(Bin) ->
- % TODO: limit length
- {This1, ok} = write(This0, {ui32, size(Bin)}),
- {This2, ok} = write(This1, Bin),
- {This2, ok};
-
+ % TODO: limit length
+ {This1, ok} = write(This0, {ui32, size(Bin)}),
+ {This2, ok} = write(This1, Bin),
+ {This2, ok};
%% Data :: iolist()
write(This = #t_compact{transport = Trans}, Data) ->
- {NewTransport, Result} = thrift_transport:write(Trans, Data),
- {This#t_compact{transport = NewTransport}, Result}.
+ {NewTransport, Result} = thrift_transport:write(Trans, Data),
+ {This#t_compact{transport = NewTransport}, Result}.
%%
%%
read(This0, message_begin) ->
- {This1, {ok, ?PROTOCOL_ID}} = read(This0, ubyte),
- {This2, {ok, VerAndType}} = read(This1, ubyte),
- ?VERSION_1 = VerAndType band ?VERSION_MASK,
- {This3, {ok, SeqId}} = read(This2, ui32),
- {This4, {ok, Name}} = read(This3, string),
- {This4, #protocol_message_begin{
- name = binary_to_list(Name),
- type = (VerAndType bsr ?TYPE_SHIFT_AMOUNT) band ?TYPE_BITS,
- seqid = SeqId}};
-
-read(This, message_end) -> {This, ok};
-
+ {This1, {ok, ?PROTOCOL_ID}} = read(This0, ubyte),
+ {This2, {ok, VerAndType}} = read(This1, ubyte),
+ ?VERSION_1 = VerAndType band ?VERSION_MASK,
+ {This3, {ok, SeqId}} = read(This2, ui32),
+ {This4, {ok, Name}} = read(This3, string),
+ {This4, #protocol_message_begin{
+ name = binary_to_list(Name),
+ type = (VerAndType bsr ?TYPE_SHIFT_AMOUNT) band ?TYPE_BITS,
+ seqid = SeqId
+ }};
+read(This, message_end) ->
+ {This, ok};
read(This = #t_compact{read_stack = Stack}, struct_begin) ->
- {This#t_compact{read_stack = [0|Stack]}, ok};
-read(This = #t_compact{read_stack = [_H|T]}, struct_end) ->
- {This#t_compact{read_stack = T}, ok};
-
-read(This0 = #t_compact{read_stack = [LastId|T]}, field_begin) ->
- {This1, {ok, Byte}} = read(This0, ubyte),
- case Byte band 16#f of
- CompactType = ?tType_STOP ->
- {This1, #protocol_field_begin{type = CompactType}};
- CompactType ->
- {This2, {ok, Id}} = case Byte bsr 4 of
- 0 -> read(This1, i16);
- IdDiff ->
- {This1, {ok, LastId + IdDiff}}
- end,
- case compact_to_typeid(CompactType) of
- ?tType_BOOL ->
- {This2#t_compact{read_stack = [Id|T], read_value = cbool_to_bool(CompactType)},
- #protocol_field_begin{type = ?tType_BOOL, id = Id}};
- Type ->
- {This2#t_compact{read_stack = [Id|T]},
- #protocol_field_begin{type = Type, id = Id}}
- end
- end;
-
-read(This, field_end) -> {This, ok};
-
+ {This#t_compact{read_stack = [0 | Stack]}, ok};
+read(This = #t_compact{read_stack = [_H | T]}, struct_end) ->
+ {This#t_compact{read_stack = T}, ok};
+read(This0 = #t_compact{read_stack = [LastId | T]}, field_begin) ->
+ {This1, {ok, Byte}} = read(This0, ubyte),
+ case Byte band 16#f of
+ CompactType = ?tType_STOP ->
+ {This1, #protocol_field_begin{type = CompactType}};
+ CompactType ->
+ {This2, {ok, Id}} =
+ case Byte bsr 4 of
+ 0 -> read(This1, i16);
+ IdDiff -> {This1, {ok, LastId + IdDiff}}
+ end,
+ case compact_to_typeid(CompactType) of
+ ?tType_BOOL ->
+ {
+ This2#t_compact{
+ read_stack = [Id | T], read_value = CompactType
+ },
+ #protocol_field_begin{type = ?tType_BOOL, id = Id}
+ };
+ Type ->
+ {This2#t_compact{read_stack = [Id | T]}, #protocol_field_begin{
+ type = Type, id = Id
+ }}
+ end
+ end;
+read(This, field_end) ->
+ {This, ok};
read(This0, map_begin) ->
- {This1, {ok, Size}} = read(This0, ui32),
- {This2, {ok, KV}} = case Size of
- 0 -> {This1, {ok, 0}};
- _ -> read(This1, ubyte)
- end,
- {This2, #protocol_map_begin{ktype = compact_to_typeid(KV bsr 4),
- vtype = compact_to_typeid(KV band 16#f),
- size = Size}};
-read(This, map_end) -> {This, ok};
-
+ {This1, {ok, Size}} = read(This0, ui32),
+ {This2, {ok, KV}} =
+ case Size of
+ 0 -> {This1, {ok, 0}};
+ _ -> read(This1, ubyte)
+ end,
+ {This2, #protocol_map_begin{
+ ktype = compact_to_typeid(KV bsr 4),
+ vtype = compact_to_typeid(KV band 16#f),
+ size = Size
+ }};
+read(This, map_end) ->
+ {This, ok};
read(This0, list_begin) ->
- {This1, {ok, SizeAndType}} = read(This0, ubyte),
- {This2, {ok, Size}} = case (SizeAndType bsr 4) band 16#f of
- 16#f -> read(This1, ui32);
- Else -> {This1, {ok, Else}}
- end,
- {This2, #protocol_list_begin{etype = compact_to_typeid(SizeAndType band 16#f),
- size = Size}};
-
-read(This, list_end) -> {This, ok};
-
+ {This1, {ok, SizeAndType}} = read(This0, ubyte),
+ {This2, {ok, Size}} =
+ case (SizeAndType bsr 4) band 16#f of
+ 16#f -> read(This1, ui32);
+ Else -> {This1, {ok, Else}}
+ end,
+ {This2, #protocol_list_begin{
+ etype = compact_to_typeid(SizeAndType band 16#f),
+ size = Size
+ }};
+read(This, list_end) ->
+ {This, ok};
read(This0, set_begin) ->
- {This1, {ok, SizeAndType}} = read(This0, ubyte),
- {This2, {ok, Size}} = case (SizeAndType bsr 4) band 16#f of
- 16#f -> read(This1, ui32);
- Else -> {This1, {ok, Else}}
- end,
- {This2, #protocol_set_begin{etype = compact_to_typeid(SizeAndType band 16#f),
- size = Size}};
-
-read(This, set_end) -> {This, ok};
-
+ {This1, {ok, SizeAndType}} = read(This0, ubyte),
+ {This2, {ok, Size}} =
+ case (SizeAndType bsr 4) band 16#f of
+ 16#f -> read(This1, ui32);
+ Else -> {This1, {ok, Else}}
+ end,
+ {This2, #protocol_set_begin{
+ etype = compact_to_typeid(SizeAndType band 16#f),
+ size = Size
+ }};
+read(This, set_end) ->
+ {This, ok};
read(This0, field_stop) ->
- {This1, {ok, ?tType_STOP}} = read(This0, ubyte),
- {This1, ok};
-
+ {This1, {ok, ?tType_STOP}} = read(This0, ubyte),
+ {This1, ok};
%%
read(This0 = #t_compact{read_value = ?CBOOL_NONE}, bool) ->
- {This1, {ok, Byte}} = read(This0, ubyte),
- {This1, {ok, cbool_to_bool(Byte)}};
-
+ {This1, {ok, Byte}} = read(This0, ubyte),
+ {This1, {ok, cbool_to_bool(Byte)}};
read(This0 = #t_compact{read_value = Bool}, bool) ->
- {This0#t_compact{read_value = ?CBOOL_NONE}, {ok, Bool}};
-
+ {This0#t_compact{read_value = ?CBOOL_NONE}, {ok, cbool_to_bool(Bool)}};
read(This0, ubyte) ->
- {This1, {ok, <<Val:8/integer-unsigned-big, _/binary>>}} = read_data(This0, 1),
- {This1, {ok, Val}};
-
+ {This1, {ok, <<Val:8/integer-unsigned-big, _/binary>>}} = read_data(This0, 1),
+ {This1, {ok, Val}};
read(This0, byte) ->
- {This1, Bytes} = read_data(This0, 1),
- case Bytes of
- {ok, <<Val:8/integer-signed-big, _/binary>>} -> {This1, {ok, Val}};
- Else -> {This1, Else}
- end;
-
+ {This1, Bytes} = read_data(This0, 1),
+ case Bytes of
+ {ok, <<Val:8/integer-signed-big, _/binary>>} -> {This1, {ok, Val}};
+ Else -> {This1, Else}
+ end;
read(This0, i16) ->
- {This1, {ok, Zigzag}} = read_varint(This0, 0, 0),
- {This1, {ok, from_zigzag(Zigzag)}};
-
-read(This0, ui32) -> read_varint(This0, 0, 0);
-
+ {This1, {ok, Zigzag}} = read_varint(This0, 0, 0),
+ {This1, {ok, from_zigzag(Zigzag)}};
+read(This0, ui32) ->
+ read_varint(This0, 0, 0);
read(This0, i32) ->
- {This1, {ok, Zigzag}} = read_varint(This0, 0, 0),
- {This1, {ok, from_zigzag(Zigzag)}};
-
+ {This1, {ok, Zigzag}} = read_varint(This0, 0, 0),
+ {This1, {ok, from_zigzag(Zigzag)}};
read(This0, i64) ->
- {This1, {ok, Zigzag}} = read_varint(This0, 0, 0),
- {This1, {ok, from_zigzag(Zigzag)}};
-
+ {This1, {ok, Zigzag}} = read_varint(This0, 0, 0),
+ {This1, {ok, from_zigzag(Zigzag)}};
read(This0, double) ->
- {This1, Bytes} = read_data(This0, 8),
- case Bytes of
- {ok, <<Val:64/float-signed-little, _/binary>>} -> {This1, {ok, Val}};
- Else -> {This1, Else}
- end;
-
+ {This1, Bytes} = read_data(This0, 8),
+ case Bytes of
+ {ok, <<Val:64/float-signed-little, _/binary>>} -> {This1, {ok, Val}};
+ Else -> {This1, Else}
+ end;
% returns a binary directly, call binary_to_list if necessary
read(This0, string) ->
- {This1, {ok, Sz}} = read(This0, ui32),
- read_data(This1, Sz).
+ {This1, {ok, Sz}} = read(This0, ui32),
+ read_data(This1, Sz).
-spec read_data(#t_compact{}, non_neg_integer()) ->
{#t_compact{}, {ok, binary()} | {error, _Reason}}.
-read_data(This, 0) -> {This, {ok, <<>>}};
+read_data(This, 0) ->
+ {This, {ok, <<>>}};
read_data(This = #t_compact{transport = Trans}, Len) when is_integer(Len) andalso Len > 0 ->
{NewTransport, Result} = thrift_transport:read(Trans, Len),
{This#t_compact{transport = NewTransport}, Result}.
-
%%%% FACTORY GENERATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% returns a (fun() -> thrift_protocol())
new_protocol_factory(TransportFactory, _Options) ->
- F = fun() ->
- case TransportFactory() of
+ F = fun() ->
+ case TransportFactory() of
{ok, Transport} ->
- thrift_compact_protocol:new(
- Transport,
- []);
+ thrift_compact_protocol:new(
+ Transport,
+ []
+ );
{error, Error} ->
- {error, Error}
- end
- end,
- {ok, F}.
+ {error, Error}
+ end
+ end,
+ {ok, F}.
diff --git a/lib/erl/src/thrift_disk_log_transport.erl b/lib/erl/src/thrift_disk_log_transport.erl
index de8ee41..733d88f 100644
--- a/lib/erl/src/thrift_disk_log_transport.erl
+++ b/lib/erl/src/thrift_disk_log_transport.erl
@@ -31,13 +31,13 @@
-export([read/2, write/2, force_flush/1, flush/1, close/1]).
%% state
--record(dl_transport, {log,
- close_on_close = false,
- sync_every = infinity,
- sync_tref}).
--type state() :: #dl_transport{}.
--include("thrift_transport_behaviour.hrl").
-
+-record(dl_transport, {
+ %% Keep in sync with disk_log:log/0 type
+ log :: term(),
+ close_on_close = false :: boolean(),
+ sync_every = infinity :: undefined | timeout(),
+ sync_tref :: undefined | timer:tref()
+}).
%% Create a transport attached to an already open log.
%% If you'd like this transport to close the disk_log using disk_log:lclose()
@@ -51,12 +51,12 @@
N when is_integer(N), N > 0 ->
{ok, TRef} = timer:apply_interval(N, ?MODULE, force_flush, [State]),
State#dl_transport{sync_tref = TRef};
- _ -> State
+ _ ->
+ State
end,
thrift_transport:new(?MODULE, State2).
-
parse_opts([], State) ->
State;
parse_opts([{close_on_close, Bool} | Rest], State) when is_boolean(Bool) ->
@@ -64,7 +64,6 @@
parse_opts([{sync_every, Int} | Rest], State) when is_integer(Int), Int > 0 ->
parse_opts(Rest, State#dl_transport{sync_every = Int}).
-
%%%% TRANSPORT IMPLENTATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% disk_log_transport is write-only
@@ -80,38 +79,40 @@
flush(This = #dl_transport{log = Log, sync_every = SE}) ->
case SE of
- undefined -> % no time-based sync
- disk_log:sync(Log);
- _Else -> % sync will happen automagically
+ % no time-based sync
+ undefined ->
+ ok = disk_log:sync(Log);
+ % sync will happen automagically
+ _Else ->
ok
end,
{This, ok}.
-
-
-
%% On close, close the underlying log if we're configured to do so.
close(This = #dl_transport{close_on_close = false}) ->
{This, ok};
close(This = #dl_transport{log = Log}) ->
- {This, disk_log:lclose(Log)}.
-
+ {This, disk_log:close(Log)}.
%%%% FACTORY GENERATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
new_transport_factory(Name, ExtraLogOpts) ->
- new_transport_factory(Name, ExtraLogOpts, [{close_on_close, true},
- {sync_every, 500}]).
+ new_transport_factory(Name, ExtraLogOpts, [
+ {close_on_close, true},
+ {sync_every, 500}
+ ]).
new_transport_factory(Name, ExtraLogOpts, TransportOpts) ->
F = fun() -> factory_impl(Name, ExtraLogOpts, TransportOpts) end,
{ok, F}.
factory_impl(Name, ExtraLogOpts, TransportOpts) ->
- LogOpts = [{name, Name},
- {format, external},
- {type, wrap} |
- ExtraLogOpts],
+ LogOpts = [
+ {name, Name},
+ {format, external},
+ {type, wrap}
+ | ExtraLogOpts
+ ],
Log =
case disk_log:open(LogOpts) of
{ok, LogS} ->
diff --git a/lib/erl/src/thrift_file_transport.erl b/lib/erl/src/thrift_file_transport.erl
index 071152b..b0bf383 100644
--- a/lib/erl/src/thrift_file_transport.erl
+++ b/lib/erl/src/thrift_file_transport.erl
@@ -28,88 +28,76 @@
%% legacy api
-export([new_reader/1]).
-
-record(t_file, {
- device,
- should_close = true,
- mode = write
+ device :: file:io_device(),
+ should_close = true :: boolean(),
+ mode = write :: file:mode()
}).
--type state() :: #t_file{}.
-
-
--spec new(Device::file:io_device()) ->
- thrift_transport:t_transport().
+-spec new(Device :: file:io_device()) -> {ok, thrift_transport:t_transport()}.
new(Device) -> new(Device, []).
--spec new(Device::file:io_device(), Opts::list()) ->
- thrift_transport:t_transport().
+-spec new(Device :: file:io_device(), Opts :: list()) -> {ok, thrift_transport:t_transport()}.
%% Device should be opened in raw and binary mode.
new(Device, Opts) when is_list(Opts) ->
- State = parse_opts(Opts, #t_file{device = Device}),
- thrift_transport:new(?MODULE, State).
+ State = parse_opts(Opts, #t_file{device = Device}),
+ thrift_transport:new(?MODULE, State).
-
-parse_opts([{should_close, Bool}|Rest], State)
-when is_boolean(Bool) ->
- parse_opts(Rest, State#t_file{should_close = Bool});
-parse_opts([{mode, Mode}|Rest], State)
-when Mode =:= write; Mode =:= read ->
- parse_opts(Rest, State#t_file{mode = Mode});
+parse_opts([{should_close, Bool} | Rest], State) when
+ is_boolean(Bool)
+->
+ parse_opts(Rest, State#t_file{should_close = Bool});
+parse_opts([{mode, Mode} | Rest], State) when
+ Mode =:= write; Mode =:= read
+->
+ parse_opts(Rest, State#t_file{mode = Mode});
parse_opts([], State) ->
- State.
+ State.
-
--include("thrift_transport_behaviour.hrl").
-
-
-read(State = #t_file{device = Device, mode = read}, Len)
-when is_integer(Len), Len >= 0 ->
- case file:read(Device, Len) of
- eof -> {State, {error, eof}};
- {ok, Result} -> {State, {ok, iolist_to_binary(Result)}}
- end;
+read(State = #t_file{device = Device, mode = read}, Len) when
+ is_integer(Len), Len >= 0
+->
+ case file:read(Device, Len) of
+ eof -> {State, {error, eof}};
+ {ok, Result} -> {State, {ok, iolist_to_binary(Result)}}
+ end;
read(State, _) ->
- {State, {error, write_mode}}.
+ {State, {error, write_mode}}.
-
-read_exact(State = #t_file{device = Device, mode = read}, Len)
-when is_integer(Len), Len >= 0 ->
- case file:read(Device, Len) of
- eof -> {State, {error, eof}};
- {ok, Result} ->
- case iolist_size(Result) of
- X when X < Len -> {State, {error, eof}};
- _ -> {State, {ok, iolist_to_binary(Result)}}
- end
- end;
+read_exact(State = #t_file{device = Device, mode = read}, Len) when
+ is_integer(Len), Len >= 0
+->
+ case file:read(Device, Len) of
+ eof ->
+ {State, {error, eof}};
+ {ok, Result} ->
+ case iolist_size(Result) of
+ X when X < Len -> {State, {error, eof}};
+ _ -> {State, {ok, iolist_to_binary(Result)}}
+ end
+ end;
read_exact(State, _) ->
- {State, {error, write_mode}}.
-
+ {State, {error, write_mode}}.
write(State = #t_file{device = Device, mode = write}, Data) ->
- {State, file:write(Device, Data)};
+ {State, file:write(Device, Data)};
write(State, _) ->
- {State, {error, read_mode}}.
-
+ {State, {error, read_mode}}.
flush(State = #t_file{device = Device, mode = write}) ->
- {State, file:sync(Device)}.
-
+ {State, file:sync(Device)}.
close(State = #t_file{device = Device, should_close = SC}) ->
- case SC of
- true -> {State, file:close(Device)};
- false -> {State, ok}
- end.
-
+ case SC of
+ true -> {State, file:close(Device)};
+ false -> {State, ok}
+ end.
%% legacy api. left for compatibility
new_reader(Filename) ->
- case file:open(Filename, [read, binary, {read_ahead, 1024*1024}]) of
- {ok, IODevice} -> new(IODevice, [{should_close, true}, {mode, read}]);
- Error -> Error
- end.
-
+ case file:open(Filename, [read, binary, {read_ahead, 1024 * 1024}]) of
+ {ok, IODevice} -> new(IODevice, [{should_close, true}, {mode, read}]);
+ Error -> Error
+ end.
diff --git a/lib/erl/src/thrift_framed_transport.erl b/lib/erl/src/thrift_framed_transport.erl
index 9a5d6af..0d93baa 100644
--- a/lib/erl/src/thrift_framed_transport.erl
+++ b/lib/erl/src/thrift_framed_transport.erl
@@ -26,101 +26,92 @@
%% protocol callbacks
-export([read/2, read_exact/2, write/2, flush/1, close/1]).
-
-record(t_framed, {
- wrapped,
- read_buffer,
- write_buffer
+ wrapped :: thrift_transport:t_transport(),
+ read_buffer :: iodata(),
+ write_buffer :: iodata()
}).
--type state() :: #t_framed{}.
-
-
--spec new(Transport::thrift_transport:t_transport()) ->
- thrift_transport:t_transport().
+-spec new(Transport :: thrift_transport:t_transport()) -> {ok, thrift_transport:t_transport()}.
new(Wrapped) ->
- State = #t_framed{
- wrapped = Wrapped,
- read_buffer = [],
- write_buffer = []
- },
- thrift_transport:new(?MODULE, State).
+ State = #t_framed{
+ wrapped = Wrapped,
+ read_buffer = [],
+ write_buffer = []
+ },
+ thrift_transport:new(?MODULE, State).
+read(State = #t_framed{wrapped = Wrapped, read_buffer = Buffer}, Len) when
+ is_integer(Len), Len >= 0
+->
+ Binary = iolist_to_binary(Buffer),
+ case Binary of
+ <<>> when Len > 0 ->
+ case next_frame(Wrapped) of
+ {NewState, {ok, Frame}} ->
+ NewBinary = iolist_to_binary([Binary, Frame]),
+ Give = min(iolist_size(NewBinary), Len),
+ {Result, Remaining} = split_binary(NewBinary, Give),
+ {State#t_framed{wrapped = NewState, read_buffer = Remaining}, {ok, Result}};
+ {NewState, Error} ->
+ {State#t_framed{wrapped = NewState}, Error}
+ end;
+ %% read of zero bytes
+ <<>> ->
+ {State, {ok, <<>>}};
+ %% read buffer is nonempty
+ _ ->
+ Give = min(iolist_size(Binary), Len),
+ {Result, Remaining} = split_binary(Binary, Give),
+ {State#t_framed{read_buffer = Remaining}, {ok, Result}}
+ end.
--include("thrift_transport_behaviour.hrl").
-
-
-read(State = #t_framed{wrapped = Wrapped, read_buffer = Buffer}, Len)
-when is_integer(Len), Len >= 0 ->
- Binary = iolist_to_binary(Buffer),
- case Binary of
- <<>> when Len > 0 ->
- case next_frame(Wrapped) of
- {NewState, {ok, Frame}} ->
- NewBinary = iolist_to_binary([Binary, Frame]),
- Give = min(iolist_size(NewBinary), Len),
- {Result, Remaining} = split_binary(NewBinary, Give),
- {State#t_framed{wrapped = NewState, read_buffer = Remaining}, {ok, Result}};
- {NewState, Error} ->
- {State#t_framed{wrapped = NewState}, Error}
- end;
- %% read of zero bytes
- <<>> -> {State, {ok, <<>>}};
- %% read buffer is nonempty
- _ ->
- Give = min(iolist_size(Binary), Len),
- {Result, Remaining} = split_binary(Binary, Give),
- {State#t_framed{read_buffer = Remaining}, {ok, Result}}
- end.
-
-
-read_exact(State = #t_framed{wrapped = Wrapped, read_buffer = Buffer}, Len)
-when is_integer(Len), Len >= 0 ->
- Binary = iolist_to_binary(Buffer),
- case iolist_size(Binary) of
- %% read buffer is larger than requested read size
- X when X >= Len ->
- {Result, Remaining} = split_binary(Binary, Len),
- {State#t_framed{read_buffer = Remaining}, {ok, Result}};
- %% read buffer is insufficient for requested read size
- _ ->
- case next_frame(Wrapped) of
- {NewState, {ok, Frame}} ->
- read_exact(
- State#t_framed{wrapped = NewState, read_buffer = [Buffer, Frame]},
- Len
- );
- {NewState, Error} ->
- {State#t_framed{wrapped = NewState}, Error}
- end
- end.
+read_exact(State = #t_framed{wrapped = Wrapped, read_buffer = Buffer}, Len) when
+ is_integer(Len), Len >= 0
+->
+ Binary = iolist_to_binary(Buffer),
+ case iolist_size(Binary) of
+ %% read buffer is larger than requested read size
+ X when X >= Len ->
+ {Result, Remaining} = split_binary(Binary, Len),
+ {State#t_framed{read_buffer = Remaining}, {ok, Result}};
+ %% read buffer is insufficient for requested read size
+ _ ->
+ case next_frame(Wrapped) of
+ {NewState, {ok, Frame}} ->
+ read_exact(
+ State#t_framed{wrapped = NewState, read_buffer = [Buffer, Frame]},
+ Len
+ );
+ {NewState, Error} ->
+ {State#t_framed{wrapped = NewState}, Error}
+ end
+ end.
next_frame(Transport) ->
- case thrift_transport:read_exact(Transport, 4) of
- {NewState, {ok, <<FrameLength:32/integer-signed-big>>}} ->
- thrift_transport:read_exact(NewState, FrameLength);
- Error -> Error
- end.
-
+ case thrift_transport:read_exact(Transport, 4) of
+ {NewState, {ok, <<FrameLength:32/integer-signed-big>>}} ->
+ thrift_transport:read_exact(NewState, FrameLength);
+ Error ->
+ Error
+ end.
write(State = #t_framed{write_buffer = Buffer}, Data) ->
- {State#t_framed{write_buffer = [Buffer, Data]}, ok}.
-
+ {State#t_framed{write_buffer = [Buffer, Data]}, ok}.
flush(State = #t_framed{write_buffer = Buffer, wrapped = Wrapped}) ->
- case iolist_size(Buffer) of
- %% if write buffer is empty, do nothing
- 0 -> {State, ok};
- FrameLen ->
- Data = [<<FrameLen:32/integer-signed-big>>, Buffer],
- {Written, Response} = thrift_transport:write(Wrapped, Data),
- {Flushed, ok} = thrift_transport:flush(Written),
- {State#t_framed{wrapped = Flushed, write_buffer = []}, Response}
- end.
-
+ case iolist_size(Buffer) of
+ %% if write buffer is empty, do nothing
+ 0 ->
+ {State, ok};
+ FrameLen ->
+ Data = [<<FrameLen:32/integer-signed-big>>, Buffer],
+ {Written, Response} = thrift_transport:write(Wrapped, Data),
+ {Flushed, ok} = thrift_transport:flush(Written),
+ {State#t_framed{wrapped = Flushed, write_buffer = []}, Response}
+ end.
close(State = #t_framed{wrapped = Wrapped}) ->
- {Closed, Result} = thrift_transport:close(Wrapped),
- {State#t_framed{wrapped = Closed}, Result}.
-
+ {Closed, Result} = thrift_transport:close(Wrapped),
+ {State#t_framed{wrapped = Closed}, Result}.
diff --git a/lib/erl/src/thrift_http_transport.erl b/lib/erl/src/thrift_http_transport.erl
index 46bcede..b422b3f 100644
--- a/lib/erl/src/thrift_http_transport.erl
+++ b/lib/erl/src/thrift_http_transport.erl
@@ -27,15 +27,16 @@
%% thrift_transport callbacks
-export([write/2, read/2, flush/1, close/1]).
--record(http_transport, {host, % string()
- path, % string()
- read_buffer, % iolist()
- write_buffer, % iolist()
- http_options, % see http(3)
- extra_headers % [{str(), str()}, ...]
- }).
--type state() :: #http_transport{}.
--include("thrift_transport_behaviour.hrl").
+% string()
+-record(http_transport, {
+ host :: string(),
+ path :: string(),
+ read_buffer :: iodata(),
+ write_buffer :: iodata(),
+ % see httpc(3)
+ http_options :: [{atom(), term()}],
+ extra_headers :: [{string(), string()}]
+}).
new(Host, Path) ->
new(Host, Path, _Options = []).
@@ -46,12 +47,14 @@
%% {extra_headers, ExtraHeaders} = List of extra HTTP headers
%%--------------------------------------------------------------------
new(Host, Path, Options) ->
- State1 = #http_transport{host = Host,
- path = Path,
- read_buffer = [],
- write_buffer = [],
- http_options = [],
- extra_headers = []},
+ State1 = #http_transport{
+ host = Host,
+ path = Path,
+ read_buffer = [],
+ write_buffer = [],
+ http_options = [],
+ extra_headers = []
+ },
ApplyOption =
fun
({http_options, HttpOpts}, State = #http_transport{}) ->
@@ -75,28 +78,38 @@
{State#http_transport{write_buffer = [WBuf, Data]}, ok}.
%% Flushes the buffer, making a request
-flush(State = #http_transport{host = Host,
- path = Path,
- read_buffer = Rbuf,
- write_buffer = Wbuf,
- http_options = HttpOptions,
- extra_headers = ExtraHeaders}) ->
+flush(
+ State = #http_transport{
+ host = Host,
+ path = Path,
+ read_buffer = Rbuf,
+ write_buffer = Wbuf,
+ http_options = HttpOptions,
+ extra_headers = ExtraHeaders
+ }
+) ->
case iolist_to_binary(Wbuf) of
<<>> ->
%% Don't bother flushing empty buffers.
{State, ok};
WBinary ->
{ok, {{_Version, 200, _ReasonPhrase}, _Headers, Body}} =
- httpc:request(post,
- {"http://" ++ Host ++ Path,
- [{"User-Agent", "Erlang/thrift_http_transport"} | ExtraHeaders],
- "application/x-thrift",
- WBinary},
- HttpOptions,
- [{body_format, binary}]),
+ httpc:request(
+ post,
+ {
+ "http://" ++ Host ++ Path,
+ [{"User-Agent", "Erlang/thrift_http_transport"} | ExtraHeaders],
+ "application/x-thrift",
+ WBinary
+ },
+ HttpOptions,
+ [{body_format, binary}]
+ ),
- State1 = State#http_transport{read_buffer = [Rbuf, Body],
- write_buffer = []},
+ State1 = State#http_transport{
+ read_buffer = [Rbuf, Body],
+ write_buffer = []
+ },
{State1, ok}
end.
@@ -109,7 +122,7 @@
case iolist_to_binary(RBuf) of
<<Data:Give/binary, RBuf1/binary>> ->
Response = {ok, Data},
- State1 = State#http_transport{read_buffer=RBuf1},
+ State1 = State#http_transport{read_buffer = RBuf1},
{State1, Response};
_ ->
{State, {error, 'EOF'}}
diff --git a/lib/erl/src/thrift_json_parser.erl b/lib/erl/src/thrift_json_parser.erl
index 4e47f10..18e0c03 100644
--- a/lib/erl/src/thrift_json_parser.erl
+++ b/lib/erl/src/thrift_json_parser.erl
@@ -22,19 +22,15 @@
-module(thrift_json_parser).
-export([parser/0, handle_event/2]).
-
-record(config, {strict_utf8 = false :: boolean()}).
-
parser() -> fun(JSON) -> start(JSON, {?MODULE, []}, [], #config{}) end.
-
handle_event(Event, {Handler, State}, _Config) -> {Handler, Handler:handle_event(Event, State)}.
handle_event(end_json, State) -> lists:reverse([end_json] ++ State);
handle_event(Event, State) -> [Event] ++ State.
-
%% whitespace
-define(space, 16#20).
-define(tab, 16#09).
@@ -68,12 +64,11 @@
%% comments
-define(star, 16#2A).
-
%% some useful guards
-define(is_hex(Symbol),
(Symbol >= $a andalso Symbol =< $f) orelse
- (Symbol >= $A andalso Symbol =< $F) orelse
- (Symbol >= $0 andalso Symbol =< $9)
+ (Symbol >= $A andalso Symbol =< $F) orelse
+ (Symbol >= $0 andalso Symbol =< $9)
).
-define(is_nonzero(Symbol),
@@ -84,7 +79,6 @@
Symbol =:= ?space; Symbol =:= ?tab; Symbol =:= ?cr; Symbol =:= ?newline
).
-
%% lists are benchmarked to be faster (tho higher in memory usage) than binaries
new_seq() -> [].
new_seq(C) -> [C].
@@ -96,13 +90,11 @@
end_seq(Seq, _) -> end_seq(Seq).
-
start(<<16#ef, 16#bb, 16#bf, Rest/binary>>, Handler, Stack, Config) ->
value(Rest, Handler, Stack, Config);
start(Bin, Handler, Stack, Config) ->
value(Bin, Handler, Stack, Config).
-
value(<<?doublequote, Rest/binary>>, Handler, Stack, Config) ->
string(Rest, Handler, new_seq(), Stack, Config);
value(<<$t, Rest/binary>>, Handler, Stack, Config) ->
@@ -118,41 +110,37 @@
value(<<S, Rest/binary>>, Handler, Stack, Config) when ?is_nonzero(S) ->
integer(Rest, Handler, new_seq(S), Stack, Config);
value(<<?start_object, Rest/binary>>, Handler, Stack, Config) ->
- object(Rest, handle_event(start_object, Handler, Config), [key|Stack], Config);
+ object(Rest, handle_event(start_object, Handler, Config), [key | Stack], Config);
value(<<?start_array, Rest/binary>>, Handler, Stack, Config) ->
- array(Rest, handle_event(start_array, Handler, Config), [array|Stack], Config);
+ array(Rest, handle_event(start_array, Handler, Config), [array | Stack], Config);
value(<<S, Rest/binary>>, Handler, Stack, Config) when ?is_whitespace(S) ->
value(Rest, Handler, Stack, Config);
value(_Bin, _Handler, _Stack, _Config) ->
erlang:error(badarg).
-
object(<<?doublequote, Rest/binary>>, Handler, Stack, Config) ->
string(Rest, Handler, new_seq(), Stack, Config);
-object(<<?end_object, Rest/binary>>, Handler, [key|Stack], Config) ->
+object(<<?end_object, Rest/binary>>, Handler, [key | Stack], Config) ->
maybe_done(Rest, handle_event(end_object, Handler, Config), Stack, Config);
object(<<S, Rest/binary>>, Handler, Stack, Config) when ?is_whitespace(S) ->
object(Rest, Handler, Stack, Config);
object(_Bin, _Handler, _Stack, _Config) ->
erlang:error(badarg).
-
-array(<<?end_array, Rest/binary>>, Handler, [array|Stack], Config) ->
+array(<<?end_array, Rest/binary>>, Handler, [array | Stack], Config) ->
maybe_done(Rest, handle_event(end_array, Handler, Config), Stack, Config);
array(<<S, Rest/binary>>, Handler, Stack, Config) when ?is_whitespace(S) ->
array(Rest, Handler, Stack, Config);
array(Bin, Handler, Stack, Config) ->
value(Bin, Handler, Stack, Config).
-
-colon(<<?colon, Rest/binary>>, Handler, [key|Stack], Config) ->
- value(Rest, Handler, [object|Stack], Config);
+colon(<<?colon, Rest/binary>>, Handler, [key | Stack], Config) ->
+ value(Rest, Handler, [object | Stack], Config);
colon(<<S, Rest/binary>>, Handler, Stack, Config) when ?is_whitespace(S) ->
colon(Rest, Handler, Stack, Config);
colon(_Bin, _Handler, _Stack, _Config) ->
erlang:error(badarg).
-
key(<<?doublequote, Rest/binary>>, Handler, Stack, Config) ->
string(Rest, Handler, new_seq(), Stack, Config);
key(<<S, Rest/binary>>, Handler, Stack, Config) when ?is_whitespace(S) ->
@@ -160,7 +148,6 @@
key(_Bin, _Handler, _Stack, _Config) ->
erlang:error(badarg).
-
%% note that if you encounter an error from string and you can't find the clause that
%% caused it here, it might be in unescape below
string(<<?doublequote, Rest/binary>>, Handler, Acc, Stack, Config) ->
@@ -212,42 +199,47 @@
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#100000, X < 16#10fffe ->
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
%% surrogates
-string(<<237, X, _, Rest/binary>>, Handler, Acc, Stack, Config=#config{strict_utf8=false})
- when X >= 160 ->
+string(<<237, X, _, Rest/binary>>, Handler, Acc, Stack, Config = #config{strict_utf8 = false}) when
+ X >= 160
+->
string(Rest, Handler, acc_seq(Acc, 16#fffd), Stack, Config);
%% u+xfffe, u+xffff, control codes and other noncharacters
-string(<<_/utf8, Rest/binary>>, Handler, Acc, Stack, Config=#config{strict_utf8=false}) ->
+string(<<_/utf8, Rest/binary>>, Handler, Acc, Stack, Config = #config{strict_utf8 = false}) ->
string(Rest, Handler, acc_seq(Acc, 16#fffd), Stack, Config);
%% u+fffe and u+ffff for R14BXX (subsequent runtimes will happily match the
%% preceding clause
-string(<<239, 191, X, Rest/binary>>, Handler, Acc, Stack, Config=#config{strict_utf8=false})
- when X == 190; X == 191 ->
+string(
+ <<239, 191, X, Rest/binary>>, Handler, Acc, Stack, Config = #config{strict_utf8 = false}
+) when
+ X == 190; X == 191
+->
string(Rest, Handler, acc_seq(Acc, 16#fffd), Stack, Config);
%% overlong encodings and missing continuations of a 2 byte sequence
-string(<<X, Rest/binary>>, Handler, Acc, Stack, Config=#config{strict_utf8=false})
- when X >= 192, X =< 223 ->
+string(<<X, Rest/binary>>, Handler, Acc, Stack, Config = #config{strict_utf8 = false}) when
+ X >= 192, X =< 223
+->
strip_continuations(Rest, Handler, Acc, Stack, Config, 1);
%% overlong encodings and missing continuations of a 3 byte sequence
-string(<<X, Rest/binary>>, Handler, Acc, Stack, Config=#config{strict_utf8=false})
- when X >= 224, X =< 239 ->
+string(<<X, Rest/binary>>, Handler, Acc, Stack, Config = #config{strict_utf8 = false}) when
+ X >= 224, X =< 239
+->
strip_continuations(Rest, Handler, Acc, Stack, Config, 2);
%% overlong encodings and missing continuations of a 4 byte sequence
-string(<<X, Rest/binary>>, Handler, Acc, Stack, Config=#config{strict_utf8=false})
- when X >= 240, X =< 247 ->
+string(<<X, Rest/binary>>, Handler, Acc, Stack, Config = #config{strict_utf8 = false}) when
+ X >= 240, X =< 247
+->
strip_continuations(Rest, Handler, Acc, Stack, Config, 3);
%% incompletes and unexpected bytes, including orphan continuations
-string(<<_, Rest/binary>>, Handler, Acc, Stack, Config=#config{strict_utf8=false}) ->
+string(<<_, Rest/binary>>, Handler, Acc, Stack, Config = #config{strict_utf8 = false}) ->
string(Rest, Handler, acc_seq(Acc, 16#fffd), Stack, Config);
string(_Bin, _Handler, _Acc, _Stack, _Config) ->
- erlang:error(badarg).
+ erlang:error(badarg).
-
-doublequote(Rest, Handler, Acc, [key|_] = Stack, Config) ->
+doublequote(Rest, Handler, Acc, [key | _] = Stack, Config) ->
colon(Rest, handle_event({key, end_seq(Acc, Config)}, Handler, Config), Stack, Config);
doublequote(Rest, Handler, Acc, Stack, Config) ->
maybe_done(Rest, handle_event({string, end_seq(Acc, Config)}, Handler, Config), Stack, Config).
-
%% strips continuation bytes after bad utf bytes, guards against both too short
%% and overlong sequences. N is the maximum number of bytes to strip
strip_continuations(<<Rest/binary>>, Handler, Acc, Stack, Config, 0) ->
@@ -259,7 +251,6 @@
strip_continuations(<<Rest/binary>>, Handler, Acc, Stack, Config, _) ->
string(Rest, Handler, acc_seq(Acc, 16#fffd), Stack, Config).
-
%% this all gets really gross and should probably eventually be folded into
%% but for now it fakes being part of string on incompletes and errors
unescape(<<$b, Rest/binary>>, Handler, Acc, Stack, Config) ->
@@ -278,22 +269,35 @@
string(Rest, Handler, acc_seq(Acc, $\\), Stack, Config);
unescape(<<?solidus, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, acc_seq(Acc, $/), Stack, Config);
-unescape(<<$u, $d, A, B, C, ?rsolidus, $u, $d, X, Y, Z, Rest/binary>>, Handler, Acc, Stack, Config)
- when (A == $8 orelse A == $9 orelse A == $a orelse A == $b),
- (X == $c orelse X == $d orelse X == $e orelse X == $f),
- ?is_hex(B), ?is_hex(C), ?is_hex(Y), ?is_hex(Z)
- ->
+unescape(
+ <<$u, $d, A, B, C, ?rsolidus, $u, $d, X, Y, Z, Rest/binary>>, Handler, Acc, Stack, Config
+) when
+ (A == $8 orelse A == $9 orelse A == $a orelse A == $b),
+ (X == $c orelse X == $d orelse X == $e orelse X == $f),
+ ?is_hex(B),
+ ?is_hex(C),
+ ?is_hex(Y),
+ ?is_hex(Z)
+->
High = erlang:list_to_integer([$d, A, B, C], 16),
Low = erlang:list_to_integer([$d, X, Y, Z], 16),
Codepoint = (High - 16#d800) * 16#400 + (Low - 16#dc00) + 16#10000,
string(Rest, Handler, acc_seq(Acc, Codepoint), Stack, Config);
-unescape(<<$u, $d, A, B, C, ?rsolidus, $u, W, X, Y, Z, Rest/binary>>, Handler, Acc, Stack, Config)
- when (A == $8 orelse A == $9 orelse A == $a orelse A == $b),
- ?is_hex(B), ?is_hex(C), ?is_hex(W), ?is_hex(X), ?is_hex(Y), ?is_hex(Z)
- ->
+unescape(
+ <<$u, $d, A, B, C, ?rsolidus, $u, W, X, Y, Z, Rest/binary>>, Handler, Acc, Stack, Config
+) when
+ (A == $8 orelse A == $9 orelse A == $a orelse A == $b),
+ ?is_hex(B),
+ ?is_hex(C),
+ ?is_hex(W),
+ ?is_hex(X),
+ ?is_hex(Y),
+ ?is_hex(Z)
+->
string(Rest, Handler, acc_seq(Acc, [16#fffd, 16#fffd]), Stack, Config);
-unescape(<<$u, A, B, C, D, Rest/binary>>, Handler, Acc, Stack, Config)
- when ?is_hex(A), ?is_hex(B), ?is_hex(C), ?is_hex(D) ->
+unescape(<<$u, A, B, C, D, Rest/binary>>, Handler, Acc, Stack, Config) when
+ ?is_hex(A), ?is_hex(B), ?is_hex(C), ?is_hex(D)
+->
case erlang:list_to_integer([A, B, C, D], 16) of
Codepoint when Codepoint < 16#d800; Codepoint > 16#dfff ->
string(Rest, Handler, acc_seq(Acc, Codepoint), Stack, Config);
@@ -303,7 +307,6 @@
unescape(_Bin, _Handler, _Acc, _Stack, _Config) ->
erlang:error(badarg).
-
%% like in strings, there's some pseudo states in here that will never
%% show up in errors or incompletes. some show up in value, some show
%% up in integer, decimal or exp
@@ -314,7 +317,6 @@
negative(_Bin, _Handler, _Acc, _Stack, _Config) ->
erlang:error(badarg).
-
zero(<<?decimalpoint, Rest/binary>>, Handler, Acc, Stack, Config) ->
decimal(Rest, Handler, acc_seq(Acc, ?decimalpoint), Stack, Config);
zero(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= $e; S =:= $E ->
@@ -322,7 +324,6 @@
zero(Bin, Handler, Acc, Stack, Config) ->
finish_number(Bin, Handler, {zero, Acc}, Stack, Config).
-
integer(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) ->
integer(Rest, Handler, acc_seq(Acc, S), Stack, Config);
integer(<<?decimalpoint, Rest/binary>>, Handler, Acc, Stack, Config) ->
@@ -332,13 +333,11 @@
integer(Bin, Handler, Acc, Stack, Config) ->
finish_number(Bin, Handler, {integer, Acc}, Stack, Config).
-
initialdecimal(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) ->
decimal(Rest, Handler, acc_seq(Acc, S), Stack, Config);
initialdecimal(_Bin, _Handler, _Acc, _Stack, _Config) ->
erlang:error(badarg).
-
decimal(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) ->
decimal(Rest, Handler, acc_seq(Acc, S), Stack, Config);
decimal(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= $e; S =:= $E ->
@@ -346,7 +345,6 @@
decimal(Bin, Handler, Acc, Stack, Config) ->
finish_number(Bin, Handler, {decimal, Acc}, Stack, Config).
-
e(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) ->
exp(Rest, Handler, acc_seq(Acc, S), Stack, Config);
e(<<Sign, Rest/binary>>, Handler, Acc, Stack, Config) when Sign =:= ?positive; Sign =:= ?negative ->
@@ -354,66 +352,59 @@
e(_Bin, _Handler, _Acc, _Stack, _Config) ->
erlang:error(badarg).
-
ex(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) ->
exp(Rest, Handler, acc_seq(Acc, S), Stack, Config);
ex(_Bin, _Handler, _Acc, _Stack, _Config) ->
erlang:error(badarg).
-
exp(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) ->
exp(Rest, Handler, acc_seq(Acc, S), Stack, Config);
exp(Bin, Handler, Acc, Stack, Config) ->
finish_number(Bin, Handler, {exp, Acc}, Stack, Config).
-
finish_number(Rest, Handler, Acc, [], Config) ->
maybe_done(Rest, handle_event(format_number(Acc), Handler, Config), [], Config);
finish_number(Rest, Handler, Acc, Stack, Config) ->
maybe_done(Rest, handle_event(format_number(Acc), Handler, Config), Stack, Config).
-
format_number({zero, Acc}) -> {integer, list_to_integer(lists:reverse(Acc))};
format_number({integer, Acc}) -> {integer, list_to_integer(lists:reverse(Acc))};
format_number({decimal, Acc}) -> {float, list_to_float(lists:reverse(Acc))};
format_number({exp, Acc}) -> {float, list_to_float(lists:reverse(Acc))}.
-
true(<<$r, $u, $e, Rest/binary>>, Handler, Stack, Config) ->
maybe_done(Rest, handle_event({literal, true}, Handler, Config), Stack, Config);
true(_Bin, _Handler, _Stack, _Config) ->
erlang:error(badarg).
-
false(<<$a, $l, $s, $e, Rest/binary>>, Handler, Stack, Config) ->
maybe_done(Rest, handle_event({literal, false}, Handler, Config), Stack, Config);
false(_Bin, _Handler, _Stack, _Config) ->
erlang:error(badarg).
-
null(<<$u, $l, $l, Rest/binary>>, Handler, Stack, Config) ->
maybe_done(Rest, handle_event({literal, null}, Handler, Config), Stack, Config);
null(_Bin, _Handler, _Stack, _Config) ->
erlang:error(badarg).
-
maybe_done(<<Rest/binary>>, Handler, [], Config) ->
done(Rest, handle_event(end_json, Handler, Config), [], Config);
-maybe_done(<<?end_object, Rest/binary>>, Handler, [object|Stack], Config) ->
+maybe_done(<<?end_object, Rest/binary>>, Handler, [object | Stack], Config) ->
maybe_done(Rest, handle_event(end_object, Handler, Config), Stack, Config);
-maybe_done(<<?end_array, Rest/binary>>, Handler, [array|Stack], Config) ->
+maybe_done(<<?end_array, Rest/binary>>, Handler, [array | Stack], Config) ->
maybe_done(Rest, handle_event(end_array, Handler, Config), Stack, Config);
-maybe_done(<<?comma, Rest/binary>>, Handler, [object|Stack], Config) ->
- key(Rest, Handler, [key|Stack], Config);
-maybe_done(<<?comma, Rest/binary>>, Handler, [array|_] = Stack, Config) ->
+maybe_done(<<?comma, Rest/binary>>, Handler, [object | Stack], Config) ->
+ key(Rest, Handler, [key | Stack], Config);
+maybe_done(<<?comma, Rest/binary>>, Handler, [array | _] = Stack, Config) ->
value(Rest, Handler, Stack, Config);
maybe_done(<<S, Rest/binary>>, Handler, Stack, Config) when ?is_whitespace(S) ->
maybe_done(Rest, Handler, Stack, Config);
maybe_done(_Bin, _Handler, _Stack, _Config) ->
erlang:error(badarg).
-
done(<<S, Rest/binary>>, Handler, [], Config) when ?is_whitespace(S) ->
done(Rest, Handler, [], Config);
-done(<<>>, {_Handler, State}, [], _Config) -> State;
-done(_Bin, _Handler, _Stack, _Config) -> erlang:error(badarg).
+done(<<>>, {_Handler, State}, [], _Config) ->
+ State;
+done(_Bin, _Handler, _Stack, _Config) ->
+ erlang:error(badarg).
diff --git a/lib/erl/src/thrift_json_protocol.erl b/lib/erl/src/thrift_json_protocol.erl
index c5f3da8..b0a3918 100644
--- a/lib/erl/src/thrift_json_protocol.erl
+++ b/lib/erl/src/thrift_json_protocol.erl
@@ -27,35 +27,38 @@
-include("thrift_constants.hrl").
-include("thrift_protocol.hrl").
--export([new/1, new/2,
- read/2,
- write/2,
- flush_transport/1,
- close_transport/1,
- new_protocol_factory/2
- ]).
+-export([
+ new/1, new/2,
+ read/2,
+ write/2,
+ flush_transport/1,
+ close_transport/1,
+ new_protocol_factory/2
+]).
-record(json_context, {
% the type of json_context: array or object
- type,
+ type :: undefined | array | object,
% fields read or written
- fields_processed = 0
+ fields_processed = 0 :: non_neg_integer()
}).
+-type json_context() :: #json_context{}.
+-type jsx_type() :: atom() | {atom(), atom() | string()}.
+-type jsx() :: {event, jsx_type(), [jsx_type()]}.
+
-record(json_protocol, {
- transport,
- context_stack = [],
- jsx
+ transport :: term(),
+ context_stack = [] :: [json_context()],
+ jsx :: undefined | jsx()
}).
--type state() :: #json_protocol{}.
--include("thrift_protocol_behaviour.hrl").
-define(VERSION_1, 1).
-define(JSON_DOUBLE_PRECISION, 16).
typeid_to_json(?tType_BOOL) -> "tf";
-typeid_to_json(?tType_BYTE) -> "i8";
typeid_to_json(?tType_DOUBLE) -> "dbl";
+% NOTE: ?tType_BYTE also match here
typeid_to_json(?tType_I8) -> "i8";
typeid_to_json(?tType_I16) -> "i16";
typeid_to_json(?tType_I32) -> "i32";
@@ -84,28 +87,33 @@
end_context(object) -> "}";
end_context(array) -> "]".
-
new(Transport) ->
new(Transport, _Options = []).
new(Transport, _Options) ->
- State = #json_protocol{transport = Transport},
+ State = #json_protocol{transport = Transport},
thrift_protocol:new(?MODULE, State).
flush_transport(This = #json_protocol{transport = Transport}) ->
{NewTransport, Result} = thrift_transport:flush(Transport),
- {This#json_protocol{
+ {
+ This#json_protocol{
transport = NewTransport,
context_stack = []
- }, Result}.
+ },
+ Result
+ }.
close_transport(This = #json_protocol{transport = Transport}) ->
{NewTransport, Result} = thrift_transport:close(Transport),
- {This#json_protocol{
+ {
+ This#json_protocol{
transport = NewTransport,
context_stack = [],
jsx = undefined
- }, Result}.
+ },
+ Result
+ }.
%%%
%%% instance methods
@@ -113,63 +121,82 @@
% places a new context on the stack:
write(#json_protocol{context_stack = Stack} = State0, {enter_context, Type}) ->
{State1, ok} = write_values(State0, [{context_pre_item, false}]),
- State2 = State1#json_protocol{context_stack = [
- #json_context{type=Type}|Stack]},
- write_values(State2, [list_to_binary(start_context(Type))]);
-
-% removes the topmost context from stack
-write(#json_protocol{context_stack = [CurrCtxt|Stack]} = State0, {exit_context}) ->
+ State2 = State1#json_protocol{
+ context_stack = [
+ #json_context{type = Type} | Stack
+ ]
+ },
+ write_values(State2, [list_to_binary(start_context(Type))]);
+% removes the topmost context from stack
+write(#json_protocol{context_stack = [CurrCtxt | Stack]} = State0, {exit_context}) ->
Type = CurrCtxt#json_context.type,
State1 = State0#json_protocol{context_stack = Stack},
write_values(State1, [
- list_to_binary(end_context(Type)),
- {context_post_item, false}
- ]);
-
-% writes necessary prelude to field or container depending on current context
-write(#json_protocol{context_stack = []} = This0,
- {context_pre_item, _}) -> {This0, ok};
-write(#json_protocol{context_stack = [Context|_CtxtTail]} = This0,
- {context_pre_item, MayNeedQuotes}) ->
+ list_to_binary(end_context(Type)),
+ {context_post_item, false}
+ ]);
+% writes necessary prelude to field or container depending on current context
+write(
+ #json_protocol{context_stack = []} = This0,
+ {context_pre_item, _}
+) ->
+ {This0, ok};
+write(
+ #json_protocol{context_stack = [Context | _CtxtTail]} = This0,
+ {context_pre_item, MayNeedQuotes}
+) ->
FieldNo = Context#json_context.fields_processed,
CtxtType = Context#json_context.type,
Rem = FieldNo rem 2,
case {CtxtType, FieldNo, Rem, MayNeedQuotes} of
- {array, N, _, _} when N > 0 -> % array element (not first)
+ % array element (not first)
+ {array, N, _, _} when N > 0 ->
write(This0, <<",">>);
- {object, 0, _, true} -> % non-string object key (first)
+ % non-string object key (first)
+ {object, 0, _, true} ->
write(This0, <<"\"">>);
- {object, N, 0, true} when N > 0 -> % non-string object key (not first)
+ % non-string object key (not first)
+ {object, N, 0, true} when N > 0 ->
write(This0, <<",\"">>);
- {object, N, 0, false} when N > 0-> % string object key (not first)
+ % string object key (not first)
+ {object, N, 0, false} when N > 0 ->
write(This0, <<",">>);
- _ -> % no pre-field necessary
+ % no pre-field necessary
+ _ ->
{This0, ok}
end;
-
-% writes necessary postlude to field or container depending on current context
-write(#json_protocol{context_stack = []} = This0,
- {context_post_item, _}) -> {This0, ok};
-write(#json_protocol{context_stack = [Context|CtxtTail]} = This0,
- {context_post_item, MayNeedQuotes}) ->
+% writes necessary postlude to field or container depending on current context
+write(
+ #json_protocol{context_stack = []} = This0,
+ {context_post_item, _}
+) ->
+ {This0, ok};
+write(
+ #json_protocol{context_stack = [Context | CtxtTail]} = This0,
+ {context_post_item, MayNeedQuotes}
+) ->
FieldNo = Context#json_context.fields_processed,
CtxtType = Context#json_context.type,
Rem = FieldNo rem 2,
- {This1, ok} = case {CtxtType, Rem, MayNeedQuotes} of
- {object, 0, true} -> % non-string object key
- write(This0, <<"\":">>);
- {object, 0, false} -> % string object key
- write(This0, <<":">>);
- _ -> % no pre-field necessary
- {This0, ok}
- end,
+ {This1, ok} =
+ case {CtxtType, Rem, MayNeedQuotes} of
+ % non-string object key
+ {object, 0, true} ->
+ write(This0, <<"\":">>);
+ % string object key
+ {object, 0, false} ->
+ write(This0, <<":">>);
+ % no pre-field necessary
+ _ ->
+ {This0, ok}
+ end,
NewContext = Context#json_context{fields_processed = FieldNo + 1},
- {This1#json_protocol{context_stack=[NewContext|CtxtTail]}, ok};
-
+ {This1#json_protocol{context_stack = [NewContext | CtxtTail]}, ok};
write(This0, #protocol_message_begin{
name = Name,
type = Type,
- seqid = Seqid}) ->
+ seqid = Seqid
+}) ->
write_values(This0, [
{enter_context, array},
{i32, ?VERSION_1},
@@ -177,15 +204,14 @@
{i32, Type},
{i32, Seqid}
]);
-
-write(This, message_end) ->
+write(This, message_end) ->
write_values(This, [{exit_context}]);
-
% Example field expression: "1":{"dbl":3.14}
write(This0, #protocol_field_begin{
- name = _Name,
- type = Type,
- id = Id}) ->
+ name = _Name,
+ type = Type,
+ id = Id
+}) ->
write_values(This0, [
% entering 'outer' object
{i16, Id},
@@ -193,18 +219,16 @@
{enter_context, object},
{string, typeid_to_json(Type)}
]);
-
-write(This, field_stop) ->
+write(This, field_stop) ->
{This, ok};
-
-write(This, field_end) ->
- write_values(This,[{exit_context}]);
-
+write(This, field_end) ->
+ write_values(This, [{exit_context}]);
% Example message with map: [1,"testMap",1,0,{"1":{"map":["i32","i32",3,{"7":77,"8":88,"9":99}]}}]
write(This0, #protocol_map_begin{
- ktype = Ktype,
- vtype = Vtype,
- size = Size}) ->
+ ktype = Ktype,
+ vtype = Vtype,
+ size = Size
+}) ->
write_values(This0, [
{enter_context, array},
{string, typeid_to_json(Ktype)},
@@ -212,86 +236,79 @@
{i32, Size},
{enter_context, object}
]);
-
-write(This, map_end) ->
- write_values(This,[
+write(This, map_end) ->
+ write_values(This, [
{exit_context},
{exit_context}
]);
-
write(This0, #protocol_list_begin{
- etype = Etype,
- size = Size}) ->
+ etype = Etype,
+ size = Size
+}) ->
write_values(This0, [
{enter_context, array},
{string, typeid_to_json(Etype)},
{i32, Size}
]);
-
-write(This, list_end) ->
- write_values(This,[
+write(This, list_end) ->
+ write_values(This, [
{exit_context}
]);
-
% example message with set: [1,"testSet",1,0,{"1":{"set":["i32",3,1,2,3]}}]
write(This0, #protocol_set_begin{
- etype = Etype,
- size = Size}) ->
+ etype = Etype,
+ size = Size
+}) ->
write_values(This0, [
{enter_context, array},
{string, typeid_to_json(Etype)},
{i32, Size}
]);
-
-write(This, set_end) ->
- write_values(This,[
+write(This, set_end) ->
+ write_values(This, [
{exit_context}
]);
% example message with struct: [1,"testStruct",1,0,{"1":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":1152921504606847000}}}}]
-write(This, #protocol_struct_begin{}) ->
+write(This, #protocol_struct_begin{}) ->
write_values(This, [
{enter_context, object}
]);
-
-write(This, struct_end) ->
- write_values(This,[
+write(This, struct_end) ->
+ write_values(This, [
{exit_context}
]);
-
-write(This, {bool, true}) -> write_values(This, [
+write(This, {bool, true}) ->
+ write_values(This, [
{context_pre_item, true},
<<"true">>,
{context_post_item, true}
]);
-
-write(This, {bool, false}) -> write_values(This, [
+write(This, {bool, false}) ->
+ write_values(This, [
{context_pre_item, true},
<<"false">>,
{context_post_item, true}
]);
-
-write(This, {byte, Byte}) -> write_values(This, [
+write(This, {byte, Byte}) ->
+ write_values(This, [
{context_pre_item, true},
list_to_binary(integer_to_list(Byte)),
{context_post_item, true}
]);
-
write(This, {i16, I16}) ->
write(This, {byte, I16});
-
write(This, {i32, I32}) ->
write(This, {byte, I32});
-
write(This, {i64, I64}) ->
write(This, {byte, I64});
-
-write(This, {double, Double}) -> write_values(This, [
+write(This, {double, Double}) ->
+ write_values(This, [
{context_pre_item, true},
- list_to_binary(io_lib:format("~.*f", [?JSON_DOUBLE_PRECISION,Double])),
+ list_to_binary(io_lib:format("~.*f", [?JSON_DOUBLE_PRECISION, Double])),
{context_post_item, true}
]);
-
-write(This0, {string, Str}) -> write_values(This0, [
+write(This0, {string, Str}) ->
+ write_values(This0, [
{context_pre_item, false},
case is_binary(Str) of
true -> Str;
@@ -299,7 +316,6 @@
end,
{context_post_item, false}
]);
-
%% TODO: binary fields should be base64 encoded?
%% Data :: iolist()
@@ -315,10 +331,11 @@
ThisOut
end,
This0,
- ValueList),
+ ValueList
+ ),
{FinalState, ok}.
-%% I wish the erlang version of the transport interface included a
+%% I wish the erlang version of the transport interface included a
%% read_all function (like eg. the java implementation). Since it doesn't,
%% here's my version (even though it probably shouldn't be in this file).
%%
@@ -327,7 +344,7 @@
read_all(#json_protocol{transport = Transport0} = State) ->
{Transport1, Bin} = read_all_1(Transport0, []),
P = thrift_json_parser:parser(),
- [First|Rest] = P(Bin),
+ [First | Rest] = P(Bin),
State#json_protocol{
transport = Transport1,
jsx = {event, First, Rest}
@@ -336,11 +353,14 @@
read_all_1(Transport0, IoList) ->
{Transport1, Result} = thrift_transport:read(Transport0, 1),
case Result of
- {ok, <<>>} -> % nothing read: assume we're done
+ % nothing read: assume we're done
+ {ok, <<>>} ->
{Transport1, iolist_to_binary(lists:reverse(IoList))};
- {ok, Data} -> % character successfully read; read more
- read_all_1(Transport1, [Data|IoList]);
- {error, 'EOF'} -> % we're done
+ % character successfully read; read more
+ {ok, Data} ->
+ read_all_1(Transport1, [Data | IoList]);
+ % we're done
+ {error, 'EOF'} ->
{Transport1, iolist_to_binary(lists:reverse(IoList))}
end.
@@ -348,17 +368,16 @@
% type as input. Comparing the read event from the one is was passed, it
% returns an error if something other than the expected value is encountered.
% Expect also maintains the context stack in #json_protocol.
-expect(#json_protocol{jsx={event, {Type, Data}=Ev, [Next|Rest]}}=State, ExpectedType) ->
- NextState = State#json_protocol{jsx={event, Next, Rest}},
+expect(#json_protocol{jsx = {event, {Type, Data} = Ev, [Next | Rest]}} = State, ExpectedType) ->
+ NextState = State#json_protocol{jsx = {event, Next, Rest}},
case Type == ExpectedType of
- true ->
+ true ->
{NextState, {ok, convert_data(Type, Data)}};
false ->
{NextState, {error, {unexpected_json_event, Ev}}}
end;
-
-expect(#json_protocol{jsx={event, Event, Next}}=State, ExpectedEvent) ->
- expect(State#json_protocol{jsx={event, {Event, none}, Next}}, ExpectedEvent).
+expect(#json_protocol{jsx = {event, Event, Next}} = State, ExpectedEvent) ->
+ expect(State#json_protocol{jsx = {event, {Event, none}, Next}}, ExpectedEvent).
convert_data(integer, I) -> list_to_integer(I);
convert_data(float, F) -> list_to_float(F);
@@ -369,9 +388,9 @@
expect_many_1(State, [], ResultList, Status) ->
{State, {Status, lists:reverse(ResultList)}};
-expect_many_1(State, [Expected|ExpTail], ResultList, _PrevStatus) ->
+expect_many_1(State, [Expected | ExpTail], ResultList, _PrevStatus) ->
{State1, {Status, Data}} = expect(State, Expected),
- NewResultList = [Data|ResultList],
+ NewResultList = [Data | ResultList],
case Status of
% in case of error, end prematurely
error -> expect_many_1(State1, [], NewResultList, Status);
@@ -381,178 +400,202 @@
% wrapper around expect to make life easier for container opening/closing functions
expect_nodata(This, ExpectedList) ->
case expect_many(This, ExpectedList) of
- {State, {ok, _}} ->
+ {State, {ok, _}} ->
{State, ok};
- Error ->
+ Error ->
Error
end.
-read_field(#json_protocol{jsx={event, Field, [Next|Rest]}} = State) ->
- NewState = State#json_protocol{jsx={event, Next, Rest}},
+read_field(#json_protocol{jsx = {event, Field, [Next | Rest]}} = State) ->
+ NewState = State#json_protocol{jsx = {event, Next, Rest}},
{NewState, Field}.
read(This0, message_begin) ->
% call read_all to get the contents of the transport buffer into JSX.
This1 = read_all(This0),
- case expect_many(This1,
- [start_array, integer, string, integer, integer]) of
+ case
+ expect_many(
+ This1,
+ [start_array, integer, string, integer, integer]
+ )
+ of
{This2, {ok, [_, Version, Name, Type, SeqId]}} ->
case Version =:= ?VERSION_1 of
true ->
- {This2, #protocol_message_begin{name = Name,
- type = Type,
- seqid = SeqId}};
+ {This2, #protocol_message_begin{
+ name = Name,
+ type = Type,
+ seqid = SeqId
+ }};
false ->
{This2, {error, no_json_protocol_version}}
end;
- Other -> Other
+ Other ->
+ Other
end;
-
-read(This, message_end) ->
+read(This, message_end) ->
expect_nodata(This, [end_array]);
-
-read(This, struct_begin) ->
+read(This, struct_begin) ->
expect_nodata(This, [start_object]);
-
-read(This, struct_end) ->
+read(This, struct_end) ->
expect_nodata(This, [end_object]);
-
read(This0, field_begin) ->
- {This1, Read} = expect_many(This0,
- [%field id
- key,
- % {} surrounding field
- start_object,
- % type of field
- key]),
+ {This1, Read} = expect_many(
+ This0,
+ %field id
+ [
+ key,
+ % {} surrounding field
+ start_object,
+ % type of field
+ key
+ ]
+ ),
case Read of
{ok, [FieldIdStr, _, FieldType]} ->
{This1, #protocol_field_begin{
- type = json_to_typeid(FieldType),
- id = list_to_integer(FieldIdStr)}}; % TODO: do we need to wrap this in a try/catch?
- {error,[{unexpected_json_event, {end_object,none}}]} ->
+ type = json_to_typeid(FieldType),
+ % TODO: do we need to wrap this in a try/catch?
+ id = list_to_integer(FieldIdStr)
+ }};
+ {error, [{unexpected_json_event, {end_object, none}}]} ->
{This1, #protocol_field_begin{type = ?tType_STOP}};
- Other ->
+ Other ->
io:format("**** OTHER branch selected ****"),
{This1, Other}
end;
-
-read(This, field_end) ->
+read(This, field_end) ->
expect_nodata(This, [end_object]);
-
% Example message with map: [1,"testMap",1,0,{"1":{"map":["i32","i32",3,{"7":77,"8":88,"9":99}]}}]
read(This0, map_begin) ->
- case expect_many(This0,
- [start_array,
- % key type
- string,
- % value type
- string,
- % size
- integer,
- % the following object contains the map
- start_object]) of
+ case
+ expect_many(
+ This0,
+ [
+ start_array,
+ % key type
+ string,
+ % value type
+ string,
+ % size
+ integer,
+ % the following object contains the map
+ start_object
+ ]
+ )
+ of
{This1, {ok, [_, Ktype, Vtype, Size, _]}} ->
- {This1, #protocol_map_begin{ktype = Ktype,
- vtype = Vtype,
- size = Size}};
- Other -> Other
+ {This1, #protocol_map_begin{
+ ktype = Ktype,
+ vtype = Vtype,
+ size = Size
+ }};
+ Other ->
+ Other
end;
-
-read(This, map_end) ->
+read(This, map_end) ->
expect_nodata(This, [end_object, end_array]);
-
read(This0, list_begin) ->
- case expect_many(This0,
- [start_array,
- % element type
- string,
- % size
- integer]) of
+ case
+ expect_many(
+ This0,
+ [
+ start_array,
+ % element type
+ string,
+ % size
+ integer
+ ]
+ )
+ of
{This1, {ok, [_, Etype, Size]}} ->
{This1, #protocol_list_begin{
etype = Etype,
- size = Size}};
- Other -> Other
+ size = Size
+ }};
+ Other ->
+ Other
end;
-
-read(This, list_end) ->
+read(This, list_end) ->
expect_nodata(This, [end_array]);
-
% example message with set: [1,"testSet",1,0,{"1":{"set":["i32",3,1,2,3]}}]
read(This0, set_begin) ->
- case expect_many(This0,
- [start_array,
- % element type
- string,
- % size
- integer]) of
+ case
+ expect_many(
+ This0,
+ [
+ start_array,
+ % element type
+ string,
+ % size
+ integer
+ ]
+ )
+ of
{This1, {ok, [_, Etype, Size]}} ->
{This1, #protocol_set_begin{
etype = Etype,
- size = Size}};
- Other -> Other
+ size = Size
+ }};
+ Other ->
+ Other
end;
-
-read(This, set_end) ->
+read(This, set_end) ->
expect_nodata(This, [end_array]);
-
read(This0, field_stop) ->
{This0, ok};
%%
read(This0, bool) ->
{This1, Field} = read_field(This0),
- Value = case Field of
- {literal, I} ->
- {ok, I};
- _Other ->
- {error, unexpected_event_for_boolean}
- end,
+ Value =
+ case Field of
+ {literal, I} ->
+ {ok, I};
+ _Other ->
+ {error, unexpected_event_for_boolean}
+ end,
{This1, Value};
-
read(This0, byte) ->
{This1, Field} = read_field(This0),
- Value = case Field of
- {key, K} ->
- {ok, list_to_integer(K)};
- {integer, I} ->
- {ok, list_to_integer(I)};
- _Other ->
- {error, unexpected_event_for_integer}
- end,
+ Value =
+ case Field of
+ {key, K} ->
+ {ok, list_to_integer(K)};
+ {integer, I} ->
+ {ok, list_to_integer(I)};
+ _Other ->
+ {error, unexpected_event_for_integer}
+ end,
{This1, Value};
-
read(This0, i16) ->
read(This0, byte);
-
read(This0, i32) ->
read(This0, byte);
-
read(This0, i64) ->
read(This0, byte);
-
read(This0, double) ->
{This1, Field} = read_field(This0),
- Value = case Field of
- {float, I} ->
- {ok, list_to_float(I)};
- _Other ->
- {error, unexpected_event_for_double}
- end,
+ Value =
+ case Field of
+ {float, I} ->
+ {ok, list_to_float(I)};
+ _Other ->
+ {error, unexpected_event_for_double}
+ end,
{This1, Value};
-
% returns a binary directly, call binary_to_list if necessary
read(This0, string) ->
{This1, Field} = read_field(This0),
- Value = case Field of
- {string, I} ->
- {ok, I};
- {key, J} ->
- {ok, J};
- _Other ->
- {error, unexpected_event_for_string}
- end,
+ Value =
+ case Field of
+ {string, I} ->
+ {ok, I};
+ {key, J} ->
+ {ok, J};
+ _Other ->
+ {error, unexpected_event_for_string}
+ end,
{This1, Value}.
%%%% FACTORY GENERATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -561,7 +604,7 @@
new_protocol_factory(TransportFactory, _Options) ->
% Only strice read/write are implemented
F = fun() ->
- {ok, Transport} = TransportFactory(),
- thrift_json_protocol:new(Transport, [])
- end,
+ {ok, Transport} = TransportFactory(),
+ thrift_json_protocol:new(Transport, [])
+ end,
{ok, F}.
diff --git a/lib/erl/src/thrift_membuffer_transport.erl b/lib/erl/src/thrift_membuffer_transport.erl
index be9acb2..df23b03 100644
--- a/lib/erl/src/thrift_membuffer_transport.erl
+++ b/lib/erl/src/thrift_membuffer_transport.erl
@@ -22,62 +22,55 @@
-behaviour(thrift_transport).
%% constructors
--export([new/0, new/1]).
+-export([new/0, new/1, new/2]).
%% protocol callbacks
-export([read/2, read_exact/2, write/2, flush/1, close/1]).
-
-record(t_membuffer, {
- buffer = []
+ buffer = [] :: iodata()
}).
--type state() :: #t_membuffer{}.
-
-
--spec new() -> thrift_transport:t_transport().
+-spec new() -> {ok, thrift_transport:t_transport()}.
new() -> new([]).
--spec new(Buf::iodata()) -> thrift_transport:t_transport().
+-spec new(Buf :: iodata()) -> {ok, thrift_transport:t_transport()}.
-new(Buf) when is_list(Buf) ->
- State = #t_membuffer{buffer = Buf},
- thrift_transport:new(?MODULE, State);
-new(Buf) when is_binary(Buf) ->
- State = #t_membuffer{buffer = [Buf]},
- thrift_transport:new(?MODULE, State).
+new(Buf) ->
+ new(Buf, []).
+new(Buf, _Opts) when is_list(Buf) ->
+ State = #t_membuffer{buffer = Buf},
+ thrift_transport:new(?MODULE, State);
+new(Buf, _Opts) when is_binary(Buf) ->
+ State = #t_membuffer{buffer = [Buf]},
+ thrift_transport:new(?MODULE, State).
--include("thrift_transport_behaviour.hrl").
+read(State = #t_membuffer{buffer = Buf}, Len) when
+ is_integer(Len), Len >= 0
+->
+ Binary = iolist_to_binary(Buf),
+ Give = min(iolist_size(Binary), Len),
+ {Result, Remaining} = split_binary(Binary, Give),
+ {State#t_membuffer{buffer = Remaining}, {ok, Result}}.
+read_exact(State = #t_membuffer{buffer = Buf}, Len) when
+ is_integer(Len), Len >= 0
+->
+ Binary = iolist_to_binary(Buf),
+ case iolist_size(Binary) of
+ X when X >= Len ->
+ {Result, Remaining} = split_binary(Binary, Len),
+ {State#t_membuffer{buffer = Remaining}, {ok, Result}};
+ _ ->
+ {State, {error, eof}}
+ end.
-read(State = #t_membuffer{buffer = Buf}, Len)
-when is_integer(Len), Len >= 0 ->
- Binary = iolist_to_binary(Buf),
- Give = min(iolist_size(Binary), Len),
- {Result, Remaining} = split_binary(Binary, Give),
- {State#t_membuffer{buffer = Remaining}, {ok, Result}}.
-
-
-read_exact(State = #t_membuffer{buffer = Buf}, Len)
-when is_integer(Len), Len >= 0 ->
- Binary = iolist_to_binary(Buf),
- case iolist_size(Binary) of
- X when X >= Len ->
- {Result, Remaining} = split_binary(Binary, Len),
- {State#t_membuffer{buffer = Remaining}, {ok, Result}};
- _ ->
- {State, {error, eof}}
- end.
-
-
-write(State = #t_membuffer{buffer = Buf}, Data)
-when is_list(Data); is_binary(Data) ->
- {State#t_membuffer{buffer = [Buf, Data]}, ok}.
-
+write(State = #t_membuffer{buffer = Buf}, Data) when
+ is_list(Data); is_binary(Data)
+->
+ {State#t_membuffer{buffer = [Buf, Data]}, ok}.
flush(State) -> {State, ok}.
-
close(State) -> {State, ok}.
-
diff --git a/lib/erl/src/thrift_memory_buffer.erl b/lib/erl/src/thrift_memory_buffer.erl
index 6a59ea5..3007f73 100644
--- a/lib/erl/src/thrift_memory_buffer.erl
+++ b/lib/erl/src/thrift_memory_buffer.erl
@@ -28,7 +28,6 @@
%% legacy api
-export([new_transport_factory/0]).
-
%% wrapper around thrift_membuffer_transport for legacy reasons
new() -> thrift_membuffer_transport:new().
@@ -44,4 +43,3 @@
flush(State) -> thrift_membuffer_transport:flush(State).
close(State) -> thrift_membuffer_transport:close(State).
-
diff --git a/lib/erl/src/thrift_multiplexed_map_wrapper.erl b/lib/erl/src/thrift_multiplexed_map_wrapper.erl
index 34c5e95..706aaf7 100644
--- a/lib/erl/src/thrift_multiplexed_map_wrapper.erl
+++ b/lib/erl/src/thrift_multiplexed_map_wrapper.erl
@@ -20,15 +20,15 @@
-module(thrift_multiplexed_map_wrapper).
-export([
- new/0
- ,store/3
- ,find/2
- ,fetch/2
- ]).
+ new/0,
+ store/3,
+ find/2,
+ fetch/2
+]).
--type service_handler() :: nonempty_string().
--type module_() :: atom().
--type service_handler_map() :: [{ServiceHandler::service_handler(), Module::module_()}].
+-type service_handler() :: nonempty_string().
+-type service_handler_map() :: orddict:orddict(service_handler(), [module()]).
+-export_type([service_handler_map/0]).
-spec new() -> service_handler_map().
new() ->
@@ -36,22 +36,22 @@
-spec store(ServiceHandler, Module, Map) -> NewMap when
ServiceHandler :: service_handler(),
- Module :: module_(),
- Map :: service_handler_map(),
- NewMap :: service_handler_map().
+ Module :: module(),
+ Map :: service_handler_map(),
+ NewMap :: service_handler_map().
store(ServiceHandler, Module, Map) ->
orddict:store(ServiceHandler, Module, Map).
-spec find(ServiceHandler, Map) -> {ok, Module} | error when
ServiceHandler :: service_handler(),
- Module :: module_(),
- Map :: service_handler_map().
+ Module :: module(),
+ Map :: service_handler_map().
find(ServiceHandler, Map) ->
orddict:find(ServiceHandler, Map).
-spec fetch(ServiceHandler, Map) -> Module when
ServiceHandler :: service_handler(),
- Module :: module_(),
- Map :: service_handler_map().
+ Module :: module(),
+ Map :: service_handler_map().
fetch(ServiceHandler, Map) ->
orddict:fetch(ServiceHandler, Map).
diff --git a/lib/erl/src/thrift_multiplexed_protocol.erl b/lib/erl/src/thrift_multiplexed_protocol.erl
index 5f7b70c..ddc9475 100644
--- a/lib/erl/src/thrift_multiplexed_protocol.erl
+++ b/lib/erl/src/thrift_multiplexed_protocol.erl
@@ -24,60 +24,91 @@
-include("thrift_constants.hrl").
-include("thrift_protocol.hrl").
--include("thrift_protocol_behaviour.hrl").
+-export([
+ new/2,
+ read/2,
+ write/2,
+ flush_transport/1,
+ close_transport/1
+]).
--export([new/2,
- read/2,
- write/2,
- flush_transport/1,
- close_transport/1
- ]).
-
--record(protocol, {module, data}).
+-record(protocol, {
+ module :: module(),
+ data :: term()
+}).
-type protocol() :: #protocol{}.
--record (multiplexed_protocol, {protocol_module_to_decorate::atom(),
- protocol_data_to_decorate::term(),
- service_name::nonempty_string()}).
+-record(multiplexed_protocol, {
+ protocol_module_to_decorate :: atom(),
+ protocol_data_to_decorate :: term(),
+ service_name :: nonempty_string()
+}).
--type state() :: #multiplexed_protocol{}.
-
--spec new(ProtocolToDecorate::protocol(), ServiceName::nonempty_string()) -> {ok, Protocol::protocol()}.
-new(ProtocolToDecorate, ServiceName) when is_record(ProtocolToDecorate, protocol),
- is_list(ServiceName) ->
- State = #multiplexed_protocol{protocol_module_to_decorate = ProtocolToDecorate#protocol.module,
- protocol_data_to_decorate = ProtocolToDecorate#protocol.data,
- service_name = ServiceName},
+-spec new(ProtocolToDecorate :: protocol(), ServiceName :: nonempty_string()) ->
+ {ok, Protocol :: protocol()}.
+new(ProtocolToDecorate, ServiceName) when
+ is_record(ProtocolToDecorate, protocol),
+ is_list(ServiceName)
+->
+ State = #multiplexed_protocol{
+ protocol_module_to_decorate = ProtocolToDecorate#protocol.module,
+ protocol_data_to_decorate = ProtocolToDecorate#protocol.data,
+ service_name = ServiceName
+ },
thrift_protocol:new(?MODULE, State).
-flush_transport(State = #multiplexed_protocol{protocol_module_to_decorate = ProtocolModuleToDecorate,
- protocol_data_to_decorate = State0}) ->
+flush_transport(
+ State = #multiplexed_protocol{
+ protocol_module_to_decorate = ProtocolModuleToDecorate,
+ protocol_data_to_decorate = State0
+ }
+) ->
{State1, ok} = ProtocolModuleToDecorate:flush_transport(State0),
{State#multiplexed_protocol{protocol_data_to_decorate = State1}, ok}.
-close_transport(State = #multiplexed_protocol{protocol_module_to_decorate = ProtocolModuleToDecorate,
- protocol_data_to_decorate = State0}) ->
+close_transport(
+ State = #multiplexed_protocol{
+ protocol_module_to_decorate = ProtocolModuleToDecorate,
+ protocol_data_to_decorate = State0
+ }
+) ->
{State1, ok} = ProtocolModuleToDecorate:close_transport(State0),
{State#multiplexed_protocol{protocol_data_to_decorate = State1}, ok}.
-write(State = #multiplexed_protocol{protocol_module_to_decorate = ProtocolModuleToDecorate,
- protocol_data_to_decorate = State0,
- service_name = ServiceName},
- Message = #protocol_message_begin{name = Name}) ->
- {State1, ok} = ProtocolModuleToDecorate:write(State0,
- Message#protocol_message_begin{name=ServiceName ++
- ?MULTIPLEXED_SERVICE_SEPARATOR ++
- Name}),
+write(
+ State = #multiplexed_protocol{
+ protocol_module_to_decorate = ProtocolModuleToDecorate,
+ protocol_data_to_decorate = State0,
+ service_name = ServiceName
+ },
+ Message = #protocol_message_begin{name = Name}
+) ->
+ {State1, ok} = ProtocolModuleToDecorate:write(
+ State0,
+ Message#protocol_message_begin{
+ name =
+ ServiceName ++
+ ?MULTIPLEXED_SERVICE_SEPARATOR ++
+ Name
+ }
+ ),
{State#multiplexed_protocol{protocol_data_to_decorate = State1}, ok};
-
-write(State = #multiplexed_protocol{protocol_module_to_decorate = ProtocolModuleToDecorate,
- protocol_data_to_decorate = State0},
- Message) ->
+write(
+ State = #multiplexed_protocol{
+ protocol_module_to_decorate = ProtocolModuleToDecorate,
+ protocol_data_to_decorate = State0
+ },
+ Message
+) ->
{State1, ok} = ProtocolModuleToDecorate:write(State0, Message),
{State#multiplexed_protocol{protocol_data_to_decorate = State1}, ok}.
-read(State = #multiplexed_protocol{protocol_module_to_decorate = ProtocolModuleToDecorate,
- protocol_data_to_decorate = State0},
- Message) ->
+read(
+ State = #multiplexed_protocol{
+ protocol_module_to_decorate = ProtocolModuleToDecorate,
+ protocol_data_to_decorate = State0
+ },
+ Message
+) ->
{State1, Result} = ProtocolModuleToDecorate:read(State0, Message),
{State#multiplexed_protocol{protocol_data_to_decorate = State1}, Result}.
diff --git a/lib/erl/src/thrift_processor.erl b/lib/erl/src/thrift_processor.erl
index 5c9f26f..e17eadb 100644
--- a/lib/erl/src/thrift_processor.erl
+++ b/lib/erl/src/thrift_processor.erl
@@ -24,71 +24,101 @@
-include("thrift_constants.hrl").
-include("thrift_protocol.hrl").
--record(thrift_processor, {handler, protocol, service}).
+-record(thrift_processor, {
+ handler :: module(),
+ protocol :: term(),
+ service :: atom()
+}).
init({_Server, ProtoGen, Service, Handler}) when is_function(ProtoGen, 0) ->
{ok, Proto} = ProtoGen(),
- loop(#thrift_processor{protocol = Proto,
- service = Service,
- handler = Handler}).
+ loop(#thrift_processor{
+ protocol = Proto,
+ service = Service,
+ handler = Handler
+ }).
-loop(State0 = #thrift_processor{protocol = Proto0,
- handler = Handler,
- service = Service}) ->
-
+loop(
+ State0 = #thrift_processor{
+ protocol = Proto0,
+ handler = Handler,
+ service = Service
+ }
+) ->
{Proto1, MessageBegin} = thrift_protocol:read(Proto0, message_begin),
State1 = State0#thrift_processor{protocol = Proto1},
ErrorHandler = fun
- (HandlerModules) when is_list(HandlerModules) -> thrift_multiplexed_map_wrapper:fetch(?MULTIPLEXED_ERROR_HANDLER_KEY, HandlerModules);
- (HandlerModule) -> HandlerModule
+ (HandlerModules) when is_list(HandlerModules) ->
+ thrift_multiplexed_map_wrapper:fetch(?MULTIPLEXED_ERROR_HANDLER_KEY, HandlerModules);
+ (HandlerModule) ->
+ HandlerModule
end,
case MessageBegin of
-
- #protocol_message_begin{name = Function,
- type = Type,
- seqid = Seqid} when Type =:= ?tMessageType_CALL; Type =:= ?tMessageType_ONEWAY ->
+ #protocol_message_begin{
+ name = Function,
+ type = Type,
+ seqid = Seqid
+ } when Type =:= ?tMessageType_CALL; Type =:= ?tMessageType_ONEWAY ->
case string:tokens(Function, ?MULTIPLEXED_SERVICE_SEPARATOR) of
[ServiceName, FunctionName] ->
- ServiceModule = thrift_multiplexed_map_wrapper:fetch(ServiceName, Service),
+ ServiceModule = thrift_multiplexed_map_wrapper:fetch(ServiceName, Service),
ServiceHandler = thrift_multiplexed_map_wrapper:fetch(ServiceName, Handler),
- case handle_function(State1#thrift_processor{service=ServiceModule, handler=ServiceHandler}, list_to_atom(FunctionName), Seqid) of
- {State2, ok} -> loop(State2#thrift_processor{service=Service, handler=Handler});
+ case
+ handle_function(
+ State1#thrift_processor{
+ service = ServiceModule, handler = ServiceHandler
+ },
+ list_to_existing_atom(FunctionName),
+ Seqid
+ )
+ of
+ {State2, ok} ->
+ loop(State2#thrift_processor{service = Service, handler = Handler});
{_State2, {error, Reason}} ->
- apply(ErrorHandler(Handler), handle_error, [list_to_atom(Function), Reason]),
+ apply(ErrorHandler(Handler), handle_error, [
+ list_to_existing_atom(Function), Reason
+ ]),
thrift_protocol:close_transport(Proto1),
ok
end;
_ ->
- case handle_function(State1, list_to_atom(Function), Seqid) of
- {State2, ok} -> loop(State2);
+ case handle_function(State1, list_to_existing_atom(Function), Seqid) of
+ {State2, ok} ->
+ loop(State2);
{_State2, {error, Reason}} ->
- apply(ErrorHandler(Handler), handle_error, [list_to_atom(Function), Reason]),
+ apply(ErrorHandler(Handler), handle_error, [
+ list_to_existing_atom(Function), Reason
+ ]),
thrift_protocol:close_transport(Proto1),
ok
end
end;
{error, timeout = Reason} ->
- apply(ErrorHandler(Handler), handle_error, [undefined, Reason]),
+ apply(ErrorHandler(Handler), handle_error, [undefined, Reason]),
thrift_protocol:close_transport(Proto1),
ok;
{error, closed = Reason} ->
%% error_logger:info_msg("Client disconnected~n"),
- apply(ErrorHandler(Handler), handle_error, [undefined, Reason]),
+ apply(ErrorHandler(Handler), handle_error, [undefined, Reason]),
thrift_protocol:close_transport(Proto1),
exit(shutdown);
{error, Reason} ->
- apply(ErrorHandler(Handler), handle_error, [undefined, Reason]),
+ apply(ErrorHandler(Handler), handle_error, [undefined, Reason]),
thrift_protocol:close_transport(Proto1),
exit(shutdown)
end.
-handle_function(State0=#thrift_processor{protocol = Proto0,
- handler = Handler,
- service = Service},
- Function,
- Seqid) ->
+handle_function(
+ State0 = #thrift_processor{
+ protocol = Proto0,
+ handler = Handler,
+ service = Service
+ },
+ Function,
+ Seqid
+) ->
InParams = Service:function_info(Function, params_type),
{Proto1, {ok, Params}} = thrift_protocol:read(Proto0, InParams),
@@ -101,55 +131,63 @@
%% [Function, Params, Micro/1000.0]),
handle_success(State1, Function, Result, Seqid)
catch
- Type:Data when Type =:= throw orelse Type =:= error ->
- handle_function_catch(State1, Function, Type, Data, Seqid)
+ Type:Data:Stack when Type =:= throw orelse Type =:= error ->
+ handle_function_catch(State1, Function, Type, Data, Seqid, Stack)
end.
-handle_function_catch(State = #thrift_processor{service = Service},
- Function, ErrType, ErrData, Seqid) ->
+handle_function_catch(
+ State = #thrift_processor{service = Service},
+ Function,
+ ErrType,
+ ErrData,
+ Seqid,
+ Stack
+) ->
IsOneway = Service:function_info(Function, reply_type) =:= oneway_void,
case {ErrType, ErrData} of
_ when IsOneway ->
- Stack = erlang:get_stacktrace(),
error_logger:warning_msg(
- "oneway void ~p threw error which must be ignored: ~p",
- [Function, {ErrType, ErrData, Stack}]),
+ "oneway void ~p threw error which must be ignored: ~p",
+ [Function, {ErrType, ErrData, Stack}]
+ ),
{State, ok};
-
{throw, Exception} when is_tuple(Exception), size(Exception) > 0 ->
%error_logger:warning_msg("~p threw exception: ~p~n", [Function, Exception]),
- handle_exception(State, Function, Exception, Seqid);
- % we still want to accept more requests from this client
+ handle_exception(State, Function, Exception, Seqid, Stack);
+ % we still want to accept more requests from this client
{error, Error} ->
- handle_error(State, Function, Error, Seqid)
+ handle_error(State, Function, Error, Seqid, Stack)
end.
-handle_success(State = #thrift_processor{service = Service},
- Function,
- Result,
- Seqid) ->
- ReplyType = Service:function_info(Function, reply_type),
+handle_success(
+ State = #thrift_processor{service = Service},
+ Function,
+ Result,
+ Seqid
+) ->
+ ReplyType = Service:function_info(Function, reply_type),
StructName = atom_to_list(Function) ++ "_result",
case Result of
{reply, ReplyData} ->
Reply = {{struct, [{0, ReplyType}]}, {StructName, ReplyData}},
send_reply(State, Function, ?tMessageType_REPLY, Reply, Seqid);
-
ok when ReplyType == {struct, []} ->
send_reply(State, Function, ?tMessageType_REPLY, {ReplyType, {StructName}}, Seqid);
-
ok when ReplyType == oneway_void ->
%% no reply for oneway void
{State, ok}
end.
-handle_exception(State = #thrift_processor{service = Service},
- Function,
- Exception,
- Seqid) ->
+handle_exception(
+ State = #thrift_processor{service = Service},
+ Function,
+ Exception,
+ Seqid,
+ Stack
+) ->
ExceptionType = element(1, Exception),
%% Fetch a structure like {struct, [{-2, {struct, {Module, Type}}},
%% {-3, {struct, {Module, Type}}}]}
@@ -161,18 +199,20 @@
%% Assuming we had a type1 exception, we'd get: [undefined, Exception, undefined]
%% e.g.: [{-1, type0}, {-2, type1}, {-3, type2}]
- ExceptionList = [case Type of
- ExceptionType -> Exception;
- _ -> undefined
- end
- || {_Fid, {struct, {_Module, Type}}} <- XInfo],
+ ExceptionList = [
+ case Type of
+ ExceptionType -> Exception;
+ _ -> undefined
+ end
+ || {_Fid, {struct, {_Module, Type}}} <- XInfo
+ ],
ExceptionTuple = list_to_tuple([Function | ExceptionList]),
- % Make sure we got at least one defined
+ % Make sure we got at least one defined
case lists:all(fun(X) -> X =:= undefined end, ExceptionList) of
true ->
- handle_unknown_exception(State, Function, Exception, Seqid);
+ handle_unknown_exception(State, Function, Exception, Seqid, Stack);
false ->
send_reply(State, Function, ?tMessageType_REPLY, {ReplySpec, ExceptionTuple}, Seqid)
end.
@@ -181,34 +221,38 @@
%% Called when an exception has been explicitly thrown by the service, but it was
%% not one of the exceptions that was defined for the function.
%%
-handle_unknown_exception(State, Function, Exception, Seqid) ->
- handle_error(State, Function, {exception_not_declared_as_thrown,
- Exception}, Seqid).
+handle_unknown_exception(State, Function, Exception, Seqid, Stack) ->
+ handle_error(State, Function, {exception_not_declared_as_thrown, Exception}, Seqid, Stack).
-handle_error(State, Function, Error, Seqid) ->
- Stack = erlang:get_stacktrace(),
+handle_error(State, Function, Error, Seqid, Stack) ->
error_logger:error_msg("~p had an error: ~p~n", [Function, {Error, Stack}]),
Message =
case application:get_env(thrift, exceptions_include_traces) of
{ok, true} ->
- lists:flatten(io_lib:format("An error occurred: ~p~n",
- [{Error, Stack}]));
+ lists:flatten(
+ io_lib:format(
+ "An error occurred: ~p~n",
+ [{Error, Stack}]
+ )
+ );
_ ->
"An unknown handler error occurred."
end,
- Reply = {?TApplicationException_Structure,
- #'TApplicationException'{
- message = Message,
- type = ?TApplicationException_UNKNOWN}},
+ Reply =
+ {?TApplicationException_Structure, #'TApplicationException'{
+ message = Message,
+ type = ?TApplicationException_UNKNOWN
+ }},
send_reply(State, Function, ?tMessageType_EXCEPTION, Reply, Seqid).
send_reply(State = #thrift_processor{protocol = Proto0}, Function, ReplyMessageType, Reply, Seqid) ->
try
{Proto1, ok} = thrift_protocol:write(Proto0, #protocol_message_begin{
- name = atom_to_list(Function),
- type = ReplyMessageType,
- seqid = Seqid}),
+ name = atom_to_list(Function),
+ type = ReplyMessageType,
+ seqid = Seqid
+ }),
{Proto2, ok} = thrift_protocol:write(Proto1, Reply),
{Proto3, ok} = thrift_protocol:write(Proto2, message_end),
{Proto4, ok} = thrift_protocol:flush_transport(Proto3),
diff --git a/lib/erl/src/thrift_protocol.erl b/lib/erl/src/thrift_protocol.erl
index 2fe10d6..c75712a 100644
--- a/lib/erl/src/thrift_protocol.erl
+++ b/lib/erl/src/thrift_protocol.erl
@@ -19,45 +19,67 @@
-module(thrift_protocol).
--export([new/2,
- write/2,
- read/2,
- read/3,
- skip/2,
- flush_transport/1,
- close_transport/1,
- typeid_to_atom/1
- ]).
-
--export([behaviour_info/1]).
+-export([
+ new/2,
+ write/2,
+ read/2,
+ read/3,
+ skip/2,
+ flush_transport/1,
+ close_transport/1,
+ typeid_to_atom/1
+]).
-include("thrift_constants.hrl").
-include("thrift_protocol.hrl").
--record(protocol, {module, data}).
+-record(protocol, {
+ module :: module(),
+ data :: term()
+}).
-behaviour_info(callbacks) ->
- [
- {read, 2},
- {write, 2},
- {flush_transport, 1},
- {close_transport, 1}
- ];
-behaviour_info(_Else) -> undefined.
+%%%=========================================================================
+%%% API
+%%%=========================================================================
+-type state() :: term().
+-export_type([state/0]).
+-type reason() :: term().
+-export_type([reason/0]).
+
+%% NOTE: keep this in sync with read/2 spec
+-callback read
+ (state(), {struct, _Info}) -> {state(), {ok, tuple()} | {error, reason()}};
+ (state(), tprot_cont_tag()) -> {state(), {ok, any()} | {error, reason()}};
+ (state(), tprot_empty_tag()) -> {state(), ok | {error, reason()}};
+ (state(), tprot_header_tag()) -> {state(), tprot_header_val() | {error, reason()}};
+ (state(), tprot_data_tag()) -> {state(), {ok, any()} | {error, reason()}}.
+
+-callback write(state(), any()) -> {state(), ok | {error, reason()}}.
+
+-callback flush_transport(state()) -> {state(), ok | {error, reason()}}.
+-callback close_transport(state()) -> {state(), ok | {error, reason()}}.
new(Module, Data) when is_atom(Module) ->
- {ok, #protocol{module = Module,
- data = Data}}.
+ {ok, #protocol{
+ module = Module,
+ data = Data
+ }}.
-spec flush_transport(#protocol{}) -> {#protocol{}, ok}.
-flush_transport(Proto = #protocol{module = Module,
- data = Data}) ->
+flush_transport(
+ Proto = #protocol{
+ module = Module,
+ data = Data
+ }
+) ->
{NewData, Result} = Module:flush_transport(Data),
{Proto#protocol{data = NewData}, Result}.
-spec close_transport(#protocol{}) -> ok.
-close_transport(#protocol{module = Module,
- data = Data}) ->
+close_transport(#protocol{
+ module = Module,
+ data = Data
+}) ->
Module:close_transport(Data).
typeid_to_atom(?tType_STOP) -> field_stop;
@@ -91,103 +113,123 @@
%% Structure is like:
%% [{Fid, Type}, ...]
-spec read(#protocol{}, {struct, _StructDef}, atom()) -> {#protocol{}, {ok, tuple()}}.
-read(IProto0, {struct, Structure}, Tag)
- when is_list(Structure), is_atom(Tag) ->
-
+read(IProto0, {struct, Structure}, Tag) when
+ is_list(Structure), is_atom(Tag)
+->
% If we want a tagged tuple, we need to offset all the tuple indices
% by 1 to avoid overwriting the tag.
- Offset = if Tag =/= undefined -> 1; true -> 0 end,
- IndexList = case length(Structure) of
- N when N > 0 -> lists:seq(1 + Offset, N + Offset);
- _ -> []
- end,
+ Offset =
+ if
+ Tag =/= undefined -> 1;
+ true -> 0
+ end,
+ IndexList =
+ case length(Structure) of
+ N when N > 0 -> lists:seq(1 + Offset, N + Offset);
+ _ -> []
+ end,
- SWithIndices = [{Fid, {Type, Index}} ||
- {{Fid, Type}, Index} <-
- lists:zip(Structure, IndexList)],
+ SWithIndices = [
+ {Fid, {Type, Index}}
+ || {{Fid, Type}, Index} <-
+ lists:zip(Structure, IndexList)
+ ],
% Fid -> {Type, Index}
SDict = dict:from_list(SWithIndices),
{IProto1, ok} = read(IProto0, struct_begin),
RTuple0 = erlang:make_tuple(length(Structure) + Offset, undefined),
- RTuple1 = if Tag =/= undefined -> setelement(1, RTuple0, Tag);
- true -> RTuple0
- end,
+ RTuple1 =
+ if
+ Tag =/= undefined -> setelement(1, RTuple0, Tag);
+ true -> RTuple0
+ end,
{IProto2, RTuple2} = read_struct_loop(IProto1, SDict, RTuple1),
{IProto2, {ok, RTuple2}}.
-
-%% NOTE: Keep this in sync with thrift_protocol_behaviour:read
+%% NOTE: Keep this in sync with read callback
-spec read
- (#protocol{}, {struct, _Info}) -> {#protocol{}, {ok, tuple()} | {error, _Reason}};
- (#protocol{}, tprot_cont_tag()) -> {#protocol{}, {ok, any()} | {error, _Reason}};
- (#protocol{}, tprot_empty_tag()) -> {#protocol{}, ok | {error, _Reason}};
- (#protocol{}, tprot_header_tag()) -> {#protocol{}, tprot_header_val() | {error, _Reason}};
- (#protocol{}, tprot_data_tag()) -> {#protocol{}, {ok, any()} | {error, _Reason}}.
+ (#protocol{}, {struct, _Info}) -> {#protocol{}, {ok, tuple()} | {error, _Reason}};
+ (#protocol{}, tprot_cont_tag()) -> {#protocol{}, {ok, any()} | {error, _Reason}};
+ (#protocol{}, tprot_empty_tag()) -> {#protocol{}, ok | {error, _Reason}};
+ (#protocol{}, tprot_header_tag()) -> {#protocol{}, tprot_header_val() | {error, _Reason}};
+ (#protocol{}, tprot_data_tag()) -> {#protocol{}, {ok, any()} | {error, _Reason}}.
-read(IProto, {struct, {Module, StructureName}}) when is_atom(Module),
- is_atom(StructureName) ->
+read(IProto, {struct, {Module, StructureName}}) when
+ is_atom(Module),
+ is_atom(StructureName)
+->
read(IProto, Module:struct_info(StructureName), StructureName);
-
-read(IProto, S={struct, Structure}) when is_list(Structure) ->
+read(IProto, S = {struct, Structure}) when is_list(Structure) ->
read(IProto, S, undefined);
-
read(IProto0, {list, Type}) ->
{IProto1, #protocol_list_begin{etype = EType, size = Size}} =
read(IProto0, list_begin),
{EType, EType} = {term_to_typeid(Type), EType},
- {List, IProto2} = lists:mapfoldl(fun(_, ProtoS0) ->
- {ProtoS1, {ok, Item}} = read(ProtoS0, Type),
- {Item, ProtoS1}
- end,
- IProto1,
- lists:duplicate(Size, 0)),
+ {List, IProto2} = lists:mapfoldl(
+ fun(_, ProtoS0) ->
+ {ProtoS1, {ok, Item}} = read(ProtoS0, Type),
+ {Item, ProtoS1}
+ end,
+ IProto1,
+ lists:duplicate(Size, 0)
+ ),
{IProto3, ok} = read(IProto2, list_end),
{IProto3, {ok, List}};
-
read(IProto0, {map, KeyType, ValType}) ->
{IProto1, #protocol_map_begin{size = Size, ktype = KType, vtype = VType}} =
read(IProto0, map_begin),
- _ = case Size of
- 0 -> 0;
- _ ->
- {KType, KType} = {term_to_typeid(KeyType), KType},
- {VType, VType} = {term_to_typeid(ValType), VType}
- end,
- {List, IProto2} = lists:mapfoldl(fun(_, ProtoS0) ->
- {ProtoS1, {ok, Key}} = read(ProtoS0, KeyType),
- {ProtoS2, {ok, Val}} = read(ProtoS1, ValType),
- {{Key, Val}, ProtoS2}
- end,
- IProto1,
- lists:duplicate(Size, 0)),
+ _ =
+ case Size of
+ 0 ->
+ 0;
+ _ ->
+ {KType, KType} = {term_to_typeid(KeyType), KType},
+ {VType, VType} = {term_to_typeid(ValType), VType}
+ end,
+ {List, IProto2} = lists:mapfoldl(
+ fun(_, ProtoS0) ->
+ {ProtoS1, {ok, Key}} = read(ProtoS0, KeyType),
+ {ProtoS2, {ok, Val}} = read(ProtoS1, ValType),
+ {{Key, Val}, ProtoS2}
+ end,
+ IProto1,
+ lists:duplicate(Size, 0)
+ ),
{IProto3, ok} = read(IProto2, map_end),
{IProto3, {ok, dict:from_list(List)}};
-
read(IProto0, {set, Type}) ->
{IProto1, #protocol_set_begin{etype = EType, size = Size}} =
read(IProto0, set_begin),
{EType, EType} = {term_to_typeid(Type), EType},
- {List, IProto2} = lists:mapfoldl(fun(_, ProtoS0) ->
- {ProtoS1, {ok, Item}} = read(ProtoS0, Type),
- {Item, ProtoS1}
- end,
- IProto1,
- lists:duplicate(Size, 0)),
+ {List, IProto2} = lists:mapfoldl(
+ fun(_, ProtoS0) ->
+ {ProtoS1, {ok, Item}} = read(ProtoS0, Type),
+ {Item, ProtoS1}
+ end,
+ IProto1,
+ lists:duplicate(Size, 0)
+ ),
{IProto3, ok} = read(IProto2, set_end),
{IProto3, {ok, sets:from_list(List)}};
-
read(Protocol, ProtocolType) ->
read_specific(Protocol, ProtocolType).
-%% NOTE: Keep this in sync with thrift_protocol_behaviour:read
+%% NOTE: Keep this in sync with read/2 spec
-spec read_specific
- (#protocol{}, tprot_empty_tag()) -> {#protocol{}, ok | {error, _Reason}};
- (#protocol{}, tprot_header_tag()) -> {#protocol{}, tprot_header_val() | {error, _Reason}};
- (#protocol{}, tprot_data_tag()) -> {#protocol{}, {ok, any()} | {error, _Reason}}.
-read_specific(Proto = #protocol{module = Module,
- data = ModuleData}, ProtocolType) ->
+ (#protocol{}, {struct, _Info}) -> {#protocol{}, {ok, tuple()} | {error, _Reason}};
+ (#protocol{}, tprot_cont_tag()) -> {#protocol{}, {ok, any()} | {error, _Reason}};
+ (#protocol{}, tprot_empty_tag()) -> {#protocol{}, ok | {error, _Reason}};
+ (#protocol{}, tprot_header_tag()) -> {#protocol{}, tprot_header_val() | {error, _Reason}};
+ (#protocol{}, tprot_data_tag()) -> {#protocol{}, {ok, any()} | {error, _Reason}}.
+read_specific(
+ Proto = #protocol{
+ module = Module,
+ data = ModuleData
+ },
+ ProtocolType
+) ->
{NewData, Result} = Module:read(ModuleData, ProtocolType),
{Proto#protocol{data = NewData}, Result}.
@@ -209,8 +251,9 @@
read_struct_loop(IProto3, SDict, NewRTuple);
Expected ->
error_logger:info_msg(
- "Skipping field ~p with wrong type (~p != ~p)~n",
- [Fid, FType, Expected]),
+ "Skipping field ~p with wrong type (~p != ~p)~n",
+ [Fid, FType, Expected]
+ ),
skip_field(FType, IProto1, SDict, RTuple)
end;
_Else2 ->
@@ -230,30 +273,25 @@
{Proto2, ok} = skip_struct_loop(Proto1),
{Proto3, ok} = read(Proto2, struct_end),
{Proto3, ok};
-
skip(Proto0, map) ->
{Proto1, Map} = read(Proto0, map_begin),
{Proto2, ok} = skip_map_loop(Proto1, Map),
{Proto3, ok} = read(Proto2, map_end),
{Proto3, ok};
-
skip(Proto0, set) ->
{Proto1, Set} = read(Proto0, set_begin),
{Proto2, ok} = skip_set_loop(Proto1, Set),
{Proto3, ok} = read(Proto2, set_end),
{Proto3, ok};
-
skip(Proto0, list) ->
{Proto1, List} = read(Proto0, list_begin),
{Proto2, ok} = skip_list_loop(Proto1, List),
{Proto3, ok} = read(Proto2, list_end),
{Proto3, ok};
-
skip(Proto0, Type) when is_atom(Type) ->
{Proto1, _Ignore} = read(Proto0, Type),
{Proto1, ok}.
-
skip_struct_loop(Proto0) ->
{Proto1, #protocol_field_begin{type = Type}} = read(Proto0, field_begin),
case Type of
@@ -265,39 +303,62 @@
skip_struct_loop(Proto3)
end.
-skip_map_loop(Proto0, Map = #protocol_map_begin{ktype = Ktype,
- vtype = Vtype,
- size = Size}) ->
+skip_map_loop(
+ Proto0,
+ Map = #protocol_map_begin{
+ ktype = Ktype,
+ vtype = Vtype,
+ size = Size
+ }
+) ->
case Size of
N when N > 0 ->
{Proto1, ok} = skip(Proto0, typeid_to_atom(Ktype)),
{Proto2, ok} = skip(Proto1, typeid_to_atom(Vtype)),
- skip_map_loop(Proto2,
- Map#protocol_map_begin{size = Size - 1});
- 0 -> {Proto0, ok}
+ skip_map_loop(
+ Proto2,
+ Map#protocol_map_begin{size = Size - 1}
+ );
+ 0 ->
+ {Proto0, ok}
end.
-skip_set_loop(Proto0, Map = #protocol_set_begin{etype = Etype,
- size = Size}) ->
+skip_set_loop(
+ Proto0,
+ Map = #protocol_set_begin{
+ etype = Etype,
+ size = Size
+ }
+) ->
case Size of
N when N > 0 ->
{Proto1, ok} = skip(Proto0, typeid_to_atom(Etype)),
- skip_set_loop(Proto1,
- Map#protocol_set_begin{size = Size - 1});
- 0 -> {Proto0, ok}
+ skip_set_loop(
+ Proto1,
+ Map#protocol_set_begin{size = Size - 1}
+ );
+ 0 ->
+ {Proto0, ok}
end.
-skip_list_loop(Proto0, Map = #protocol_list_begin{etype = Etype,
- size = Size}) ->
+skip_list_loop(
+ Proto0,
+ Map = #protocol_list_begin{
+ etype = Etype,
+ size = Size
+ }
+) ->
case Size of
N when N > 0 ->
{Proto1, ok} = skip(Proto0, typeid_to_atom(Etype)),
- skip_list_loop(Proto1,
- Map#protocol_list_begin{size = Size - 1});
- 0 -> {Proto0, ok}
+ skip_list_loop(
+ Proto1,
+ Map#protocol_list_begin{size = Size - 1}
+ );
+ 0 ->
+ {Proto0, ok}
end.
-
%%--------------------------------------------------------------------
%% Function: write(OProto, {Type, Data}) -> ok
%%
@@ -318,95 +379,112 @@
%%--------------------------------------------------------------------
-spec write(#protocol{}, any()) -> {#protocol{}, ok | {error, _Reason}}.
-write(Proto0, {{struct, StructDef}, Data})
- when is_list(StructDef), is_tuple(Data), length(StructDef) == size(Data) - 1 ->
-
+write(Proto0, {{struct, StructDef}, Data}) when
+ is_list(StructDef), is_tuple(Data), length(StructDef) == size(Data) - 1
+->
[StructName | Elems] = tuple_to_list(Data),
{Proto1, ok} = write(Proto0, #protocol_struct_begin{name = StructName}),
{Proto2, ok} = struct_write_loop(Proto1, StructDef, Elems),
{Proto3, ok} = write(Proto2, struct_end),
{Proto3, ok};
-
-write(Proto, {{struct, {Module, StructureName}}, Data})
- when is_atom(Module),
- is_atom(StructureName),
- element(1, Data) =:= StructureName ->
+write(Proto, {{struct, {Module, StructureName}}, Data}) when
+ is_atom(Module),
+ is_atom(StructureName),
+ element(1, Data) =:= StructureName
+->
write(Proto, {Module:struct_info(StructureName), Data});
-
-write(_, {{struct, {Module, StructureName}}, Data})
- when is_atom(Module),
- is_atom(StructureName) ->
- erlang:error(struct_unmatched, {{provided, element(1, Data)},
- {expected, StructureName}});
-
-write(Proto0, {{list, Type}, Data})
- when is_list(Data) ->
- {Proto1, ok} = write(Proto0,
- #protocol_list_begin{
- etype = term_to_typeid(Type),
- size = length(Data)
- }),
- Proto2 = lists:foldl(fun(Elem, ProtoIn) ->
- {ProtoOut, ok} = write(ProtoIn, {Type, Elem}),
- ProtoOut
- end,
- Proto1,
- Data),
+write(_, {{struct, {Module, StructureName}}, Data}) when
+ is_atom(Module),
+ is_atom(StructureName)
+->
+ erlang:error(struct_unmatched, {{provided, element(1, Data)}, {expected, StructureName}});
+write(Proto0, {{list, Type}, Data}) when
+ is_list(Data)
+->
+ {Proto1, ok} = write(
+ Proto0,
+ #protocol_list_begin{
+ etype = term_to_typeid(Type),
+ size = length(Data)
+ }
+ ),
+ Proto2 = lists:foldl(
+ fun(Elem, ProtoIn) ->
+ {ProtoOut, ok} = write(ProtoIn, {Type, Elem}),
+ ProtoOut
+ end,
+ Proto1,
+ Data
+ ),
{Proto3, ok} = write(Proto2, list_end),
{Proto3, ok};
-
write(Proto0, {{map, KeyType, ValType}, Data}) ->
- {Proto1, ok} = write(Proto0,
- #protocol_map_begin{
- ktype = term_to_typeid(KeyType),
- vtype = term_to_typeid(ValType),
- size = dict:size(Data)
- }),
- Proto2 = dict:fold(fun(KeyData, ValData, ProtoS0) ->
- {ProtoS1, ok} = write(ProtoS0, {KeyType, KeyData}),
- {ProtoS2, ok} = write(ProtoS1, {ValType, ValData}),
- ProtoS2
- end,
- Proto1,
- Data),
+ {Proto1, ok} = write(
+ Proto0,
+ #protocol_map_begin{
+ ktype = term_to_typeid(KeyType),
+ vtype = term_to_typeid(ValType),
+ size = dict:size(Data)
+ }
+ ),
+ Proto2 = dict:fold(
+ fun(KeyData, ValData, ProtoS0) ->
+ {ProtoS1, ok} = write(ProtoS0, {KeyType, KeyData}),
+ {ProtoS2, ok} = write(ProtoS1, {ValType, ValData}),
+ ProtoS2
+ end,
+ Proto1,
+ Data
+ ),
{Proto3, ok} = write(Proto2, map_end),
{Proto3, ok};
-
write(Proto0, {{set, Type}, Data}) ->
true = sets:is_set(Data),
- {Proto1, ok} = write(Proto0,
- #protocol_set_begin{
- etype = term_to_typeid(Type),
- size = sets:size(Data)
- }),
- Proto2 = sets:fold(fun(Elem, ProtoIn) ->
- {ProtoOut, ok} = write(ProtoIn, {Type, Elem}),
- ProtoOut
- end,
- Proto1,
- Data),
+ {Proto1, ok} = write(
+ Proto0,
+ #protocol_set_begin{
+ etype = term_to_typeid(Type),
+ size = sets:size(Data)
+ }
+ ),
+ Proto2 = sets:fold(
+ fun(Elem, ProtoIn) ->
+ {ProtoOut, ok} = write(ProtoIn, {Type, Elem}),
+ ProtoOut
+ end,
+ Proto1,
+ Data
+ ),
{Proto3, ok} = write(Proto2, set_end),
{Proto3, ok};
-
-write(Proto = #protocol{module = Module,
- data = ModuleData}, Data) ->
+write(
+ Proto = #protocol{
+ module = Module,
+ data = ModuleData
+ },
+ Data
+) ->
{NewData, Result} = Module:write(ModuleData, Data),
{Proto#protocol{data = NewData}, Result}.
struct_write_loop(Proto0, [{Fid, Type} | RestStructDef], [Data | RestData]) ->
- NewProto = case Data of
- undefined ->
- Proto0; % null fields are skipped in response
- _ ->
- {Proto1, ok} = write(Proto0,
- #protocol_field_begin{
- type = term_to_typeid(Type),
- id = Fid
- }),
- {Proto2, ok} = write(Proto1, {Type, Data}),
- {Proto3, ok} = write(Proto2, field_end),
- Proto3
- end,
+ NewProto =
+ case Data of
+ undefined ->
+ % null fields are skipped in response
+ Proto0;
+ _ ->
+ {Proto1, ok} = write(
+ Proto0,
+ #protocol_field_begin{
+ type = term_to_typeid(Type),
+ id = Fid
+ }
+ ),
+ {Proto2, ok} = write(Proto1, {Type, Data}),
+ {Proto3, ok} = write(Proto2, field_end),
+ Proto3
+ end,
struct_write_loop(NewProto, RestStructDef, RestData);
struct_write_loop(Proto, [], []) ->
write(Proto, field_stop).
diff --git a/lib/erl/src/thrift_reconnecting_client.erl b/lib/erl/src/thrift_reconnecting_client.erl
index 538fd3a..c9fe2aa 100644
--- a/lib/erl/src/thrift_reconnecting_client.erl
+++ b/lib/erl/src/thrift_reconnecting_client.erl
@@ -22,30 +22,36 @@
-behaviour(gen_server).
%% API
--export([ call/3,
- get_stats/1,
- get_and_reset_stats/1 ]).
+-export([
+ call/3,
+ get_stats/1,
+ get_and_reset_stats/1
+]).
--export([ start_link/6 ]).
+-export([start_link/6]).
%% gen_server callbacks
--export([ init/1,
- handle_call/3,
- handle_cast/2,
- handle_info/2,
- terminate/2,
- code_change/3 ]).
+-export([
+ init/1,
+ handle_call/3,
+ handle_cast/2,
+ handle_info/2,
+ terminate/2,
+ code_change/3
+]).
--record( state, { client = nil,
- host,
- port,
- thrift_svc,
- thrift_opts,
- reconn_min,
- reconn_max,
- reconn_time = 0,
- op_cnt_dict,
- op_time_dict } ).
+-record(state, {
+ client = nil,
+ host,
+ port,
+ thrift_svc,
+ thrift_opts,
+ reconn_min,
+ reconn_max,
+ reconn_time = 0,
+ op_cnt_dict,
+ op_time_dict
+}).
%%====================================================================
%% API
@@ -54,23 +60,35 @@
%% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
%% Description: Starts the server
%%--------------------------------------------------------------------
-start_link( Host, Port,
- ThriftSvc, ThriftOpts,
- ReconnMin, ReconnMax ) ->
- gen_server:start_link( ?MODULE,
- [ Host, Port,
- ThriftSvc, ThriftOpts,
- ReconnMin, ReconnMax ],
- [] ).
+start_link(
+ Host,
+ Port,
+ ThriftSvc,
+ ThriftOpts,
+ ReconnMin,
+ ReconnMax
+) ->
+ gen_server:start_link(
+ ?MODULE,
+ [
+ Host,
+ Port,
+ ThriftSvc,
+ ThriftOpts,
+ ReconnMin,
+ ReconnMax
+ ],
+ []
+ ).
-call( Pid, Op, Args ) ->
- gen_server:call( Pid, { call, Op, Args } ).
+call(Pid, Op, Args) ->
+ gen_server:call(Pid, {call, Op, Args}).
-get_stats( Pid ) ->
- gen_server:call( Pid, get_stats ).
+get_stats(Pid) ->
+ gen_server:call(Pid, get_stats).
-get_and_reset_stats( Pid ) ->
- gen_server:call( Pid, get_and_reset_stats ).
+get_and_reset_stats(Pid) ->
+ gen_server:call(Pid, get_and_reset_stats).
%%====================================================================
%% gen_server callbacks
@@ -83,19 +101,21 @@
%% {stop, Reason}
%% Description: Start the server.
%%--------------------------------------------------------------------
-init( [ Host, Port, TSvc, TOpts, ReconnMin, ReconnMax ] ) ->
- process_flag( trap_exit, true ),
+init([Host, Port, TSvc, TOpts, ReconnMin, ReconnMax]) ->
+ process_flag(trap_exit, true),
- State = #state{ host = Host,
- port = Port,
- thrift_svc = TSvc,
- thrift_opts = TOpts,
- reconn_min = ReconnMin,
- reconn_max = ReconnMax,
- op_cnt_dict = dict:new(),
- op_time_dict = dict:new() },
+ State = #state{
+ host = Host,
+ port = Port,
+ thrift_svc = TSvc,
+ thrift_opts = TOpts,
+ reconn_min = ReconnMin,
+ reconn_max = ReconnMax,
+ op_cnt_dict = dict:new(),
+ op_time_dict = dict:new()
+ },
- { ok, try_connect( State ) }.
+ {ok, try_connect(State)}.
%%--------------------------------------------------------------------
%% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} |
@@ -106,40 +126,44 @@
%% {stop, Reason, State}
%% Description: Handling call messages
%%--------------------------------------------------------------------
-handle_call( { call, Op, _ },
- _From,
- State = #state{ client = nil } ) ->
- { reply, { error, noconn }, incr_stats( Op, "failfast", 1, State ) };
+handle_call(
+ {call, Op, _},
+ _From,
+ State = #state{client = nil}
+) ->
+ {reply, {error, noconn}, incr_stats(Op, "failfast", 1, State)};
+handle_call(
+ {call, Op, Args},
+ _From,
+ State = #state{client = Client}
+) ->
+ Timer = timer_fun(),
+ Result = (catch thrift_client:call(Client, Op, Args)),
+ Time = Timer(),
-handle_call( { call, Op, Args },
- _From,
- State=#state{ client = Client } ) ->
-
- Timer = timer_fun(),
- Result = ( catch thrift_client:call( Client, Op, Args) ),
- Time = Timer(),
-
- case Result of
- { C, { ok, Reply } } ->
- S = incr_stats( Op, "success", Time, State#state{ client = C } ),
- { reply, {ok, Reply }, S };
- { _, { E, Msg } } when E == error; E == exception ->
- S = incr_stats( Op, "error", Time, try_connect( State ) ),
- { reply, { E, Msg }, S };
- Other ->
- S = incr_stats( Op, "error", Time, try_connect( State ) ),
- { reply, Other, S }
- end;
-
-handle_call( get_stats,
- _From,
- State = #state{} ) ->
- { reply, stats( State ), State };
-
-handle_call( get_and_reset_stats,
- _From,
- State = #state{} ) ->
- { reply, stats( State ), reset_stats( State ) }.
+ case Result of
+ {C, {ok, Reply}} ->
+ S = incr_stats(Op, "success", Time, State#state{client = C}),
+ {reply, {ok, Reply}, S};
+ {_, {E, Msg}} when E == error; E == exception ->
+ S = incr_stats(Op, "error", Time, try_connect(State)),
+ {reply, {E, Msg}, S};
+ Other ->
+ S = incr_stats(Op, "error", Time, try_connect(State)),
+ {reply, Other, S}
+ end;
+handle_call(
+ get_stats,
+ _From,
+ State = #state{}
+) ->
+ {reply, stats(State), State};
+handle_call(
+ get_and_reset_stats,
+ _From,
+ State = #state{}
+) ->
+ {reply, stats(State), reset_stats(State)}.
%%--------------------------------------------------------------------
%% Function: handle_cast(Msg, State) -> {noreply, State} |
@@ -147,8 +171,8 @@
%% {stop, Reason, State}
%% Description: Handling cast messages
%%--------------------------------------------------------------------
-handle_cast( _Msg, State ) ->
- { noreply, State }.
+handle_cast(_Msg, State) ->
+ {noreply, State}.
%%--------------------------------------------------------------------
%% Function: handle_info(Info, State) -> {noreply, State} |
@@ -156,11 +180,10 @@
%% {stop, Reason, State}
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
-handle_info( try_connect, State ) ->
- { noreply, try_connect( State ) };
-
-handle_info( _Info, State ) ->
- { noreply, State }.
+handle_info(try_connect, State) ->
+ {noreply, try_connect(State)};
+handle_info(_Info, State) ->
+ {noreply, State}.
%%--------------------------------------------------------------------
%% Function: terminate(Reason, State) -> void()
@@ -169,90 +192,103 @@
%% cleaning up. When it returns, the gen_server terminates with Reason.
%% The return value is ignored.
%%--------------------------------------------------------------------
-terminate( _Reason, #state{ client = Client } ) ->
- thrift_client:close( Client ),
- ok.
+terminate(_Reason, #state{client = Client}) ->
+ thrift_client:close(Client),
+ ok.
%%--------------------------------------------------------------------
%% Func: code_change(OldVsn, State, Extra) -> {ok, NewState}
%% Description: Convert process state when code is changed
%%--------------------------------------------------------------------
-code_change( _OldVsn, State, _Extra ) ->
- { ok, State }.
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
-try_connect( State = #state{ client = OldClient,
- host = Host,
- port = Port,
- thrift_svc = TSvc,
- thrift_opts = TOpts } ) ->
+try_connect(
+ State = #state{
+ client = OldClient,
+ host = Host,
+ port = Port,
+ thrift_svc = TSvc,
+ thrift_opts = TOpts
+ }
+) ->
+ case OldClient of
+ nil -> ok;
+ _ -> (catch thrift_client:close(OldClient))
+ end,
- case OldClient of
- nil -> ok;
- _ -> ( catch thrift_client:close( OldClient ) )
- end,
+ case catch thrift_client_util:new(Host, Port, TSvc, TOpts) of
+ {ok, Client} ->
+ State#state{client = Client, reconn_time = 0};
+ {E, Msg} when E == error; E == exception ->
+ ReconnTime = reconn_time(State),
+ error_logger:error_msg(
+ "[~w] ~w connect failed (~w), trying again in ~w ms~n",
+ [self(), TSvc, Msg, ReconnTime]
+ ),
+ erlang:send_after(ReconnTime, self(), try_connect),
+ State#state{client = nil, reconn_time = ReconnTime}
+ end.
- case catch thrift_client_util:new( Host, Port, TSvc, TOpts ) of
- { ok, Client } ->
- State#state{ client = Client, reconn_time = 0 };
- { E, Msg } when E == error; E == exception ->
- ReconnTime = reconn_time( State ),
- error_logger:error_msg( "[~w] ~w connect failed (~w), trying again in ~w ms~n",
- [ self(), TSvc, Msg, ReconnTime ] ),
- erlang:send_after( ReconnTime, self(), try_connect ),
- State#state{ client = nil, reconn_time = ReconnTime }
- end.
-
-
-reconn_time( #state{ reconn_min = ReconnMin, reconn_time = 0 } ) ->
- ReconnMin;
-reconn_time( #state{ reconn_max = ReconnMax, reconn_time = ReconnMax } ) ->
- ReconnMax;
-reconn_time( #state{ reconn_max = ReconnMax, reconn_time = R } ) ->
- Backoff = 2 * R,
- case Backoff > ReconnMax of
- true -> ReconnMax;
- false -> Backoff
- end.
+reconn_time(#state{reconn_min = ReconnMin, reconn_time = 0}) ->
+ ReconnMin;
+reconn_time(#state{reconn_max = ReconnMax, reconn_time = ReconnMax}) ->
+ ReconnMax;
+reconn_time(#state{reconn_max = ReconnMax, reconn_time = R}) ->
+ Backoff = 2 * R,
+ case Backoff > ReconnMax of
+ true -> ReconnMax;
+ false -> Backoff
+ end.
-ifdef(time_correction).
timer_fun() ->
- T1 = erlang:monotonic_time(),
- fun() ->
- T2 = erlang:monotonic_time(),
- erlang:convert_time_unit(T2 - T1, native, micro_seconds)
- end.
+ T1 = erlang:monotonic_time(),
+ fun() ->
+ T2 = erlang:monotonic_time(),
+ erlang:convert_time_unit(T2 - T1, native, micro_seconds)
+ end.
-else.
timer_fun() ->
- T1 = erlang:timestamp(),
- fun() ->
- T2 = erlang:timestamp(),
- timer:now_diff(T2, T1)
- end.
+ T1 = erlang:timestamp(),
+ fun() ->
+ T2 = erlang:timestamp(),
+ timer:now_diff(T2, T1)
+ end.
-endif.
-incr_stats( Op, Result, Time,
- State = #state{ op_cnt_dict = OpCntDict,
- op_time_dict = OpTimeDict } ) ->
- Key = lists:flatten( [ atom_to_list( Op ), [ "_" | Result ] ] ),
- State#state{ op_cnt_dict = dict:update_counter( Key, 1, OpCntDict ),
- op_time_dict = dict:update_counter( Key, Time, OpTimeDict ) }.
+incr_stats(
+ Op,
+ Result,
+ Time,
+ State = #state{
+ op_cnt_dict = OpCntDict,
+ op_time_dict = OpTimeDict
+ }
+) ->
+ Key = lists:flatten([atom_to_list(Op), ["_" | Result]]),
+ State#state{
+ op_cnt_dict = dict:update_counter(Key, 1, OpCntDict),
+ op_time_dict = dict:update_counter(Key, Time, OpTimeDict)
+ }.
+stats(#state{
+ thrift_svc = TSvc,
+ op_cnt_dict = OpCntDict,
+ op_time_dict = OpTimeDict
+}) ->
+ Svc = atom_to_list(TSvc),
-stats( #state{ thrift_svc = TSvc,
- op_cnt_dict = OpCntDict,
- op_time_dict = OpTimeDict } ) ->
- Svc = atom_to_list(TSvc),
+ F = fun(Key, Count, Stats) ->
+ Name = lists:flatten([Svc, ["_" | Key]]),
+ Micros = dict:fetch(Key, OpTimeDict),
+ [{Name, Count, Micros} | Stats]
+ end,
- F = fun( Key, Count, Stats ) ->
- Name = lists:flatten( [ Svc, [ "_" | Key ] ] ),
- Micros = dict:fetch( Key, OpTimeDict ),
- [ { Name, Count, Micros } | Stats ]
- end,
+ dict:fold(F, [], OpCntDict).
- dict:fold( F, [], OpCntDict ).
-
-reset_stats( State = #state{} ) ->
- State#state{ op_cnt_dict = dict:new(), op_time_dict = dict:new() }.
+reset_stats(State = #state{}) ->
+ State#state{op_cnt_dict = dict:new(), op_time_dict = dict:new()}.
diff --git a/lib/erl/src/thrift_server.erl b/lib/erl/src/thrift_server.erl
index 5012e16..e97acff 100644
--- a/lib/erl/src/thrift_server.erl
+++ b/lib/erl/src/thrift_server.erl
@@ -25,12 +25,23 @@
-export([start_link/3, stop/1, take_socket/2]).
%% gen_server callbacks
--export([init/1, handle_call/3, handle_cast/2, handle_info/2,
- terminate/2, code_change/3]).
+-export([
+ init/1,
+ handle_call/3,
+ handle_cast/2,
+ handle_info/2,
+ terminate/2,
+ code_change/3
+]).
-define(SERVER, ?MODULE).
--record(state, {listen_socket, acceptor_ref, service, handler}).
+-record(state, {
+ listen_socket :: gen_tcp:socket(),
+ acceptor_ref :: term(),
+ service :: module(),
+ handler :: module()
+}).
%%====================================================================
%% API
@@ -49,11 +60,9 @@
stop(Pid) when is_pid(Pid) ->
gen_server:call(Pid, stop).
-
take_socket(Server, Socket) ->
gen_server:call(Server, {take_socket, Socket}).
-
%%====================================================================
%% gen_server callbacks
%%====================================================================
@@ -66,17 +75,23 @@
%% Description: Initiates the server
%%--------------------------------------------------------------------
init({Port, Service, Handler}) ->
- {ok, Socket} = gen_tcp:listen(Port,
- [binary,
- {packet, 0},
- {active, false},
- {nodelay, true},
- {reuseaddr, true}]),
+ {ok, Socket} = gen_tcp:listen(
+ Port,
+ [
+ binary,
+ {packet, 0},
+ {active, false},
+ {nodelay, true},
+ {reuseaddr, true}
+ ]
+ ),
{ok, Ref} = prim_inet:async_accept(Socket, -1),
- {ok, #state{listen_socket = Socket,
- acceptor_ref = Ref,
- service = Service,
- handler = Handler}}.
+ {ok, #state{
+ listen_socket = Socket,
+ acceptor_ref = Ref,
+ service = Service,
+ handler = Handler
+ }}.
%%--------------------------------------------------------------------
%% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} |
@@ -89,7 +104,6 @@
%%--------------------------------------------------------------------
handle_call(stop, _From, State) ->
{stop, stopped, ok, State};
-
handle_call({take_socket, Socket}, {FromPid, _Tag}, State) ->
Result = gen_tcp:controlling_process(Socket, FromPid),
{reply, Result, State}.
@@ -109,11 +123,15 @@
%% {stop, Reason, State}
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
-handle_info({inet_async, ListenSocket, Ref, {ok, ClientSocket}},
- State = #state{listen_socket = ListenSocket,
- acceptor_ref = Ref,
- service = Service,
- handler = Handler}) ->
+handle_info(
+ {inet_async, ListenSocket, Ref, {ok, ClientSocket}},
+ State = #state{
+ listen_socket = ListenSocket,
+ acceptor_ref = Ref,
+ service = Service,
+ handler = Handler
+ }
+) ->
case set_sockopt(ListenSocket, ClientSocket) of
ok ->
%% New client connected - start processor
@@ -121,15 +139,15 @@
{ok, NewRef} = prim_inet:async_accept(ListenSocket, -1),
{noreply, State#state{acceptor_ref = NewRef}};
{error, Reason} ->
- error_logger:error_msg("Couldn't set socket opts: ~p~n",
- [Reason]),
+ error_logger:error_msg(
+ "Couldn't set socket opts: ~p~n",
+ [Reason]
+ ),
{stop, Reason, State}
end;
-
handle_info({inet_async, _ListenSocket, _Ref, Error}, State) ->
error_logger:error_msg("Error in acceptor: ~p~n", [Error]),
{stop, Error, State};
-
handle_info(_Info, State) ->
{noreply, State}.
@@ -155,13 +173,19 @@
%%--------------------------------------------------------------------
set_sockopt(ListenSocket, ClientSocket) ->
true = inet_db:register_socket(ClientSocket, inet_tcp),
- case prim_inet:getopts(ListenSocket,
- [active, nodelay, keepalive, delay_send, priority, tos]) of
+ case
+ prim_inet:getopts(
+ ListenSocket,
+ [active, nodelay, keepalive, delay_send, priority, tos]
+ )
+ of
{ok, Opts} ->
case prim_inet:setopts(ClientSocket, Opts) of
- ok -> ok;
- Error -> gen_tcp:close(ClientSocket),
- Error
+ ok ->
+ ok;
+ Error ->
+ gen_tcp:close(ClientSocket),
+ Error
end;
Error ->
gen_tcp:close(ClientSocket),
@@ -172,12 +196,12 @@
Server = self(),
ProtoGen = fun() ->
- % Become the controlling process
- ok = take_socket(Server, Socket),
- {ok, SocketTransport} = thrift_socket_transport:new(Socket),
- {ok, BufferedTransport} = thrift_buffered_transport:new(SocketTransport),
- {ok, Protocol} = thrift_binary_protocol:new(BufferedTransport),
- {ok, Protocol}
- end,
+ % Become the controlling process
+ ok = take_socket(Server, Socket),
+ {ok, SocketTransport} = thrift_socket_transport:new(Socket),
+ {ok, BufferedTransport} = thrift_buffered_transport:new(SocketTransport),
+ {ok, Protocol} = thrift_binary_protocol:new(BufferedTransport),
+ {ok, Protocol}
+ end,
spawn(thrift_processor, init, [{Server, ProtoGen, Service, Handler}]).
diff --git a/lib/erl/src/thrift_service.erl b/lib/erl/src/thrift_service.erl
index 2ed7b57..5024102 100644
--- a/lib/erl/src/thrift_service.erl
+++ b/lib/erl/src/thrift_service.erl
@@ -19,7 +19,9 @@
-module(thrift_service).
--export([behaviour_info/1]).
+%%%=========================================================================
+%%% API
+%%%=========================================================================
-behaviour_info(callbacks) ->
- [{function_info, 2}].
+%% TODO Replace response with type
+-callback function_info(atom(), atom()) -> {struct, term()}.
diff --git a/lib/erl/src/thrift_socket_server.erl b/lib/erl/src/thrift_socket_server.erl
index 432e65b..abeee81 100644
--- a/lib/erl/src/thrift_socket_server.erl
+++ b/lib/erl/src/thrift_socket_server.erl
@@ -21,40 +21,51 @@
-behaviour(gen_server).
--include ("thrift_constants.hrl").
+-include("thrift_constants.hrl").
+
+-export([start/1, stop/1]).
+-export([
+ init/1,
+ handle_call/3,
+ handle_cast/2,
+ terminate/2,
+ code_change/3,
+ handle_info/2
+]).
+-export([acceptor_loop/1]).
-ifdef(TEST).
- -compile(export_all).
- -export_records([thrift_socket_server]).
--else.
- -export([start/1, stop/1]).
-
- -export([init/1, handle_call/3, handle_cast/2, terminate/2, code_change/3,
- handle_info/2]).
-
- -export([acceptor_loop/1]).
+-export([parse_options/1]).
-endif.
--record(thrift_socket_server,
- {port,
- service,
- handler,
- name,
- max=2048,
- ip=any,
- listen=null,
- acceptor=null,
- socket_opts=[{recv_timeout, 500}],
- protocol=binary,
- framed=false,
- ssltransport=false,
- ssloptions=[]
- }).
+-type protocol() ::
+ compact
+ | {compact, term()}
+ | json
+ | {json, term()}
+ | binary
+ | {binary | term()}
+ | {custom, module(), term()}.
-start(State=#thrift_socket_server{}) ->
- start_server(State);
+-type socket_opts() :: [inet:inet_backend() | gen_tcp:listen_option()].
+-type ssl_opts() :: [ssl:tls_server_option()].
+
+-record(thrift_socket_server, {
+ port :: inet:port_number(),
+ service :: thrift_multiplexed_map_wrapper:service_handler_map(),
+ handler :: thrift_multiplexed_map_wrapper:service_handler_map(),
+ acceptors_left :: non_neg_integer(),
+ listen :: gen_tcp:socket(),
+ acceptor :: undefined | pid(),
+ socket_opts :: socket_opts(),
+ protocol :: protocol(),
+ framed :: boolean(),
+ ssltransport :: boolean(),
+ ssloptions :: ssl_opts()
+}).
+
start(Options) ->
- start(parse_options(Options)).
+ start_server(parse_options(Options)).
stop(Name) when is_atom(Name) ->
gen_server:cast(Name, stop);
@@ -65,259 +76,300 @@
stop({global, Name}) ->
stop(Name);
stop(Options) ->
- State = parse_options(Options),
- stop(State#thrift_socket_server.name).
+ #{name := Name} = parse_options(Options),
+ stop(Name).
%% Internal API
parse_options(Options) ->
- parse_options(Options, #thrift_socket_server{}).
+ parse_options(Options, #{}).
parse_options([], State) ->
State;
parse_options([{name, L} | Rest], State) when is_list(L) ->
Name = {local, list_to_atom(L)},
- parse_options(Rest, State#thrift_socket_server{name=Name});
+ parse_options(Rest, State#{name => Name});
parse_options([{name, A} | Rest], State) when is_atom(A) ->
Name = {local, A},
- parse_options(Rest, State#thrift_socket_server{name=Name});
+ parse_options(Rest, State#{name => Name});
parse_options([{name, Name} | Rest], State) ->
- parse_options(Rest, State#thrift_socket_server{name=Name});
+ parse_options(Rest, State#{name => Name});
parse_options([{port, L} | Rest], State) when is_list(L) ->
Port = list_to_integer(L),
- parse_options(Rest, State#thrift_socket_server{port=Port});
-parse_options([{port, Port} | Rest], State) ->
- parse_options(Rest, State#thrift_socket_server{port=Port});
+ parse_options(Rest, State#{port => Port});
+parse_options([{port, Port} | Rest], State) when is_integer(Port), Port >= 0, Port =< 65535 ->
+ parse_options(Rest, State#{port => Port});
parse_options([{ip, Ip} | Rest], State) ->
- ParsedIp = case Ip of
- any ->
- any;
- Ip when is_tuple(Ip) ->
- Ip;
- Ip when is_list(Ip) ->
- {ok, IpTuple} = inet_parse:address(Ip),
- IpTuple
- end,
- parse_options(Rest, State#thrift_socket_server{ip=ParsedIp});
+ case Ip of
+ any ->
+ parse_options(Rest, State);
+ Ip when is_tuple(Ip) ->
+ parse_options(Rest, State#{ip => Ip});
+ Ip when is_list(Ip) ->
+ {ok, IpTuple} = inet_parse:address(Ip),
+ parse_options(Rest, State#{ip => IpTuple})
+ end;
parse_options([{socket_opts, L} | Rest], State) when is_list(L), length(L) > 0 ->
- parse_options(Rest, State#thrift_socket_server{socket_opts=L});
-
+ parse_options(Rest, State#{socket_opts => L});
parse_options([{handler, []} | _Rest], _State) ->
throw("At least an error handler must be defined.");
-parse_options([{handler, ServiceHandlerPropertyList} | Rest], State) when is_list(ServiceHandlerPropertyList) ->
+parse_options([{handler, ServiceHandlerPropertyList} | Rest], State) when
+ is_list(ServiceHandlerPropertyList)
+->
ServiceHandlerMap =
- case State#thrift_socket_server.handler of
- undefined ->
- lists:foldl(
- fun ({ServiceName, ServiceHandler}, Acc) when is_list(ServiceName), is_atom(ServiceHandler) ->
- thrift_multiplexed_map_wrapper:store(ServiceName, ServiceHandler, Acc);
- (_, _Acc) ->
- throw("The handler option is not properly configured for multiplexed services. It should be a kind of [{\"error_handler\", Module::atom()}, {SericeName::list(), Module::atom()}, ...]")
- end, thrift_multiplexed_map_wrapper:new(), ServiceHandlerPropertyList);
- _ -> throw("Error while parsing the handler option.")
- end,
+ case maps:get(handler, State, undefined) of
+ undefined ->
+ lists:foldl(
+ fun
+ ({ServiceName, ServiceHandler}, Acc) when
+ is_list(ServiceName), is_atom(ServiceHandler)
+ ->
+ thrift_multiplexed_map_wrapper:store(ServiceName, ServiceHandler, Acc);
+ (_, _Acc) ->
+ throw(
+ "The handler option is not properly configured for multiplexed services. It should be a kind of [{\"error_handler\", Module::atom()}, {SericeName::list(), Module::atom()}, ...]"
+ )
+ end,
+ thrift_multiplexed_map_wrapper:new(),
+ ServiceHandlerPropertyList
+ );
+ _ ->
+ throw("Error while parsing the handler option.")
+ end,
case thrift_multiplexed_map_wrapper:find(?MULTIPLEXED_ERROR_HANDLER_KEY, ServiceHandlerMap) of
- {ok, _ErrorHandler} -> parse_options(Rest, State#thrift_socket_server{handler=ServiceHandlerMap});
- error -> throw("The handler option is not properly configured for multiplexed services. It should be a kind of [{\"error_handler\", Module::atom()}, {SericeName::list(), Module::atom()}, ...]")
+ {ok, _ErrorHandler} ->
+ parse_options(Rest, State#{handler => ServiceHandlerMap});
+ error ->
+ throw(
+ "The handler option is not properly configured for multiplexed services. It should be a kind of [{\"error_handler\", Module::atom()}, {SericeName::list(), Module::atom()}, ...]"
+ )
end;
-parse_options([{handler, Handler} | Rest], State) when State#thrift_socket_server.handler == undefined, is_atom(Handler) ->
- parse_options(Rest, State#thrift_socket_server{handler=Handler});
-
+parse_options([{handler, Handler} | Rest], State) when
+ not is_map_key(handler, State), is_atom(Handler)
+->
+ parse_options(Rest, State#{handler => Handler});
parse_options([{service, []} | _Rest], _State) ->
throw("At least one service module must be defined.");
-parse_options([{service, ServiceModulePropertyList} | Rest], State) when is_list(ServiceModulePropertyList) ->
+parse_options([{service, ServiceModulePropertyList} | Rest], State) when
+ is_list(ServiceModulePropertyList)
+->
ServiceModuleMap =
- case State#thrift_socket_server.service of
- undefined ->
- lists:foldl(
- fun ({ServiceName, ServiceModule}, Acc) when is_list(ServiceName), is_atom(ServiceModule) ->
- thrift_multiplexed_map_wrapper:store(ServiceName, ServiceModule, Acc);
- (_, _Acc) ->
- throw("The service option is not properly configured for multiplexed services. It should be a kind of [{SericeName::list(), ServiceModule::atom()}, ...]")
- end, thrift_multiplexed_map_wrapper:new(), ServiceModulePropertyList);
- _ -> throw("Error while parsing the service option.")
- end,
- parse_options(Rest, State#thrift_socket_server{service=ServiceModuleMap});
-parse_options([{service, Service} | Rest], State) when State#thrift_socket_server.service == undefined, is_atom(Service) ->
- parse_options(Rest, State#thrift_socket_server{service=Service});
-
-parse_options([{max, Max} | Rest], State) ->
- MaxInt = case Max of
- Max when is_list(Max) ->
- list_to_integer(Max);
- Max when is_integer(Max) ->
- Max
- end,
- parse_options(Rest, State#thrift_socket_server{max=MaxInt});
-
+ case maps:get(service, State, undefined) of
+ undefined ->
+ lists:foldl(
+ fun
+ ({ServiceName, ServiceModule}, Acc) when
+ is_list(ServiceName), is_atom(ServiceModule)
+ ->
+ thrift_multiplexed_map_wrapper:store(ServiceName, ServiceModule, Acc);
+ (_, _Acc) ->
+ throw(
+ "The service option is not properly configured for multiplexed services. It should be a kind of [{SericeName::list(), ServiceModule::atom()}, ...]"
+ )
+ end,
+ thrift_multiplexed_map_wrapper:new(),
+ ServiceModulePropertyList
+ );
+ _ ->
+ throw("Error while parsing the service option.")
+ end,
+ parse_options(Rest, State#{service => ServiceModuleMap});
+parse_options([{service, Service} | Rest], State) when
+ not is_map_key(service, State), is_atom(Service)
+->
+ parse_options(Rest, State#{service => Service});
+parse_options([{max, Max} | Rest], State) when is_integer(Max), Max > 0 ->
+ parse_options(Rest, State#{max => Max});
parse_options([{protocol, Proto} | Rest], State) when is_atom(Proto) ->
- parse_options(Rest, State#thrift_socket_server{protocol=Proto});
-
+ parse_options(Rest, State#{protocol => Proto});
parse_options([{framed, Framed} | Rest], State) when is_boolean(Framed) ->
- parse_options(Rest, State#thrift_socket_server{framed=Framed});
-
+ parse_options(Rest, State#{framed => Framed});
parse_options([{ssltransport, SSLTransport} | Rest], State) when is_boolean(SSLTransport) ->
- parse_options(Rest, State#thrift_socket_server{ssltransport=SSLTransport});
+ parse_options(Rest, State#{ssltransport => SSLTransport});
parse_options([{ssloptions, SSLOptions} | Rest], State) when is_list(SSLOptions) ->
- parse_options(Rest, State#thrift_socket_server{ssloptions=SSLOptions}).
+ parse_options(Rest, State#{ssloptions => SSLOptions}).
-start_server(State=#thrift_socket_server{name=Name}) ->
+start_server(Options = #{name := Name}) ->
case Name of
undefined ->
- gen_server:start_link(?MODULE, State, []);
+ gen_server:start_link(?MODULE, Options, []);
_ ->
- gen_server:start_link(Name, ?MODULE, State, [])
+ gen_server:start_link(Name, ?MODULE, Options, [])
end.
-init(State=#thrift_socket_server{ip=Ip, port=Port}) ->
+init(State = #{port := Port}) ->
process_flag(trap_exit, true),
- BaseOpts = [binary,
- {reuseaddr, true},
- {packet, 0},
- {backlog, 4096},
- {recbuf, 8192},
- {active, false}],
- Opts = case Ip of
- any ->
- BaseOpts;
- Ip ->
- [{ip, Ip} | BaseOpts]
- end,
- case gen_tcp_listen(Port, Opts, State) of
- {stop, eacces} ->
- %% fdsrv module allows another shot to bind
- %% ports which require root access
- case Port < 1024 of
- true ->
- case fdsrv:start() of
- {ok, _} ->
- case fdsrv:bind_socket(tcp, Port) of
- {ok, Fd} ->
- gen_tcp_listen(Port, [{fd, Fd} | Opts], State);
- _ ->
- {stop, fdsrv_bind_failed}
- end;
- _ ->
- {stop, fdsrv_start_failed}
- end;
- false ->
- {stop, eacces}
- end;
- Other ->
- error_logger:info_msg("thrift service listening on port ~p", [Port]),
- Other
- end.
-
-gen_tcp_listen(Port, Opts, State) ->
+ BaseOpts = [
+ binary,
+ {reuseaddr, true},
+ {packet, 0},
+ {backlog, 4096},
+ {recbuf, 8192},
+ {active, false}
+ ],
+ Opts =
+ case maps:get(ip, State, undefined) of
+ undefined ->
+ BaseOpts;
+ Ip ->
+ [{ip, Ip} | BaseOpts]
+ end,
case gen_tcp:listen(Port, Opts) of
{ok, Listen} ->
{ok, ListenPort} = inet:port(Listen),
- {ok, new_acceptor(State#thrift_socket_server{listen=Listen,
- port=ListenPort})};
+ {ok,
+ new_acceptor(#thrift_socket_server{
+ acceptors_left = maps:get(max, State, 2048),
+ listen = Listen,
+ port = ListenPort,
+ service = maps:get(service, State),
+ handler = maps:get(handler, State),
+ socket_opts = maps:get(socket_opts, State, [{recv_timeout, 500}]),
+ framed = maps:get(framed, State, false),
+ protocol = maps:get(protocol, State, binary),
+ ssltransport = maps:get(ssltransport, State, false),
+ ssloptions = maps:get(ssloptions, State, [])
+ })};
{error, Reason} ->
{stop, Reason}
end.
-new_acceptor(State=#thrift_socket_server{max=0}) ->
+new_acceptor(State = #thrift_socket_server{acceptors_left = 0}) ->
error_logger:error_msg("Not accepting new connections"),
- State#thrift_socket_server{acceptor=null};
-new_acceptor(State=#thrift_socket_server{listen=Listen,
- service=Service, handler=Handler,
- socket_opts=Opts, framed=Framed, protocol=Proto,
- ssltransport=SslTransport, ssloptions=SslOptions
- }) ->
- Pid = proc_lib:spawn_link(?MODULE, acceptor_loop,
- [{self(), Listen, Service, Handler, Opts, Framed, SslTransport, SslOptions, Proto}]),
- State#thrift_socket_server{acceptor=Pid}.
+ State#thrift_socket_server{acceptor = undefined};
+new_acceptor(
+ State = #thrift_socket_server{
+ listen = Listen,
+ service = Service,
+ handler = Handler,
+ socket_opts = Opts,
+ framed = Framed,
+ protocol = Proto,
+ ssltransport = SslTransport,
+ ssloptions = SslOptions
+ }
+) ->
+ Pid = proc_lib:spawn_link(
+ ?MODULE,
+ acceptor_loop,
+ [{self(), Listen, Service, Handler, Opts, Framed, SslTransport, SslOptions, Proto}]
+ ),
+ State#thrift_socket_server{acceptor = Pid}.
-acceptor_loop({Server, Listen, Service, Handler, SocketOpts, Framed, SslTransport, SslOptions, Proto})
- when is_pid(Server), is_list(SocketOpts) ->
- case catch gen_tcp:accept(Listen) of % infinite timeout
+acceptor_loop(
+ {Server, Listen, Service, Handler, SocketOpts, Framed, SslTransport, SslOptions, Proto}
+) when
+ is_pid(Server), is_list(SocketOpts)
+->
+ % infinite timeout
+ case catch gen_tcp:accept(Listen) of
{ok, Socket} ->
gen_server:cast(Server, {accepted, self()}),
ProtoGen = fun() ->
- {ok, SocketTransport} = case SslTransport of
- true -> thrift_sslsocket_transport:new(Socket, SocketOpts, SslOptions);
- false -> thrift_socket_transport:new(Socket, SocketOpts)
- end,
- {ok, Transport} = case Framed of
- true -> thrift_framed_transport:new(SocketTransport);
- false -> thrift_buffered_transport:new(SocketTransport)
- end,
- {ok, Protocol} = case Proto of
- compact -> thrift_compact_protocol:new(Transport);
- json -> thrift_json_protocol:new(Transport);
- _ -> thrift_binary_protocol:new(Transport)
- end,
- {ok, Protocol}
- end,
+ {ok, SocketTransport} =
+ case SslTransport of
+ true -> thrift_sslsocket_transport:new(Socket, SocketOpts, SslOptions);
+ false -> thrift_socket_transport:new(Socket, SocketOpts)
+ end,
+ {ok, Transport} =
+ case Framed of
+ true -> thrift_framed_transport:new(SocketTransport);
+ false -> thrift_buffered_transport:new(SocketTransport)
+ end,
+ {ok, Protocol} =
+ case Proto of
+ compact ->
+ thrift_compact_protocol:new(Transport);
+ {compact, Options} ->
+ thrift_compact_protocol:new(Transport, Options);
+ json ->
+ thrift_json_protocol:new(Transport);
+ {json, Options} ->
+ thrift_json_protocol:new(Transport, Options);
+ binary ->
+ thrift_binary_protocol:new(Transport);
+ {binary, Options} ->
+ thrift_binary_protocol:new(Transport, Options);
+ {custom, Module, Options} ->
+ case erlang:function_exported(Module, new, 2) of
+ true -> Module:new(Transport, Options);
+ false -> throw("Could not instantiate custom protocol")
+ end
+ end,
+ {ok, Protocol}
+ end,
thrift_processor:init({Server, ProtoGen, Service, Handler});
{error, closed} ->
exit({error, closed});
Other ->
error_logger:error_report(
- [{application, thrift},
- "Accept failed error",
- lists:flatten(io_lib:format("~p", [Other]))]),
+ [
+ {application, thrift},
+ "Accept failed error",
+ lists:flatten(io_lib:format("~p", [Other]))
+ ]
+ ),
exit({error, accept_failed})
end.
-handle_call({get, port}, _From, State=#thrift_socket_server{port=Port}) ->
+handle_call({get, port}, _From, State = #thrift_socket_server{port = Port}) ->
{reply, Port, State};
handle_call(_Message, _From, State) ->
Res = error,
{reply, Res, State}.
-handle_cast({accepted, Pid},
- State=#thrift_socket_server{acceptor=Pid, max=Max}) ->
+handle_cast(
+ {accepted, Pid},
+ State = #thrift_socket_server{acceptor = Pid, acceptors_left = Max}
+) ->
% io:format("accepted ~p~n", [Pid]),
- State1 = State#thrift_socket_server{max=Max - 1},
+ State1 = State#thrift_socket_server{acceptors_left = Max - 1},
{noreply, new_acceptor(State1)};
handle_cast(stop, State) ->
{stop, normal, State}.
-terminate(Reason, #thrift_socket_server{listen=Listen, port=Port}) ->
+terminate(Reason, #thrift_socket_server{listen = Listen}) ->
gen_tcp:close(Listen),
case Reason of
- normal -> ok;
- shutdown -> ok;
- _ -> {backtrace, Bt} = erlang:process_info(self(), backtrace),
- error_logger:error_report({?MODULE, ?LINE,
- {child_error, Reason, Bt}})
- end,
- case Port < 1024 of
- true ->
- catch fdsrv:stop(),
+ normal ->
ok;
- false ->
- ok
+ shutdown ->
+ ok;
+ _ ->
+ {backtrace, Bt} = erlang:process_info(self(), backtrace),
+ error_logger:error_report({?MODULE, ?LINE, {child_error, Reason, Bt}})
end.
code_change(_OldVsn, State, _Extra) ->
State.
-handle_info({'EXIT', Pid, normal},
- State=#thrift_socket_server{acceptor=Pid}) ->
+handle_info(
+ {'EXIT', Pid, normal},
+ State = #thrift_socket_server{acceptor = Pid}
+) ->
{noreply, new_acceptor(State)};
-handle_info({'EXIT', Pid, Reason},
- State=#thrift_socket_server{acceptor=Pid}) ->
- error_logger:error_report({?MODULE, ?LINE,
- {acceptor_error, Reason}}),
+handle_info(
+ {'EXIT', Pid, Reason},
+ State = #thrift_socket_server{acceptor = Pid}
+) ->
+ error_logger:error_report({?MODULE, ?LINE, {acceptor_error, Reason}}),
timer:sleep(100),
{noreply, new_acceptor(State)};
-handle_info({'EXIT', _LoopPid, Reason},
- State=#thrift_socket_server{acceptor=Pid, max=Max}) ->
+handle_info(
+ {'EXIT', _LoopPid, Reason},
+ State = #thrift_socket_server{acceptor = Pid, acceptors_left = AcceptorsLeft}
+) ->
case Reason of
normal -> ok;
shutdown -> ok;
- _ -> error_logger:error_report({?MODULE, ?LINE,
- {child_error, Reason, erlang:get_stacktrace()}})
+ _ -> error_logger:error_report({?MODULE, ?LINE, {child_error, Reason}})
end,
- State1 = State#thrift_socket_server{max=Max + 1},
- State2 = case Pid of
- null -> new_acceptor(State1);
- _ -> State1
- end,
+ State1 = State#thrift_socket_server{acceptors_left = AcceptorsLeft + 1},
+ State2 =
+ case Pid of
+ undefined -> new_acceptor(State1);
+ _ -> State1
+ end,
{noreply, State2};
handle_info(Info, State) ->
error_logger:info_report([{'INFO', Info}, {'State', State}]),
diff --git a/lib/erl/src/thrift_socket_transport.erl b/lib/erl/src/thrift_socket_transport.erl
index fe210da..a5b68e1 100644
--- a/lib/erl/src/thrift_socket_transport.erl
+++ b/lib/erl/src/thrift_socket_transport.erl
@@ -28,113 +28,89 @@
%% legacy api
-export([new_transport_factory/3]).
-
-record(t_socket, {
- socket,
- recv_timeout=60000,
- buffer = []
+ socket :: gen_tcp:socket(),
+ recv_timeout = 60000 :: timeout(),
+ buffer = [] :: iodata()
}).
--type state() :: #t_socket{}.
-
-
--spec new(Socket::any()) ->
- thrift_transport:t_transport().
+-spec new(Socket :: any()) -> {ok, thrift_transport:t_transport()}.
new(Socket) -> new(Socket, []).
--spec new(Socket::any(), Opts::list()) ->
- thrift_transport:t_transport().
+-spec new(Socket :: any(), Opts :: list()) -> {ok, thrift_transport:t_transport()}.
new(Socket, Opts) when is_list(Opts) ->
- State = parse_opts(Opts, #t_socket{socket = Socket}),
- thrift_transport:new(?MODULE, State).
+ State = parse_opts(Opts, #t_socket{socket = Socket}),
+ thrift_transport:new(?MODULE, State).
-
-parse_opts([{recv_timeout, Timeout}|Rest], State)
-when is_integer(Timeout), Timeout > 0 ->
- parse_opts(Rest, State#t_socket{recv_timeout = Timeout});
-parse_opts([{recv_timeout, infinity}|Rest], State) ->
- parse_opts(Rest, State#t_socket{recv_timeout = infinity});
+parse_opts([{recv_timeout, Timeout} | Rest], State) when
+ is_integer(Timeout), Timeout > 0
+->
+ parse_opts(Rest, State#t_socket{recv_timeout = Timeout});
+parse_opts([{recv_timeout, infinity} | Rest], State) ->
+ parse_opts(Rest, State#t_socket{recv_timeout = infinity});
parse_opts([], State) ->
- State.
+ State.
+read(State = #t_socket{buffer = Buf}, Len) when
+ is_integer(Len), Len >= 0
+->
+ Binary = iolist_to_binary(Buf),
+ case iolist_size(Binary) of
+ X when X >= Len ->
+ {Result, Remaining} = split_binary(Binary, Len),
+ {State#t_socket{buffer = Remaining}, {ok, Result}};
+ _ ->
+ loop_recv(State, Len, Len)
+ end.
--include("thrift_transport_behaviour.hrl").
-
-
-read(State = #t_socket{buffer = Buf}, Len)
-when is_integer(Len), Len >= 0 ->
- Binary = iolist_to_binary(Buf),
- case iolist_size(Binary) of
- X when X >= Len ->
- {Result, Remaining} = split_binary(Binary, Len),
- {State#t_socket{buffer = Remaining}, {ok, Result}};
- _ ->
- %%recv(State, Len)
- loop_recv(State,Len,Len)
- end.
-
-loop_recv(State=#t_socket{buffer = Buf},ReadLen,NextReadLen) when NextReadLen =< 0->
- {Result,Remaining}=split_binary(Buf,ReadLen),
- {State#t_socket{buffer = Remaining},{ok,Result}};
-
-loop_recv(State=#t_socket{socket = Socket,buffer = Buf},ReadLen,NextReadLen) when NextReadLen >0 ->
- case gen_tcp:recv(Socket,0,State#t_socket.recv_timeout) of
- {error,Error}->
- gen_tcp:close(Socket),
- {State,{error,Error}};
- {ok,Data}->
- Binary=iolist_to_binary([Buf,Data]),
- Give=min(iolist_size(Binary),ReadLen),
- loop_recv(State#t_socket{buffer = Binary},ReadLen,ReadLen-Give)
- end.
-
-recv(State = #t_socket{socket = Socket, buffer = Buf}, Len) ->
- case gen_tcp:recv(Socket, 0, State#t_socket.recv_timeout) of
- {error, Error} ->
- gen_tcp:close(Socket),
- {State, {error, Error}};
- {ok, Data} ->
- Binary = iolist_to_binary([Buf, Data]),
- Give = min(iolist_size(Binary), Len),
- {Result, Remaining} = split_binary(Binary, Give),
- {State#t_socket{buffer = Remaining}, {ok, Result}}
- end.
-
-
-read_exact(State = #t_socket{buffer = Buf}, Len)
-when is_integer(Len), Len >= 0 ->
- Binary = iolist_to_binary(Buf),
- case iolist_size(Binary) of
- X when X >= Len -> read(State, Len);
- X ->
- case gen_tcp:recv(State#t_socket.socket, Len - X, State#t_socket.recv_timeout) of
+loop_recv(State = #t_socket{buffer = Buf}, ReadLen, NextReadLen) when NextReadLen =< 0 ->
+ {Result, Remaining} = split_binary(Buf, ReadLen),
+ {State#t_socket{buffer = Remaining}, {ok, Result}};
+loop_recv(State = #t_socket{socket = Socket, buffer = Buf}, ReadLen, NextReadLen) when
+ NextReadLen > 0
+->
+ case gen_tcp:recv(Socket, 0, State#t_socket.recv_timeout) of
{error, Error} ->
- gen_tcp:close(State#t_socket.socket),
- {State, {error, Error}};
+ gen_tcp:close(Socket),
+ {State, {error, Error}};
{ok, Data} ->
- {State#t_socket{buffer = []}, {ok, <<Binary/binary, Data/binary>>}}
- end
- end.
+ Binary = iolist_to_binary([Buf, Data]),
+ Give = min(iolist_size(Binary), ReadLen),
+ loop_recv(State#t_socket{buffer = Binary}, ReadLen, ReadLen - Give)
+ end.
+read_exact(State = #t_socket{buffer = Buf}, Len) when
+ is_integer(Len), Len >= 0
+->
+ Binary = iolist_to_binary(Buf),
+ case iolist_size(Binary) of
+ X when X >= Len -> read(State, Len);
+ X ->
+ case gen_tcp:recv(State#t_socket.socket, Len - X, State#t_socket.recv_timeout) of
+ {error, Error} ->
+ gen_tcp:close(State#t_socket.socket),
+ {State, {error, Error}};
+ {ok, Data} ->
+ {State#t_socket{buffer = []}, {ok, <<Binary/binary, Data/binary>>}}
+ end
+ end.
write(State = #t_socket{socket = Socket}, Data) ->
- case gen_tcp:send(Socket, Data) of
- {error, Error} ->
- gen_tcp:close(Socket),
- {State, {error, Error}};
- ok -> {State, ok}
- end.
-
+ case gen_tcp:send(Socket, Data) of
+ {error, Error} ->
+ gen_tcp:close(Socket),
+ {State, {error, Error}};
+ ok ->
+ {State, ok}
+ end.
flush(State) ->
- {State#t_socket{buffer = []}, ok}.
-
+ {State#t_socket{buffer = []}, ok}.
close(State = #t_socket{socket = Socket}) ->
- {State, gen_tcp:close(Socket)}.
-
+ {State, gen_tcp:close(Socket)}.
%% legacy api. left for compatibility
@@ -143,51 +119,61 @@
%% proplists-style option list. They're parsed like this so it is an O(n)
%% operation instead of O(n^2)
-record(factory_opts, {
- connect_timeout = infinity,
- sockopts = [],
- framed = false
+ connect_timeout = infinity :: timeout(),
+ sockopts = [] :: [inet:inet_backend() | gen_tcp:connect_option()],
+ framed = false :: boolean()
}).
-parse_factory_options([], FactoryOpts, TransOpts) -> {FactoryOpts, TransOpts};
-parse_factory_options([{framed, Bool}|Rest], FactoryOpts, TransOpts)
-when is_boolean(Bool) ->
- parse_factory_options(Rest, FactoryOpts#factory_opts{framed = Bool}, TransOpts);
-parse_factory_options([{sockopts, OptList}|Rest], FactoryOpts, TransOpts)
-when is_list(OptList) ->
- parse_factory_options(Rest, FactoryOpts#factory_opts{sockopts = OptList}, TransOpts);
-parse_factory_options([{connect_timeout, TO}|Rest], FactoryOpts, TransOpts)
-when TO =:= infinity; is_integer(TO) ->
- parse_factory_options(Rest, FactoryOpts#factory_opts{connect_timeout = TO}, TransOpts);
-parse_factory_options([{recv_timeout, TO}|Rest], FactoryOpts, TransOpts)
-when TO =:= infinity; is_integer(TO) ->
- parse_factory_options(Rest, FactoryOpts, [{recv_timeout, TO}] ++ TransOpts).
-
+parse_factory_options([], FactoryOpts, TransOpts) ->
+ {FactoryOpts, TransOpts};
+parse_factory_options([{framed, Bool} | Rest], FactoryOpts, TransOpts) when
+ is_boolean(Bool)
+->
+ parse_factory_options(Rest, FactoryOpts#factory_opts{framed = Bool}, TransOpts);
+parse_factory_options([{sockopts, OptList} | Rest], FactoryOpts, TransOpts) when
+ is_list(OptList)
+->
+ parse_factory_options(Rest, FactoryOpts#factory_opts{sockopts = OptList}, TransOpts);
+parse_factory_options([{connect_timeout, TO} | Rest], FactoryOpts, TransOpts) when
+ TO =:= infinity; is_integer(TO)
+->
+ parse_factory_options(Rest, FactoryOpts#factory_opts{connect_timeout = TO}, TransOpts);
+parse_factory_options([{recv_timeout, TO} | Rest], FactoryOpts, TransOpts) when
+ TO =:= infinity; is_integer(TO)
+->
+ parse_factory_options(Rest, FactoryOpts, [{recv_timeout, TO}] ++ TransOpts).
%% Generates a "transport factory" function - a fun which returns a thrift_transport()
%% instance.
%% State can be passed into a protocol factory to generate a connection to a
%% thrift server over a socket.
new_transport_factory(Host, Port, Options) ->
- {FactoryOpts, TransOpts} = parse_factory_options(Options, #factory_opts{}, []),
- {ok, fun() -> SockOpts = [binary,
- {packet, 0},
- {active, false},
- {nodelay, true}|FactoryOpts#factory_opts.sockopts
- ],
- case catch gen_tcp:connect(
- Host,
- Port,
- SockOpts,
- FactoryOpts#factory_opts.connect_timeout
- ) of
- {ok, Sock} ->
- {ok, Transport} = thrift_socket_transport:new(Sock, TransOpts),
- {ok, BufTransport} = case FactoryOpts#factory_opts.framed of
- true -> thrift_framed_transport:new(Transport);
- false -> thrift_buffered_transport:new(Transport)
- end,
- {ok, BufTransport};
- Error -> Error
- end
- end}.
-
+ {FactoryOpts, TransOpts} = parse_factory_options(Options, #factory_opts{}, []),
+ {ok, fun() ->
+ SockOpts = [
+ binary,
+ {packet, 0},
+ {active, false},
+ {nodelay, true}
+ | FactoryOpts#factory_opts.sockopts
+ ],
+ case
+ catch gen_tcp:connect(
+ Host,
+ Port,
+ SockOpts,
+ FactoryOpts#factory_opts.connect_timeout
+ )
+ of
+ {ok, Sock} ->
+ {ok, Transport} = thrift_socket_transport:new(Sock, TransOpts),
+ {ok, BufTransport} =
+ case FactoryOpts#factory_opts.framed of
+ true -> thrift_framed_transport:new(Transport);
+ false -> thrift_buffered_transport:new(Transport)
+ end,
+ {ok, BufTransport};
+ Error ->
+ Error
+ end
+ end}.
diff --git a/lib/erl/src/thrift_sslsocket_transport.erl b/lib/erl/src/thrift_sslsocket_transport.erl
index 211153f..43e64b1 100644
--- a/lib/erl/src/thrift_sslsocket_transport.erl
+++ b/lib/erl/src/thrift_sslsocket_transport.erl
@@ -18,80 +18,97 @@
%%
-module(thrift_sslsocket_transport).
--include("thrift_transport_behaviour.hrl").
-
-behaviour(thrift_transport).
--export([new/3,
- write/2, read/2, flush/1, close/1,
+-export([
+ new/3,
+ write/2,
+ read/2,
+ flush/1,
+ close/1,
- new_transport_factory/3]).
+ new_transport_factory/3
+]).
%% Export only for the transport factory
-export([new/2]).
--record(data, {socket,
- recv_timeout=infinity}).
--type state() :: #data{}.
+-record(data, {
+ socket :: ssl:sslsocket(),
+ recv_timeout = infinity :: infinity | timeout()
+}).
+
+-type data() :: #data{}.
+-type reason() :: thrift_transport:reason().
%% The following "local" record is filled in by parse_factory_options/2
%% below. These options can be passed to new_protocol_factory/3 in a
%% proplists-style option list. They're parsed like this so it is an O(n)
%% operation instead of O(n^2)
--record(factory_opts, {connect_timeout = infinity,
- sockopts = [],
- framed = false,
- ssloptions = []}).
+-record(factory_opts, {
+ connect_timeout = infinity :: infinity | timeout(),
+ sockopts = [] :: [inet:inet_backend() | gen_tcp:connect_option()],
+ framed = false :: boolean(),
+ ssloptions = [] :: [ssl:tls_client_option()]
+}).
parse_factory_options([], Opts) ->
Opts;
parse_factory_options([{framed, Bool} | Rest], Opts) when is_boolean(Bool) ->
- parse_factory_options(Rest, Opts#factory_opts{framed=Bool});
+ parse_factory_options(Rest, Opts#factory_opts{framed = Bool});
parse_factory_options([{sockopts, OptList} | Rest], Opts) when is_list(OptList) ->
- parse_factory_options(Rest, Opts#factory_opts{sockopts=OptList});
+ parse_factory_options(Rest, Opts#factory_opts{sockopts = OptList});
parse_factory_options([{connect_timeout, TO} | Rest], Opts) when TO =:= infinity; is_integer(TO) ->
- parse_factory_options(Rest, Opts#factory_opts{connect_timeout=TO});
+ parse_factory_options(Rest, Opts#factory_opts{connect_timeout = TO});
parse_factory_options([{ssloptions, SslOptions} | Rest], Opts) when is_list(SslOptions) ->
- parse_factory_options(Rest, Opts#factory_opts{ssloptions=SslOptions}).
+ parse_factory_options(Rest, Opts#factory_opts{ssloptions = SslOptions}).
new(Socket, SockOpts, SslOptions) when is_list(SockOpts), is_list(SslOptions) ->
- inet:setopts(Socket, [{active, false}]), %% => prevent the ssl handshake messages get lost
+ %% => prevent the ssl handshake messages get lost
+ ok = inet:setopts(Socket, [{active, false}]),
%% upgrade to an ssl socket
- case catch ssl:ssl_accept(Socket, SslOptions) of % infinite timeout
+
+ % infinite timeout
+ case catch ssl:handshake(Socket, SslOptions) of
{ok, SslSocket} ->
new(SslSocket, SockOpts);
{error, Reason} ->
exit({error, Reason});
Other ->
error_logger:error_report(
- [{application, thrift},
- "SSL accept failed error",
- lists:flatten(io_lib:format("~p", [Other]))]),
+ [
+ {application, thrift},
+ "SSL accept failed error",
+ lists:flatten(io_lib:format("~p", [Other]))
+ ]
+ ),
exit({error, ssl_accept_failed})
end.
new(SslSocket, SockOpts) ->
State =
case lists:keysearch(recv_timeout, 1, SockOpts) of
- {value, {recv_timeout, Timeout}}
- when is_integer(Timeout), Timeout > 0 ->
- #data{socket=SslSocket, recv_timeout=Timeout};
+ {value, {recv_timeout, Timeout}} when
+ is_integer(Timeout), Timeout > 0
+ ->
+ #data{socket = SslSocket, recv_timeout = Timeout};
_ ->
- #data{socket=SslSocket}
+ #data{socket = SslSocket}
end,
thrift_transport:new(?MODULE, State).
%% Data :: iolist()
+-spec write(data(), iolist()) -> {data(), ok | {error, reason()}}.
write(This = #data{socket = Socket}, Data) ->
{This, ssl:send(Socket, Data)}.
-read(This = #data{socket=Socket, recv_timeout=Timeout}, Len)
- when is_integer(Len), Len >= 0 ->
+read(This = #data{socket = Socket, recv_timeout = Timeout}, Len) when
+ is_integer(Len), Len >= 0
+->
case ssl:recv(Socket, Len, Timeout) of
Err = {error, timeout} ->
- error_logger:info_msg("read timeout: peer conn ~p", [inet:peername(Socket)]),
- ssl:close(Socket),
+ ok = ssl:close(Socket),
{This, Err};
Data ->
{This, Data}
@@ -116,32 +133,48 @@
ParsedOpts = parse_factory_options(Options, #factory_opts{}),
F = fun() ->
- SockOpts = [binary,
- {packet, 0},
- {active, false},
- {nodelay, true} |
- ParsedOpts#factory_opts.sockopts],
- case catch gen_tcp:connect(Host, Port, SockOpts,
- ParsedOpts#factory_opts.connect_timeout) of
- {ok, Sock} ->
- SslSock = case catch ssl:connect(Sock, ParsedOpts#factory_opts.ssloptions,
- ParsedOpts#factory_opts.connect_timeout) of
- {ok, SslSocket} ->
- SslSocket;
- Other ->
- error_logger:info_msg("error while connecting over ssl - reason: ~p~n", [Other]),
- catch gen_tcp:close(Sock),
- exit(error)
- end,
- {ok, Transport} = thrift_sslsocket_transport:new(SslSock, SockOpts),
- {ok, BufTransport} =
- case ParsedOpts#factory_opts.framed of
- true -> thrift_framed_transport:new(Transport);
- false -> thrift_buffered_transport:new(Transport)
- end,
- {ok, BufTransport};
- Error ->
- Error
- end
- end,
- {ok, F}.
\ No newline at end of file
+ SockOpts = [
+ binary,
+ {packet, 0},
+ {active, false},
+ {nodelay, true}
+ | ParsedOpts#factory_opts.sockopts
+ ],
+ case
+ catch gen_tcp:connect(
+ Host,
+ Port,
+ SockOpts,
+ ParsedOpts#factory_opts.connect_timeout
+ )
+ of
+ {ok, Sock} ->
+ SslSock =
+ case
+ catch ssl:connect(
+ Sock,
+ ParsedOpts#factory_opts.ssloptions,
+ ParsedOpts#factory_opts.connect_timeout
+ )
+ of
+ {ok, SslSocket} ->
+ SslSocket;
+ Other ->
+ error_logger:info_msg(
+ "error while connecting over ssl - reason: ~p~n", [Other]
+ ),
+ catch gen_tcp:close(Sock),
+ exit(error)
+ end,
+ {ok, Transport} = thrift_sslsocket_transport:new(SslSock, SockOpts),
+ {ok, BufTransport} =
+ case ParsedOpts#factory_opts.framed of
+ true -> thrift_framed_transport:new(Transport);
+ false -> thrift_buffered_transport:new(Transport)
+ end,
+ {ok, BufTransport};
+ Error ->
+ Error
+ end
+ end,
+ {ok, F}.
diff --git a/lib/erl/src/thrift_transport.erl b/lib/erl/src/thrift_transport.erl
index 2414bde..cc9ca1b 100644
--- a/lib/erl/src/thrift_transport.erl
+++ b/lib/erl/src/thrift_transport.erl
@@ -19,108 +19,105 @@
-module(thrift_transport).
--export([behaviour_info/1]).
%% constructors
-export([new/1, new/2]).
%% transport callbacks
-export([read/2, read_exact/2, write/2, flush/1, close/1]).
+-record(t_transport, {
+ module :: module(),
+ state :: term()
+}).
+-type t_transport() :: #t_transport{}.
-export_type([t_transport/0]).
+%%%=========================================================================
+%%% API
+%%%=========================================================================
+-type state() :: term().
+-export_type([state/0]).
+-type reason() :: term().
+-export_type([reason/0]).
-behaviour_info(callbacks) ->
- [{read, 2}, {write, 2}, {flush, 1}, {close, 1}].
-
-
--record(t_transport, {
- module,
- state
-}).
-
--type state() :: #t_transport{}.
--type t_transport() :: #t_transport{}.
-
+-callback write(state(), iolist() | binary()) -> {state(), ok | {error, reason()}}.
+-callback read(state(), non_neg_integer()) -> {state(), {ok, binary()} | {error, reason()}}.
+-callback flush(state()) -> {state(), ok | {error, reason()}}.
+-callback close(state()) -> {state(), ok | {error, reason()}}.
-ifdef(transport_wrapper_module).
-define(debug_wrap(Transport),
- case Transport#t_transport.module of
- ?transport_wrapper_module -> Transport;
- _Else ->
- {ok, Result} = ?transport_wrapper_module:new(Transport),
- Result
- end
+ case Transport#t_transport.module of
+ ?transport_wrapper_module ->
+ Transport;
+ _Else ->
+ {ok, Result} = ?transport_wrapper_module:new(Transport),
+ Result
+ end
).
-else.
-define(debug_wrap(Transport), Transport).
-endif.
-
-type wrappable() ::
- binary() |
- list() |
- {membuffer, binary() | list()} |
- {tcp, port()} |
- {tcp, port(), list()} |
- {file, file:io_device()} |
- {file, file:io_device(), list()} |
- {file, file:filename()} |
- {file, file:filename(), list()}.
+ binary()
+ | list()
+ | {membuffer, binary() | list()}
+ | {membuffer, binary() | list(), list()}
+ | {tcp, port()}
+ | {tcp, port(), list()}
+ | {file, file:io_device()}
+ | {file, file:io_device(), list()}
+ | {file, file:filename()}
+ | {file, file:filename(), list()}.
-spec new(wrappable()) -> {ok, #t_transport{}}.
-new({membuffer, Membuffer}) when is_binary(Membuffer); is_list(Membuffer) ->
- thrift_membuffer_transport:new(Membuffer);
-new({membuffer, Membuffer, []}) when is_binary(Membuffer); is_list(Membuffer) ->
- thrift_membuffer_transport:new(Membuffer);
+new({membuffer, Membuffer}) ->
+ new({membuffer, Membuffer, []});
+new({membuffer, Membuffer, Opts}) when is_binary(Membuffer); is_list(Membuffer) ->
+ thrift_membuffer_transport:new(Membuffer, Opts);
new({tcp, Socket}) when is_port(Socket) ->
- new({tcp, Socket, []});
+ new({tcp, Socket, []});
new({tcp, Socket, Opts}) when is_port(Socket) ->
- thrift_socket_transport:new(Socket, Opts);
+ thrift_socket_transport:new(Socket, Opts);
new({file, Filename}) when is_list(Filename); is_binary(Filename) ->
- new({file, Filename, []});
+ new({file, Filename, []});
new({file, Filename, Opts}) when is_list(Filename); is_binary(Filename) ->
- {ok, File} = file:open(Filename, [raw, binary]),
- new({file, File, Opts});
+ {ok, File} = file:open(Filename, [raw, binary]),
+ new({file, File, Opts});
new({file, File, Opts}) ->
- thrift_file_transport:new(File, Opts).
+ thrift_file_transport:new(File, Opts).
--spec new(Module::module(), State::any()) -> {ok, #t_transport{}}.
+-spec new(Module :: module(), State :: any()) -> {ok, t_transport()}.
new(Module, State) when is_atom(Module) ->
- {ok, ?debug_wrap(#t_transport{module = Module, state = State})}.
+ {ok, ?debug_wrap(#t_transport{module = Module, state = State})}.
+read(Transport = #t_transport{module = Module}, Len) when
+ is_integer(Len), Len >= 0
+->
+ {NewState, Result} = Module:read(Transport#t_transport.state, Len),
+ {Transport#t_transport{state = NewState}, Result}.
--include("thrift_transport_behaviour.hrl").
-
-
-read(Transport = #t_transport{module = Module}, Len)
-when is_integer(Len), Len >= 0 ->
- {NewState, Result} = Module:read(Transport#t_transport.state, Len),
- {Transport#t_transport{state = NewState}, Result}.
-
-
-read_exact(Transport = #t_transport{module = Module}, Len)
-when is_integer(Len), Len >= 0 ->
- case lists:keyfind(read_exact, 1, Module:module_info(exports)) of
- {read_exact, 2} ->
- {NewState, Result} = Module:read_exact(Transport#t_transport.state, Len),
- {Transport#t_transport{state = NewState}, Result};
- _ ->
- read(Transport, Len)
- end.
-
+read_exact(Transport = #t_transport{module = Module}, Len) when
+ is_integer(Len), Len >= 0
+->
+ case lists:keyfind(read_exact, 1, Module:module_info(exports)) of
+ {read_exact, 2} ->
+ {NewState, Result} = Module:read_exact(Transport#t_transport.state, Len),
+ {Transport#t_transport{state = NewState}, Result};
+ _ ->
+ read(Transport, Len)
+ end.
write(Transport = #t_transport{module = Module}, Data) ->
- {NewState, Result} = Module:write(Transport#t_transport.state, Data),
- {Transport#t_transport{state = NewState}, Result}.
-
+ {NewState, Result} = Module:write(Transport#t_transport.state, Data),
+ {Transport#t_transport{state = NewState}, Result}.
flush(Transport = #t_transport{module = Module}) ->
- {NewState, Result} = Module:flush(Transport#t_transport.state),
- {Transport#t_transport{state = NewState}, Result}.
-
+ {NewState, Result} = Module:flush(Transport#t_transport.state),
+ {Transport#t_transport{state = NewState}, Result}.
close(Transport = #t_transport{module = Module}) ->
- {NewState, Result} = Module:close(Transport#t_transport.state),
- {Transport#t_transport{state = NewState}, Result}.
-
+ {NewState, Result} = Module:close(Transport#t_transport.state),
+ {Transport#t_transport{state = NewState}, Result}.
diff --git a/lib/erl/src/thrift_transport_state_test.erl b/lib/erl/src/thrift_transport_state_test.erl
index e83a44d..99b5649 100644
--- a/lib/erl/src/thrift_transport_state_test.erl
+++ b/lib/erl/src/thrift_transport_state_test.erl
@@ -26,28 +26,35 @@
-export([new/1]).
%% gen_server callbacks
--export([init/1, handle_call/3, handle_cast/2, handle_info/2,
- terminate/2, code_change/3]).
+-export([
+ init/1,
+ handle_call/3,
+ handle_cast/2,
+ handle_info/2,
+ terminate/2,
+ code_change/3
+]).
%% thrift_transport callbacks
-export([write/2, read/2, flush/1, close/1]).
--record(trans, {wrapped, % #thrift_transport{}
- version :: integer(),
- counter :: pid()
- }).
--type state() :: #trans{}.
--include("thrift_transport_behaviour.hrl").
+% #thrift_transport{}
+-record(trans, {
+ wrapped :: thrift_transport:t_transport(),
+ version :: integer(),
+ counter :: pid()
+}).
-record(state, {cversion :: integer()}).
-
new(WrappedTransport) ->
case gen_server:start_link(?MODULE, [], []) of
{ok, Pid} ->
- Trans = #trans{wrapped = WrappedTransport,
- version = 0,
- counter = Pid},
+ Trans = #trans{
+ wrapped = WrappedTransport,
+ version = 0,
+ counter = Pid
+ },
thrift_transport:new(?MODULE, Trans);
Else ->
Else
@@ -82,7 +89,6 @@
Transport2 = Transport1#trans{wrapped = Wrapped1},
{Transport2, Result}.
-
%%====================================================================
%% gen_server callbacks
%%====================================================================
@@ -91,7 +97,7 @@
{ok, #state{cversion = 0}}.
handle_call(check_version, _From, State = #state{cversion = Version}) ->
- {reply, Version, State#state{cversion = Version+1}}.
+ {reply, Version, State#state{cversion = Version + 1}}.
handle_cast(shutdown, State) ->
{stop, normal, State}.
@@ -107,7 +113,7 @@
check_version(Transport = #trans{version = Version, counter = Counter}) ->
case gen_server:call(Counter, check_version) of
Version ->
- Transport#trans{version = Version+1};
+ Transport#trans{version = Version + 1};
_Else ->
% State wasn't propagated properly. Die.
erlang:error(state_not_propagated)
diff --git a/lib/erl/test/legacy_names_test.erl b/lib/erl/test/legacy_names_test.erl
index c16aa3e..9076ffb 100644
--- a/lib/erl/test/legacy_names_test.erl
+++ b/lib/erl/test/legacy_names_test.erl
@@ -18,52 +18,58 @@
%%
-module(legacy_names_test).
--compile(export_all).
-include_lib("eunit/include/eunit.hrl").
-include("gen-erl/legacyNames_constants.hrl").
record_generation_test_() ->
- [
- {"capitalizedStruct record", ?_assertMatch(
- {capitalizedStruct, _, _},
- #capitalizedStruct{id=null,message=null}
- )}
- ].
+ [
+ {"capitalizedStruct record",
+ ?_assertMatch(
+ {capitalizedStruct, _, _},
+ #capitalizedStruct{id = null, message = null}
+ )}
+ ].
struct_info_test_() ->
- [
- {"capitalizedStruct extended definition", ?_assertEqual(
- {struct, [
- {1, undefined, i32, 'id', undefined},
- {2, undefined, string, 'message', undefined}
- ]},
- legacyNames_types:struct_info_ext(capitalizedStruct)
- )},
- {"listCapitalizedStructs extended definition", ?_assertEqual(
- {struct, [
- {1, undefined, {list, {struct, {'legacyNames_types', 'capitalizedStruct'}}}, 'structs', []}
- ]},
- legacyNames_types:struct_info_ext(listCapitalizedStructs)
- )}
- ].
+ [
+ {"capitalizedStruct extended definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, i32, 'id', undefined},
+ {2, undefined, string, 'message', undefined}
+ ]},
+ legacyNames_types:struct_info_ext(capitalizedStruct)
+ )},
+ {"listCapitalizedStructs extended definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, {list, {struct, {'legacyNames_types', 'capitalizedStruct'}}},
+ 'structs', []}
+ ]},
+ legacyNames_types:struct_info_ext(listCapitalizedStructs)
+ )}
+ ].
service_info_test_() ->
- [
- {"names params", ?_assertEqual(
- {struct, [
- {1, {struct, {'legacyNames_types', 'capitalizedStruct'}}},
- {2, {struct, {'legacyNames_types', 'capitalizedStruct'}}}
- ]},
- legacyNames_thrift:function_info(names, params_type)
- )},
- {"names reply", ?_assertEqual(
- {struct, {'legacyNames_types', 'listCapitalizedStructs'}},
- legacyNames_thrift:function_info(names, reply_type)
- )},
- {"names exceptions", ?_assertEqual(
- {struct, [{1, {struct, {'legacyNames_types', 'xception'}}}]},
- legacyNames_thrift:function_info(names, exceptions)
- )}
- ].
+ [
+ {"names params",
+ ?_assertEqual(
+ {struct, [
+ {1, {struct, {'legacyNames_types', 'capitalizedStruct'}}},
+ {2, {struct, {'legacyNames_types', 'capitalizedStruct'}}}
+ ]},
+ legacyNames_thrift:function_info(names, params_type)
+ )},
+ {"names reply",
+ ?_assertEqual(
+ {struct, {'legacyNames_types', 'listCapitalizedStructs'}},
+ legacyNames_thrift:function_info(names, reply_type)
+ )},
+ {"names exceptions",
+ ?_assertEqual(
+ {struct, [{1, {struct, {'legacyNames_types', 'xception'}}}]},
+ legacyNames_thrift:function_info(names, exceptions)
+ )}
+ ].
diff --git a/lib/erl/test/multiplexing_test.erl b/lib/erl/test/multiplexing_test.erl
index 0f2d616..5752e53 100644
--- a/lib/erl/test/multiplexing_test.erl
+++ b/lib/erl/test/multiplexing_test.erl
@@ -1,19 +1,37 @@
+%%
+%% Licensed to the Apache Software Foundation (ASF) under one
+%% or more contributor license agreements. See the NOTICE file
+%% distributed with this work for additional information
+%% regarding copyright ownership. The ASF licenses this file
+%% to you under the Apache License, Version 2.0 (the
+%% "License"); you may not use this file except in compliance
+%% with the License. You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing,
+%% software distributed under the License is distributed on an
+%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+%% KIND, either express or implied. See the License for the
+%% specific language governing permissions and limitations
+%% under the License.
+%%
+
-module(multiplexing_test).
-include_lib("eunit/include/eunit.hrl").
-export([
- handle_function/2
- ,handle_error/2
+ handle_function/2,
+ handle_error/2
]).
start_multiplexed_server_test() ->
-
Port = 9090,
Services = [
- {"Multiplexing_Calculator", multiplexing__calculator_thrift},
- {"Multiplexing_WeatherReport", multiplexing__weather_report_thrift}
- ],
+ {"Multiplexing_Calculator", multiplexing__calculator_thrift},
+ {"Multiplexing_WeatherReport", multiplexing__weather_report_thrift}
+ ],
{ok, Pid} = thrift_socket_server:start([
{ip, "127.0.0.1"},
@@ -21,21 +39,32 @@
{name, ?MODULE},
{service, Services},
{handler, [
- {"error_handler", ?MODULE},
- {"Multiplexing_Calculator", ?MODULE},
+ {"error_handler", ?MODULE},
+ {"Multiplexing_Calculator", ?MODULE},
{"Multiplexing_WeatherReport", ?MODULE}
]}
- ]),
+ ]),
- {ok, [{"Multiplexing_Calculator", CalculatorClient0},
- {"Multiplexing_WeatherReport", WeatherReportClient0}]} = thrift_client_util:new_multiplexed("127.0.0.1", Port, Services, []),
+ {ok, [
+ {"Multiplexing_Calculator", CalculatorClient0},
+ {"Multiplexing_WeatherReport", WeatherReportClient0}
+ ]} = thrift_client_util:new_multiplexed("127.0.0.1", Port, Services, []),
- ?assertMatch({_, {error, {bad_args, _, _}}}, thrift_client:call(WeatherReportClient0, getTemperature, [1])),
+ ?assertMatch(
+ {_, {error, {bad_args, _, _}}},
+ thrift_client:call(WeatherReportClient0, getTemperature, [1])
+ ),
?assertMatch({_, {error, {bad_args, _, _}}}, thrift_client:call(CalculatorClient0, add, [1])),
- ?assertMatch({_, {error, {bad_args, _, _}}}, thrift_client:call(CalculatorClient0, add, [1,1,1])),
+ ?assertMatch(
+ {_, {error, {bad_args, _, _}}}, thrift_client:call(CalculatorClient0, add, [1, 1, 1])
+ ),
- ?assertMatch({_, {error, {no_function, _}}}, thrift_client:call(CalculatorClient0, getTemperature, [])),
- ?assertMatch({_, {error, {no_function, _}}}, thrift_client:call(WeatherReportClient0, add, [41, 1])),
+ ?assertMatch(
+ {_, {error, {no_function, _}}}, thrift_client:call(CalculatorClient0, getTemperature, [])
+ ),
+ ?assertMatch(
+ {_, {error, {no_function, _}}}, thrift_client:call(WeatherReportClient0, add, [41, 1])
+ ),
?assertMatch({_, {ok, 42}}, thrift_client:call(CalculatorClient0, add, [41, 1])),
?assertMatch({_, {ok, 42.0}}, thrift_client:call(WeatherReportClient0, getTemperature, [])),
@@ -47,11 +76,10 @@
%% Calculator handles
handle_function(add, {X, Y}) ->
{reply, X + Y};
-
%% WeatherReport handles
handle_function(getTemperature, {}) ->
{reply, 42.0}.
handle_error(_F, _Reason) ->
-%% ?debugHere, ?debugVal({_F, _Reason}),
- ok.
\ No newline at end of file
+ %% ?debugHere, ?debugVal({_F, _Reason}),
+ ok.
diff --git a/lib/erl/test/name_conflict_test.erl b/lib/erl/test/name_conflict_test.erl
index b01df57..30c1a8e 100644
--- a/lib/erl/test/name_conflict_test.erl
+++ b/lib/erl/test/name_conflict_test.erl
@@ -18,282 +18,333 @@
%%
-module(name_conflict_test).
--compile(export_all).
-include_lib("eunit/include/eunit.hrl").
-include("gen-erl/name_conflict_test_constants.hrl").
record_generation_test_() ->
- [
- {"using record", ?_assertMatch(
- {using, _, _},
- #using{single=null,integer=null}
- )},
- {"delegate record", ?_assertMatch(
- {delegate, _, _},
- #delegate{partial=null,delegate=null}
- )},
- {"get record", ?_assertMatch(
- {get, _},
- #get{sbyte=null}
- )},
- {"partial record", ?_assertMatch(
- {partial, _, _, _},
- #partial{using=null}
- )},
- {"ClassAndProp record", ?_assertMatch(
- {'ClassAndProp', _, _, _, _},
- #'ClassAndProp'{
- 'ClassAndProp'=null,
- 'ClassAndProp_'=null,
- 'ClassAndProp__'=null,
- 'ClassAndProper'=null
- }
- )},
- {"second_chance record", ?_assertMatch(
- {second_chance, _, _, _, _},
- #second_chance{
- 'SECOND_CHANCE'=null,
- 'SECOND_CHANCE_'=null,
- 'SECOND_CHANCE__'=null,
- 'SECOND_CHANCES'=null
- }
- )},
- {"NOW_EAT_THIS record", ?_assertMatch(
- {'NOW_EAT_THIS', _, _, _, _},
- #'NOW_EAT_THIS'{
- now_eat_this=null,
- now_eat_this_=null,
- now_eat_this__=null,
- now_eat_this_and_this=null
- }
- )},
- {"TheEdgeCase record", ?_assertMatch(
- {'TheEdgeCase', _, _, _, _, _, _},
- #'TheEdgeCase'{
- theEdgeCase=null,
- theEdgeCase_=null,
- theEdgeCase__=null,
- 'TheEdgeCase'=null,
- 'TheEdgeCase_'=null,
- 'TheEdgeCase__'=null
- }
- )},
- {"Tricky_ record", ?_assertMatch(
- {'Tricky_', _, _},
- #'Tricky_'{tricky=null,'Tricky'=null}
- )},
- {"Nested record", ?_assertMatch(
- {'Nested', _, _, _, _, _, _},
- #'Nested'{
- 'ClassAndProp'=null,
- second_chance=null,
- 'NOW_EAT_THIS'=null,
- 'TheEdgeCase'=null,
- 'Tricky_'=null,
- 'Nested'=null
- }
- )},
- {"Problem_ record", ?_assertMatch(
- {'Problem_', _, _},
- #'Problem_'{problem=null,'Problem'=null}
- )}
- ].
+ [
+ {"using record",
+ ?_assertMatch(
+ {using, _, _},
+ #using{single = null, integer = null}
+ )},
+ {"delegate record",
+ ?_assertMatch(
+ {delegate, _, _},
+ #delegate{partial = null, delegate = null}
+ )},
+ {"get record",
+ ?_assertMatch(
+ {get, _},
+ #get{sbyte = null}
+ )},
+ {"partial record",
+ ?_assertMatch(
+ {partial, _, _, _},
+ #partial{using = null}
+ )},
+ {"ClassAndProp record",
+ ?_assertMatch(
+ {'ClassAndProp', _, _, _, _},
+ #'ClassAndProp'{
+ 'ClassAndProp' = null,
+ 'ClassAndProp_' = null,
+ 'ClassAndProp__' = null,
+ 'ClassAndProper' = null
+ }
+ )},
+ {"second_chance record",
+ ?_assertMatch(
+ {second_chance, _, _, _, _},
+ #second_chance{
+ 'SECOND_CHANCE' = null,
+ 'SECOND_CHANCE_' = null,
+ 'SECOND_CHANCE__' = null,
+ 'SECOND_CHANCES' = null
+ }
+ )},
+ {"NOW_EAT_THIS record",
+ ?_assertMatch(
+ {'NOW_EAT_THIS', _, _, _, _},
+ #'NOW_EAT_THIS'{
+ now_eat_this = null,
+ now_eat_this_ = null,
+ now_eat_this__ = null,
+ now_eat_this_and_this = null
+ }
+ )},
+ {"TheEdgeCase record",
+ ?_assertMatch(
+ {'TheEdgeCase', _, _, _, _, _, _},
+ #'TheEdgeCase'{
+ theEdgeCase = null,
+ theEdgeCase_ = null,
+ theEdgeCase__ = null,
+ 'TheEdgeCase' = null,
+ 'TheEdgeCase_' = null,
+ 'TheEdgeCase__' = null
+ }
+ )},
+ {"Tricky_ record",
+ ?_assertMatch(
+ {'Tricky_', _, _},
+ #'Tricky_'{tricky = null, 'Tricky' = null}
+ )},
+ {"Nested record",
+ ?_assertMatch(
+ {'Nested', _, _, _, _, _, _},
+ #'Nested'{
+ 'ClassAndProp' = null,
+ second_chance = null,
+ 'NOW_EAT_THIS' = null,
+ 'TheEdgeCase' = null,
+ 'Tricky_' = null,
+ 'Nested' = null
+ }
+ )},
+ {"Problem_ record",
+ ?_assertMatch(
+ {'Problem_', _, _},
+ #'Problem_'{problem = null, 'Problem' = null}
+ )}
+ ].
struct_info_test_() ->
- [
- {"using definition", ?_assertEqual(
- {struct, [{1, double},{2, double}]},
- name_conflict_test_types:struct_info(using)
- )},
- {"delegate definition", ?_assertEqual(
- {struct, [
- {1, string},
- {2, {struct, {name_conflict_test_types, delegate}}}
- ]},
- name_conflict_test_types:struct_info(delegate)
- )},
- {"get definition", ?_assertEqual(
- {struct, [{1, bool}]},
- name_conflict_test_types:struct_info(get)
- )},
- {"partial definition", ?_assertEqual(
- {struct, [
- {1, {struct, {name_conflict_test_types, using}}},
- {2, bool},
- {3, bool}
- ]},
- name_conflict_test_types:struct_info(partial)
- )},
- {"ClassAndProp definition", ?_assertEqual(
- {struct, [{1, bool},{2, bool},{3, bool},{4, bool}]},
- name_conflict_test_types:struct_info('ClassAndProp')
- )},
- {"second_chance definition", ?_assertEqual(
- {struct, [{1, bool},{2, bool},{3, bool},{4, bool}]},
- name_conflict_test_types:struct_info(second_chance)
- )},
- {"NOW_EAT_THIS definition", ?_assertEqual(
- {struct, [{1, bool},{2, bool},{3, bool},{4, bool}]},
- name_conflict_test_types:struct_info('NOW_EAT_THIS')
- )},
- {"TheEdgeCase definition", ?_assertEqual(
- {struct, [{1, bool},{2, bool},{3, bool},{4, bool},{5, bool},{6, bool}]},
- name_conflict_test_types:struct_info('TheEdgeCase')
- )},
- {"Tricky_ definition", ?_assertEqual(
- {struct, [{1, bool},{2, bool}]},
- name_conflict_test_types:struct_info('Tricky_')
- )},
- {"Nested definition", ?_assertEqual(
- {struct, [
- {1, {struct, {name_conflict_test_types, 'ClassAndProp'}}},
- {2, {struct, {name_conflict_test_types, second_chance}}},
- {3, {struct, {name_conflict_test_types, 'NOW_EAT_THIS'}}},
- {4, {struct, {name_conflict_test_types, 'TheEdgeCase'}}},
- {5, {struct, {name_conflict_test_types, 'Tricky_'}}},
- {6, {struct, {name_conflict_test_types, 'Nested'}}}
- ]},
- name_conflict_test_types:struct_info('Nested')
- )},
- {"Problem_ definition", ?_assertEqual(
- {struct, [{1, bool},{2, bool}]},
- name_conflict_test_types:struct_info('Problem_')
- )},
- {"using extended definition", ?_assertEqual(
- {struct, [
- {1, undefined, double, single, undefined},
- {2, undefined, double, integer, undefined}
- ]},
- name_conflict_test_types:struct_info_ext(using)
- )},
- {"delegate extended definition", ?_assertEqual(
- {struct, [
- {1, undefined, string, partial, undefined},
- {2, undefined, {struct, {name_conflict_test_types, delegate}}, delegate, undefined}
- ]},
- name_conflict_test_types:struct_info_ext(delegate)
- )},
- {"get extended definition", ?_assertEqual(
- {struct, [{1, undefined, bool, sbyte, undefined}]},
- name_conflict_test_types:struct_info_ext(get)
- )},
- {"partial extended definition", ?_assertEqual(
- {struct, [
- {1, undefined, {struct, {name_conflict_test_types, using}}, using, #using{}},
- {2, undefined, bool, read, undefined},
- {3, undefined, bool, write, undefined}
- ]},
- name_conflict_test_types:struct_info_ext(partial)
- )},
- {"ClassAndProp extended definition", ?_assertEqual(
- {struct, [
- {1, undefined, bool, 'ClassAndProp', undefined},
- {2, undefined, bool, 'ClassAndProp_', undefined},
- {3, undefined, bool, 'ClassAndProp__', undefined},
- {4, undefined, bool, 'ClassAndProper', undefined}
- ]},
- name_conflict_test_types:struct_info_ext('ClassAndProp')
- )},
- {"second_chance extended definition", ?_assertEqual(
- {struct, [
- {1, undefined, bool, 'SECOND_CHANCE', undefined},
- {2, undefined, bool, 'SECOND_CHANCE_', undefined},
- {3, undefined, bool, 'SECOND_CHANCE__', undefined},
- {4, undefined, bool, 'SECOND_CHANCES', undefined}
- ]},
- name_conflict_test_types:struct_info_ext(second_chance)
- )},
- {"NOW_EAT_THIS extended definition", ?_assertEqual(
- {struct, [
- {1, undefined, bool, now_eat_this, undefined},
- {2, undefined, bool, now_eat_this_, undefined},
- {3, undefined, bool, now_eat_this__, undefined},
- {4, undefined, bool, now_eat_this_and_this, undefined}
- ]},
- name_conflict_test_types:struct_info_ext('NOW_EAT_THIS')
- )},
- {"TheEdgeCase extended definition", ?_assertEqual(
- {struct, [
- {1, undefined, bool, theEdgeCase, undefined},
- {2, undefined, bool, theEdgeCase_, undefined},
- {3, undefined, bool, theEdgeCase__, undefined},
- {4, undefined, bool, 'TheEdgeCase', undefined},
- {5, undefined, bool, 'TheEdgeCase_', undefined},
- {6, undefined, bool, 'TheEdgeCase__', undefined}
- ]},
- name_conflict_test_types:struct_info_ext('TheEdgeCase')
- )},
- {"Tricky_ extended definition", ?_assertEqual(
- {struct, [
- {1, undefined, bool, tricky, undefined},
- {2, undefined, bool, 'Tricky', undefined}
- ]},
- name_conflict_test_types:struct_info_ext('Tricky_')
- )},
- {"Nested extended definition", ?_assertEqual(
- {struct, [
- {1, undefined, {struct, {
- name_conflict_test_types,
- 'ClassAndProp'
- }}, 'ClassAndProp', #'ClassAndProp'{}},
- {2, undefined, {struct, {
- name_conflict_test_types,
- second_chance
- }}, second_chance, #second_chance{}},
- {3, undefined, {struct, {
- name_conflict_test_types,
- 'NOW_EAT_THIS'
- }}, 'NOW_EAT_THIS', #'NOW_EAT_THIS'{}},
- {4, undefined, {struct, {
- name_conflict_test_types,
- 'TheEdgeCase'
- }}, 'TheEdgeCase', #'TheEdgeCase'{}},
- {5, undefined, {struct, {
- name_conflict_test_types,
- 'Tricky_'
- }}, 'Tricky_', #'Tricky_'{}},
- {6, undefined, {struct, {
- name_conflict_test_types,
- 'Nested'
- }}, 'Nested', undefined}
- ]},
- name_conflict_test_types:struct_info_ext('Nested')
- )},
- {"Problem_ extended definition", ?_assertEqual(
- {struct, [
- {1, undefined, bool, problem, undefined},
- {2, undefined, bool, 'Problem', undefined}
- ]},
- name_conflict_test_types:struct_info_ext('Problem_')
- )}
- ].
+ [
+ {"using definition",
+ ?_assertEqual(
+ {struct, [{1, double}, {2, double}]},
+ name_conflict_test_types:struct_info(using)
+ )},
+ {"delegate definition",
+ ?_assertEqual(
+ {struct, [
+ {1, string},
+ {2, {struct, {name_conflict_test_types, delegate}}}
+ ]},
+ name_conflict_test_types:struct_info(delegate)
+ )},
+ {"get definition",
+ ?_assertEqual(
+ {struct, [{1, bool}]},
+ name_conflict_test_types:struct_info(get)
+ )},
+ {"partial definition",
+ ?_assertEqual(
+ {struct, [
+ {1, {struct, {name_conflict_test_types, using}}},
+ {2, bool},
+ {3, bool}
+ ]},
+ name_conflict_test_types:struct_info(partial)
+ )},
+ {"ClassAndProp definition",
+ ?_assertEqual(
+ {struct, [{1, bool}, {2, bool}, {3, bool}, {4, bool}]},
+ name_conflict_test_types:struct_info('ClassAndProp')
+ )},
+ {"second_chance definition",
+ ?_assertEqual(
+ {struct, [{1, bool}, {2, bool}, {3, bool}, {4, bool}]},
+ name_conflict_test_types:struct_info(second_chance)
+ )},
+ {"NOW_EAT_THIS definition",
+ ?_assertEqual(
+ {struct, [{1, bool}, {2, bool}, {3, bool}, {4, bool}]},
+ name_conflict_test_types:struct_info('NOW_EAT_THIS')
+ )},
+ {"TheEdgeCase definition",
+ ?_assertEqual(
+ {struct, [{1, bool}, {2, bool}, {3, bool}, {4, bool}, {5, bool}, {6, bool}]},
+ name_conflict_test_types:struct_info('TheEdgeCase')
+ )},
+ {"Tricky_ definition",
+ ?_assertEqual(
+ {struct, [{1, bool}, {2, bool}]},
+ name_conflict_test_types:struct_info('Tricky_')
+ )},
+ {"Nested definition",
+ ?_assertEqual(
+ {struct, [
+ {1, {struct, {name_conflict_test_types, 'ClassAndProp'}}},
+ {2, {struct, {name_conflict_test_types, second_chance}}},
+ {3, {struct, {name_conflict_test_types, 'NOW_EAT_THIS'}}},
+ {4, {struct, {name_conflict_test_types, 'TheEdgeCase'}}},
+ {5, {struct, {name_conflict_test_types, 'Tricky_'}}},
+ {6, {struct, {name_conflict_test_types, 'Nested'}}}
+ ]},
+ name_conflict_test_types:struct_info('Nested')
+ )},
+ {"Problem_ definition",
+ ?_assertEqual(
+ {struct, [{1, bool}, {2, bool}]},
+ name_conflict_test_types:struct_info('Problem_')
+ )},
+ {"using extended definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, double, single, undefined},
+ {2, undefined, double, integer, undefined}
+ ]},
+ name_conflict_test_types:struct_info_ext(using)
+ )},
+ {"delegate extended definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, string, partial, undefined},
+ {2, undefined, {struct, {name_conflict_test_types, delegate}}, delegate,
+ undefined}
+ ]},
+ name_conflict_test_types:struct_info_ext(delegate)
+ )},
+ {"get extended definition",
+ ?_assertEqual(
+ {struct, [{1, undefined, bool, sbyte, undefined}]},
+ name_conflict_test_types:struct_info_ext(get)
+ )},
+ {"partial extended definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, {struct, {name_conflict_test_types, using}}, using, #using{}},
+ {2, undefined, bool, read, undefined},
+ {3, undefined, bool, write, undefined}
+ ]},
+ name_conflict_test_types:struct_info_ext(partial)
+ )},
+ {"ClassAndProp extended definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, bool, 'ClassAndProp', undefined},
+ {2, undefined, bool, 'ClassAndProp_', undefined},
+ {3, undefined, bool, 'ClassAndProp__', undefined},
+ {4, undefined, bool, 'ClassAndProper', undefined}
+ ]},
+ name_conflict_test_types:struct_info_ext('ClassAndProp')
+ )},
+ {"second_chance extended definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, bool, 'SECOND_CHANCE', undefined},
+ {2, undefined, bool, 'SECOND_CHANCE_', undefined},
+ {3, undefined, bool, 'SECOND_CHANCE__', undefined},
+ {4, undefined, bool, 'SECOND_CHANCES', undefined}
+ ]},
+ name_conflict_test_types:struct_info_ext(second_chance)
+ )},
+ {"NOW_EAT_THIS extended definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, bool, now_eat_this, undefined},
+ {2, undefined, bool, now_eat_this_, undefined},
+ {3, undefined, bool, now_eat_this__, undefined},
+ {4, undefined, bool, now_eat_this_and_this, undefined}
+ ]},
+ name_conflict_test_types:struct_info_ext('NOW_EAT_THIS')
+ )},
+ {"TheEdgeCase extended definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, bool, theEdgeCase, undefined},
+ {2, undefined, bool, theEdgeCase_, undefined},
+ {3, undefined, bool, theEdgeCase__, undefined},
+ {4, undefined, bool, 'TheEdgeCase', undefined},
+ {5, undefined, bool, 'TheEdgeCase_', undefined},
+ {6, undefined, bool, 'TheEdgeCase__', undefined}
+ ]},
+ name_conflict_test_types:struct_info_ext('TheEdgeCase')
+ )},
+ {"Tricky_ extended definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, bool, tricky, undefined},
+ {2, undefined, bool, 'Tricky', undefined}
+ ]},
+ name_conflict_test_types:struct_info_ext('Tricky_')
+ )},
+ {"Nested extended definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined,
+ {struct, {
+ name_conflict_test_types,
+ 'ClassAndProp'
+ }},
+ 'ClassAndProp', #'ClassAndProp'{}},
+ {2, undefined,
+ {struct, {
+ name_conflict_test_types,
+ second_chance
+ }},
+ second_chance, #second_chance{}},
+ {3, undefined,
+ {struct, {
+ name_conflict_test_types,
+ 'NOW_EAT_THIS'
+ }},
+ 'NOW_EAT_THIS', #'NOW_EAT_THIS'{}},
+ {4, undefined,
+ {struct, {
+ name_conflict_test_types,
+ 'TheEdgeCase'
+ }},
+ 'TheEdgeCase', #'TheEdgeCase'{}},
+ {5, undefined,
+ {struct, {
+ name_conflict_test_types,
+ 'Tricky_'
+ }},
+ 'Tricky_', #'Tricky_'{}},
+ {6, undefined,
+ {struct, {
+ name_conflict_test_types,
+ 'Nested'
+ }},
+ 'Nested', undefined}
+ ]},
+ name_conflict_test_types:struct_info_ext('Nested')
+ )},
+ {"Problem_ extended definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, bool, problem, undefined},
+ {2, undefined, bool, 'Problem', undefined}
+ ]},
+ name_conflict_test_types:struct_info_ext('Problem_')
+ )}
+ ].
service_info_test_() ->
- [
- {"event params", ?_assertEqual(
- {struct, [{1, {struct, {name_conflict_test_types, partial}}}]},
- extern_thrift:function_info(event, params_type)
- )},
- {"event reply", ?_assertEqual(
- {struct, {name_conflict_test_types, delegate}},
- extern_thrift:function_info(event, reply_type)
- )},
- {"event exceptions", ?_assertEqual(
- {struct, []},
- extern_thrift:function_info(event, exceptions)
- )},
- {"Foo params", ?_assertEqual(
- {struct, [{1, {struct, {name_conflict_test_types, 'Nested'}}}]},
- extern_thrift:function_info('Foo', params_type)
- )},
- {"Foo reply", ?_assertEqual(
- {struct, []},
- extern_thrift:function_info('Foo', reply_type)
- )},
- {"Foo exceptions", ?_assertEqual(
- {struct, [{1, {struct, {name_conflict_test_types, 'Problem_'}}}]},
- extern_thrift:function_info('Foo', exceptions)
- )}
- ].
+ [
+ {"event params",
+ ?_assertEqual(
+ {struct, [{1, {struct, {name_conflict_test_types, partial}}}]},
+ extern_thrift:function_info(event, params_type)
+ )},
+ {"event reply",
+ ?_assertEqual(
+ {struct, {name_conflict_test_types, delegate}},
+ extern_thrift:function_info(event, reply_type)
+ )},
+ {"event exceptions",
+ ?_assertEqual(
+ {struct, []},
+ extern_thrift:function_info(event, exceptions)
+ )},
+ {"Foo params",
+ ?_assertEqual(
+ {struct, [{1, {struct, {name_conflict_test_types, 'Nested'}}}]},
+ extern_thrift:function_info('Foo', params_type)
+ )},
+ {"Foo reply",
+ ?_assertEqual(
+ {struct, []},
+ extern_thrift:function_info('Foo', reply_type)
+ )},
+ {"Foo exceptions",
+ ?_assertEqual(
+ {struct, [{1, {struct, {name_conflict_test_types, 'Problem_'}}}]},
+ extern_thrift:function_info('Foo', exceptions)
+ )}
+ ].
diff --git a/lib/erl/test/stress_server.erl b/lib/erl/test/stress_server.erl
index 35fff06..78ddefe 100644
--- a/lib/erl/test/stress_server.erl
+++ b/lib/erl/test/stress_server.erl
@@ -19,33 +19,32 @@
-module(stress_server).
+-export([
+ start_link/1,
--export([start_link/1,
+ handle_function/2,
- handle_function/2,
-
- echoVoid/0,
- echoByte/1,
- echoI32/1,
- echoI64/1,
- echoString/1,
- echoList/1,
- echoSet/1,
- echoMap/1
- ]).
+ echoVoid/0,
+ echoByte/1,
+ echoI32/1,
+ echoI64/1,
+ echoString/1,
+ echoList/1,
+ echoSet/1,
+ echoMap/1
+]).
start_link(Port) ->
thrift_server:start_link(Port, service_thrift, ?MODULE).
-
handle_function(Function, Args) ->
case apply(?MODULE, Function, tuple_to_list(Args)) of
ok ->
- ok;
- Else -> {reply, Else}
+ ok;
+ Else ->
+ {reply, Else}
end.
-
echoVoid() ->
ok.
echoByte(X) ->
diff --git a/lib/erl/test/test_const.erl b/lib/erl/test/test_const.erl
index 627777b..74830e9 100644
--- a/lib/erl/test/test_const.erl
+++ b/lib/erl/test/test_const.erl
@@ -25,30 +25,31 @@
-include("gen-erl/constants_demo_types.hrl").
namespace_test() ->
- %% Verify that records produced by ConstantsDemo.thrift have the right namespace.
- io:format(user, "in namespace_test()\n", []),
- {struct, _} = constants_demo_types:struct_info('consts_thing'),
- {struct, _} = constants_demo_types:struct_info('consts_Blah'),
- ok.
+ %% Verify that records produced by ConstantsDemo.thrift have the right namespace.
+ io:format(user, "in namespace_test()\n", []),
+ {struct, _} = constants_demo_types:struct_info('consts_thing'),
+ {struct, _} = constants_demo_types:struct_info('consts_Blah'),
+ ok.
const_map_test() ->
- ?assertEqual(233, constants_demo_constants:gen_map(35532)),
- ?assertError(function_clause, constants_demo_constants:gen_map(0)),
+ ?assertEqual(233, constants_demo_constants:gen_map(35532)),
+ ?assertError(function_clause, constants_demo_constants:gen_map(0)),
- ?assertEqual(853, constants_demo_constants:gen_map(43523, default)),
- ?assertEqual(default, constants_demo_constants:gen_map(10110, default)),
+ ?assertEqual(853, constants_demo_constants:gen_map(43523, default)),
+ ?assertEqual(default, constants_demo_constants:gen_map(10110, default)),
- ?assertEqual(98325, constants_demo_constants:gen_map2("lkjsdf")),
- ?assertError(function_clause, constants_demo_constants:gen_map2("nonexist")),
+ ?assertEqual(98325, constants_demo_constants:gen_map2("lkjsdf")),
+ ?assertError(function_clause, constants_demo_constants:gen_map2("nonexist")),
- ?assertEqual(233, constants_demo_constants:gen_map2("hello", 321)),
- ?assertEqual(321, constants_demo_constants:gen_map2("goodbye", 321)).
+ ?assertEqual(233, constants_demo_constants:gen_map2("hello", 321)),
+ ?assertEqual(321, constants_demo_constants:gen_map2("goodbye", 321)).
const_list_test() ->
- ?assertEqual(23598352, constants_demo_constants:gen_list(2)),
- ?assertError(function_clause, constants_demo_constants:gen_list(0)),
+ ?assertEqual(23598352, constants_demo_constants:gen_list(2)),
+ ?assertError(function_clause, constants_demo_constants:gen_list(0)),
- ?assertEqual(3253523, constants_demo_constants:gen_list(3, default)),
- ?assertEqual(default, constants_demo_constants:gen_list(10, default)).
+ ?assertEqual(3253523, constants_demo_constants:gen_list(3, default)),
+ ?assertEqual(default, constants_demo_constants:gen_list(10, default)).
--endif. %% TEST
+%% TEST
+-endif.
diff --git a/lib/erl/test/test_disklog.erl b/lib/erl/test/test_disklog.erl
index dcb6fc1..742e895 100644
--- a/lib/erl/test/test_disklog.erl
+++ b/lib/erl/test/test_disklog.erl
@@ -23,77 +23,83 @@
-include_lib("eunit/include/eunit.hrl").
disklog_test() ->
- {ok, TransportFactory} =
- thrift_disk_log_transport:new_transport_factory(
- test_disklog,
- [{file, "./test_log"},
- {size, {1024*1024, 10}}]),
- {ok, ProtocolFactory} =
- thrift_binary_protocol:new_protocol_factory( TransportFactory, []),
- {ok, Proto} = ProtocolFactory(),
- {ok, Client0} = thrift_client:new(Proto, thrift_test_thrift),
+ {ok, TransportFactory} =
+ thrift_disk_log_transport:new_transport_factory(
+ test_disklog,
+ [
+ {file, "./test_log"},
+ {size, {1024 * 1024, 10}}
+ ]
+ ),
+ {ok, ProtocolFactory} =
+ thrift_binary_protocol:new_protocol_factory(TransportFactory, []),
+ {ok, Proto} = ProtocolFactory(),
+ {ok, Client0} = thrift_client:new(Proto, thrift_test_thrift),
- io:format("Client started~n"),
+ io:format("Client started~n"),
- % We have to make oneway calls into this client only since otherwise it
- % will try to read from the disklog and go boom.
- {Client1, {ok, ok}} = thrift_client:call(Client0, testOneway, [16#deadbeef]),
- io:format("Call written~n"),
+ % We have to make oneway calls into this client only since otherwise it
+ % will try to read from the disklog and go boom.
+ {Client1, {ok, ok}} = thrift_client:call(Client0, testOneway, [16#deadbeef]),
+ io:format("Call written~n"),
- % Use the send_call method to write a non-oneway call into the log
- {Client2, ok} =
- thrift_client:send_call(Client1, testString, [<<"hello world">>]),
- io:format("Non-oneway call sent~n"),
+ % Use the send_call method to write a non-oneway call into the log
+ {Client2, ok} =
+ thrift_client:send_call(Client1, testString, [<<"hello world">>]),
+ io:format("Non-oneway call sent~n"),
- {_Client3, ok} = thrift_client:close(Client2),
- io:format("Client closed~n"),
-
- lists:foreach(fun(File) -> file:delete(File) end, [
- "./test_log.1",
- "./test_log.idx",
- "./test_log.siz"
- ]),
- io:format("Cleaning up test files~n"),
+ {_Client3, ok} = thrift_client:close(Client2),
+ io:format("Client closed~n"),
- ok.
+ lists:foreach(fun(File) -> file:delete(File) end, [
+ "./test_log.1",
+ "./test_log.idx",
+ "./test_log.siz"
+ ]),
+ io:format("Cleaning up test files~n"),
+
+ ok.
disklog_base64_test() ->
- {ok, TransportFactory} =
- thrift_disk_log_transport:new_transport_factory(
- test_disklog,
- [{file, "./test_b64_log"},
- {size, {1024*1024, 10}}]),
- {ok, B64Factory} =
- thrift_base64_transport:new_transport_factory(TransportFactory),
- {ok, BufFactory} =
- thrift_buffered_transport:new_transport_factory(B64Factory),
- {ok, ProtocolFactory} =
- thrift_binary_protocol:new_protocol_factory(BufFactory, []),
- {ok, Proto} = ProtocolFactory(),
- {ok, Client0} = thrift_client:new(Proto, thrift_test_thrift),
+ {ok, TransportFactory} =
+ thrift_disk_log_transport:new_transport_factory(
+ test_disklog,
+ [
+ {file, "./test_b64_log"},
+ {size, {1024 * 1024, 10}}
+ ]
+ ),
+ {ok, B64Factory} =
+ thrift_base64_transport:new_transport_factory(TransportFactory),
+ {ok, BufFactory} =
+ thrift_buffered_transport:new_transport_factory(B64Factory),
+ {ok, ProtocolFactory} =
+ thrift_binary_protocol:new_protocol_factory(BufFactory, []),
+ {ok, Proto} = ProtocolFactory(),
+ {ok, Client0} = thrift_client:new(Proto, thrift_test_thrift),
- io:format("Client started~n"),
+ io:format("Client started~n"),
- % We have to make oneway calls into this client only since otherwise
- % it will try to read from the disklog and go boom.
- {Client1, {ok, ok}} = thrift_client:call(Client0, testOneway, [16#deadbeef]),
- io:format("Call written~n"),
+ % We have to make oneway calls into this client only since otherwise
+ % it will try to read from the disklog and go boom.
+ {Client1, {ok, ok}} = thrift_client:call(Client0, testOneway, [16#deadbeef]),
+ io:format("Call written~n"),
- % Use the send_call method to write a non-oneway call into the log
- {Client2, ok} =
- thrift_client:send_call(Client1, testString, [<<"hello world">>]),
- io:format("Non-oneway call sent~n"),
+ % Use the send_call method to write a non-oneway call into the log
+ {Client2, ok} =
+ thrift_client:send_call(Client1, testString, [<<"hello world">>]),
+ io:format("Non-oneway call sent~n"),
- {_Client3, ok} = thrift_client:close(Client2),
- io:format("Client closed~n"),
+ {_Client3, ok} = thrift_client:close(Client2),
+ io:format("Client closed~n"),
- lists:foreach(fun(File) -> file:delete(File) end, [
- "./test_b64_log.1",
- "./test_b64_log.idx",
- "./test_b64_log.siz"
- ]),
- io:format("Cleaning up test files~n"),
+ lists:foreach(fun(File) -> file:delete(File) end, [
+ "./test_b64_log.1",
+ "./test_b64_log.idx",
+ "./test_b64_log.siz"
+ ]),
+ io:format("Cleaning up test files~n"),
- ok.
+ ok.
-endif.
diff --git a/lib/erl/test/test_omit.erl b/lib/erl/test/test_omit.erl
index 80841e2..a51f1ed 100644
--- a/lib/erl/test/test_omit.erl
+++ b/lib/erl/test/test_omit.erl
@@ -1,3 +1,22 @@
+%%
+%% Licensed to the Apache Software Foundation (ASF) under one
+%% or more contributor license agreements. See the NOTICE file
+%% distributed with this work for additional information
+%% regarding copyright ownership. The ASF licenses this file
+%% to you under the Apache License, Version 2.0 (the
+%% "License"); you may not use this file except in compliance
+%% with the License. You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing,
+%% software distributed under the License is distributed on an
+%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+%% KIND, either express or implied. See the License for the
+%% specific language governing permissions and limitations
+%% under the License.
+%%
+
-module(test_omit).
-include("gen-erl/thrift_omit_with_types.hrl").
@@ -6,74 +25,83 @@
-include_lib("eunit/include/eunit.hrl").
omit_struct1_test() ->
- %% In this test, the field that is deleted is a basic type (an i32).
- A = #test1{one = 1, three = 3},
- B = #test1{one = 1, two = 2, three = 3},
- {ok, Transport} = thrift_membuffer_transport:new(),
- {ok, P0} = thrift_binary_protocol:new(Transport),
+ %% In this test, the field that is deleted is a basic type (an i32).
+ A = #test1{one = 1, three = 3},
+ B = #test1{one = 1, two = 2, three = 3},
+ {ok, Transport} = thrift_membuffer_transport:new(),
+ {ok, P0} = thrift_binary_protocol:new(Transport),
- {P1, ok} = thrift_protocol:write(P0, {{struct, {thrift_omit_with_types, element(1, A)}}, A}),
- {P2, {ok, O0}} = thrift_protocol:read(P1, {struct, {thrift_omit_without_types, element(1, A)}}),
- ?assertEqual(element(1, A), element(1, O0)),
- ?assertEqual(element(2, A), element(2, O0)),
- ?assertEqual(element(4, A), element(3, O0)),
+ {P1, ok} = thrift_protocol:write(P0, {{struct, {thrift_omit_with_types, element(1, A)}}, A}),
+ {P2, {ok, O0}} = thrift_protocol:read(P1, {struct, {thrift_omit_without_types, element(1, A)}}),
+ ?assertEqual(element(1, A), element(1, O0)),
+ ?assertEqual(element(2, A), element(2, O0)),
+ ?assertEqual(element(4, A), element(3, O0)),
- {P3, ok} = thrift_protocol:write(P2, {{struct, {thrift_omit_with_types, element(1, B)}}, B}),
- {_P4, {ok, O1}} = thrift_protocol:read(P3, {struct, {thrift_omit_without_types, element(1, A)}}),
- ?assertEqual(element(1, A), element(1, O1)),
- ?assertEqual(element(2, A), element(2, O1)),
- ?assertEqual(element(4, A), element(3, O1)),
+ {P3, ok} = thrift_protocol:write(P2, {{struct, {thrift_omit_with_types, element(1, B)}}, B}),
+ {_P4, {ok, O1}} = thrift_protocol:read(
+ P3, {struct, {thrift_omit_without_types, element(1, A)}}
+ ),
+ ?assertEqual(element(1, A), element(1, O1)),
+ ?assertEqual(element(2, A), element(2, O1)),
+ ?assertEqual(element(4, A), element(3, O1)),
- ok.
+ ok.
omit_struct2_test() ->
- %% In this test, the field that is deleted is a struct.
- A = #test2{one = 1, two = #test2{one = 10, three = 30}, three = 3},
- B = #test2{one = 1, two = #test2{one = 10, two = #test2{one = 100}, three = 30}, three = 3},
+ %% In this test, the field that is deleted is a struct.
+ A = #test2{one = 1, two = #test2{one = 10, three = 30}, three = 3},
+ B = #test2{one = 1, two = #test2{one = 10, two = #test2{one = 100}, three = 30}, three = 3},
- {ok, Transport} = thrift_membuffer_transport:new(),
- {ok, P0} = thrift_binary_protocol:new(Transport),
+ {ok, Transport} = thrift_membuffer_transport:new(),
+ {ok, P0} = thrift_binary_protocol:new(Transport),
- {P1, ok} = thrift_protocol:write(P0, {{struct, {thrift_omit_with_types, element(1, A)}}, A}),
- {P2, {ok, O0}} = thrift_protocol:read(P1, {struct, {thrift_omit_without_types, element(1, A)}}),
- ?assertEqual(element(1, A), element(1, O0)),
- ?assertEqual(element(2, A), element(2, O0)),
- ?assertEqual(element(4, A), element(3, O0)),
+ {P1, ok} = thrift_protocol:write(P0, {{struct, {thrift_omit_with_types, element(1, A)}}, A}),
+ {P2, {ok, O0}} = thrift_protocol:read(P1, {struct, {thrift_omit_without_types, element(1, A)}}),
+ ?assertEqual(element(1, A), element(1, O0)),
+ ?assertEqual(element(2, A), element(2, O0)),
+ ?assertEqual(element(4, A), element(3, O0)),
- {P3, ok} = thrift_protocol:write(P2, {{struct, {thrift_omit_with_types, element(1, B)}}, B}),
- {_P4, {ok, O1}} = thrift_protocol:read(P3, {struct, {thrift_omit_without_types, element(1, A)}}),
- ?assertEqual(element(1, A), element(1, O1)),
- ?assertEqual(element(2, A), element(2, O1)),
- ?assertEqual(element(4, A), element(3, O1)),
+ {P3, ok} = thrift_protocol:write(P2, {{struct, {thrift_omit_with_types, element(1, B)}}, B}),
+ {_P4, {ok, O1}} = thrift_protocol:read(
+ P3, {struct, {thrift_omit_without_types, element(1, A)}}
+ ),
+ ?assertEqual(element(1, A), element(1, O1)),
+ ?assertEqual(element(2, A), element(2, O1)),
+ ?assertEqual(element(4, A), element(3, O1)),
- ok.
+ ok.
omit_list_test() ->
- %% In this test, the field that is deleted is a list.
- A = #test1{one = 1, two = 2, three = 3},
- B = #test3{one = 1, two = [ A ]},
+ %% In this test, the field that is deleted is a list.
+ A = #test1{one = 1, two = 2, three = 3},
+ B = #test3{one = 1, two = [A]},
- {ok, Transport} = thrift_membuffer_transport:new(),
- {ok, P0} = thrift_binary_protocol:new(Transport),
+ {ok, Transport} = thrift_membuffer_transport:new(),
+ {ok, P0} = thrift_binary_protocol:new(Transport),
- {P1, ok} = thrift_protocol:write(P0, {{struct, {thrift_omit_with_types, element(1, B)}}, B}),
- {_P2, {ok, O0}} = thrift_protocol:read(P1, {struct, {thrift_omit_without_types, element(1, B)}}),
- ?assertEqual(element(2, B), element(2, O0)),
+ {P1, ok} = thrift_protocol:write(P0, {{struct, {thrift_omit_with_types, element(1, B)}}, B}),
+ {_P2, {ok, O0}} = thrift_protocol:read(
+ P1, {struct, {thrift_omit_without_types, element(1, B)}}
+ ),
+ ?assertEqual(element(2, B), element(2, O0)),
- ok.
+ ok.
omit_map_test() ->
- %% In this test, the field that is deleted is a map.
- A = #test1{one = 1, two = 2, three = 3},
- B = #test4{one = 1, two = dict:from_list([ {2, A} ])},
+ %% In this test, the field that is deleted is a map.
+ A = #test1{one = 1, two = 2, three = 3},
+ B = #test4{one = 1, two = dict:from_list([{2, A}])},
- {ok, Transport} = thrift_membuffer_transport:new(),
- {ok, P0} = thrift_binary_protocol:new(Transport),
+ {ok, Transport} = thrift_membuffer_transport:new(),
+ {ok, P0} = thrift_binary_protocol:new(Transport),
- {P1, ok} = thrift_protocol:write(P0, {{struct, {thrift_omit_with_types, element(1, B)}}, B}),
- {_P2, {ok, O0}} = thrift_protocol:read(P1, {struct, {thrift_omit_without_types, element(1, B)}}),
- ?assertEqual(element(2, B), element(2, O0)),
+ {P1, ok} = thrift_protocol:write(P0, {{struct, {thrift_omit_with_types, element(1, B)}}, B}),
+ {_P2, {ok, O0}} = thrift_protocol:read(
+ P1, {struct, {thrift_omit_without_types, element(1, B)}}
+ ),
+ ?assertEqual(element(2, B), element(2, O0)),
- ok.
+ ok.
--endif. %% TEST
+%% TEST
+-endif.
diff --git a/lib/erl/test/test_rendered_double_constants.erl b/lib/erl/test/test_rendered_double_constants.erl
index 87fce81..02950f2 100644
--- a/lib/erl/test/test_rendered_double_constants.erl
+++ b/lib/erl/test/test_rendered_double_constants.erl
@@ -27,42 +27,96 @@
-define(EPSILON, 0.0000001).
rendered_double_constants_test() ->
- ?assert(abs(1.0 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_INT_CONSTANT_TEST) =< ?EPSILON),
- ?assert(abs(-100.0 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_NEGATIVE_INT_CONSTANT_TEST) =< ?EPSILON),
- ?assert(abs(9223372036854775807.0 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_LARGEST_INT_CONSTANT_TEST) =< ?EPSILON),
- ?assert(abs(-9223372036854775807.0 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_SMALLEST_INT_CONSTANT_TEST) =< ?EPSILON),
- ?assert(abs(3.14159265359 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_DOUBLE_WITH_MANY_DECIMALS_TEST) =< ?EPSILON),
- ?assert(abs(1000000.1 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_FRACTIONAL_DOUBLE_TEST) =< ?EPSILON),
- ?assert(abs(-1000000.1 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_NEGATIVE_FRACTIONAL_DOUBLE_TEST) =< ?EPSILON),
- ?assert(abs(1.7e+308 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_LARGE_DOUBLE_TEST) =< ?EPSILON),
- ?assert(abs(9223372036854775816.43 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_LARGE_FRACTIONAL_DOUBLE_TEST) =< ?EPSILON),
- ?assert(abs(-1.7e+308 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_SMALL_DOUBLE_TEST) =< ?EPSILON),
- ?assert(abs(-9223372036854775816.43 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_NEGATIVE_BUT_LARGE_FRACTIONAL_DOUBLE_TEST) =< ?EPSILON),
- ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_INT_CONSTANT_TEST)),
- ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_NEGATIVE_INT_CONSTANT_TEST)),
- ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_LARGEST_INT_CONSTANT_TEST)),
- ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_SMALLEST_INT_CONSTANT_TEST)),
- ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_DOUBLE_WITH_MANY_DECIMALS_TEST)),
- ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_FRACTIONAL_DOUBLE_TEST)),
- ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_NEGATIVE_FRACTIONAL_DOUBLE_TEST)),
- ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_LARGE_DOUBLE_TEST)),
- ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_LARGE_FRACTIONAL_DOUBLE_TEST)),
- ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_SMALL_DOUBLE_TEST)),
- ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_NEGATIVE_BUT_LARGE_FRACTIONAL_DOUBLE_TEST)).
+ ?assert(abs(1.0 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_INT_CONSTANT_TEST) =< ?EPSILON),
+ ?assert(
+ abs(-100.0 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_NEGATIVE_INT_CONSTANT_TEST) =<
+ ?EPSILON
+ ),
+ ?assert(
+ abs(
+ 9223372036854775807.0 -
+ ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_LARGEST_INT_CONSTANT_TEST
+ ) =< ?EPSILON
+ ),
+ ?assert(
+ abs(
+ -9223372036854775807.0 -
+ ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_SMALLEST_INT_CONSTANT_TEST
+ ) =< ?EPSILON
+ ),
+ ?assert(
+ abs(
+ 3.14159265359 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_DOUBLE_WITH_MANY_DECIMALS_TEST
+ ) =< ?EPSILON
+ ),
+ ?assert(
+ abs(1000000.1 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_FRACTIONAL_DOUBLE_TEST) =<
+ ?EPSILON
+ ),
+ ?assert(
+ abs(-1000000.1 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_NEGATIVE_FRACTIONAL_DOUBLE_TEST) =<
+ ?EPSILON
+ ),
+ ?assert(
+ abs(1.7e+308 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_LARGE_DOUBLE_TEST) =< ?EPSILON
+ ),
+ ?assert(
+ abs(
+ 9223372036854775816.43 -
+ ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_LARGE_FRACTIONAL_DOUBLE_TEST
+ ) =< ?EPSILON
+ ),
+ ?assert(
+ abs(-1.7e+308 - ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_SMALL_DOUBLE_TEST) =< ?EPSILON
+ ),
+ ?assert(
+ abs(
+ -9223372036854775816.43 -
+ ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_NEGATIVE_BUT_LARGE_FRACTIONAL_DOUBLE_TEST
+ ) =< ?EPSILON
+ ),
+ ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_INT_CONSTANT_TEST)),
+ ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_NEGATIVE_INT_CONSTANT_TEST)),
+ ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_LARGEST_INT_CONSTANT_TEST)),
+ ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_SMALLEST_INT_CONSTANT_TEST)),
+ ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_DOUBLE_WITH_MANY_DECIMALS_TEST)),
+ ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_FRACTIONAL_DOUBLE_TEST)),
+ ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_NEGATIVE_FRACTIONAL_DOUBLE_TEST)),
+ ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_LARGE_DOUBLE_TEST)),
+ ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_LARGE_FRACTIONAL_DOUBLE_TEST)),
+ ?assert(is_float(?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_SMALL_DOUBLE_TEST)),
+ ?assert(
+ is_float(
+ ?DOUBLE_CONSTANTS_TEST_DOUBLE_ASSIGNED_TO_NEGATIVE_BUT_LARGE_FRACTIONAL_DOUBLE_TEST
+ )
+ ).
rendered_double_list_test() ->
- ?assertEqual(12, length(?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)),
- ?assert(abs(1.0 - lists:nth(1, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
- ?assert(abs(-100.0 - lists:nth(2, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
- ?assert(abs(100.0 - lists:nth(3, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
- ?assert(abs(9223372036854775807.0 - lists:nth(4, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
- ?assert(abs(-9223372036854775807.0 - lists:nth(5, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
- ?assert(abs(3.14159265359 - lists:nth(6, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
- ?assert(abs(1000000.1 - lists:nth(7, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
- ?assert(abs(-1000000.1 - lists:nth(8, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
- ?assert(abs(1.7e+308 - lists:nth(9, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
- ?assert(abs(-1.7e+308 - lists:nth(10, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
- ?assert(abs(9223372036854775816.43 - lists:nth(11, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
- ?assert(abs(-9223372036854775816.43 - lists:nth(12, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON).
+ ?assertEqual(12, length(?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)),
+ ?assert(abs(1.0 - lists:nth(1, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
+ ?assert(abs(-100.0 - lists:nth(2, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
+ ?assert(abs(100.0 - lists:nth(3, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
+ ?assert(
+ abs(9223372036854775807.0 - lists:nth(4, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =<
+ ?EPSILON
+ ),
+ ?assert(
+ abs(-9223372036854775807.0 - lists:nth(5, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =<
+ ?EPSILON
+ ),
+ ?assert(abs(3.14159265359 - lists:nth(6, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
+ ?assert(abs(1000000.1 - lists:nth(7, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
+ ?assert(abs(-1000000.1 - lists:nth(8, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
+ ?assert(abs(1.7e+308 - lists:nth(9, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
+ ?assert(abs(-1.7e+308 - lists:nth(10, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =< ?EPSILON),
+ ?assert(
+ abs(9223372036854775816.43 - lists:nth(11, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =<
+ ?EPSILON
+ ),
+ ?assert(
+ abs(-9223372036854775816.43 - lists:nth(12, ?DOUBLE_CONSTANTS_TEST_DOUBLE_LIST_TEST)) =<
+ ?EPSILON
+ ).
--endif. %% TEST
\ No newline at end of file
+%% TEST
+-endif.
diff --git a/lib/erl/test/test_thrift_1151.erl b/lib/erl/test/test_thrift_1151.erl
index f4a910e..141787e 100644
--- a/lib/erl/test/test_thrift_1151.erl
+++ b/lib/erl/test/test_thrift_1151.erl
@@ -1,3 +1,22 @@
+%%
+%% Licensed to the Apache Software Foundation (ASF) under one
+%% or more contributor license agreements. See the NOTICE file
+%% distributed with this work for additional information
+%% regarding copyright ownership. The ASF licenses this file
+%% to you under the Apache License, Version 2.0 (the
+%% "License"); you may not use this file except in compliance
+%% with the License. You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing,
+%% software distributed under the License is distributed on an
+%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+%% KIND, either express or implied. See the License for the
+%% specific language governing permissions and limitations
+%% under the License.
+%%
+
-module(test_thrift_1151).
-include("gen-erl/thrift1151_types.hrl").
@@ -6,29 +25,29 @@
-include_lib("eunit/include/eunit.hrl").
unmatched_struct_test() ->
- S1 = #'StructC'{x=#'StructB'{x=1}},
- {ok, Transport} = thrift_memory_buffer:new(),
- {ok, Protocol} = thrift_binary_protocol:new(Transport),
- ?assertException(
- error,
- struct_unmatched,
- thrift_protocol:write(
- Protocol,
- {{struct, element(2, thrift1151_types:struct_info('StructC'))}, S1}
- )
- ).
+ S1 = #'StructC'{x = #'StructB'{x = 1}},
+ {ok, Transport} = thrift_memory_buffer:new(),
+ {ok, Protocol} = thrift_binary_protocol:new(Transport),
+ ?assertException(
+ error,
+ struct_unmatched,
+ thrift_protocol:write(
+ Protocol,
+ {{struct, element(2, thrift1151_types:struct_info('StructC'))}, S1}
+ )
+ ).
badarg_test() ->
- S2 = #'StructC'{x=#'StructA'{x="1"}},
- {ok, Transport} = thrift_memory_buffer:new(),
- {ok, Protocol} = thrift_binary_protocol:new(Transport),
- ?assertException(
- error,
- badarg,
- thrift_protocol:write(
- Protocol,
- {{struct, element(2, thrift1151_types:struct_info('StructC'))}, S2}
- )
- ).
+ S2 = #'StructC'{x = #'StructA'{x = "1"}},
+ {ok, Transport} = thrift_memory_buffer:new(),
+ {ok, Protocol} = thrift_binary_protocol:new(Transport),
+ ?assertException(
+ error,
+ badarg,
+ thrift_protocol:write(
+ Protocol,
+ {{struct, element(2, thrift1151_types:struct_info('StructC'))}, S2}
+ )
+ ).
-endif.
diff --git a/lib/erl/test/test_thrift_3214.erl b/lib/erl/test/test_thrift_3214.erl
index 118e779..4d7dd3e 100644
--- a/lib/erl/test/test_thrift_3214.erl
+++ b/lib/erl/test/test_thrift_3214.erl
@@ -18,7 +18,6 @@
%%
-module(test_thrift_3214).
--compile(export_all).
-include("gen-erl/thrift3214_types.hrl").
@@ -26,33 +25,38 @@
-include_lib("eunit/include/eunit.hrl").
record_generation_test_() ->
- [
- {"StringMap record", ?_assertMatch(
- {'StringMap', _},
- #'StringMap'{data=#{50 => "foo"}}
- )},
- {"StringMap record defaults", ?_assertEqual(
- {'StringMap', #{1 => "a", 2 => "b"}},
- #'StringMap'{}
- )},
- {"StringMap record dict from list", ?_assertNotEqual(
- {'StringMap', dict:from_list([{1, "a"}, {2, "b"}])},
- #'StringMap'{}
- )},
- {"StringMap record map from list", ?_assertEqual(
- {'StringMap', maps:from_list([{1, "a"}, {2, "b"}])},
- #'StringMap'{}
- )}
- ].
+ [
+ {"StringMap record",
+ ?_assertMatch(
+ {'StringMap', _},
+ #'StringMap'{data = #{50 => "foo"}}
+ )},
+ {"StringMap record defaults",
+ ?_assertEqual(
+ {'StringMap', #{1 => "a", 2 => "b"}},
+ #'StringMap'{}
+ )},
+ {"StringMap record dict from list",
+ ?_assertNotEqual(
+ {'StringMap', dict:from_list([{1, "a"}, {2, "b"}])},
+ #'StringMap'{}
+ )},
+ {"StringMap record map from list",
+ ?_assertEqual(
+ {'StringMap', maps:from_list([{1, "a"}, {2, "b"}])},
+ #'StringMap'{}
+ )}
+ ].
struct_info_test_() ->
- [
- {"StringMap extended definition", ?_assertEqual(
- {struct, [
- {1, undefined, {map, i32, string}, 'data', #{1 => "a", 2 => "b"}}
- ]},
- thrift3214_types:struct_info_ext('StringMap')
- )}
- ].
+ [
+ {"StringMap extended definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, {map, i32, string}, 'data', #{1 => "a", 2 => "b"}}
+ ]},
+ thrift3214_types:struct_info_ext('StringMap')
+ )}
+ ].
-endif.
diff --git a/lib/erl/test/test_thrift_buffered_transport.erl b/lib/erl/test/test_thrift_buffered_transport.erl
index 8519e82..e7b23ab 100644
--- a/lib/erl/test/test_thrift_buffered_transport.erl
+++ b/lib/erl/test/test_thrift_buffered_transport.erl
@@ -20,340 +20,295 @@
-module(test_thrift_buffered_transport).
-include_lib("eunit/include/eunit.hrl").
-
new(Transport) -> thrift_buffered_transport:new(Transport).
new_test_() ->
- [
- {"new buffered membuffer", ?_assertMatch(
- {ok, {t_transport, thrift_buffered_transport, {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, []}},
- []
- }}},
- new({t_transport, thrift_membuffer_transport, {t_membuffer, []}})
- )}
- ].
-
+ [
+ {"new buffered membuffer",
+ ?_assertMatch(
+ {ok,
+ {t_transport, thrift_buffered_transport,
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, []}},
+ []}}},
+ new({t_transport, thrift_membuffer_transport, {t_membuffer, []}})
+ )}
+ ].
read(Frame, Bytes) -> thrift_buffered_transport:read(Frame, Bytes).
read_test_() ->
- [
- {"read zero bytes from an empty buffered membuffer", ?_assertMatch(
- {
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- []
- },
- {ok, <<>>}
- },
- read(
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- []
- },
- 0
- )
- )},
- {"read 1 byte from an empty buffered membuffer", ?_assertMatch(
- {_, {ok, <<>>}},
- read(
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- []
- },
- 1
- )
- )},
- {"read zero bytes from nonempty buffered membuffer", ?_assertMatch(
- {
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer,
- <<"hallo world">>
- }},
- []
- },
- {ok, <<>>}
- },
- read(
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer,
- <<"hallo world">>
- }},
- []
- },
- 0
- )
- )},
- {"read 1 byte from nonempty buffered membuffer", ?_assertMatch(
- {
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<"allo world">>}},
- []
- },
- {ok, <<"h">>}
- },
- read(
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
- []
- },
- 1
- )
- )},
- {"read 1 byte from nonempty buffer", ?_assertMatch(
- {
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<"allo world">>}},
- []
- },
- {ok, <<"h">>}
- },
- read(
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
- []
- },
- 1
- )
- )},
- {"read a zillion bytes from nonempty buffered membuffer", ?_assertMatch(
- {
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- []
- },
- {ok, <<"hallo world">>}
- },
- read(
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
- []
- },
- 65536
- )
- )}
- ].
-
+ [
+ {"read zero bytes from an empty buffered membuffer",
+ ?_assertMatch(
+ {
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ []},
+ {ok, <<>>}
+ },
+ read(
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ []},
+ 0
+ )
+ )},
+ {"read 1 byte from an empty buffered membuffer",
+ ?_assertMatch(
+ {_, {ok, <<>>}},
+ read(
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ []},
+ 1
+ )
+ )},
+ {"read zero bytes from nonempty buffered membuffer",
+ ?_assertMatch(
+ {
+ {t_buffered,
+ {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
+ []},
+ {ok, <<>>}
+ },
+ read(
+ {t_buffered,
+ {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
+ []},
+ 0
+ )
+ )},
+ {"read 1 byte from nonempty buffered membuffer",
+ ?_assertMatch(
+ {
+ {t_buffered,
+ {t_transport, thrift_membuffer_transport, {t_membuffer, <<"allo world">>}},
+ []},
+ {ok, <<"h">>}
+ },
+ read(
+ {t_buffered,
+ {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
+ []},
+ 1
+ )
+ )},
+ {"read 1 byte from nonempty buffer",
+ ?_assertMatch(
+ {
+ {t_buffered,
+ {t_transport, thrift_membuffer_transport, {t_membuffer, <<"allo world">>}},
+ []},
+ {ok, <<"h">>}
+ },
+ read(
+ {t_buffered,
+ {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
+ []},
+ 1
+ )
+ )},
+ {"read a zillion bytes from nonempty buffered membuffer",
+ ?_assertMatch(
+ {
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ []},
+ {ok, <<"hallo world">>}
+ },
+ read(
+ {t_buffered,
+ {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
+ []},
+ 65536
+ )
+ )}
+ ].
read_exact(Frame, Bytes) -> thrift_buffered_transport:read_exact(Frame, Bytes).
read_exact_test_() ->
- [
- {"read exactly zero bytes from an empty buffered membuffer", ?_assertMatch(
- {
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- []
- },
- {ok, <<>>}
- },
- read_exact(
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- []
- },
- 0
- )
- )},
- {"read exactly 1 byte from an empty buffered membuffer", ?_assertMatch(
- {_, {error, eof}},
- read_exact(
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- []
- },
- 1
- )
- )},
- {"read exactly zero bytes from nonempty buffered membuffer", ?_assertMatch(
- {
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
- []
- },
- {ok, <<>>}
- },
- read_exact(
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
- []
- },
- 0
- )
- )},
- {"read exactly 1 byte from nonempty buffered membuffer", ?_assertMatch(
- {
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<"allo world">>}},
- []
- },
- {ok, <<"h">>}
- },
- read_exact(
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer,
- <<"hallo world">>
- }},
- []
- },
- 1
- )
- )},
- {"read exactly 1 byte from nonempty buffer", ?_assertMatch(
- {
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<"allo world">>}},
- []
- },
- {ok, <<"h">>}
- },
- read_exact(
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
- []
- },
- 1
- )
- )},
- {"read exactly a zillion bytes from nonempty buffered membuffer", ?_assertMatch(
- {
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
- []
- },
- {error, eof}
- },
- read_exact(
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer,
- <<"hallo world">>
- }},
- []
- },
- 65536
- )
- )}
- ].
-
+ [
+ {"read exactly zero bytes from an empty buffered membuffer",
+ ?_assertMatch(
+ {
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ []},
+ {ok, <<>>}
+ },
+ read_exact(
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ []},
+ 0
+ )
+ )},
+ {"read exactly 1 byte from an empty buffered membuffer",
+ ?_assertMatch(
+ {_, {error, eof}},
+ read_exact(
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ []},
+ 1
+ )
+ )},
+ {"read exactly zero bytes from nonempty buffered membuffer",
+ ?_assertMatch(
+ {
+ {t_buffered,
+ {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
+ []},
+ {ok, <<>>}
+ },
+ read_exact(
+ {t_buffered,
+ {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
+ []},
+ 0
+ )
+ )},
+ {"read exactly 1 byte from nonempty buffered membuffer",
+ ?_assertMatch(
+ {
+ {t_buffered,
+ {t_transport, thrift_membuffer_transport, {t_membuffer, <<"allo world">>}},
+ []},
+ {ok, <<"h">>}
+ },
+ read_exact(
+ {t_buffered,
+ {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
+ []},
+ 1
+ )
+ )},
+ {"read exactly 1 byte from nonempty buffer",
+ ?_assertMatch(
+ {
+ {t_buffered,
+ {t_transport, thrift_membuffer_transport, {t_membuffer, <<"allo world">>}},
+ []},
+ {ok, <<"h">>}
+ },
+ read_exact(
+ {t_buffered,
+ {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
+ []},
+ 1
+ )
+ )},
+ {"read exactly a zillion bytes from nonempty buffered membuffer",
+ ?_assertMatch(
+ {
+ {t_buffered,
+ {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
+ []},
+ {error, eof}
+ },
+ read_exact(
+ {t_buffered,
+ {t_transport, thrift_membuffer_transport, {t_membuffer, <<"hallo world">>}},
+ []},
+ 65536
+ )
+ )}
+ ].
write(Framed, Data) -> thrift_buffered_transport:write(Framed, Data).
write_test_() ->
- [
- {"write empty list to empty buffered membuffer", ?_assertMatch(
- {
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [[], []]
- },
- ok
- },
- write(
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- []
- },
- []
- )
- )},
- {"write empty list to nonempty buffered membuffer", ?_assertMatch(
- {
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [["hallo world"], []]
- },
- ok
- },
- write(
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- ["hallo world"]
- },
- []
- )
- )},
- {"write empty binary to empty buffered membuffer", ?_assertMatch(
- {
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [[], <<>>]
- },
- ok
- },
- write(
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- []
- },
- <<>>
- )
- )},
- {"write empty binary to nonempty buffered membuffer", ?_assertMatch(
- {
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [["hallo world"], <<>>]
- },
- ok
- },
- write(
- {t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- ["hallo world"]
- },
- <<>>
- )
- )}
- ].
-
+ [
+ {"write empty list to empty buffered membuffer",
+ ?_assertMatch(
+ {
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [
+ [], []
+ ]},
+ ok
+ },
+ write(
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ []},
+ []
+ )
+ )},
+ {"write empty list to nonempty buffered membuffer",
+ ?_assertMatch(
+ {
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [
+ ["hallo world"], []
+ ]},
+ ok
+ },
+ write(
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [
+ "hallo world"
+ ]},
+ []
+ )
+ )},
+ {"write empty binary to empty buffered membuffer",
+ ?_assertMatch(
+ {
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [
+ [], <<>>
+ ]},
+ ok
+ },
+ write(
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ []},
+ <<>>
+ )
+ )},
+ {"write empty binary to nonempty buffered membuffer",
+ ?_assertMatch(
+ {
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [
+ ["hallo world"], <<>>
+ ]},
+ ok
+ },
+ write(
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [
+ "hallo world"
+ ]},
+ <<>>
+ )
+ )}
+ ].
flush(Transport) -> thrift_buffered_transport:flush(Transport).
flush_test_() ->
- [
- {"flush empty buffered membuffer", ?_assertMatch(
- {{t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- []
- },
- ok
- },
- flush({t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- []
- })
- )},
- {"flush nonempty buffered membuffer", ?_assertMatch(
- {{t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer,
- [<<>>, <<"hallo world">>]
- }},
- []
- },
- ok
- },
- flush({t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- <<"hallo world">>
- })
- )}
- ].
-
+ [
+ {"flush empty buffered membuffer",
+ ?_assertMatch(
+ {
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ []},
+ ok
+ },
+ flush(
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, []}
+ )
+ )},
+ {"flush nonempty buffered membuffer",
+ ?_assertMatch(
+ {
+ {t_buffered,
+ {t_transport, thrift_membuffer_transport,
+ {t_membuffer, [<<>>, <<"hallo world">>]}},
+ []},
+ ok
+ },
+ flush(
+ {t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ <<"hallo world">>}
+ )
+ )}
+ ].
close(Transport) -> thrift_buffered_transport:close(Transport).
close_test_() ->
- {"close buffered membuffer", ?_assertMatch(
- {{t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- []
- },
- ok
- },
- close({t_buffered,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- []
- })
- )}.
-
+ {"close buffered membuffer",
+ ?_assertMatch(
+ {{t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, []}, ok},
+ close({t_buffered, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, []})
+ )}.
diff --git a/lib/erl/test/test_thrift_compact_protocol.erl b/lib/erl/test/test_thrift_compact_protocol.erl
index 5da78c6..b9efae7 100644
--- a/lib/erl/test/test_thrift_compact_protocol.erl
+++ b/lib/erl/test/test_thrift_compact_protocol.erl
@@ -22,198 +22,203 @@
-include("thrift_constants.hrl").
-include("thrift_protocol.hrl").
-
new(Transport) -> thrift_compact_protocol:new(Transport).
new() ->
- {ok, Transport} = thrift_membuffer_transport:new(),
- thrift_compact_protocol:new(Transport).
+ {ok, Transport} = thrift_membuffer_transport:new(),
+ thrift_compact_protocol:new(Transport).
new_test() ->
- new(thrift_membuffer_transport:new()).
+ new(thrift_membuffer_transport:new()).
write(This, Value) -> thrift_protocol:write(This, Value).
read(This, Type) -> thrift_protocol:read(This, Type).
str(This0, Value0) ->
- {This1, ok} = write(This0, {string, Value0}),
- {This2, {ok, Value1}} = read(This1, string),
- ?assertEqual(Value0, binary_to_list(Value1)),
- {This2, ok}.
+ {This1, ok} = write(This0, {string, Value0}),
+ {This2, {ok, Value1}} = read(This1, string),
+ ?assertEqual(Value0, binary_to_list(Value1)),
+ {This2, ok}.
string_test() ->
- {ok, This0} = new(),
- {This1, ok} = str(This0, "aaa"),
- {This2, ok} = str(This1, ""),
- {This2, ok}.
+ {ok, This0} = new(),
+ {This1, ok} = str(This0, "aaa"),
+ {This2, ok} = str(This1, ""),
+ {This2, ok}.
round_trip(This0, Type, Value0) ->
- {This1, ok} = write(This0, {Type, Value0}),
- {This2, {ok, Value1}} = read(This1, Type),
- ?assertEqual(Value0, Value1),
- {This2, ok}.
+ {This1, ok} = write(This0, {Type, Value0}),
+ {This2, {ok, Value1}} = read(This1, Type),
+ ?assertEqual(Value0, Value1),
+ {This2, ok}.
bool_test() ->
- {ok, This0} = new(),
- {This1, ok} = round_trip(This0, bool, true),
- {This2, ok} = round_trip(This1, bool, false),
- {This2, ok}.
+ {ok, This0} = new(),
+ {This1, ok} = round_trip(This0, bool, true),
+ {This2, ok} = round_trip(This1, bool, false),
+ {This2, ok}.
byte(This0, Value0) -> round_trip(This0, byte, Value0).
byte_test() ->
- {ok, This0} = new(),
- {This1, ok} = byte(This0, 0),
- {This2, ok} = byte(This1, 42),
- {This3, ok} = byte(This2, -1),
- {This4, ok} = byte(This3, -128),
- {This4, ok}.
+ {ok, This0} = new(),
+ {This1, ok} = byte(This0, 0),
+ {This2, ok} = byte(This1, 42),
+ {This3, ok} = byte(This2, -1),
+ {This4, ok} = byte(This3, -128),
+ {This4, ok}.
i16(This0, Value0) -> round_trip(This0, i16, Value0).
i16_test() ->
- {ok, This0} = new(),
- {This1, ok} = i16(This0, 0),
- {This2, ok} = i16(This1, 42),
- {This3, ok} = i16(This2, 30000),
- {This4, ok} = i16(This3, -1),
- {This5, ok} = i16(This4, -128),
- {This6, ok} = i16(This5, -30000),
- {This6, ok}.
+ {ok, This0} = new(),
+ {This1, ok} = i16(This0, 0),
+ {This2, ok} = i16(This1, 42),
+ {This3, ok} = i16(This2, 30000),
+ {This4, ok} = i16(This3, -1),
+ {This5, ok} = i16(This4, -128),
+ {This6, ok} = i16(This5, -30000),
+ {This6, ok}.
i32(This0, Value0) -> round_trip(This0, i32, Value0).
i32_test() ->
- {ok, This0} = new(),
- {This1, ok} = i32(This0, 0),
- {This2, ok} = i32(This1, 42),
- {This3, ok} = i32(This2, 30000),
- {This4, ok} = i32(This3, 2000000002),
- {This5, ok} = i32(This4, -1),
- {This6, ok} = i32(This5, -128),
- {This7, ok} = i32(This6, -30000),
- {This8, ok} = i32(This7, -2000000002),
- {This8, ok}.
+ {ok, This0} = new(),
+ {This1, ok} = i32(This0, 0),
+ {This2, ok} = i32(This1, 42),
+ {This3, ok} = i32(This2, 30000),
+ {This4, ok} = i32(This3, 2000000002),
+ {This5, ok} = i32(This4, -1),
+ {This6, ok} = i32(This5, -128),
+ {This7, ok} = i32(This6, -30000),
+ {This8, ok} = i32(This7, -2000000002),
+ {This8, ok}.
i64(This0, Value0) -> round_trip(This0, i64, Value0).
i64_test() ->
- {ok, This0} = new(),
- {This1, ok} = i64(This0, 0),
- {This2, ok} = i64(This1, 42),
- {This3, ok} = i64(This2, 30000),
- {This4, ok} = i64(This3, 2000000002),
- {This5, ok} = i64(This4, 100000000000000064),
- {This6, ok} = i64(This5, -1),
- {This7, ok} = i64(This6, -128),
- {This8, ok} = i64(This7, -30000),
- {This9, ok} = i64(This8, -2000000002),
- {This10, ok} = i64(This9, -100000000000000064),
- {This10, ok}.
+ {ok, This0} = new(),
+ {This1, ok} = i64(This0, 0),
+ {This2, ok} = i64(This1, 42),
+ {This3, ok} = i64(This2, 30000),
+ {This4, ok} = i64(This3, 2000000002),
+ {This5, ok} = i64(This4, 100000000000000064),
+ {This6, ok} = i64(This5, -1),
+ {This7, ok} = i64(This6, -128),
+ {This8, ok} = i64(This7, -30000),
+ {This9, ok} = i64(This8, -2000000002),
+ {This10, ok} = i64(This9, -100000000000000064),
+ {This10, ok}.
struct_test() ->
- {ok, P0} = new(),
- {P1, ok} = write(P0, #protocol_message_begin{ name = "Message1", type = ?tType_I8, seqid = 3}),
- {P2, ok} = write(P1, #protocol_struct_begin{}),
- {P3, ok} = write(P2, #protocol_field_begin{ name = "field1", type = ?tType_I8, id = 1}),
- {P4, ok} = write(P3, {byte, 42}),
- {P5, ok} = write(P4, field_end),
- {P6, ok} = write(P5, #protocol_field_begin{ name = "field2", type = ?tType_I8, id = 14}),
- {P7, ok} = write(P6, {byte, 3}),
- {P8, ok} = write(P7, field_end),
- {P9, ok} = write(P8, #protocol_field_begin{ name = "field3", type = ?tType_I8, id = 42}),
- {P10, ok} = write(P9, {byte, 8}),
- {P11, ok} = write(P10, field_end),
- {P12, ok} = write(P11, field_stop),
- {P13, ok} = write(P12, struct_end),
- {P14, ok} = write(P13, message_end),
+ {ok, P0} = new(),
+ {P1, ok} = write(P0, #protocol_message_begin{name = "Message1", type = ?tType_I8, seqid = 3}),
+ {P2, ok} = write(P1, #protocol_struct_begin{}),
+ {P3, ok} = write(P2, #protocol_field_begin{name = "field1", type = ?tType_I8, id = 1}),
+ {P4, ok} = write(P3, {byte, 42}),
+ {P5, ok} = write(P4, field_end),
+ {P6, ok} = write(P5, #protocol_field_begin{name = "field2", type = ?tType_I8, id = 14}),
+ {P7, ok} = write(P6, {byte, 3}),
+ {P8, ok} = write(P7, field_end),
+ {P9, ok} = write(P8, #protocol_field_begin{name = "field3", type = ?tType_I8, id = 42}),
+ {P10, ok} = write(P9, {byte, 8}),
+ {P11, ok} = write(P10, field_end),
+ {P12, ok} = write(P11, field_stop),
+ {P13, ok} = write(P12, struct_end),
+ {P14, ok} = write(P13, message_end),
- {P15, #protocol_message_begin{ name = "Message1", type = ?tType_I8, seqid = 3}} = read(P14, message_begin),
- {P16, ok} = read(P15, struct_begin),
- {P17, #protocol_field_begin{ type = ?tType_I8, id = 1 }} = read(P16, field_begin),
- {P18, {ok, 42}} = read(P17, byte),
- {P19, ok} = read(P18, field_end),
- {P20, #protocol_field_begin{ type = ?tType_I8, id = 14 }} = read(P19, field_begin),
- {P21, {ok, 3}} = read(P20, byte),
- {P22, ok} = read(P21, field_end),
- {P23, #protocol_field_begin{ type = ?tType_I8, id = 42 }} = read(P22, field_begin),
- {P24, {ok, 8}} = read(P23, byte),
- {P25, ok} = read(P24, field_end),
- {P26, #protocol_field_begin{ type = ?tType_STOP}} = read(P25, field_begin),
- {P27, ok} = read(P26, struct_end),
- {P28, ok} = read(P27, message_end),
- {P28, ok}.
+ {P15, #protocol_message_begin{name = "Message1", type = ?tType_I8, seqid = 3}} = read(
+ P14, message_begin
+ ),
+ {P16, ok} = read(P15, struct_begin),
+ {P17, #protocol_field_begin{type = ?tType_I8, id = 1}} = read(P16, field_begin),
+ {P18, {ok, 42}} = read(P17, byte),
+ {P19, ok} = read(P18, field_end),
+ {P20, #protocol_field_begin{type = ?tType_I8, id = 14}} = read(P19, field_begin),
+ {P21, {ok, 3}} = read(P20, byte),
+ {P22, ok} = read(P21, field_end),
+ {P23, #protocol_field_begin{type = ?tType_I8, id = 42}} = read(P22, field_begin),
+ {P24, {ok, 8}} = read(P23, byte),
+ {P25, ok} = read(P24, field_end),
+ {P26, #protocol_field_begin{type = ?tType_STOP}} = read(P25, field_begin),
+ {P27, ok} = read(P26, struct_end),
+ {P28, ok} = read(P27, message_end),
+ {P28, ok}.
bool_field_test() ->
- {ok, P0} = new(),
- {P1, ok} = write(P0, #protocol_message_begin{ name = "Message1", type = ?tType_I8, seqid = 3}),
- {P2, ok} = write(P1, #protocol_struct_begin{}),
- {P3, ok} = write(P2, #protocol_field_begin{ name = "field1", type = ?tType_BOOL, id = 1}),
- {P4, ok} = write(P3, {bool, true}),
- {P5, ok} = write(P4, field_end),
- {P6, ok} = write(P5, #protocol_field_begin{ name = "field2", type = ?tType_BOOL, id = 14}),
- {P7, ok} = write(P6, {bool, false}),
- {P8, ok} = write(P7, field_end),
- {P9, ok} = write(P8, #protocol_field_begin{ name = "field3", type = ?tType_BOOL, id = 42}),
- {P10, ok} = write(P9, {bool, true}),
- {P11, ok} = write(P10, field_end),
- {P12, ok} = write(P11, field_stop),
- {P13, ok} = write(P12, struct_end),
- {P14, ok} = write(P13, message_end),
+ {ok, P0} = new(),
+ {P1, ok} = write(P0, #protocol_message_begin{name = "Message1", type = ?tType_I8, seqid = 3}),
+ {P2, ok} = write(P1, #protocol_struct_begin{}),
+ {P3, ok} = write(P2, #protocol_field_begin{name = "field1", type = ?tType_BOOL, id = 1}),
+ {P4, ok} = write(P3, {bool, true}),
+ {P5, ok} = write(P4, field_end),
+ {P6, ok} = write(P5, #protocol_field_begin{name = "field2", type = ?tType_BOOL, id = 14}),
+ {P7, ok} = write(P6, {bool, false}),
+ {P8, ok} = write(P7, field_end),
+ {P9, ok} = write(P8, #protocol_field_begin{name = "field3", type = ?tType_BOOL, id = 42}),
+ {P10, ok} = write(P9, {bool, true}),
+ {P11, ok} = write(P10, field_end),
+ {P12, ok} = write(P11, field_stop),
+ {P13, ok} = write(P12, struct_end),
+ {P14, ok} = write(P13, message_end),
- {P15, #protocol_message_begin{ name = "Message1", type = ?tType_I8, seqid = 3}} = read(P14, message_begin),
- {P16, ok} = read(P15, struct_begin),
- {P17, #protocol_field_begin{ type = ?tType_BOOL, id = 1 }} = read(P16, field_begin),
- {P18, {ok, true}} = read(P17, bool),
- {P19, ok} = read(P18, field_end),
- {P20, #protocol_field_begin{ type = ?tType_BOOL, id = 14 }} = read(P19, field_begin),
- {P21, {ok, false}} = read(P20, bool),
- {P22, ok} = read(P21, field_end),
- {P23, #protocol_field_begin{ type = ?tType_BOOL, id = 42 }} = read(P22, field_begin),
- {P24, {ok, true}} = read(P23, bool),
- {P25, ok} = read(P24, field_end),
- {P26, #protocol_field_begin{ type = ?tType_STOP}} = read(P25, field_begin),
- {P27, ok} = read(P26, struct_end),
- {P28, ok} = read(P27, message_end),
- {P28, ok}.
+ {P15, #protocol_message_begin{name = "Message1", type = ?tType_I8, seqid = 3}} = read(
+ P14, message_begin
+ ),
+ {P16, ok} = read(P15, struct_begin),
+ {P17, #protocol_field_begin{type = ?tType_BOOL, id = 1}} = read(P16, field_begin),
+ {P18, {ok, true}} = read(P17, bool),
+ {P19, ok} = read(P18, field_end),
+ {P20, #protocol_field_begin{type = ?tType_BOOL, id = 14}} = read(P19, field_begin),
+ {P21, {ok, false}} = read(P20, bool),
+ {P22, ok} = read(P21, field_end),
+ {P23, #protocol_field_begin{type = ?tType_BOOL, id = 42}} = read(P22, field_begin),
+ {P24, {ok, true}} = read(P23, bool),
+ {P25, ok} = read(P24, field_end),
+ {P26, #protocol_field_begin{type = ?tType_STOP}} = read(P25, field_begin),
+ {P27, ok} = read(P26, struct_end),
+ {P28, ok} = read(P27, message_end),
+ {P28, ok}.
nesting_test() ->
- {ok, P0} = new(),
- {P1, ok} = write(P0, #protocol_message_begin{ name = "Message1", type = ?tType_I8, seqid = 3}),
- {P2, ok} = write(P1, #protocol_struct_begin{}),
- {P3, ok} = write(P2, #protocol_field_begin{ name = "field1", type = ?tType_BOOL, id = 14}),
- {P4, ok} = write(P3, {bool, true}),
- {P5, ok} = write(P4, field_end),
+ {ok, P0} = new(),
+ {P1, ok} = write(P0, #protocol_message_begin{name = "Message1", type = ?tType_I8, seqid = 3}),
+ {P2, ok} = write(P1, #protocol_struct_begin{}),
+ {P3, ok} = write(P2, #protocol_field_begin{name = "field1", type = ?tType_BOOL, id = 14}),
+ {P4, ok} = write(P3, {bool, true}),
+ {P5, ok} = write(P4, field_end),
- {P6, ok} = write(P5, #protocol_field_begin{ name = "field2", type = ?tType_STRUCT, id = 28}),
- {P7, ok} = write(P6, #protocol_struct_begin{}),
- {P8, ok} = write(P7, #protocol_field_begin{ name = "field2_1", type = ?tType_BOOL, id = 30000}),
- {P9, ok} = write(P8, {bool, false}),
- {P10, ok} = write(P9, field_end),
- {P11, ok} = write(P10, field_stop),
- {P12, ok} = write(P11, struct_end),
- {P13, ok} = write(P12, field_end),
+ {P6, ok} = write(P5, #protocol_field_begin{name = "field2", type = ?tType_STRUCT, id = 28}),
+ {P7, ok} = write(P6, #protocol_struct_begin{}),
+ {P8, ok} = write(P7, #protocol_field_begin{name = "field2_1", type = ?tType_BOOL, id = 30000}),
+ {P9, ok} = write(P8, {bool, false}),
+ {P10, ok} = write(P9, field_end),
+ {P11, ok} = write(P10, field_stop),
+ {P12, ok} = write(P11, struct_end),
+ {P13, ok} = write(P12, field_end),
- {P14, ok} = write(P13, #protocol_field_begin{ name = "field3", type = ?tType_BOOL, id = 42}),
- {P15, ok} = write(P14, {bool, true}),
- {P16, ok} = write(P15, field_end),
- {P17, ok} = write(P16, field_stop),
- {P18, ok} = write(P17, struct_end),
- {P19, ok} = write(P18, message_end),
+ {P14, ok} = write(P13, #protocol_field_begin{name = "field3", type = ?tType_BOOL, id = 42}),
+ {P15, ok} = write(P14, {bool, true}),
+ {P16, ok} = write(P15, field_end),
+ {P17, ok} = write(P16, field_stop),
+ {P18, ok} = write(P17, struct_end),
+ {P19, ok} = write(P18, message_end),
- {P20, #protocol_message_begin{ name = "Message1", type = ?tType_I8, seqid = 3}} = read(P19, message_begin),
- {P21, ok} = read(P20, struct_begin),
- {P22, #protocol_field_begin{ type = ?tType_BOOL, id = 14 }} = read(P21, field_begin),
- {P23, {ok, true}} = read(P22, bool),
- {P24, ok} = read(P23, field_end),
+ {P20, #protocol_message_begin{name = "Message1", type = ?tType_I8, seqid = 3}} = read(
+ P19, message_begin
+ ),
+ {P21, ok} = read(P20, struct_begin),
+ {P22, #protocol_field_begin{type = ?tType_BOOL, id = 14}} = read(P21, field_begin),
+ {P23, {ok, true}} = read(P22, bool),
+ {P24, ok} = read(P23, field_end),
- {P25, #protocol_field_begin{ type = ?tType_STRUCT, id = 28 }} = read(P24, field_begin),
- {P26, ok} = read(P25, struct_begin),
- {P27, #protocol_field_begin{ type = ?tType_BOOL, id = 30000 }} = read(P26, field_begin),
- {P28, {ok, false}} = read(P27, bool),
- {P29, ok} = read(P28, field_end),
- {P30, #protocol_field_begin{ type = ?tType_STOP }} = read(P29, field_begin),
- {P31, ok} = read(P30, struct_end),
- {P32, ok} = read(P31, field_end),
+ {P25, #protocol_field_begin{type = ?tType_STRUCT, id = 28}} = read(P24, field_begin),
+ {P26, ok} = read(P25, struct_begin),
+ {P27, #protocol_field_begin{type = ?tType_BOOL, id = 30000}} = read(P26, field_begin),
+ {P28, {ok, false}} = read(P27, bool),
+ {P29, ok} = read(P28, field_end),
+ {P30, #protocol_field_begin{type = ?tType_STOP}} = read(P29, field_begin),
+ {P31, ok} = read(P30, struct_end),
+ {P32, ok} = read(P31, field_end),
- {P33, #protocol_field_begin{ type = ?tType_BOOL, id = 42 }} = read(P32, field_begin),
- {P34, {ok, true}} = read(P33, bool),
- {P35, ok} = read(P34, field_end),
- {P36, #protocol_field_begin{ type = ?tType_STOP }} = read(P35, field_begin),
- {P37, ok} = read(P36, struct_end),
- {P38, ok} = read(P37, message_end),
- {P38, ok}.
+ {P33, #protocol_field_begin{type = ?tType_BOOL, id = 42}} = read(P32, field_begin),
+ {P34, {ok, true}} = read(P33, bool),
+ {P35, ok} = read(P34, field_end),
+ {P36, #protocol_field_begin{type = ?tType_STOP}} = read(P35, field_begin),
+ {P37, ok} = read(P36, struct_end),
+ {P38, ok} = read(P37, message_end),
+ {P38, ok}.
diff --git a/lib/erl/test/test_thrift_file_transport.erl b/lib/erl/test/test_thrift_file_transport.erl
index 3e5c1d1..85b6c46 100644
--- a/lib/erl/test/test_thrift_file_transport.erl
+++ b/lib/erl/test/test_thrift_file_transport.erl
@@ -20,194 +20,205 @@
-module(test_thrift_file_transport).
-include_lib("eunit/include/eunit.hrl").
-
new(File) -> thrift_file_transport:new(File).
new(File, Opts) -> thrift_file_transport:new(File, Opts).
new_test_() ->
- [
- {"new file", ?_assertMatch(
- {ok, {_, thrift_file_transport, {t_file, a_fake_file, true, write}}},
- new(a_fake_file)
- )},
- {"new file in read mode", ?_assertMatch(
- {ok, {_, thrift_file_transport, {t_file, a_fake_file, true, read}}},
- new(a_fake_file, [{mode, read}])
- )},
- {"new file in write mode", ?_assertMatch(
- {ok, {_, thrift_file_transport, {t_file, a_fake_file, true, write}}},
- new(a_fake_file, [{mode, write}])
- )},
- {"new file in should_close true mode", ?_assertMatch(
- {ok, {_, thrift_file_transport, {t_file, a_fake_file, true, write}}},
- new(a_fake_file, [{should_close, true}])
- )},
- {"new file in should_close false mode", ?_assertMatch(
- {ok, {_, thrift_file_transport, {t_file, a_fake_file, false, write}}},
- new(a_fake_file, [{should_close, false}])
- )}
- ].
-
+ [
+ {"new file",
+ ?_assertMatch(
+ {ok, {_, thrift_file_transport, {t_file, a_fake_file, true, write}}},
+ new(a_fake_file)
+ )},
+ {"new file in read mode",
+ ?_assertMatch(
+ {ok, {_, thrift_file_transport, {t_file, a_fake_file, true, read}}},
+ new(a_fake_file, [{mode, read}])
+ )},
+ {"new file in write mode",
+ ?_assertMatch(
+ {ok, {_, thrift_file_transport, {t_file, a_fake_file, true, write}}},
+ new(a_fake_file, [{mode, write}])
+ )},
+ {"new file in should_close true mode",
+ ?_assertMatch(
+ {ok, {_, thrift_file_transport, {t_file, a_fake_file, true, write}}},
+ new(a_fake_file, [{should_close, true}])
+ )},
+ {"new file in should_close false mode",
+ ?_assertMatch(
+ {ok, {_, thrift_file_transport, {t_file, a_fake_file, false, write}}},
+ new(a_fake_file, [{should_close, false}])
+ )}
+ ].
read(File, Bytes) -> thrift_file_transport:read(File, Bytes).
read_test_() ->
- {setup,
- fun() ->
- meck:new(file, [unstick, passthrough]),
- meck:expect(file, read, fun(Bin, N) ->
- {Result, _} = split_binary(Bin, min(iolist_size(Bin), N)),
- {ok, Result}
- end)
- end,
- fun(_) -> meck:unload(file) end,
- [
- {"read zero bytes from empty file", ?_assertMatch(
- {_, {ok, <<>>}},
- read({t_file, <<>>, true, read}, 0)
- )},
- {"read 1 byte from empty file", ?_assertMatch(
- {_, {ok, <<>>}},
- read({t_file, <<>>, true, read}, 1)
- )},
- {"read zero bytes from nonempty file", ?_assertMatch(
- {_, {ok, <<>>}},
- read({t_file, <<"hallo world">>, true, read}, 0)
- )},
- {"read 1 byte from nonempty file", ?_assertMatch(
- {_, {ok, <<"h">>}},
- read({t_file, <<"hallo world">>, true, read}, 1)
- )},
- {"read a zillion bytes from nonempty file", ?_assertMatch(
- {_, {ok, <<"hallo world">>}},
- read({t_file, <<"hallo world">>, true, read}, 65536)
- )},
- {"read 0 byte from file in write mode", ?_assertMatch(
- {_, {error, write_mode}},
- read({t_file, <<>>, true, write}, 0)
- )},
- {"read 1 byte from file in write mode", ?_assertMatch(
- {_, {error, write_mode}},
- read({t_file, <<>>, true, write}, 1)
- )}
- ]
- }.
-
+ {setup,
+ fun() ->
+ meck:new(file, [unstick, passthrough]),
+ meck:expect(file, read, fun(Bin, N) ->
+ {Result, _} = split_binary(Bin, min(iolist_size(Bin), N)),
+ {ok, Result}
+ end)
+ end,
+ fun(_) -> meck:unload(file) end, [
+ {"read zero bytes from empty file",
+ ?_assertMatch(
+ {_, {ok, <<>>}},
+ read({t_file, <<>>, true, read}, 0)
+ )},
+ {"read 1 byte from empty file",
+ ?_assertMatch(
+ {_, {ok, <<>>}},
+ read({t_file, <<>>, true, read}, 1)
+ )},
+ {"read zero bytes from nonempty file",
+ ?_assertMatch(
+ {_, {ok, <<>>}},
+ read({t_file, <<"hallo world">>, true, read}, 0)
+ )},
+ {"read 1 byte from nonempty file",
+ ?_assertMatch(
+ {_, {ok, <<"h">>}},
+ read({t_file, <<"hallo world">>, true, read}, 1)
+ )},
+ {"read a zillion bytes from nonempty file",
+ ?_assertMatch(
+ {_, {ok, <<"hallo world">>}},
+ read({t_file, <<"hallo world">>, true, read}, 65536)
+ )},
+ {"read 0 byte from file in write mode",
+ ?_assertMatch(
+ {_, {error, write_mode}},
+ read({t_file, <<>>, true, write}, 0)
+ )},
+ {"read 1 byte from file in write mode",
+ ?_assertMatch(
+ {_, {error, write_mode}},
+ read({t_file, <<>>, true, write}, 1)
+ )}
+ ]}.
read_exact(File, Bytes) -> thrift_file_transport:read_exact(File, Bytes).
read_exact_test_() ->
- {setup,
- fun() ->
- meck:new(file, [unstick, passthrough]),
- meck:expect(file, read, fun(Bin, N) ->
- {Result, _} = split_binary(Bin, min(iolist_size(Bin), N)),
- {ok, Result}
- end)
- end,
- fun(_) -> meck:unload(file) end,
- [
- {"read exactly zero bytes from empty file", ?_assertMatch(
- {_, {ok, <<>>}},
- read_exact({t_file, <<>>, true, read}, 0)
- )},
- {"read exactly 1 byte from empty file", ?_assertMatch(
- {_, {error, eof}},
- read_exact({t_file, <<>>, true, read}, 1)
- )},
- {"read exactly zero bytes from nonempty file", ?_assertMatch(
- {_, {ok, <<>>}},
- read_exact({t_file, <<"hallo world">>, true, read}, 0)
- )},
- {"read exactly 1 byte from nonempty file", ?_assertMatch(
- {_, {ok, <<"h">>}},
- read_exact({t_file, <<"hallo world">>, true, read}, 1)
- )},
- {"read exactly a zillion bytes from nonempty file", ?_assertMatch(
- {_, {error, eof}},
- read_exact({t_file, <<"hallo world">>, true, read}, 65536)
- )},
- {"read exactly 0 byte from file in write mode", ?_assertMatch(
- {_, {error, write_mode}},
- read_exact({t_file, <<>>, true, write}, 0)
- )},
- {"read exactly 1 byte from file in write mode", ?_assertMatch(
- {_, {error, write_mode}},
- read_exact({t_file, <<>>, true, write}, 1)
- )}
- ]
- }.
-
+ {setup,
+ fun() ->
+ meck:new(file, [unstick, passthrough]),
+ meck:expect(file, read, fun(Bin, N) ->
+ {Result, _} = split_binary(Bin, min(iolist_size(Bin), N)),
+ {ok, Result}
+ end)
+ end,
+ fun(_) -> meck:unload(file) end, [
+ {"read exactly zero bytes from empty file",
+ ?_assertMatch(
+ {_, {ok, <<>>}},
+ read_exact({t_file, <<>>, true, read}, 0)
+ )},
+ {"read exactly 1 byte from empty file",
+ ?_assertMatch(
+ {_, {error, eof}},
+ read_exact({t_file, <<>>, true, read}, 1)
+ )},
+ {"read exactly zero bytes from nonempty file",
+ ?_assertMatch(
+ {_, {ok, <<>>}},
+ read_exact({t_file, <<"hallo world">>, true, read}, 0)
+ )},
+ {"read exactly 1 byte from nonempty file",
+ ?_assertMatch(
+ {_, {ok, <<"h">>}},
+ read_exact({t_file, <<"hallo world">>, true, read}, 1)
+ )},
+ {"read exactly a zillion bytes from nonempty file",
+ ?_assertMatch(
+ {_, {error, eof}},
+ read_exact({t_file, <<"hallo world">>, true, read}, 65536)
+ )},
+ {"read exactly 0 byte from file in write mode",
+ ?_assertMatch(
+ {_, {error, write_mode}},
+ read_exact({t_file, <<>>, true, write}, 0)
+ )},
+ {"read exactly 1 byte from file in write mode",
+ ?_assertMatch(
+ {_, {error, write_mode}},
+ read_exact({t_file, <<>>, true, write}, 1)
+ )}
+ ]}.
write(File, Data) -> thrift_file_transport:write(File, Data).
write_test_() ->
- {setup,
- fun() ->
- meck:new(file, [unstick, passthrough]),
- meck:expect(file, write, fun(_, _) -> ok end)
- end,
- fun(_) -> meck:unload(file) end,
- [
- {"write empty list to file", ?_assertMatch(
- {{t_file, a_fake_file, true, write}, ok},
- write({t_file, a_fake_file, true, write}, [])
- )},
- {"write empty binary to file", ?_assertMatch(
- {{t_file, a_fake_file, true, write}, ok},
- write({t_file, a_fake_file, true, write}, <<>>)
- )},
- {"write a list to file", ?_assertMatch(
- {{t_file, a_fake_file, true, write}, ok},
- write({t_file, a_fake_file, true, write}, "hallo world")
- )},
- {"write a binary to file", ?_assertMatch(
- {{t_file, a_fake_file, true, write}, ok},
- write({t_file, a_fake_file, true, write}, <<"hallo world">>)
- )},
- {"write a binary to file in read mode", ?_assertMatch(
- {_, {error, read_mode}},
- write({t_file, a_fake_file, true, read}, <<"hallo world">>)
- )},
- {"write a list to file in read mode", ?_assertMatch(
- {_, {error, read_mode}},
- write({t_file, a_fake_file, true, read}, "hallo world")
- )}
- ]
- }.
-
+ {setup,
+ fun() ->
+ meck:new(file, [unstick, passthrough]),
+ meck:expect(file, write, fun(_, _) -> ok end)
+ end,
+ fun(_) -> meck:unload(file) end, [
+ {"write empty list to file",
+ ?_assertMatch(
+ {{t_file, a_fake_file, true, write}, ok},
+ write({t_file, a_fake_file, true, write}, [])
+ )},
+ {"write empty binary to file",
+ ?_assertMatch(
+ {{t_file, a_fake_file, true, write}, ok},
+ write({t_file, a_fake_file, true, write}, <<>>)
+ )},
+ {"write a list to file",
+ ?_assertMatch(
+ {{t_file, a_fake_file, true, write}, ok},
+ write({t_file, a_fake_file, true, write}, "hallo world")
+ )},
+ {"write a binary to file",
+ ?_assertMatch(
+ {{t_file, a_fake_file, true, write}, ok},
+ write({t_file, a_fake_file, true, write}, <<"hallo world">>)
+ )},
+ {"write a binary to file in read mode",
+ ?_assertMatch(
+ {_, {error, read_mode}},
+ write({t_file, a_fake_file, true, read}, <<"hallo world">>)
+ )},
+ {"write a list to file in read mode",
+ ?_assertMatch(
+ {_, {error, read_mode}},
+ write({t_file, a_fake_file, true, read}, "hallo world")
+ )}
+ ]}.
flush(Transport) -> thrift_file_transport:flush(Transport).
flush_test_() ->
- {setup,
- fun() ->
- meck:new(file, [unstick, passthrough]),
- meck:expect(file, sync, fun(_File) -> ok end)
- end,
- fun(_) -> meck:unload(file) end,
- [
- {"flush file", ?_assertMatch(
- {{t_file, a_fake_file, true, write}, ok},
- flush({t_file, a_fake_file, true, write})
- )}
- ]
- }.
-
+ {setup,
+ fun() ->
+ meck:new(file, [unstick, passthrough]),
+ meck:expect(file, sync, fun(_File) -> ok end)
+ end,
+ fun(_) -> meck:unload(file) end, [
+ {"flush file",
+ ?_assertMatch(
+ {{t_file, a_fake_file, true, write}, ok},
+ flush({t_file, a_fake_file, true, write})
+ )}
+ ]}.
close(Transport) -> thrift_file_transport:close(Transport).
close_test_() ->
- {setup,
- fun() ->
- meck:new(file, [unstick, passthrough]),
- meck:expect(file, close, fun(_) -> ok end)
- end,
- fun(_) -> meck:unload(file) end,
- [
- {"close file", ?_assertMatch(
- {{t_file, a_fake_file, true, write}, ok},
- close({t_file, a_fake_file, true, write})
- )}
- ]
- }.
\ No newline at end of file
+ {setup,
+ fun() ->
+ meck:new(file, [unstick, passthrough]),
+ meck:expect(file, close, fun(_) -> ok end)
+ end,
+ fun(_) -> meck:unload(file) end, [
+ {"close file",
+ ?_assertMatch(
+ {{t_file, a_fake_file, true, write}, ok},
+ close({t_file, a_fake_file, true, write})
+ )}
+ ]}.
diff --git a/lib/erl/test/test_thrift_framed_transport.erl b/lib/erl/test/test_thrift_framed_transport.erl
index 8a538a5..b960920 100644
--- a/lib/erl/test/test_thrift_framed_transport.erl
+++ b/lib/erl/test/test_thrift_framed_transport.erl
@@ -20,385 +20,302 @@
-module(test_thrift_framed_transport).
-include_lib("eunit/include/eunit.hrl").
-
new(Transport) -> thrift_framed_transport:new(Transport).
new_test_() ->
- [
- {"new framed membuffer", ?_assertMatch(
- {ok, {t_transport, thrift_framed_transport, {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, []}},
- [],
- []
- }}},
- new({t_transport, thrift_membuffer_transport, {t_membuffer, []}})
- )}
- ].
-
+ [
+ {"new framed membuffer",
+ ?_assertMatch(
+ {ok,
+ {t_transport, thrift_framed_transport,
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, []}}, [],
+ []}}},
+ new({t_transport, thrift_membuffer_transport, {t_membuffer, []}})
+ )}
+ ].
read(Frame, Bytes) -> thrift_framed_transport:read(Frame, Bytes).
read_test_() ->
- [
- {"read zero bytes from an empty framed membuffer", ?_assertMatch(
- {
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- []
- },
- {ok, <<>>}
- },
- read(
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- []
- },
- 0
- )
- )},
- {"read 1 byte from an empty framed membuffer", ?_assertMatch(
- {_, {error, eof}},
- read(
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- []
- },
- 1
- )
- )},
- {"read zero bytes from nonempty framed membuffer", ?_assertMatch(
- {
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer,
- <<0, 0, 0, 11, "hallo world">>
- }},
- [],
- []
- },
- {ok, <<>>}
- },
- read(
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer,
- <<0, 0, 0, 11, "hallo world">>
- }},
- [],
- []
- },
- 0
- )
- )},
- {"read 1 byte from nonempty framed membuffer", ?_assertMatch(
- {
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- <<"allo world">>,
- []
- },
- {ok, <<"h">>}
- },
- read(
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer,
- <<0, 0, 0, 11, "hallo world">>
- }},
- [],
- []
- },
- 1
- )
- )},
- {"read 1 byte from nonempty buffer", ?_assertMatch(
- {
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- <<"allo world">>,
- []
- },
- {ok, <<"h">>}
- },
- read(
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- <<"hallo world">>,
- []
- },
- 1
- )
- )},
- {"read a zillion bytes from nonempty framed membuffer", ?_assertMatch(
- {
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- <<>>,
- []
- },
- {ok, <<"hallo world">>}
- },
- read(
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer,
- <<0, 0, 0, 11, "hallo world">>
- }},
- [],
- []
- },
- 65536
- )
- )}
- ].
-
+ [
+ {"read zero bytes from an empty framed membuffer",
+ ?_assertMatch(
+ {
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [],
+ []},
+ {ok, <<>>}
+ },
+ read(
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [],
+ []},
+ 0
+ )
+ )},
+ {"read 1 byte from an empty framed membuffer",
+ ?_assertMatch(
+ {_, {error, eof}},
+ read(
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [],
+ []},
+ 1
+ )
+ )},
+ {"read zero bytes from nonempty framed membuffer",
+ ?_assertMatch(
+ {
+ {t_framed,
+ {t_transport, thrift_membuffer_transport,
+ {t_membuffer, <<0, 0, 0, 11, "hallo world">>}},
+ [], []},
+ {ok, <<>>}
+ },
+ read(
+ {t_framed,
+ {t_transport, thrift_membuffer_transport,
+ {t_membuffer, <<0, 0, 0, 11, "hallo world">>}},
+ [], []},
+ 0
+ )
+ )},
+ {"read 1 byte from nonempty framed membuffer",
+ ?_assertMatch(
+ {
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ <<"allo world">>, []},
+ {ok, <<"h">>}
+ },
+ read(
+ {t_framed,
+ {t_transport, thrift_membuffer_transport,
+ {t_membuffer, <<0, 0, 0, 11, "hallo world">>}},
+ [], []},
+ 1
+ )
+ )},
+ {"read 1 byte from nonempty buffer",
+ ?_assertMatch(
+ {
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ <<"allo world">>, []},
+ {ok, <<"h">>}
+ },
+ read(
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ <<"hallo world">>, []},
+ 1
+ )
+ )},
+ {"read a zillion bytes from nonempty framed membuffer",
+ ?_assertMatch(
+ {
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, <<>>,
+ []},
+ {ok, <<"hallo world">>}
+ },
+ read(
+ {t_framed,
+ {t_transport, thrift_membuffer_transport,
+ {t_membuffer, <<0, 0, 0, 11, "hallo world">>}},
+ [], []},
+ 65536
+ )
+ )}
+ ].
read_exact(Frame, Bytes) -> thrift_framed_transport:read_exact(Frame, Bytes).
read_exact_test_() ->
- [
- {"read exactly zero bytes from an empty framed membuffer", ?_assertMatch(
- {
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- <<>>,
- []
- },
- {ok, <<>>}
- },
- read_exact(
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- []
- },
- 0
- )
- )},
- {"read exactly 1 byte from an empty framed membuffer", ?_assertMatch(
- {_, {error, eof}},
- read_exact(
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- []
- },
- 1
- )
- )},
- {"read exactly zero bytes from nonempty framed membuffer", ?_assertMatch(
- {
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer,
- <<0, 0, 0, 11, "hallo world">>
- }},
- <<>>,
- []
- },
- {ok, <<>>}
- },
- read_exact(
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer,
- <<0, 0, 0, 11, "hallo world">>
- }},
- [],
- []
- },
- 0
- )
- )},
- {"read exactly 1 byte from nonempty framed membuffer", ?_assertMatch(
- {
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- <<"allo world">>,
- []
- },
- {ok, <<"h">>}
- },
- read_exact(
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer,
- <<0, 0, 0, 11, "hallo world">>
- }},
- [],
- []
- },
- 1
- )
- )},
- {"read exactly 1 byte from nonempty buffer", ?_assertMatch(
- {
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- <<"allo world">>,
- []
- },
- {ok, <<"h">>}
- },
- read_exact(
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- <<"hallo world">>,
- []
- },
- 1
- )
- )},
- {"read exactly a zillion bytes from nonempty framed membuffer", ?_assertMatch(
- {
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [[],<<"hallo world">>],
- []
- },
- {error, eof}
- },
- read_exact(
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer,
- <<0, 0, 0, 11, "hallo world">>
- }},
- [],
- []
- },
- 65536
- )
- )}
- ].
-
+ [
+ {"read exactly zero bytes from an empty framed membuffer",
+ ?_assertMatch(
+ {
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, <<>>,
+ []},
+ {ok, <<>>}
+ },
+ read_exact(
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [],
+ []},
+ 0
+ )
+ )},
+ {"read exactly 1 byte from an empty framed membuffer",
+ ?_assertMatch(
+ {_, {error, eof}},
+ read_exact(
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [],
+ []},
+ 1
+ )
+ )},
+ {"read exactly zero bytes from nonempty framed membuffer",
+ ?_assertMatch(
+ {
+ {t_framed,
+ {t_transport, thrift_membuffer_transport,
+ {t_membuffer, <<0, 0, 0, 11, "hallo world">>}},
+ <<>>, []},
+ {ok, <<>>}
+ },
+ read_exact(
+ {t_framed,
+ {t_transport, thrift_membuffer_transport,
+ {t_membuffer, <<0, 0, 0, 11, "hallo world">>}},
+ [], []},
+ 0
+ )
+ )},
+ {"read exactly 1 byte from nonempty framed membuffer",
+ ?_assertMatch(
+ {
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ <<"allo world">>, []},
+ {ok, <<"h">>}
+ },
+ read_exact(
+ {t_framed,
+ {t_transport, thrift_membuffer_transport,
+ {t_membuffer, <<0, 0, 0, 11, "hallo world">>}},
+ [], []},
+ 1
+ )
+ )},
+ {"read exactly 1 byte from nonempty buffer",
+ ?_assertMatch(
+ {
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ <<"allo world">>, []},
+ {ok, <<"h">>}
+ },
+ read_exact(
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ <<"hallo world">>, []},
+ 1
+ )
+ )},
+ {"read exactly a zillion bytes from nonempty framed membuffer",
+ ?_assertMatch(
+ {
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
+ [[], <<"hallo world">>], []},
+ {error, eof}
+ },
+ read_exact(
+ {t_framed,
+ {t_transport, thrift_membuffer_transport,
+ {t_membuffer, <<0, 0, 0, 11, "hallo world">>}},
+ [], []},
+ 65536
+ )
+ )}
+ ].
write(Framed, Data) -> thrift_framed_transport:write(Framed, Data).
write_test_() ->
- [
- {"write empty list to empty framed membuffer", ?_assertMatch(
- {
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- [[], []]
- },
- ok
- },
- write(
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- []
- },
- []
- )
- )},
- {"write empty list to nonempty framed membuffer", ?_assertMatch(
- {
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- [["hallo world"], []]
- },
- ok
- },
- write(
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- ["hallo world"]
- },
- []
- )
- )},
- {"write empty binary to empty framed membuffer", ?_assertMatch(
- {
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- [[], <<>>]
- },
- ok
- },
- write(
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- []
- },
- <<>>
- )
- )},
- {"write empty binary to nonempty framed membuffer", ?_assertMatch(
- {
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- [["hallo world"], <<>>]
- },
- ok
- },
- write(
- {t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- ["hallo world"]
- },
- <<>>
- )
- )}
- ].
-
+ [
+ {"write empty list to empty framed membuffer",
+ ?_assertMatch(
+ {
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [], [
+ [], []
+ ]},
+ ok
+ },
+ write(
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [],
+ []},
+ []
+ )
+ )},
+ {"write empty list to nonempty framed membuffer",
+ ?_assertMatch(
+ {
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [], [
+ ["hallo world"], []
+ ]},
+ ok
+ },
+ write(
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [], [
+ "hallo world"
+ ]},
+ []
+ )
+ )},
+ {"write empty binary to empty framed membuffer",
+ ?_assertMatch(
+ {
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [], [
+ [], <<>>
+ ]},
+ ok
+ },
+ write(
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [],
+ []},
+ <<>>
+ )
+ )},
+ {"write empty binary to nonempty framed membuffer",
+ ?_assertMatch(
+ {
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [], [
+ ["hallo world"], <<>>
+ ]},
+ ok
+ },
+ write(
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [], [
+ "hallo world"
+ ]},
+ <<>>
+ )
+ )}
+ ].
flush(Transport) -> thrift_framed_transport:flush(Transport).
flush_test_() ->
- [
- {"flush empty framed membuffer", ?_assertMatch(
- {{t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- []
- },
- ok
- },
- flush({t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- []
- })
- )},
- {"flush nonempty framed membuffer", ?_assertMatch(
- {{t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer,
- [<<>>, [<<0, 0, 0, 11>>, <<"hallo world">>]]
- }},
- [],
- []
- },
- ok
- },
- flush({t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- <<"hallo world">>
- })
- )}
- ].
-
+ [
+ {"flush empty framed membuffer",
+ ?_assertMatch(
+ {
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [],
+ []},
+ ok
+ },
+ flush(
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [],
+ []}
+ )
+ )},
+ {"flush nonempty framed membuffer",
+ ?_assertMatch(
+ {
+ {t_framed,
+ {t_transport, thrift_membuffer_transport,
+ {t_membuffer, [<<>>, [<<0, 0, 0, 11>>, <<"hallo world">>]]}},
+ [], []},
+ ok
+ },
+ flush(
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [],
+ <<"hallo world">>}
+ )
+ )}
+ ].
close(Transport) -> thrift_framed_transport:close(Transport).
close_test_() ->
- {"close framed membuffer", ?_assertMatch(
- {{t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- []
- },
- ok
- },
- close({t_framed,
- {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}},
- [],
- []
- })
- )}.
-
+ {"close framed membuffer",
+ ?_assertMatch(
+ {
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [], []},
+ ok
+ },
+ close(
+ {t_framed, {t_transport, thrift_membuffer_transport, {t_membuffer, <<>>}}, [], []}
+ )
+ )}.
diff --git a/lib/erl/test/test_thrift_membuffer_transport.erl b/lib/erl/test/test_thrift_membuffer_transport.erl
index 9689c79..e388311 100644
--- a/lib/erl/test/test_thrift_membuffer_transport.erl
+++ b/lib/erl/test/test_thrift_membuffer_transport.erl
@@ -20,148 +20,168 @@
-module(test_thrift_membuffer_transport).
-include_lib("eunit/include/eunit.hrl").
-
new() -> thrift_membuffer_transport:new().
new(Data) -> thrift_membuffer_transport:new(Data).
new_test_() ->
- [
- {"new empty membuffer", ?_assertMatch(
- {ok, {_, _, {t_membuffer, []}}},
- new()
- )},
- {"new membuffer with <<>>", ?_assertMatch(
- {ok, {_, _, {t_membuffer, [<<>>]}}},
- new(<<>>)
- )},
- {"new membuffer with []", ?_assertMatch(
- {ok, {_, _, {t_membuffer, []}}},
- new([])
- )},
- {"new membuffer with <<\"hallo world\">>", ?_assertMatch(
- {ok, {_, _, {t_membuffer, [<<"hallo world">>]}}},
- new(<<"hallo world">>)
- )},
- {"new membuffer with \"hallo world\"", ?_assertMatch(
- {ok, {_, _, {t_membuffer, "hallo world"}}},
- new("hallo world")
- )}
- ].
-
+ [
+ {"new empty membuffer",
+ ?_assertMatch(
+ {ok, {_, _, {t_membuffer, []}}},
+ new()
+ )},
+ {"new membuffer with <<>>",
+ ?_assertMatch(
+ {ok, {_, _, {t_membuffer, [<<>>]}}},
+ new(<<>>)
+ )},
+ {"new membuffer with []",
+ ?_assertMatch(
+ {ok, {_, _, {t_membuffer, []}}},
+ new([])
+ )},
+ {"new membuffer with <<\"hallo world\">>",
+ ?_assertMatch(
+ {ok, {_, _, {t_membuffer, [<<"hallo world">>]}}},
+ new(<<"hallo world">>)
+ )},
+ {"new membuffer with \"hallo world\"",
+ ?_assertMatch(
+ {ok, {_, _, {t_membuffer, "hallo world"}}},
+ new("hallo world")
+ )}
+ ].
read(Membuffer, Bytes) -> thrift_membuffer_transport:read(Membuffer, Bytes).
read_test_() ->
- [
- {"read zero bytes from an empty membuffer", ?_assertMatch(
- {_, {ok, <<>>}},
- read({t_membuffer, []}, 0)
- )},
- {"read 1 byte from an empty membuffer", ?_assertMatch(
- {_, {ok, <<>>}},
- read({t_membuffer, []}, 1)
- )},
- {"read zero bytes from nonempty membuffer", ?_assertMatch(
- {{t_membuffer, <<"hallo world">>}, {ok, <<>>}},
- read({t_membuffer, [["hallo", " "], "world"]}, 0)
- )},
- {"read 1 byte from nonempty membuffer", ?_assertMatch(
- {{t_membuffer, <<"allo world">>}, {ok, <<"h">>}},
- read({t_membuffer, [["hallo", " "], "world"]}, 1)
- )},
- {"read a zillion bytes from nonempty buffer", ?_assertMatch(
- {{t_membuffer, <<>>}, {ok, <<"hallo world">>}},
- read({t_membuffer, [["hallo", " "], "world"]}, 65536)
- )}
- ].
-
+ [
+ {"read zero bytes from an empty membuffer",
+ ?_assertMatch(
+ {_, {ok, <<>>}},
+ read({t_membuffer, []}, 0)
+ )},
+ {"read 1 byte from an empty membuffer",
+ ?_assertMatch(
+ {_, {ok, <<>>}},
+ read({t_membuffer, []}, 1)
+ )},
+ {"read zero bytes from nonempty membuffer",
+ ?_assertMatch(
+ {{t_membuffer, <<"hallo world">>}, {ok, <<>>}},
+ read({t_membuffer, [["hallo", " "], "world"]}, 0)
+ )},
+ {"read 1 byte from nonempty membuffer",
+ ?_assertMatch(
+ {{t_membuffer, <<"allo world">>}, {ok, <<"h">>}},
+ read({t_membuffer, [["hallo", " "], "world"]}, 1)
+ )},
+ {"read a zillion bytes from nonempty buffer",
+ ?_assertMatch(
+ {{t_membuffer, <<>>}, {ok, <<"hallo world">>}},
+ read({t_membuffer, [["hallo", " "], "world"]}, 65536)
+ )}
+ ].
read_exact(Membuffer, Bytes) ->
- thrift_membuffer_transport:read_exact(Membuffer, Bytes).
+ thrift_membuffer_transport:read_exact(Membuffer, Bytes).
read_exact_test_() ->
- [
- {"read exactly zero bytes from an empty membuffer", ?_assertMatch(
- {_, {ok, <<>>}},
- read_exact({t_membuffer, []}, 0)
- )},
- {"read exactly 1 byte from an empty membuffer", ?_assertMatch(
- {_, {error, eof}},
- read_exact({t_membuffer, []}, 1)
- )},
- {"read exactly zero bytes from nonempty membuffer", ?_assertMatch(
- {{t_membuffer, <<"hallo world">>}, {ok, <<>>}},
- read_exact({t_membuffer, [["hallo", " "], "world"]}, 0)
- )},
- {"read exactly 1 byte from nonempty membuffer", ?_assertMatch(
- {{t_membuffer, <<"allo world">>}, {ok, <<"h">>}},
- read_exact({t_membuffer, [["hallo", " "], "world"]}, 1)
- )},
- {"read exactly a zillion bytes from nonempty buffer", ?_assertMatch(
- {{t_membuffer, [["hallo", " "], "world"]}, {error, eof}},
- read_exact({t_membuffer, [["hallo", " "], "world"]}, 65536)
- )}
- ].
-
+ [
+ {"read exactly zero bytes from an empty membuffer",
+ ?_assertMatch(
+ {_, {ok, <<>>}},
+ read_exact({t_membuffer, []}, 0)
+ )},
+ {"read exactly 1 byte from an empty membuffer",
+ ?_assertMatch(
+ {_, {error, eof}},
+ read_exact({t_membuffer, []}, 1)
+ )},
+ {"read exactly zero bytes from nonempty membuffer",
+ ?_assertMatch(
+ {{t_membuffer, <<"hallo world">>}, {ok, <<>>}},
+ read_exact({t_membuffer, [["hallo", " "], "world"]}, 0)
+ )},
+ {"read exactly 1 byte from nonempty membuffer",
+ ?_assertMatch(
+ {{t_membuffer, <<"allo world">>}, {ok, <<"h">>}},
+ read_exact({t_membuffer, [["hallo", " "], "world"]}, 1)
+ )},
+ {"read exactly a zillion bytes from nonempty buffer",
+ ?_assertMatch(
+ {{t_membuffer, [["hallo", " "], "world"]}, {error, eof}},
+ read_exact({t_membuffer, [["hallo", " "], "world"]}, 65536)
+ )}
+ ].
write(Membuffer, Data) -> thrift_membuffer_transport:write(Membuffer, Data).
write_test_() ->
- [
- {"write empty list to empty membuffer", ?_assertMatch(
- {{t_membuffer, [[], []]}, ok},
- write({t_membuffer, []}, [])
- )},
- {"write empty list to nonempty membuffer", ?_assertMatch(
- {{t_membuffer, ["hallo world", []]}, ok},
- write({t_membuffer, "hallo world"}, [])
- )},
- {"write empty binary to empty membuffer", ?_assertMatch(
- {{t_membuffer, [[], <<>>]}, ok},
- write({t_membuffer, []}, <<>>)
- )},
- {"write empty binary to nonempty membuffer", ?_assertMatch(
- {{t_membuffer, ["hallo world", <<>>]}, ok},
- write({t_membuffer, "hallo world"}, <<>>)
- )},
- {"write a list to empty membuffer", ?_assertMatch(
- {{t_membuffer, [[], "hallo world"]}, ok},
- write({t_membuffer, []}, "hallo world")
- )},
- {"write a list to nonempty membuffer", ?_assertMatch(
- {{t_membuffer, [["hallo", " "], "world"]}, ok},
- write({t_membuffer, ["hallo", " "]}, "world")
- )},
- {"write a binary to empty membuffer", ?_assertMatch(
- {{t_membuffer, [[], <<"hallo world">>]}, ok},
- write({t_membuffer, []}, <<"hallo world">>)
- )},
- {"write a binary to nonempty membuffer", ?_assertMatch(
- {{t_membuffer, [["hallo", " "], <<"world">>]}, ok},
- write({t_membuffer, ["hallo", " "]}, <<"world">>)
- )}
- ].
-
+ [
+ {"write empty list to empty membuffer",
+ ?_assertMatch(
+ {{t_membuffer, [[], []]}, ok},
+ write({t_membuffer, []}, [])
+ )},
+ {"write empty list to nonempty membuffer",
+ ?_assertMatch(
+ {{t_membuffer, ["hallo world", []]}, ok},
+ write({t_membuffer, "hallo world"}, [])
+ )},
+ {"write empty binary to empty membuffer",
+ ?_assertMatch(
+ {{t_membuffer, [[], <<>>]}, ok},
+ write({t_membuffer, []}, <<>>)
+ )},
+ {"write empty binary to nonempty membuffer",
+ ?_assertMatch(
+ {{t_membuffer, ["hallo world", <<>>]}, ok},
+ write({t_membuffer, "hallo world"}, <<>>)
+ )},
+ {"write a list to empty membuffer",
+ ?_assertMatch(
+ {{t_membuffer, [[], "hallo world"]}, ok},
+ write({t_membuffer, []}, "hallo world")
+ )},
+ {"write a list to nonempty membuffer",
+ ?_assertMatch(
+ {{t_membuffer, [["hallo", " "], "world"]}, ok},
+ write({t_membuffer, ["hallo", " "]}, "world")
+ )},
+ {"write a binary to empty membuffer",
+ ?_assertMatch(
+ {{t_membuffer, [[], <<"hallo world">>]}, ok},
+ write({t_membuffer, []}, <<"hallo world">>)
+ )},
+ {"write a binary to nonempty membuffer",
+ ?_assertMatch(
+ {{t_membuffer, [["hallo", " "], <<"world">>]}, ok},
+ write({t_membuffer, ["hallo", " "]}, <<"world">>)
+ )}
+ ].
flush(Transport) -> thrift_membuffer_transport:flush(Transport).
flush_test_() ->
- [
- {"flush empty membuffer", ?_assertMatch(
- {{t_membuffer, []}, ok},
- flush({t_membuffer, []})
- )},
- {"flush nonempty membuffer", ?_assertMatch(
- {{t_membuffer, [<<"hallo world">>]}, ok},
- flush({t_membuffer, [<<"hallo world">>]})
- )}
- ].
-
+ [
+ {"flush empty membuffer",
+ ?_assertMatch(
+ {{t_membuffer, []}, ok},
+ flush({t_membuffer, []})
+ )},
+ {"flush nonempty membuffer",
+ ?_assertMatch(
+ {{t_membuffer, [<<"hallo world">>]}, ok},
+ flush({t_membuffer, [<<"hallo world">>]})
+ )}
+ ].
close(Transport) -> thrift_membuffer_transport:close(Transport).
close_test_() ->
- {"close membuffer", ?_assertMatch(
- {{t_membuffer, _}, ok},
- close({t_membuffer, []})
- )}.
\ No newline at end of file
+ {"close membuffer",
+ ?_assertMatch(
+ {{t_membuffer, _}, ok},
+ close({t_membuffer, []})
+ )}.
diff --git a/lib/erl/test/test_thrift_socket_transport.erl b/lib/erl/test/test_thrift_socket_transport.erl
index 757c6d9..7e47314 100644
--- a/lib/erl/test/test_thrift_socket_transport.erl
+++ b/lib/erl/test/test_thrift_socket_transport.erl
@@ -20,185 +20,197 @@
-module(test_thrift_socket_transport).
-include_lib("eunit/include/eunit.hrl").
-
new(Socket) -> thrift_socket_transport:new(Socket).
new(Socket, Opts) -> thrift_socket_transport:new(Socket, Opts).
new_test_() ->
- [
- {"new socket", ?_assertMatch(
- {ok, {_, thrift_socket_transport, {t_socket, a_fake_socket, 60000, []}}},
- new(a_fake_socket)
- )},
- {"new socket with no options", ?_assertMatch(
- {ok, {_, thrift_socket_transport, {t_socket, a_fake_socket, 60000, []}}},
- new(a_fake_socket, [])
- )},
- {"new socket with integer timeout", ?_assertMatch(
- {ok, {_, thrift_socket_transport, {t_socket, a_fake_socket, 5000, []}}},
- new(a_fake_socket, [{recv_timeout, 5000}])
- )},
- {"new socket with infinity timeout", ?_assertMatch(
- {ok, {_, thrift_socket_transport, {t_socket, a_fake_socket, infinity, []}}},
- new(a_fake_socket, [{recv_timeout, infinity}])
- )}
- ].
-
+ [
+ {"new socket",
+ ?_assertMatch(
+ {ok, {_, thrift_socket_transport, {t_socket, a_fake_socket, 60000, []}}},
+ new(a_fake_socket)
+ )},
+ {"new socket with no options",
+ ?_assertMatch(
+ {ok, {_, thrift_socket_transport, {t_socket, a_fake_socket, 60000, []}}},
+ new(a_fake_socket, [])
+ )},
+ {"new socket with integer timeout",
+ ?_assertMatch(
+ {ok, {_, thrift_socket_transport, {t_socket, a_fake_socket, 5000, []}}},
+ new(a_fake_socket, [{recv_timeout, 5000}])
+ )},
+ {"new socket with infinity timeout",
+ ?_assertMatch(
+ {ok, {_, thrift_socket_transport, {t_socket, a_fake_socket, infinity, []}}},
+ new(a_fake_socket, [{recv_timeout, infinity}])
+ )}
+ ].
read(Socket, Bytes) -> thrift_socket_transport:read(Socket, Bytes).
read_test_() ->
- {setup,
- fun() ->
- meck:new(gen_tcp, [unstick, passthrough]),
- meck:expect(gen_tcp, recv, fun(Bin, 0, _) ->
- case Bin of
- <<"empty">> -> {error, timeout};
- _ -> {ok, Bin}
- end end),
- meck:expect(gen_tcp, close, fun(_) -> ok end)
- end,
- fun(_) -> meck:unload(gen_tcp) end,
- [
- {"read zero bytes from empty socket", ?_assertMatch(
- {_, {ok, <<>>}},
- read({t_socket, <<>>, 60000, []}, 0)
- )},
- {"read 1 byte from empty socket", ?_assertMatch(
- {_, {error, timeout}},
- read({t_socket, <<"empty">>, 60000, []}, 1)
- )},
- {"read zero bytes from nonempty socket", ?_assertMatch(
- {{t_socket, _, _, _}, {ok, <<>>}},
- read({t_socket, <<"hallo world">>, 60000, []}, 0)
- )},
- {"read 1 byte from nonempty socket", ?_assertMatch(
- {{t_socket, _, _, <<"allo world">>}, {ok, <<"h">>}},
- read({t_socket, <<"hallo world">>, 60000, []}, 1)
- )},
- {"read a zillion bytes from nonempty socket", ?_assertMatch(
- {{t_socket, _, _, <<"ld">>}, {ok, <<"hallo world world world world wor">>}},
- read({t_socket, <<"hallo world world world world world">>, 60000, []}, 33)
- )},
- {"read 1 byte from previously buffered socket", ?_assertMatch(
- {{t_socket, _, _, <<"allo">>}, {ok, <<"h">>}},
- read({t_socket, <<" world">>, 60000, <<"hallo">>}, 1)
- )},
- {"read 6 byte from previously buffered socket", ?_assertMatch(
- {{t_socket, _, _, <<"world">>}, {ok, <<"hallo ">>}},
- read({t_socket, <<" world">>, 60000, <<"hallo">>}, 6)
- )},
- {"read a zillion bytes from previously buffered socket", ?_assertMatch(
- {{t_socket, _, _, <<"ld">>}, {ok, <<"hallo world world world world wor">>}},
- read({t_socket, <<" world">>, 60000, <<"hallo">>}, 33)
- )}
- ]
- }.
-
+ {setup,
+ fun() ->
+ meck:new(gen_tcp, [unstick, passthrough]),
+ meck:expect(gen_tcp, recv, fun(Bin, 0, _) ->
+ case Bin of
+ <<"empty">> -> {error, timeout};
+ _ -> {ok, Bin}
+ end
+ end),
+ meck:expect(gen_tcp, close, fun(_) -> ok end)
+ end,
+ fun(_) -> meck:unload(gen_tcp) end, [
+ {"read zero bytes from empty socket",
+ ?_assertMatch(
+ {_, {ok, <<>>}},
+ read({t_socket, <<>>, 60000, []}, 0)
+ )},
+ {"read 1 byte from empty socket",
+ ?_assertMatch(
+ {_, {error, timeout}},
+ read({t_socket, <<"empty">>, 60000, []}, 1)
+ )},
+ {"read zero bytes from nonempty socket",
+ ?_assertMatch(
+ {{t_socket, _, _, _}, {ok, <<>>}},
+ read({t_socket, <<"hallo world">>, 60000, []}, 0)
+ )},
+ {"read 1 byte from nonempty socket",
+ ?_assertMatch(
+ {{t_socket, _, _, <<"allo world">>}, {ok, <<"h">>}},
+ read({t_socket, <<"hallo world">>, 60000, []}, 1)
+ )},
+ {"read a zillion bytes from nonempty socket",
+ ?_assertMatch(
+ {{t_socket, _, _, <<"ld">>}, {ok, <<"hallo world world world world wor">>}},
+ read({t_socket, <<"hallo world world world world world">>, 60000, []}, 33)
+ )},
+ {"read 1 byte from previously buffered socket",
+ ?_assertMatch(
+ {{t_socket, _, _, <<"allo">>}, {ok, <<"h">>}},
+ read({t_socket, <<" world">>, 60000, <<"hallo">>}, 1)
+ )},
+ {"read 6 byte from previously buffered socket",
+ ?_assertMatch(
+ {{t_socket, _, _, <<"world">>}, {ok, <<"hallo ">>}},
+ read({t_socket, <<" world">>, 60000, <<"hallo">>}, 6)
+ )},
+ {"read a zillion bytes from previously buffered socket",
+ ?_assertMatch(
+ {{t_socket, _, _, <<"ld">>}, {ok, <<"hallo world world world world wor">>}},
+ read({t_socket, <<" world">>, 60000, <<"hallo">>}, 33)
+ )}
+ ]}.
read_exact(Socket, Bytes) -> thrift_socket_transport:read_exact(Socket, Bytes).
read_exact_test_() ->
- {setup,
- fun() ->
- meck:new(gen_tcp, [unstick, passthrough]),
- meck:expect(gen_tcp, recv, fun(Bin, N, _) ->
- case N of
- 0 -> {ok, Bin};
- 1 -> {ok, <<"h">>};
- N when N > 2 -> {error, timeout}
- end
- end),
- meck:expect(gen_tcp, close, fun(_) -> ok end)
- end,
- fun(_) -> meck:unload(gen_tcp) end,
- [
- {"read_exact zero bytes from empty socket", ?_assertMatch(
- {_, {ok, <<>>}},
- read_exact({t_socket, <<>>, 60000, []}, 0)
- )},
- {"read_exact zero bytes from nonempty socket", ?_assertMatch(
- {{t_socket, _, _, _}, {ok, <<>>}},
- read_exact({t_socket, <<"hallo world">>, 60000, []}, 0)
- )},
- {"read_exact 1 byte from nonempty socket", ?_assertMatch(
- {{t_socket, _, _, []}, {ok, <<"h">>}},
- read_exact({t_socket, <<"hallo world">>, 60000, []}, 1)
- )},
- {"read_exact a zillion bytes from nonempty socket", ?_assertMatch(
- {{t_socket, _, _, []}, {error, timeout}},
- read_exact({t_socket, <<"hallo world">>, 60000, []}, 65536)
- )},
- {"read_exact 1 byte from previously buffered socket", ?_assertMatch(
- {{t_socket, _, _, <<"allo">>}, {ok, <<"h">>}},
- read_exact({t_socket, <<" world">>, 60000, <<"hallo">>}, 1)
- )},
- {"read_exact 6 byte from previously buffered socket", ?_assertMatch(
- {{t_socket, _, _, []}, {ok, <<"more h">>}},
- read_exact({t_socket, <<"hallo">>, 60000, <<"more ">>}, 6)
- )},
- {"read_exact a zillion bytes from previously buffered socket", ?_assertMatch(
- {{t_socket, _, _, <<"hallo">>}, {error, timeout}},
- read_exact({t_socket, <<" world">>, 60000, <<"hallo">>}, 65536)
- )}
- ]
- }.
-
+ {setup,
+ fun() ->
+ meck:new(gen_tcp, [unstick, passthrough]),
+ meck:expect(gen_tcp, recv, fun(Bin, N, _) ->
+ case N of
+ 0 -> {ok, Bin};
+ 1 -> {ok, <<"h">>};
+ N when N > 2 -> {error, timeout}
+ end
+ end),
+ meck:expect(gen_tcp, close, fun(_) -> ok end)
+ end,
+ fun(_) -> meck:unload(gen_tcp) end, [
+ {"read_exact zero bytes from empty socket",
+ ?_assertMatch(
+ {_, {ok, <<>>}},
+ read_exact({t_socket, <<>>, 60000, []}, 0)
+ )},
+ {"read_exact zero bytes from nonempty socket",
+ ?_assertMatch(
+ {{t_socket, _, _, _}, {ok, <<>>}},
+ read_exact({t_socket, <<"hallo world">>, 60000, []}, 0)
+ )},
+ {"read_exact 1 byte from nonempty socket",
+ ?_assertMatch(
+ {{t_socket, _, _, []}, {ok, <<"h">>}},
+ read_exact({t_socket, <<"hallo world">>, 60000, []}, 1)
+ )},
+ {"read_exact a zillion bytes from nonempty socket",
+ ?_assertMatch(
+ {{t_socket, _, _, []}, {error, timeout}},
+ read_exact({t_socket, <<"hallo world">>, 60000, []}, 65536)
+ )},
+ {"read_exact 1 byte from previously buffered socket",
+ ?_assertMatch(
+ {{t_socket, _, _, <<"allo">>}, {ok, <<"h">>}},
+ read_exact({t_socket, <<" world">>, 60000, <<"hallo">>}, 1)
+ )},
+ {"read_exact 6 byte from previously buffered socket",
+ ?_assertMatch(
+ {{t_socket, _, _, []}, {ok, <<"more h">>}},
+ read_exact({t_socket, <<"hallo">>, 60000, <<"more ">>}, 6)
+ )},
+ {"read_exact a zillion bytes from previously buffered socket",
+ ?_assertMatch(
+ {{t_socket, _, _, <<"hallo">>}, {error, timeout}},
+ read_exact({t_socket, <<" world">>, 60000, <<"hallo">>}, 65536)
+ )}
+ ]}.
write(Socket, Data) -> thrift_socket_transport:write(Socket, Data).
write_test_() ->
- {setup,
- fun() ->
- meck:new(gen_tcp, [unstick, passthrough]),
- meck:expect(gen_tcp, send, fun(_, _) -> ok end)
- end,
- fun(_) -> meck:unload(gen_tcp) end,
- [
- {"write empty list to socket", ?_assertMatch(
- {{t_socket, a_fake_socket, 60000, []}, ok},
- write({t_socket, a_fake_socket, 60000, []}, [])
- )},
- {"write empty binary to socket", ?_assertMatch(
- {{t_socket, a_fake_socket, 60000, []}, ok},
- write({t_socket, a_fake_socket, 60000, []}, <<>>)
- )},
- {"write a list to socket", ?_assertMatch(
- {{t_socket, a_fake_socket, 60000, []}, ok},
- write({t_socket, a_fake_socket, 60000, []}, "hallo world")
- )},
- {"write a binary to socket", ?_assertMatch(
- {{t_socket, a_fake_socket, 60000, []}, ok},
- write({t_socket, a_fake_socket, 60000, []}, <<"hallo world">>)
- )}
- ]
- }.
-
+ {setup,
+ fun() ->
+ meck:new(gen_tcp, [unstick, passthrough]),
+ meck:expect(gen_tcp, send, fun(_, _) -> ok end)
+ end,
+ fun(_) -> meck:unload(gen_tcp) end, [
+ {"write empty list to socket",
+ ?_assertMatch(
+ {{t_socket, a_fake_socket, 60000, []}, ok},
+ write({t_socket, a_fake_socket, 60000, []}, [])
+ )},
+ {"write empty binary to socket",
+ ?_assertMatch(
+ {{t_socket, a_fake_socket, 60000, []}, ok},
+ write({t_socket, a_fake_socket, 60000, []}, <<>>)
+ )},
+ {"write a list to socket",
+ ?_assertMatch(
+ {{t_socket, a_fake_socket, 60000, []}, ok},
+ write({t_socket, a_fake_socket, 60000, []}, "hallo world")
+ )},
+ {"write a binary to socket",
+ ?_assertMatch(
+ {{t_socket, a_fake_socket, 60000, []}, ok},
+ write({t_socket, a_fake_socket, 60000, []}, <<"hallo world">>)
+ )}
+ ]}.
flush(Transport) -> thrift_socket_transport:flush(Transport).
flush_test_() ->
- [
- {"flush socket", ?_assertMatch(
- {{t_socket, a_fake_socket, 60000, []}, ok},
- flush({t_socket, a_fake_socket, 60000, []})
- )}
- ].
-
+ [
+ {"flush socket",
+ ?_assertMatch(
+ {{t_socket, a_fake_socket, 60000, []}, ok},
+ flush({t_socket, a_fake_socket, 60000, []})
+ )}
+ ].
close(Transport) -> thrift_socket_transport:close(Transport).
close_test_() ->
- {setup,
- fun() ->
- meck:new(gen_tcp, [unstick, passthrough]),
- meck:expect(gen_tcp, close, fun(_) -> ok end)
- end,
- fun(_) -> meck:unload(gen_tcp) end,
- [
- {"close membuffer", ?_assertMatch(
- {{t_socket, a_fake_socket, 60000, []}, ok},
- close({t_socket, a_fake_socket, 60000, []})
- )}
- ]
- }.
+ {setup,
+ fun() ->
+ meck:new(gen_tcp, [unstick, passthrough]),
+ meck:expect(gen_tcp, close, fun(_) -> ok end)
+ end,
+ fun(_) -> meck:unload(gen_tcp) end, [
+ {"close membuffer",
+ ?_assertMatch(
+ {{t_socket, a_fake_socket, 60000, []}, ok},
+ close({t_socket, a_fake_socket, 60000, []})
+ )}
+ ]}.
diff --git a/lib/erl/test/thrift_socket_server_test.erl b/lib/erl/test/thrift_socket_server_test.erl
index 0818b84..0330198 100644
--- a/lib/erl/test/thrift_socket_server_test.erl
+++ b/lib/erl/test/thrift_socket_server_test.erl
@@ -1,49 +1,133 @@
--module (thrift_socket_server_test).
+%%
+%% Licensed to the Apache Software Foundation (ASF) under one
+%% or more contributor license agreements. See the NOTICE file
+%% distributed with this work for additional information
+%% regarding copyright ownership. The ASF licenses this file
+%% to you under the Apache License, Version 2.0 (the
+%% "License"); you may not use this file except in compliance
+%% with the License. You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing,
+%% software distributed under the License is distributed on an
+%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+%% KIND, either express or implied. See the License for the
+%% specific language governing permissions and limitations
+%% under the License.
+%%
+
+-module(thrift_socket_server_test).
-include_lib("eunit/include/eunit.hrl").
--include ("thrift_constants.hrl").
+-include("thrift_constants.hrl").
parse_handler_options_test_() ->
- CorrectServiceHandlerOptionList = [{?MULTIPLEXED_ERROR_HANDLER_KEY, ?MODULE}, {"Service1", ?MODULE}, {"Service2", ?MODULE}],
- MissingErrorHandlerOptionList = [{"Service1", ?MODULE}, {"Service2", ?MODULE}],
- WrongService2HandlerOptionList = [{?MULTIPLEXED_ERROR_HANDLER_KEY, ?MODULE}, {"Service1", ?MODULE}, {"Service2", "Module"}],
- WrongServiceKeyOptionList = [{?MULTIPLEXED_ERROR_HANDLER_KEY, ?MODULE}, {'service1', ?MODULE}, {"Service2", ?MODULE}],
+ CorrectServiceHandlerOptionList = [
+ {?MULTIPLEXED_ERROR_HANDLER_KEY, ?MODULE}, {"Service1", ?MODULE}, {"Service2", ?MODULE}
+ ],
+ MissingErrorHandlerOptionList = [{"Service1", ?MODULE}, {"Service2", ?MODULE}],
+ WrongService2HandlerOptionList = [
+ {?MULTIPLEXED_ERROR_HANDLER_KEY, ?MODULE}, {"Service1", ?MODULE}, {"Service2", "Module"}
+ ],
+ WrongServiceKeyOptionList = [
+ {?MULTIPLEXED_ERROR_HANDLER_KEY, ?MODULE}, {'service1', ?MODULE}, {"Service2", ?MODULE}
+ ],
CorrectHandlerTestFunction = fun() ->
- ?assertMatch({thrift_socket_server,_,_,_,_,_,_,_,_,_,_,_,_,_}, thrift_socket_server:parse_options([{handler, CorrectServiceHandlerOptionList}])),
- {thrift_socket_server,_,_, HandlerList,_,_,_,_,_,_,_,_,_,_} = thrift_socket_server:parse_options([{handler, CorrectServiceHandlerOptionList}]),
- lists:foreach(fun
- ({ServiceName, HandlerModule}) ->
- ?assertMatch({ok, HandlerModule} when is_atom(HandlerModule), thrift_multiplexed_map_wrapper:find(ServiceName, HandlerList))
- end, CorrectServiceHandlerOptionList)
+ ?assertMatch(
+ #{},
+ thrift_socket_server:parse_options([{handler, CorrectServiceHandlerOptionList}])
+ ),
+ #{handler := HandlerList} = thrift_socket_server:parse_options(
+ [
+ {handler, CorrectServiceHandlerOptionList}
+ ]
+ ),
+ lists:foreach(
+ fun({ServiceName, HandlerModule}) ->
+ ?assertMatch(
+ {ok, HandlerModule} when is_atom(HandlerModule),
+ thrift_multiplexed_map_wrapper:find(ServiceName, HandlerList)
+ )
+ end,
+ CorrectServiceHandlerOptionList
+ )
end,
[
- {"Bad argument for the handler option", ?_assertThrow(_, thrift_socket_server:parse_options([{handler, []}]))},
- {"Try to parse the handler option twice", ?_assertThrow(_, thrift_socket_server:parse_options([{handler, ?MODULE}, {handler, CorrectServiceHandlerOptionList}]))},
- {"Parse the handler option as a non multiplexed service handler", ?_assertMatch({thrift_socket_server,_,_,?MODULE,_,_,_,_,_,_,_,_,_,_}, thrift_socket_server:parse_options([{handler, ?MODULE}]))},
- {"No error handler was defined", ?_assertThrow(_, thrift_socket_server:parse_options([{handler, MissingErrorHandlerOptionList}]))},
- {"Bad handler module for Service2", ?_assertThrow(_, thrift_socket_server:parse_options([{handler, WrongService2HandlerOptionList}]))},
- {"Bad service key for Service1", ?_assertThrow(_, thrift_socket_server:parse_options([{handler, WrongServiceKeyOptionList}]))},
- {"Try to parse a correct handler option list", CorrectHandlerTestFunction}
+ {"Bad argument for the handler option",
+ ?_assertThrow(_, thrift_socket_server:parse_options([{handler, []}]))},
+ {"Try to parse the handler option twice",
+ ?_assertThrow(
+ _,
+ thrift_socket_server:parse_options([
+ {handler, ?MODULE}, {handler, CorrectServiceHandlerOptionList}
+ ])
+ )},
+ {"Parse the handler option as a non multiplexed service handler",
+ ?_assertMatch(
+ #{handler := ?MODULE},
+ thrift_socket_server:parse_options([{handler, ?MODULE}])
+ )},
+ {"No error handler was defined",
+ ?_assertThrow(
+ _, thrift_socket_server:parse_options([{handler, MissingErrorHandlerOptionList}])
+ )},
+ {"Bad handler module for Service2",
+ ?_assertThrow(
+ _, thrift_socket_server:parse_options([{handler, WrongService2HandlerOptionList}])
+ )},
+ {"Bad service key for Service1",
+ ?_assertThrow(
+ _, thrift_socket_server:parse_options([{handler, WrongServiceKeyOptionList}])
+ )},
+ {"Try to parse a correct handler option list", CorrectHandlerTestFunction}
].
parse_service_options_test_() ->
CorrectServiceModuleOptionList = [{"Service1", ?MODULE}, {"Service2", ?MODULE}],
- WrongService2ModuleOptionList = [{"Service1", ?MODULE}, {"Service2", "thrift_service_module"}],
- WrongServiceKeyOptionList = [{'service1', ?MODULE}, {"Service2", ?MODULE}],
+ WrongService2ModuleOptionList = [{"Service1", ?MODULE}, {"Service2", "thrift_service_module"}],
+ WrongServiceKeyOptionList = [{'service1', ?MODULE}, {"Service2", ?MODULE}],
CorrectServiceModuleTestFunction = fun() ->
- ?assertMatch({thrift_socket_server,_,_,_,_,_,_,_,_,_,_,_,_,_}, thrift_socket_server:parse_options([{service, CorrectServiceModuleOptionList}])),
- {thrift_socket_server,_, ServiceModuleList,_,_,_,_,_,_,_,_,_,_,_} = thrift_socket_server:parse_options([{service, CorrectServiceModuleOptionList}]),
- lists:foreach(fun
- ({ServiceName, ServiceModule}) ->
- ?assertMatch({ok, ServiceModule} when is_atom(ServiceModule), thrift_multiplexed_map_wrapper:find(ServiceName, ServiceModuleList))
- end, CorrectServiceModuleOptionList)
+ ?assertMatch(
+ #{},
+ thrift_socket_server:parse_options([{service, CorrectServiceModuleOptionList}])
+ ),
+ #{service := ServiceModuleList} = thrift_socket_server:parse_options(
+ [{service, CorrectServiceModuleOptionList}]
+ ),
+ lists:foreach(
+ fun({ServiceName, ServiceModule}) ->
+ ?assertMatch(
+ {ok, ServiceModule} when is_atom(ServiceModule),
+ thrift_multiplexed_map_wrapper:find(ServiceName, ServiceModuleList)
+ )
+ end,
+ CorrectServiceModuleOptionList
+ )
end,
[
- {"Bad argument for the service option", ?_assertThrow(_, thrift_socket_server:parse_options([{service, []}]))},
- {"Try to parse the service option twice", ?_assertThrow(_, thrift_socket_server:parse_options([{service, ?MODULE}, {service, CorrectServiceModuleOptionList}]))},
- {"Parse a service module for a non multiplexed service", ?_assertMatch({thrift_socket_server,_,?MODULE,_,_,_,_,_,_,_,_,_,_,_}, thrift_socket_server:parse_options([{service, ?MODULE}]))},
- {"Bad service module for Service2", ?_assertThrow(_, thrift_socket_server:parse_options([{service, WrongService2ModuleOptionList}]))},
- {"Bad service key for Service1", ?_assertThrow(_, thrift_socket_server:parse_options([{service, WrongServiceKeyOptionList}]))},
- {"Try to parse a correct service option list", CorrectServiceModuleTestFunction}
+ {"Bad argument for the service option",
+ ?_assertThrow(_, thrift_socket_server:parse_options([{service, []}]))},
+ {"Try to parse the service option twice",
+ ?_assertThrow(
+ _,
+ thrift_socket_server:parse_options([
+ {service, ?MODULE}, {service, CorrectServiceModuleOptionList}
+ ])
+ )},
+ {"Parse a service module for a non multiplexed service",
+ ?_assertMatch(
+ #{service := ?MODULE},
+ thrift_socket_server:parse_options([{service, ?MODULE}])
+ )},
+ {"Bad service module for Service2",
+ ?_assertThrow(
+ _, thrift_socket_server:parse_options([{service, WrongService2ModuleOptionList}])
+ )},
+ {"Bad service key for Service1",
+ ?_assertThrow(
+ _, thrift_socket_server:parse_options([{service, WrongServiceKeyOptionList}])
+ )},
+ {"Try to parse a correct service option list", CorrectServiceModuleTestFunction}
].
diff --git a/lib/erl/test/thrift_test_test.erl b/lib/erl/test/thrift_test_test.erl
index 77df61d..f86627b 100644
--- a/lib/erl/test/thrift_test_test.erl
+++ b/lib/erl/test/thrift_test_test.erl
@@ -19,625 +19,768 @@
% don't rename this thrift_test, it clobbers generated files
-module(thrift_test_test).
--compile(export_all).
-include_lib("eunit/include/eunit.hrl").
-include("gen-erl/thrift_test_constants.hrl").
constant_test_() ->
- [
- {"myNumberz equals 1", ?_assertEqual(1, ?THRIFT_TEST_MYNUMBERZ)}
- ].
+ [
+ {"myNumberz equals 1", ?_assertEqual(1, ?THRIFT_TEST_MYNUMBERZ)}
+ ].
record_generation_test_() ->
- [
- {"Bonk record", ?_assertMatch(
- {'thrift.test.Bonk', _, _},
- #'thrift.test.Bonk'{message=null,type=null}
- )},
- {"Bools record", ?_assertMatch(
- {'thrift.test.Bools', _, _},
- #'thrift.test.Bools'{im_true=null,im_false=null}
- )},
- {"Xtruct record", ?_assertMatch(
- {'thrift.test.Xtruct', _, _, _, _},
- #'thrift.test.Xtruct'{string_thing=null,byte_thing=null,i32_thing=null,i64_thing=null}
- )},
- {"Xtruct2 record", ?_assertMatch(
- {'thrift.test.Xtruct2', _, _, _},
- #'thrift.test.Xtruct2'{byte_thing=null,struct_thing=null,i32_thing=null}
- )},
- {"Xtruct3 record", ?_assertMatch(
- {'thrift.test.Xtruct3', _, _, _, _},
- #'thrift.test.Xtruct3'{string_thing=null,changed=null,i32_thing=null,i64_thing=null}
- )},
- {"Insanity record", ?_assertMatch(
- {'thrift.test.Insanity', _, _},
- #'thrift.test.Insanity'{userMap=null,xtructs=null}
- )},
- {"CrazyNesting record", ?_assertMatch(
- {'thrift.test.CrazyNesting', _, _, _, _},
- #'thrift.test.CrazyNesting'{
- string_field=null,
- set_field=null,
- list_field=null,
- binary_field=null
- }
- )},
- {"Xception record", ?_assertMatch(
- {'thrift.test.Xception', _, _},
- #'thrift.test.Xception'{errorCode=null,message=null}
- )},
- {"Xception2 record", ?_assertMatch(
- {'thrift.test.Xception2', _, _},
- #'thrift.test.Xception2'{errorCode=null,struct_thing=null}
- )},
- {"EmptyStruct record", ?_assertMatch({'thrift.test.EmptyStruct'}, #'thrift.test.EmptyStruct'{})},
- {"OneField record", ?_assertMatch({'thrift.test.OneField', _}, #'thrift.test.OneField'{field=null})},
- {"VersioningTestV1 record", ?_assertMatch(
- {'thrift.test.VersioningTestV1', _, _, _},
- #'thrift.test.VersioningTestV1'{begin_in_both=null,old_string=null,end_in_both=null}
- )},
- {"VersioningTestV2 record", ?_assertMatch(
- {'thrift.test.VersioningTestV2', _, _, _, _, _, _, _, _, _, _, _, _},
- #'thrift.test.VersioningTestV2'{
- begin_in_both=null,
- newint=null,
- newbyte=null,
- newshort=null,
- newlong=null,
- newdouble=null,
- newstruct=null,
- newlist=null,
- newset=null,
- newmap=null,
- newstring=null,
- end_in_both=null
- }
- )},
- {"ListTypeVersioningV1 record", ?_assertMatch(
- {'thrift.test.ListTypeVersioningV1', _, _},
- #'thrift.test.ListTypeVersioningV1'{myints=null,hello=null}
- )},
- {"ListTypeVersioningV2 record", ?_assertMatch(
- {'thrift.test.ListTypeVersioningV2', _, _},
- #'thrift.test.ListTypeVersioningV2'{strings=null,hello=null}
- )},
- {"GuessProtocolStruct record", ?_assertMatch(
- {'thrift.test.GuessProtocolStruct', _},
- #'thrift.test.GuessProtocolStruct'{map_field=null}
- )},
- {"LargeDeltas record", ?_assertMatch(
- {'thrift.test.LargeDeltas', _, _, _, _, _, _, _, _, _, _},
- #'thrift.test.LargeDeltas'{
- b1=null,
- b10=null,
- b100=null,
- check_true=null,
- b1000=null,
- check_false=null,
- vertwo2000=null,
- a_set2500=null,
- vertwo3000=null,
- big_numbers=null
- }
- )},
- {"NestedListsI32x2 record", ?_assertMatch(
- {'thrift.test.NestedListsI32x2', _},
- #'thrift.test.NestedListsI32x2'{integerlist=null}
- )},
- {"NestedListsI32x3 record", ?_assertMatch(
- {'thrift.test.NestedListsI32x3', _},
- #'thrift.test.NestedListsI32x3'{integerlist=null}
- )},
- {"NestedMixedx2 record", ?_assertMatch(
- {'thrift.test.NestedMixedx2', _, _, _},
- #'thrift.test.NestedMixedx2'{
- int_set_list=null,
- map_int_strset=null,
- map_int_strset_list=null
- }
- )},
- {"ListBonks record", ?_assertMatch({'thrift.test.ListBonks', _}, #'thrift.test.ListBonks'{bonk=null})},
- {"NestedListsBonk record", ?_assertMatch(
- {'thrift.test.NestedListsBonk', _},
- #'thrift.test.NestedListsBonk'{bonk=null}
- )},
- {"BoolTest record", ?_assertMatch(
- {'thrift.test.BoolTest', _, _},
- #'thrift.test.BoolTest'{b=null,s=null}
- )},
- {"StructA record", ?_assertMatch({'thrift.test.StructA', _}, #'thrift.test.StructA'{s=null})},
- {"StructB record", ?_assertMatch(
- {'thrift.test.StructB', _, _},
- #'thrift.test.StructB'{aa=null,ab=null}
- )}
- ].
+ [
+ {"Bonk record",
+ ?_assertMatch(
+ {'thrift.test.Bonk', _, _},
+ #'thrift.test.Bonk'{message = null, type = null}
+ )},
+ {"Bools record",
+ ?_assertMatch(
+ {'thrift.test.Bools', _, _},
+ #'thrift.test.Bools'{im_true = null, im_false = null}
+ )},
+ {"Xtruct record",
+ ?_assertMatch(
+ {'thrift.test.Xtruct', _, _, _, _},
+ #'thrift.test.Xtruct'{
+ string_thing = null, byte_thing = null, i32_thing = null, i64_thing = null
+ }
+ )},
+ {"Xtruct2 record",
+ ?_assertMatch(
+ {'thrift.test.Xtruct2', _, _, _},
+ #'thrift.test.Xtruct2'{byte_thing = null, struct_thing = null, i32_thing = null}
+ )},
+ {"Xtruct3 record",
+ ?_assertMatch(
+ {'thrift.test.Xtruct3', _, _, _, _},
+ #'thrift.test.Xtruct3'{
+ string_thing = null, changed = null, i32_thing = null, i64_thing = null
+ }
+ )},
+ {"Insanity record",
+ ?_assertMatch(
+ {'thrift.test.Insanity', _, _},
+ #'thrift.test.Insanity'{userMap = null, xtructs = null}
+ )},
+ {"CrazyNesting record",
+ ?_assertMatch(
+ {'thrift.test.CrazyNesting', _, _, _, _},
+ #'thrift.test.CrazyNesting'{
+ string_field = null,
+ set_field = null,
+ list_field = null,
+ binary_field = null
+ }
+ )},
+ {"Xception record",
+ ?_assertMatch(
+ {'thrift.test.Xception', _, _},
+ #'thrift.test.Xception'{errorCode = null, message = null}
+ )},
+ {"Xception2 record",
+ ?_assertMatch(
+ {'thrift.test.Xception2', _, _},
+ #'thrift.test.Xception2'{errorCode = null, struct_thing = null}
+ )},
+ {"EmptyStruct record",
+ ?_assertMatch({'thrift.test.EmptyStruct'}, #'thrift.test.EmptyStruct'{})},
+ {"OneField record",
+ ?_assertMatch({'thrift.test.OneField', _}, #'thrift.test.OneField'{field = null})},
+ {"VersioningTestV1 record",
+ ?_assertMatch(
+ {'thrift.test.VersioningTestV1', _, _, _},
+ #'thrift.test.VersioningTestV1'{
+ begin_in_both = null, old_string = null, end_in_both = null
+ }
+ )},
+ {"VersioningTestV2 record",
+ ?_assertMatch(
+ {'thrift.test.VersioningTestV2', _, _, _, _, _, _, _, _, _, _, _, _},
+ #'thrift.test.VersioningTestV2'{
+ begin_in_both = null,
+ newint = null,
+ newbyte = null,
+ newshort = null,
+ newlong = null,
+ newdouble = null,
+ newstruct = null,
+ newlist = null,
+ newset = null,
+ newmap = null,
+ newstring = null,
+ end_in_both = null
+ }
+ )},
+ {"ListTypeVersioningV1 record",
+ ?_assertMatch(
+ {'thrift.test.ListTypeVersioningV1', _, _},
+ #'thrift.test.ListTypeVersioningV1'{myints = null, hello = null}
+ )},
+ {"ListTypeVersioningV2 record",
+ ?_assertMatch(
+ {'thrift.test.ListTypeVersioningV2', _, _},
+ #'thrift.test.ListTypeVersioningV2'{strings = null, hello = null}
+ )},
+ {"GuessProtocolStruct record",
+ ?_assertMatch(
+ {'thrift.test.GuessProtocolStruct', _},
+ #'thrift.test.GuessProtocolStruct'{map_field = null}
+ )},
+ {"LargeDeltas record",
+ ?_assertMatch(
+ {'thrift.test.LargeDeltas', _, _, _, _, _, _, _, _, _, _},
+ #'thrift.test.LargeDeltas'{
+ b1 = null,
+ b10 = null,
+ b100 = null,
+ check_true = null,
+ b1000 = null,
+ check_false = null,
+ vertwo2000 = null,
+ a_set2500 = null,
+ vertwo3000 = null,
+ big_numbers = null
+ }
+ )},
+ {"NestedListsI32x2 record",
+ ?_assertMatch(
+ {'thrift.test.NestedListsI32x2', _},
+ #'thrift.test.NestedListsI32x2'{integerlist = null}
+ )},
+ {"NestedListsI32x3 record",
+ ?_assertMatch(
+ {'thrift.test.NestedListsI32x3', _},
+ #'thrift.test.NestedListsI32x3'{integerlist = null}
+ )},
+ {"NestedMixedx2 record",
+ ?_assertMatch(
+ {'thrift.test.NestedMixedx2', _, _, _},
+ #'thrift.test.NestedMixedx2'{
+ int_set_list = null,
+ map_int_strset = null,
+ map_int_strset_list = null
+ }
+ )},
+ {"ListBonks record",
+ ?_assertMatch({'thrift.test.ListBonks', _}, #'thrift.test.ListBonks'{bonk = null})},
+ {"NestedListsBonk record",
+ ?_assertMatch(
+ {'thrift.test.NestedListsBonk', _},
+ #'thrift.test.NestedListsBonk'{bonk = null}
+ )},
+ {"BoolTest record",
+ ?_assertMatch(
+ {'thrift.test.BoolTest', _, _},
+ #'thrift.test.BoolTest'{b = null, s = null}
+ )},
+ {"StructA record",
+ ?_assertMatch({'thrift.test.StructA', _}, #'thrift.test.StructA'{s = null})},
+ {"StructB record",
+ ?_assertMatch(
+ {'thrift.test.StructB', _, _},
+ #'thrift.test.StructB'{aa = null, ab = null}
+ )}
+ ].
struct_info_test_() ->
- [
- {"Bonk definition (short version)", ?_assertEqual(
- {struct, [{1, string}, {2, i32}]},
- thrift_test_types:struct_info('thrift.test.Bonk')
- )},
- {"Bonk definition", ?_assertEqual(
- {struct, [
- {1, undefined, string, message, undefined},
- {2, undefined, i32, type, undefined}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.Bonk')
- )},
- {"Bools definition", ?_assertEqual(
- {struct, [
- {1, undefined, bool, im_true, undefined},
- {2, undefined, bool, im_false, undefined}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.Bools')
- )},
- {"Xtruct definition", ?_assertEqual(
- {struct, [
- {1, undefined, string, string_thing, undefined},
- {4, undefined, byte, byte_thing, undefined},
- {9, undefined, i32, i32_thing, undefined},
- {11, undefined, i64, i64_thing, undefined}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.Xtruct')
- )},
- {"Xtruct2 definition", ?_assertEqual(
- {struct, [
- {1, undefined, byte, byte_thing, undefined},
- {2, undefined, {struct, {'thrift_test_types', 'thrift.test.Xtruct'}}, struct_thing, #'thrift.test.Xtruct'{}},
- {3, undefined, i32, i32_thing, undefined}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.Xtruct2')
- )},
- {"Xtruct3 definition", ?_assertEqual(
- {struct, [
- {1, undefined, string, string_thing, undefined},
- {4, undefined, i32, changed, undefined},
- {9, undefined, i32, i32_thing, undefined},
- {11, undefined, i64, i64_thing, undefined}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.Xtruct3')
- )},
- {"Insanity definition", ?_assertEqual(
- {struct, [
- {1, undefined, {map, i32, i64}, userMap, dict:new()},
- {2, undefined, {list, {struct, {'thrift_test_types', 'thrift.test.Xtruct'}}}, xtructs, []}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.Insanity')
- )},
- {"CrazyNesting definition", ?_assertEqual(
- {struct, [
- {1, undefined, string, string_field, undefined},
- {2, optional, {set, {struct, {'thrift_test_types', 'thrift.test.Insanity'}}}, set_field, sets:new()},
- {3, required, {list, {map,
- {set, i32},
- {map, i32, {set, {list, {map, {struct, {'thrift_test_types', 'thrift.test.Insanity'}}, string}}}}
- }}, list_field, []},
- {4, undefined, string, binary_field, undefined}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.CrazyNesting')
- )},
- {"Xception definition", ?_assertEqual(
- {struct, [
- {1, undefined, i32, errorCode, undefined},
- {2, undefined, string, message, undefined}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.Xception')
- )},
- {"Xception2 definition", ?_assertEqual(
- {struct, [
- {1, undefined, i32, errorCode, undefined},
- {2, undefined, {struct, {'thrift_test_types', 'thrift.test.Xtruct'}}, struct_thing, #'thrift.test.Xtruct'{}}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.Xception2')
- )},
- {"EmptyStruct definition", ?_assertEqual(
- {struct, []},
- thrift_test_types:struct_info_ext('thrift.test.EmptyStruct')
- )},
- {"OneField definition", ?_assertEqual(
- {struct, [
- {1, undefined, {struct, {'thrift_test_types', 'thrift.test.EmptyStruct'}}, field, #'thrift.test.EmptyStruct'{}}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.OneField')
- )},
- {"VersioningTestV1 definition", ?_assertEqual(
- {struct, [
- {1, undefined, i32, begin_in_both, undefined},
- {3, undefined, string, old_string, undefined},
- {12, undefined, i32, end_in_both, undefined}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.VersioningTestV1')
- )},
- {"VersioningTestV2 definition", ?_assertEqual(
- {struct, [
- {1, undefined, i32, begin_in_both, undefined},
- {2, undefined, i32, newint, undefined},
- {3, undefined, byte, newbyte, undefined},
- {4, undefined, i16, newshort, undefined},
- {5, undefined, i64, newlong, undefined},
- {6, undefined, double, newdouble, undefined},
- {7, undefined, {struct, {thrift_test_types, 'thrift.test.Bonk'}}, newstruct, #'thrift.test.Bonk'{}},
- {8, undefined, {list, i32}, newlist, []},
- {9, undefined, {set, i32}, newset, sets:new()},
- {10, undefined, {map, i32, i32}, newmap, dict:new()},
- {11, undefined, string, newstring, undefined},
- {12, undefined, i32, end_in_both, undefined}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.VersioningTestV2')
- )},
- {"ListTypeVersioningV1 definition", ?_assertEqual(
- {struct, [
- {1, undefined, {list, i32}, myints, []},
- {2, undefined, string, hello, undefined}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.ListTypeVersioningV1')
- )},
- {"ListTypeVersioningV2 definition", ?_assertEqual(
- {struct, [
- {1, undefined, {list, string}, strings, []},
- {2, undefined, string, hello, undefined}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.ListTypeVersioningV2')
- )},
- {"GuessProtocolStruct definition", ?_assertEqual(
- {struct, [
- {7, undefined, {map, string, string}, map_field, dict:new()}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.GuessProtocolStruct')
- )},
- {"LargeDeltas definition", ?_assertEqual(
- {struct, [
- {1, undefined, {struct, {thrift_test_types, 'thrift.test.Bools'}}, b1, #'thrift.test.Bools'{}},
- {10, undefined, {struct, {thrift_test_types, 'thrift.test.Bools'}}, b10, #'thrift.test.Bools'{}},
- {100, undefined, {struct, {thrift_test_types, 'thrift.test.Bools'}}, b100, #'thrift.test.Bools'{}},
- {500, undefined, bool, check_true, undefined},
- {1000, undefined, {struct, {thrift_test_types, 'thrift.test.Bools'}}, b1000, #'thrift.test.Bools'{}},
- {1500, undefined, bool, check_false, undefined},
- {2000, undefined, {struct, {thrift_test_types, 'thrift.test.VersioningTestV2'}}, vertwo2000, #'thrift.test.VersioningTestV2'{}},
- {2500, undefined, {set, string}, a_set2500, sets:new()},
- {3000, undefined, {struct, {thrift_test_types, 'thrift.test.VersioningTestV2'}}, vertwo3000, #'thrift.test.VersioningTestV2'{}},
- {4000, undefined, {list, i32}, big_numbers, []}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.LargeDeltas')
- )},
- {"NestedListsI32x2 definition", ?_assertEqual(
- {struct, [
- {1, undefined, {list, {list, i32}}, integerlist, []}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.NestedListsI32x2')
- )},
- {"NestedListsI32x3 definition", ?_assertEqual(
- {struct, [
- {1, undefined, {list, {list, {list, i32}}}, integerlist, []}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.NestedListsI32x3')
- )},
- {"NestedMixedx2 definition", ?_assertEqual(
- {struct, [
- {1, undefined, {list, {set, i32}}, int_set_list, []},
- {2, undefined, {map, i32, {set, string}}, map_int_strset, dict:new()},
- {3, undefined, {list, {map, i32, {set, string}}}, map_int_strset_list, []}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.NestedMixedx2')
- )},
- {"ListBonks definition", ?_assertEqual(
- {struct, [
- {1, undefined, {list, {struct, {thrift_test_types, 'thrift.test.Bonk'}}}, bonk, []}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.ListBonks')
- )},
- {"NestedListsBonk definition", ?_assertEqual(
- {struct, [
- {1, undefined, {list, {list, {list, {struct, {thrift_test_types, 'thrift.test.Bonk'}}}}}, bonk, []}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.NestedListsBonk')
- )},
- {"BoolTest definition", ?_assertEqual(
- {struct, [
- {1, optional, bool, b, true},
- {2, optional, string, s, "true"}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.BoolTest')
- )},
- {"StructA definition", ?_assertEqual(
- {struct, [{1, required, string, s, undefined}]},
- thrift_test_types:struct_info_ext('thrift.test.StructA')
- )},
- {"StructB definition", ?_assertEqual(
- {struct, [
- {1, optional, {struct, {thrift_test_types, 'thrift.test.StructA'}}, aa, #'thrift.test.StructA'{}},
- {2, required, {struct, {thrift_test_types, 'thrift.test.StructA'}}, ab, #'thrift.test.StructA'{}}
- ]},
- thrift_test_types:struct_info_ext('thrift.test.StructB')
- )}
- ].
+ [
+ {"Bonk definition (short version)",
+ ?_assertEqual(
+ {struct, [{1, string}, {2, i32}]},
+ thrift_test_types:struct_info('thrift.test.Bonk')
+ )},
+ {"Bonk definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, string, message, undefined},
+ {2, undefined, i32, type, undefined}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.Bonk')
+ )},
+ {"Bools definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, bool, im_true, undefined},
+ {2, undefined, bool, im_false, undefined}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.Bools')
+ )},
+ {"Xtruct definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, string, string_thing, undefined},
+ {4, undefined, byte, byte_thing, undefined},
+ {9, undefined, i32, i32_thing, undefined},
+ {11, undefined, i64, i64_thing, undefined}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.Xtruct')
+ )},
+ {"Xtruct2 definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, byte, byte_thing, undefined},
+ {2, undefined, {struct, {'thrift_test_types', 'thrift.test.Xtruct'}},
+ struct_thing, #'thrift.test.Xtruct'{}},
+ {3, undefined, i32, i32_thing, undefined}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.Xtruct2')
+ )},
+ {"Xtruct3 definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, string, string_thing, undefined},
+ {4, undefined, i32, changed, undefined},
+ {9, undefined, i32, i32_thing, undefined},
+ {11, undefined, i64, i64_thing, undefined}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.Xtruct3')
+ )},
+ {"Insanity definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, {map, i32, i64}, userMap, dict:new()},
+ {2, undefined, {list, {struct, {'thrift_test_types', 'thrift.test.Xtruct'}}},
+ xtructs, []}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.Insanity')
+ )},
+ {"CrazyNesting definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, string, string_field, undefined},
+ {2, optional, {set, {struct, {'thrift_test_types', 'thrift.test.Insanity'}}},
+ set_field, sets:new()},
+ {3, required,
+ {list,
+ {map, {set, i32},
+ {map, i32,
+ {set,
+ {list,
+ {map,
+ {struct,
+ {'thrift_test_types', 'thrift.test.Insanity'}},
+ string}}}}}},
+ list_field, []},
+ {4, undefined, string, binary_field, undefined}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.CrazyNesting')
+ )},
+ {"Xception definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, i32, errorCode, undefined},
+ {2, undefined, string, message, undefined}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.Xception')
+ )},
+ {"Xception2 definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, i32, errorCode, undefined},
+ {2, undefined, {struct, {'thrift_test_types', 'thrift.test.Xtruct'}},
+ struct_thing, #'thrift.test.Xtruct'{}}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.Xception2')
+ )},
+ {"EmptyStruct definition",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_types:struct_info_ext('thrift.test.EmptyStruct')
+ )},
+ {"OneField definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, {struct, {'thrift_test_types', 'thrift.test.EmptyStruct'}},
+ field, #'thrift.test.EmptyStruct'{}}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.OneField')
+ )},
+ {"VersioningTestV1 definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, i32, begin_in_both, undefined},
+ {3, undefined, string, old_string, undefined},
+ {12, undefined, i32, end_in_both, undefined}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.VersioningTestV1')
+ )},
+ {"VersioningTestV2 definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, i32, begin_in_both, undefined},
+ {2, undefined, i32, newint, undefined},
+ {3, undefined, byte, newbyte, undefined},
+ {4, undefined, i16, newshort, undefined},
+ {5, undefined, i64, newlong, undefined},
+ {6, undefined, double, newdouble, undefined},
+ {7, undefined, {struct, {thrift_test_types, 'thrift.test.Bonk'}}, newstruct,
+ #'thrift.test.Bonk'{}},
+ {8, undefined, {list, i32}, newlist, []},
+ {9, undefined, {set, i32}, newset, sets:new()},
+ {10, undefined, {map, i32, i32}, newmap, dict:new()},
+ {11, undefined, string, newstring, undefined},
+ {12, undefined, i32, end_in_both, undefined}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.VersioningTestV2')
+ )},
+ {"ListTypeVersioningV1 definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, {list, i32}, myints, []},
+ {2, undefined, string, hello, undefined}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.ListTypeVersioningV1')
+ )},
+ {"ListTypeVersioningV2 definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, {list, string}, strings, []},
+ {2, undefined, string, hello, undefined}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.ListTypeVersioningV2')
+ )},
+ {"GuessProtocolStruct definition",
+ ?_assertEqual(
+ {struct, [
+ {7, undefined, {map, string, string}, map_field, dict:new()}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.GuessProtocolStruct')
+ )},
+ {"LargeDeltas definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, {struct, {thrift_test_types, 'thrift.test.Bools'}}, b1,
+ #'thrift.test.Bools'{}},
+ {10, undefined, {struct, {thrift_test_types, 'thrift.test.Bools'}}, b10,
+ #'thrift.test.Bools'{}},
+ {100, undefined, {struct, {thrift_test_types, 'thrift.test.Bools'}}, b100,
+ #'thrift.test.Bools'{}},
+ {500, undefined, bool, check_true, undefined},
+ {1000, undefined, {struct, {thrift_test_types, 'thrift.test.Bools'}}, b1000,
+ #'thrift.test.Bools'{}},
+ {1500, undefined, bool, check_false, undefined},
+ {2000, undefined, {struct, {thrift_test_types, 'thrift.test.VersioningTestV2'}},
+ vertwo2000, #'thrift.test.VersioningTestV2'{}},
+ {2500, undefined, {set, string}, a_set2500, sets:new()},
+ {3000, undefined, {struct, {thrift_test_types, 'thrift.test.VersioningTestV2'}},
+ vertwo3000, #'thrift.test.VersioningTestV2'{}},
+ {4000, undefined, {list, i32}, big_numbers, []}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.LargeDeltas')
+ )},
+ {"NestedListsI32x2 definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, {list, {list, i32}}, integerlist, []}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.NestedListsI32x2')
+ )},
+ {"NestedListsI32x3 definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, {list, {list, {list, i32}}}, integerlist, []}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.NestedListsI32x3')
+ )},
+ {"NestedMixedx2 definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, {list, {set, i32}}, int_set_list, []},
+ {2, undefined, {map, i32, {set, string}}, map_int_strset, dict:new()},
+ {3, undefined, {list, {map, i32, {set, string}}}, map_int_strset_list, []}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.NestedMixedx2')
+ )},
+ {"ListBonks definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined, {list, {struct, {thrift_test_types, 'thrift.test.Bonk'}}}, bonk,
+ []}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.ListBonks')
+ )},
+ {"NestedListsBonk definition",
+ ?_assertEqual(
+ {struct, [
+ {1, undefined,
+ {list, {list, {list, {struct, {thrift_test_types, 'thrift.test.Bonk'}}}}},
+ bonk, []}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.NestedListsBonk')
+ )},
+ {"BoolTest definition",
+ ?_assertEqual(
+ {struct, [
+ {1, optional, bool, b, true},
+ {2, optional, string, s, "true"}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.BoolTest')
+ )},
+ {"StructA definition",
+ ?_assertEqual(
+ {struct, [{1, required, string, s, undefined}]},
+ thrift_test_types:struct_info_ext('thrift.test.StructA')
+ )},
+ {"StructB definition",
+ ?_assertEqual(
+ {struct, [
+ {1, optional, {struct, {thrift_test_types, 'thrift.test.StructA'}}, aa,
+ #'thrift.test.StructA'{}},
+ {2, required, {struct, {thrift_test_types, 'thrift.test.StructA'}}, ab,
+ #'thrift.test.StructA'{}}
+ ]},
+ thrift_test_types:struct_info_ext('thrift.test.StructB')
+ )}
+ ].
service_info_test_() ->
- [
- {"testVoid params", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testVoid, params_type)
- )},
- {"testVoid reply", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testVoid, reply_type)
- )},
- {"testVoid exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testVoid, exceptions)
- )},
- {"testString params", ?_assertEqual(
- {struct, [{1, string}]},
- thrift_test_thrift:function_info(testString, params_type)
- )},
- {"testString reply", ?_assertEqual(
- string,
- thrift_test_thrift:function_info(testString, reply_type)
- )},
- {"testString exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testString, exceptions)
- )},
- {"testByte params", ?_assertEqual(
- {struct, [{1, byte}]},
- thrift_test_thrift:function_info(testByte, params_type)
- )},
- {"testByte reply", ?_assertEqual(
- byte,
- thrift_test_thrift:function_info(testByte, reply_type)
- )},
- {"testByte exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testByte, exceptions)
- )},
- {"testI32 params", ?_assertEqual(
- {struct, [{1, i32}]},
- thrift_test_thrift:function_info(testI32, params_type)
- )},
- {"testI32 reply", ?_assertEqual(
- i32,
- thrift_test_thrift:function_info(testI32, reply_type)
- )},
- {"testI32 exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testI32, exceptions)
- )},
- {"testI64 params", ?_assertEqual(
- {struct, [{1, i64}]},
- thrift_test_thrift:function_info(testI64, params_type)
- )},
- {"testI64 reply", ?_assertEqual(
- i64,
- thrift_test_thrift:function_info(testI64, reply_type)
- )},
- {"testI64 exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testI64, exceptions)
- )},
- {"testDouble params", ?_assertEqual(
- {struct, [{1, double}]},
- thrift_test_thrift:function_info(testDouble, params_type)
- )},
- {"testDouble reply", ?_assertEqual(
- double,
- thrift_test_thrift:function_info(testDouble, reply_type)
- )},
- {"testDouble exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testDouble, exceptions)
- )},
- {"testStruct params", ?_assertEqual(
- {struct, [
- {1, {struct, {thrift_test_types, 'thrift.test.Xtruct'}}}
- ]},
- thrift_test_thrift:function_info(testStruct, params_type)
- )},
- {"testStruct reply", ?_assertEqual(
- {struct, {thrift_test_types, 'thrift.test.Xtruct'}},
- thrift_test_thrift:function_info(testStruct, reply_type)
- )},
- {"testStruct exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testStruct, exceptions)
- )},
- {"testNest params", ?_assertEqual(
- {struct, [
- {1, {struct, {thrift_test_types, 'thrift.test.Xtruct2'}}}
- ]},
- thrift_test_thrift:function_info(testNest, params_type)
- )},
- {"testNest reply", ?_assertEqual(
- {struct, {thrift_test_types, 'thrift.test.Xtruct2'}},
- thrift_test_thrift:function_info(testNest, reply_type)
- )},
- {"testNest exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testNest, exceptions)
- )},
- {"testMap params", ?_assertEqual(
- {struct, [
- {1, {map, i32, i32}}
- ]},
- thrift_test_thrift:function_info(testMap, params_type)
- )},
- {"testMap reply", ?_assertEqual(
- {map, i32, i32},
- thrift_test_thrift:function_info(testMap, reply_type)
- )},
- {"testMap exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testMap, exceptions)
- )},
- {"testStringMap params", ?_assertEqual(
- {struct, [
- {1, {map, string, string}}
- ]},
- thrift_test_thrift:function_info(testStringMap, params_type)
- )},
- {"testStringMap reply", ?_assertEqual(
- {map, string, string},
- thrift_test_thrift:function_info(testStringMap, reply_type)
- )},
- {"testStringMap exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testStringMap, exceptions)
- )},
- {"testSet params", ?_assertEqual(
- {struct, [
- {1, {set, i32}}
- ]},
- thrift_test_thrift:function_info(testSet, params_type)
- )},
- {"testSet reply", ?_assertEqual(
- {set, i32},
- thrift_test_thrift:function_info(testSet, reply_type)
- )},
- {"testSet exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testSet, exceptions)
- )},
- {"testList params", ?_assertEqual(
- {struct, [
- {1, {list, i32}}
- ]},
- thrift_test_thrift:function_info(testList, params_type)
- )},
- {"testList reply", ?_assertEqual(
- {list, i32},
- thrift_test_thrift:function_info(testList, reply_type)
- )},
- {"testList exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testList, exceptions)
- )},
- {"testEnum params", ?_assertEqual(
- {struct, [
- {1, i32}
- ]},
- thrift_test_thrift:function_info(testEnum, params_type)
- )},
- {"testEnum reply", ?_assertEqual(
- i32,
- thrift_test_thrift:function_info(testEnum, reply_type)
- )},
- {"testEnum exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testEnum, exceptions)
- )},
- {"testTypedef params", ?_assertEqual(
- {struct, [{1, i64}]},
- thrift_test_thrift:function_info(testTypedef, params_type)
- )},
- {"testTypedef reply", ?_assertEqual(
- i64,
- thrift_test_thrift:function_info(testTypedef, reply_type)
- )},
- {"testTypedef exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testTypedef, exceptions)
- )},
- {"testMapMap params", ?_assertEqual(
- {struct, [
- {1, i32}
- ]},
- thrift_test_thrift:function_info(testMapMap, params_type)
- )},
- {"testMapMap reply", ?_assertEqual(
- {map, i32, {map, i32,i32}},
- thrift_test_thrift:function_info(testMapMap, reply_type)
- )},
- {"testMapMap exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testMapMap, exceptions)
- )},
- {"testInsanity params", ?_assertEqual(
- {struct, [
- {1, {struct, {thrift_test_types, 'thrift.test.Insanity'}}}
- ]},
- thrift_test_thrift:function_info(testInsanity, params_type)
- )},
- {"testInsanity reply", ?_assertEqual(
- {map, i64, {map, i32, {struct, {'thrift_test_types', 'thrift.test.Insanity'}}}},
- thrift_test_thrift:function_info(testInsanity, reply_type)
- )},
- {"testInsanity exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testInsanity, exceptions)
- )},
- {"testMulti params", ?_assertEqual(
- {struct, [
- {1, byte},
- {2, i32},
- {3, i64},
- {4, {map, i16, string}},
- {5, i32},
- {6, i64}
- ]},
- thrift_test_thrift:function_info(testMulti, params_type)
- )},
- {"testMulti reply", ?_assertEqual(
- {struct, {thrift_test_types, 'thrift.test.Xtruct'}},
- thrift_test_thrift:function_info(testMulti, reply_type)
- )},
- {"testMulti exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testMulti, exceptions)
- )},
- {"testException params", ?_assertEqual(
- {struct, [{1, string}]},
- thrift_test_thrift:function_info(testException, params_type)
- )},
- {"testException reply", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testException, reply_type)
- )},
- {"testException exceptions", ?_assertEqual(
- {struct, [
- {1, {struct, {thrift_test_types, 'thrift.test.Xception'}}}
- ]},
- thrift_test_thrift:function_info(testException, exceptions)
- )},
- {"testMultiException params", ?_assertEqual(
- {struct, [{1, string}, {2, string}]},
- thrift_test_thrift:function_info(testMultiException, params_type)
- )},
- {"testMultiException reply", ?_assertEqual(
- {struct, {thrift_test_types, 'thrift.test.Xtruct'}},
- thrift_test_thrift:function_info(testMultiException, reply_type)
- )},
- {"testMultiException exceptions", ?_assertEqual(
- {struct, [
- {1, {struct, {thrift_test_types, 'thrift.test.Xception'}}},
- {2, {struct, {thrift_test_types, 'thrift.test.Xception2'}}}
- ]},
- thrift_test_thrift:function_info(testMultiException, exceptions)
- )},
- {"testOneway params", ?_assertEqual(
- {struct, [{1, i32}]},
- thrift_test_thrift:function_info(testOneway, params_type)
- )},
- {"testOneway reply", ?_assertEqual(
- oneway_void,
- thrift_test_thrift:function_info(testOneway, reply_type)
- )},
- {"testOneway exceptions", ?_assertEqual(
- {struct, []},
- thrift_test_thrift:function_info(testOneway, exceptions)
- )},
- {"secondtestString params", ?_assertEqual(
- {struct, [{1, string}]},
- second_service_thrift:function_info(secondtestString, params_type)
- )},
- {"secondtestString reply", ?_assertEqual(
- string,
- second_service_thrift:function_info(secondtestString, reply_type)
- )},
- {"secondtestString exceptions", ?_assertEqual(
- {struct, []},
- second_service_thrift:function_info(secondtestString, exceptions)
- )}
- ].
+ [
+ {"testVoid params",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testVoid, params_type)
+ )},
+ {"testVoid reply",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testVoid, reply_type)
+ )},
+ {"testVoid exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testVoid, exceptions)
+ )},
+ {"testString params",
+ ?_assertEqual(
+ {struct, [{1, string}]},
+ thrift_test_thrift:function_info(testString, params_type)
+ )},
+ {"testString reply",
+ ?_assertEqual(
+ string,
+ thrift_test_thrift:function_info(testString, reply_type)
+ )},
+ {"testString exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testString, exceptions)
+ )},
+ {"testByte params",
+ ?_assertEqual(
+ {struct, [{1, byte}]},
+ thrift_test_thrift:function_info(testByte, params_type)
+ )},
+ {"testByte reply",
+ ?_assertEqual(
+ byte,
+ thrift_test_thrift:function_info(testByte, reply_type)
+ )},
+ {"testByte exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testByte, exceptions)
+ )},
+ {"testI32 params",
+ ?_assertEqual(
+ {struct, [{1, i32}]},
+ thrift_test_thrift:function_info(testI32, params_type)
+ )},
+ {"testI32 reply",
+ ?_assertEqual(
+ i32,
+ thrift_test_thrift:function_info(testI32, reply_type)
+ )},
+ {"testI32 exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testI32, exceptions)
+ )},
+ {"testI64 params",
+ ?_assertEqual(
+ {struct, [{1, i64}]},
+ thrift_test_thrift:function_info(testI64, params_type)
+ )},
+ {"testI64 reply",
+ ?_assertEqual(
+ i64,
+ thrift_test_thrift:function_info(testI64, reply_type)
+ )},
+ {"testI64 exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testI64, exceptions)
+ )},
+ {"testDouble params",
+ ?_assertEqual(
+ {struct, [{1, double}]},
+ thrift_test_thrift:function_info(testDouble, params_type)
+ )},
+ {"testDouble reply",
+ ?_assertEqual(
+ double,
+ thrift_test_thrift:function_info(testDouble, reply_type)
+ )},
+ {"testDouble exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testDouble, exceptions)
+ )},
+ {"testStruct params",
+ ?_assertEqual(
+ {struct, [
+ {1, {struct, {thrift_test_types, 'thrift.test.Xtruct'}}}
+ ]},
+ thrift_test_thrift:function_info(testStruct, params_type)
+ )},
+ {"testStruct reply",
+ ?_assertEqual(
+ {struct, {thrift_test_types, 'thrift.test.Xtruct'}},
+ thrift_test_thrift:function_info(testStruct, reply_type)
+ )},
+ {"testStruct exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testStruct, exceptions)
+ )},
+ {"testNest params",
+ ?_assertEqual(
+ {struct, [
+ {1, {struct, {thrift_test_types, 'thrift.test.Xtruct2'}}}
+ ]},
+ thrift_test_thrift:function_info(testNest, params_type)
+ )},
+ {"testNest reply",
+ ?_assertEqual(
+ {struct, {thrift_test_types, 'thrift.test.Xtruct2'}},
+ thrift_test_thrift:function_info(testNest, reply_type)
+ )},
+ {"testNest exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testNest, exceptions)
+ )},
+ {"testMap params",
+ ?_assertEqual(
+ {struct, [
+ {1, {map, i32, i32}}
+ ]},
+ thrift_test_thrift:function_info(testMap, params_type)
+ )},
+ {"testMap reply",
+ ?_assertEqual(
+ {map, i32, i32},
+ thrift_test_thrift:function_info(testMap, reply_type)
+ )},
+ {"testMap exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testMap, exceptions)
+ )},
+ {"testStringMap params",
+ ?_assertEqual(
+ {struct, [
+ {1, {map, string, string}}
+ ]},
+ thrift_test_thrift:function_info(testStringMap, params_type)
+ )},
+ {"testStringMap reply",
+ ?_assertEqual(
+ {map, string, string},
+ thrift_test_thrift:function_info(testStringMap, reply_type)
+ )},
+ {"testStringMap exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testStringMap, exceptions)
+ )},
+ {"testSet params",
+ ?_assertEqual(
+ {struct, [
+ {1, {set, i32}}
+ ]},
+ thrift_test_thrift:function_info(testSet, params_type)
+ )},
+ {"testSet reply",
+ ?_assertEqual(
+ {set, i32},
+ thrift_test_thrift:function_info(testSet, reply_type)
+ )},
+ {"testSet exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testSet, exceptions)
+ )},
+ {"testList params",
+ ?_assertEqual(
+ {struct, [
+ {1, {list, i32}}
+ ]},
+ thrift_test_thrift:function_info(testList, params_type)
+ )},
+ {"testList reply",
+ ?_assertEqual(
+ {list, i32},
+ thrift_test_thrift:function_info(testList, reply_type)
+ )},
+ {"testList exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testList, exceptions)
+ )},
+ {"testEnum params",
+ ?_assertEqual(
+ {struct, [
+ {1, i32}
+ ]},
+ thrift_test_thrift:function_info(testEnum, params_type)
+ )},
+ {"testEnum reply",
+ ?_assertEqual(
+ i32,
+ thrift_test_thrift:function_info(testEnum, reply_type)
+ )},
+ {"testEnum exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testEnum, exceptions)
+ )},
+ {"testTypedef params",
+ ?_assertEqual(
+ {struct, [{1, i64}]},
+ thrift_test_thrift:function_info(testTypedef, params_type)
+ )},
+ {"testTypedef reply",
+ ?_assertEqual(
+ i64,
+ thrift_test_thrift:function_info(testTypedef, reply_type)
+ )},
+ {"testTypedef exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testTypedef, exceptions)
+ )},
+ {"testMapMap params",
+ ?_assertEqual(
+ {struct, [
+ {1, i32}
+ ]},
+ thrift_test_thrift:function_info(testMapMap, params_type)
+ )},
+ {"testMapMap reply",
+ ?_assertEqual(
+ {map, i32, {map, i32, i32}},
+ thrift_test_thrift:function_info(testMapMap, reply_type)
+ )},
+ {"testMapMap exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testMapMap, exceptions)
+ )},
+ {"testInsanity params",
+ ?_assertEqual(
+ {struct, [
+ {1, {struct, {thrift_test_types, 'thrift.test.Insanity'}}}
+ ]},
+ thrift_test_thrift:function_info(testInsanity, params_type)
+ )},
+ {"testInsanity reply",
+ ?_assertEqual(
+ {map, i64, {map, i32, {struct, {'thrift_test_types', 'thrift.test.Insanity'}}}},
+ thrift_test_thrift:function_info(testInsanity, reply_type)
+ )},
+ {"testInsanity exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testInsanity, exceptions)
+ )},
+ {"testMulti params",
+ ?_assertEqual(
+ {struct, [
+ {1, byte},
+ {2, i32},
+ {3, i64},
+ {4, {map, i16, string}},
+ {5, i32},
+ {6, i64}
+ ]},
+ thrift_test_thrift:function_info(testMulti, params_type)
+ )},
+ {"testMulti reply",
+ ?_assertEqual(
+ {struct, {thrift_test_types, 'thrift.test.Xtruct'}},
+ thrift_test_thrift:function_info(testMulti, reply_type)
+ )},
+ {"testMulti exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testMulti, exceptions)
+ )},
+ {"testException params",
+ ?_assertEqual(
+ {struct, [{1, string}]},
+ thrift_test_thrift:function_info(testException, params_type)
+ )},
+ {"testException reply",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testException, reply_type)
+ )},
+ {"testException exceptions",
+ ?_assertEqual(
+ {struct, [
+ {1, {struct, {thrift_test_types, 'thrift.test.Xception'}}}
+ ]},
+ thrift_test_thrift:function_info(testException, exceptions)
+ )},
+ {"testMultiException params",
+ ?_assertEqual(
+ {struct, [{1, string}, {2, string}]},
+ thrift_test_thrift:function_info(testMultiException, params_type)
+ )},
+ {"testMultiException reply",
+ ?_assertEqual(
+ {struct, {thrift_test_types, 'thrift.test.Xtruct'}},
+ thrift_test_thrift:function_info(testMultiException, reply_type)
+ )},
+ {"testMultiException exceptions",
+ ?_assertEqual(
+ {struct, [
+ {1, {struct, {thrift_test_types, 'thrift.test.Xception'}}},
+ {2, {struct, {thrift_test_types, 'thrift.test.Xception2'}}}
+ ]},
+ thrift_test_thrift:function_info(testMultiException, exceptions)
+ )},
+ {"testOneway params",
+ ?_assertEqual(
+ {struct, [{1, i32}]},
+ thrift_test_thrift:function_info(testOneway, params_type)
+ )},
+ {"testOneway reply",
+ ?_assertEqual(
+ oneway_void,
+ thrift_test_thrift:function_info(testOneway, reply_type)
+ )},
+ {"testOneway exceptions",
+ ?_assertEqual(
+ {struct, []},
+ thrift_test_thrift:function_info(testOneway, exceptions)
+ )},
+ {"secondtestString params",
+ ?_assertEqual(
+ {struct, [{1, string}]},
+ second_service_thrift:function_info(secondtestString, params_type)
+ )},
+ {"secondtestString reply",
+ ?_assertEqual(
+ string,
+ second_service_thrift:function_info(secondtestString, reply_type)
+ )},
+ {"secondtestString exceptions",
+ ?_assertEqual(
+ {struct, []},
+ second_service_thrift:function_info(secondtestString, exceptions)
+ )}
+ ].
diff --git a/lib/go/README.md b/lib/go/README.md
index b2cf1df..0aa4f1b 100644
--- a/lib/go/README.md
+++ b/lib/go/README.md
@@ -108,13 +108,19 @@
the client closes the connection (this is a best effort check, not a guarantee
-- there's no guarantee that the context object is always canceled when client
closes the connection, but when it's canceled you can always assume the client
-closed the connection). When implementing Go Thrift server, you can take
-advantage of that to abandon requests that's no longer needed:
+closed the connection). The cause of the cancellation (via `context.Cause(ctx)`)
+would also be set to `thrift.ErrAbandonRequest`.
+
+When implementing Go Thrift server, you can take advantage of that to abandon
+requests that's no longer needed by returning `thrift.ErrAbandonRequest`:
func MyEndpoint(ctx context.Context, req *thriftRequestType) (*thriftResponseType, error) {
...
if ctx.Err() == context.Canceled {
return nil, thrift.ErrAbandonRequest
+ // Or just return ctx.Err(), compiler generated processor code will
+ // handle it for you automatically:
+ // return nil, ctx.Err()
}
...
}
@@ -155,4 +161,4 @@
zero err time. Otherwise, the stop will wait for all the client
connections to be closed gracefully util thrift.ServerStopTimeout is
reached, and client connections that are not closed after thrift.ServerStopTimeout
-will be closed abruptly which may cause some client errors.
\ No newline at end of file
+will be closed abruptly which may cause some client errors.
diff --git a/lib/go/test/fuzz/go.mod b/lib/go/test/fuzz/go.mod
index 6641881..41cccc3 100644
--- a/lib/go/test/fuzz/go.mod
+++ b/lib/go/test/fuzz/go.mod
@@ -1,6 +1,6 @@
module github.com/apache/thrift/lib/go/test/fuzz
-go 1.19
+go 1.20
replace github.com/apache/thrift => ../../../../
diff --git a/lib/go/test/go.mod b/lib/go/test/go.mod
index 1c6d80d..59535e6 100644
--- a/lib/go/test/go.mod
+++ b/lib/go/test/go.mod
@@ -1,6 +1,6 @@
module github.com/apache/thrift/lib/go/test
-go 1.19
+go 1.20
require (
github.com/apache/thrift v0.0.0-00010101000000-000000000000
diff --git a/lib/go/test/tests/server_connectivity_check_test.go b/lib/go/test/tests/server_connectivity_check_test.go
new file mode 100644
index 0000000..51710ed
--- /dev/null
+++ b/lib/go/test/tests/server_connectivity_check_test.go
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package tests
+
+import (
+ "context"
+ "runtime/debug"
+ "testing"
+ "time"
+
+ "github.com/apache/thrift/lib/go/test/gopath/src/clientmiddlewareexceptiontest"
+ "github.com/apache/thrift/lib/go/thrift"
+)
+
+func TestServerConnectivityCheck(t *testing.T) {
+ const (
+ // Server will sleep for longer than client is willing to wait
+ // so client will close the connection.
+ serverSleep = 50 * time.Millisecond
+ clientSocketTimeout = time.Millisecond
+ )
+ serverSocket, err := thrift.NewTServerSocket(":0")
+ if err != nil {
+ t.Fatalf("failed to create server socket: %v", err)
+ }
+ processor := clientmiddlewareexceptiontest.NewClientMiddlewareExceptionTestProcessor(fakeClientMiddlewareExceptionTestHandler(
+ func(ctx context.Context) (*clientmiddlewareexceptiontest.FooResponse, error) {
+ time.Sleep(serverSleep)
+ err := ctx.Err()
+ if err == nil {
+ t.Error("Expected server ctx to be cancelled, did not happen")
+ return new(clientmiddlewareexceptiontest.FooResponse), nil
+ }
+ return nil, err
+ },
+ ))
+ server := thrift.NewTSimpleServer2(processor, serverSocket)
+ if err := server.Listen(); err != nil {
+ t.Fatalf("failed to listen server: %v", err)
+ }
+ server.SetLogger(func(msg string) {
+ t.Errorf("Server logger called with %q", msg)
+ t.Errorf("Server logger callstack:\n%s", debug.Stack())
+ })
+ addr := serverSocket.Addr().String()
+ go server.Serve()
+ t.Cleanup(func() {
+ server.Stop()
+ })
+
+ cfg := &thrift.TConfiguration{
+ SocketTimeout: clientSocketTimeout,
+ }
+ socket := thrift.NewTSocketConf(addr, cfg)
+ if err := socket.Open(); err != nil {
+ t.Fatalf("failed to create client connection: %v", err)
+ }
+ t.Cleanup(func() {
+ socket.Close()
+ })
+ inProtocol := thrift.NewTBinaryProtocolConf(socket, cfg)
+ outProtocol := thrift.NewTBinaryProtocolConf(socket, cfg)
+ client := thrift.NewTStandardClient(inProtocol, outProtocol)
+ ctx, cancel := context.WithTimeout(context.Background(), clientSocketTimeout)
+ defer cancel()
+ _, err = clientmiddlewareexceptiontest.NewClientMiddlewareExceptionTestClient(client).Foo(ctx)
+ socket.Close()
+ if err == nil {
+ t.Error("Expected client to time out, did not happen")
+ }
+}
diff --git a/lib/go/thrift/simple_server.go b/lib/go/thrift/simple_server.go
index c5c14fe..d4f555c 100644
--- a/lib/go/thrift/simple_server.go
+++ b/lib/go/thrift/simple_server.go
@@ -24,6 +24,7 @@
"errors"
"fmt"
"io"
+ "net"
"sync"
"sync/atomic"
"time"
@@ -354,7 +355,13 @@
ok, err := processor.Process(ctx, inputProtocol, outputProtocol)
if errors.Is(err, ErrAbandonRequest) {
- return client.Close()
+ err := client.Close()
+ if errors.Is(err, net.ErrClosed) {
+ // In this case, it's kinda expected to get
+ // net.ErrClosed, treat that as no-error
+ return nil
+ }
+ return err
}
if errors.As(err, new(TTransportException)) && err != nil {
return err
diff --git a/lib/go/thrift/socket.go b/lib/go/thrift/socket.go
index cba7c0f..2185fb1 100644
--- a/lib/go/thrift/socket.go
+++ b/lib/go/thrift/socket.go
@@ -55,7 +55,7 @@
//
// Example:
//
-// trans, err := thrift.NewTSocketConf("localhost:9090", &TConfiguration{
+// trans := thrift.NewTSocketConf("localhost:9090", &TConfiguration{
// ConnectTimeout: time.Second, // Use 0 for no timeout
// SocketTimeout: time.Second, // Use 0 for no timeout
// })
diff --git a/lib/haxe/haxelib.json b/lib/haxe/haxelib.json
index c2dab34..78779da 100644
--- a/lib/haxe/haxelib.json
+++ b/lib/haxe/haxelib.json
@@ -10,7 +10,7 @@
"framework"
],
"description": "Haxe bindings for the Apache Thrift RPC and serialization framework",
- "version": "0.19.0",
+ "version": "0.20.0",
"releasenote": "Licensed under Apache License, Version 2.0. The Apache Thrift compiler needs to be installed separately.",
"contributors": ["ApacheThrift"],
"dependencies": {
diff --git a/lib/java/README.md b/lib/java/README.md
index aa07495..c65f97c 100644
--- a/lib/java/README.md
+++ b/lib/java/README.md
@@ -50,13 +50,13 @@
following this step (which is also done in the travis CI docker images):
```bash
-export GRADLE_VERSION="8.0.2"
+export GRADLE_VERSION="8.4"
# install dependencies
apt-get install -y --no-install-recommends openjdk-17-jdk-headless wget unzip
# download gradle distribution
wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip
# check binary integrity
-echo "ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7 /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -
+echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -
# unzip and install
unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip
mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle
diff --git a/lib/java/build.gradle b/lib/java/build.gradle
index 41083d0..f0252ce 100644
--- a/lib/java/build.gradle
+++ b/lib/java/build.gradle
@@ -41,8 +41,8 @@
id 'signing'
id 'pmd'
id 'com.github.johnrengelman.shadow' version '8.1.1'
- id "com.github.spotbugs" version "5.0.14"
- id "com.diffplug.spotless" version "6.19.0"
+ id "com.github.spotbugs" version "5.1.3"
+ id "com.diffplug.spotless" version "6.22.0"
}
description = 'Apache Thrift Java Library'
diff --git a/lib/java/gradle.properties b/lib/java/gradle.properties
index 2e3d041..404318b 100644
--- a/lib/java/gradle.properties
+++ b/lib/java/gradle.properties
@@ -1,7 +1,7 @@
# This file is shared currently between this Gradle build and the
# Ant builds for fd303 and JavaScript. Keep the dotted notation for
# the properties to minimize the changes in the dependencies.
-thrift.version=0.19.0
+thrift.version=0.20.0
thrift.groupid=org.apache.thrift
release=false
diff --git a/lib/java/gradle/publishing.gradle b/lib/java/gradle/publishing.gradle
index 91f456a..5c26fdc 100644
--- a/lib/java/gradle/publishing.gradle
+++ b/lib/java/gradle/publishing.gradle
@@ -43,14 +43,16 @@
withSourcesJar()
}
+// skip shadow jar from publishing. Workaround for https://github.com/johnrengelman/shadow/issues/651
+components.java.withVariantsFromConfiguration(configurations.shadowRuntimeElements) {
+ skip()
+}
+
publishing {
publications {
mavenJava(MavenPublication) {
artifactId = "libthrift"
- // explicitly set 3 jars because calling "from components.java" will include shadow jar which isn't what we want
- artifact jar
- artifact sourcesJar
- artifact javadocJar
+ from components.java
pom {
name = 'Apache Thrift'
description = 'Thrift is a software framework for scalable cross-language services development.'
diff --git a/lib/java/gradle/sourceConfiguration.gradle b/lib/java/gradle/sourceConfiguration.gradle
index e3e143a..30f72cc 100644
--- a/lib/java/gradle/sourceConfiguration.gradle
+++ b/lib/java/gradle/sourceConfiguration.gradle
@@ -39,8 +39,8 @@
options.encoding = 'UTF-8'
options.debug = true
options.deprecation = true
- // the following is to build with Java 11 specifications, even when building with later JDK
- options.release = 11
+ // the following is to build with Java 8 specifications, even when building with later JDK
+ options.release = 8
options.compilerArgs += [
'-Werror',
'-Xlint:deprecation',
diff --git a/lib/java/src/main/java/org/apache/thrift/protocol/TBinaryProtocol.java b/lib/java/src/main/java/org/apache/thrift/protocol/TBinaryProtocol.java
index 263a818..99c3e93 100644
--- a/lib/java/src/main/java/org/apache/thrift/protocol/TBinaryProtocol.java
+++ b/lib/java/src/main/java/org/apache/thrift/protocol/TBinaryProtocol.java
@@ -553,6 +553,7 @@
throw new TTransportException(TTransportException.UNKNOWN, "unrecognized type code");
}
}
+
// -----------------------------------------------------------------
// Additional methods to improve performance.
diff --git a/lib/java/src/main/java/org/apache/thrift/protocol/TCompactProtocol.java b/lib/java/src/main/java/org/apache/thrift/protocol/TCompactProtocol.java
index b522956..abb5cca 100644
--- a/lib/java/src/main/java/org/apache/thrift/protocol/TCompactProtocol.java
+++ b/lib/java/src/main/java/org/apache/thrift/protocol/TCompactProtocol.java
@@ -940,6 +940,7 @@
throw new TTransportException(TTransportException.UNKNOWN, "unrecognized type code");
}
}
+
// -----------------------------------------------------------------
// Additional methods to improve performance.
diff --git a/lib/java/src/main/java/org/apache/thrift/protocol/TType.java b/lib/java/src/main/java/org/apache/thrift/protocol/TType.java
index 5a64e42..fbcdac3 100644
--- a/lib/java/src/main/java/org/apache/thrift/protocol/TType.java
+++ b/lib/java/src/main/java/org/apache/thrift/protocol/TType.java
@@ -34,6 +34,8 @@
public static final byte MAP = 13;
public static final byte SET = 14;
public static final byte LIST = 15;
- public static final byte ENUM = 16;
- public static final byte UUID = 17;
+ public static final byte UUID = 16;
+
+ /** This is not part of the TBinaryProtocol spec but Java specific implementation detail */
+ public static final byte ENUM = -1;
}
diff --git a/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java b/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java
index ae3d292..86b8dfd 100644
--- a/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java
+++ b/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java
@@ -65,18 +65,22 @@
/** The number of threads for selecting on already-accepted connections */
public int selectorThreads = 2;
+
/**
* The size of the executor service (if none is specified) that will handle invocations. This
* may be set to 0, in which case invocations will be handled directly on the selector threads
* (as is in TNonblockingServer)
*/
private int workerThreads = 5;
+
/** Time to wait for server to stop gracefully */
private int stopTimeoutVal = 60;
private TimeUnit stopTimeoutUnit = TimeUnit.SECONDS;
+
/** The ExecutorService for handling dispatched requests */
private ExecutorService executorService = null;
+
/**
* The size of the blocking queue per selector thread for passing accepted connections to the
* selector thread
diff --git a/lib/java/src/main/java/org/apache/thrift/transport/TIOStreamTransport.java b/lib/java/src/main/java/org/apache/thrift/transport/TIOStreamTransport.java
index af745b8..44dd2b0 100644
--- a/lib/java/src/main/java/org/apache/thrift/transport/TIOStreamTransport.java
+++ b/lib/java/src/main/java/org/apache/thrift/transport/TIOStreamTransport.java
@@ -68,6 +68,7 @@
super(config);
inputStream_ = is;
}
+
/**
* Input stream constructor, constructs an input only transport.
*
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestTSaslTransports.java b/lib/java/src/test/java/org/apache/thrift/transport/TestTSaslTransports.java
index d4f8fff..224da21 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestTSaslTransports.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestTSaslTransports.java
@@ -492,7 +492,7 @@
public static class SaslAnonymousProvider extends java.security.Provider {
public SaslAnonymousProvider() {
- super("ThriftSaslAnonymous", "1.0", "Thrift Anonymous SASL provider");
+ super("ThriftSaslAnonymous", 1.0, "Thrift Anonymous SASL provider");
put("SaslClientFactory.ANONYMOUS", SaslAnonymousFactory.class.getName());
put("SaslServerFactory.ANONYMOUS", SaslAnonymousFactory.class.getName());
}
diff --git a/lib/js/package-lock.json b/lib/js/package-lock.json
index 2697f4a..5559790 100644
--- a/lib/js/package-lock.json
+++ b/lib/js/package-lock.json
@@ -1,249 +1,288 @@
{
"name": "thrift",
- "version": "0.19.0",
- "lockfileVersion": 1,
+ "version": "0.20.0",
+ "lockfileVersion": 3,
"requires": true,
- "dependencies": {
- "@babel/parser": {
+ "packages": {
+ "": {
+ "name": "thrift",
+ "version": "0.19.0",
+ "license": "Apache-2.0",
+ "devDependencies": {
+ "browserify": "~16.5",
+ "grunt": "^1.4.1",
+ "grunt-cli": "^1.4.3",
+ "grunt-contrib-concat": "~1.0",
+ "grunt-contrib-jshint": "~3.2",
+ "grunt-contrib-qunit": "~3.1",
+ "grunt-contrib-uglify": "~4.0",
+ "grunt-jsdoc": "~2.4",
+ "grunt-shell-spawn": "~0.4",
+ "jsdoc": "^3.6.7",
+ "jslint": "~0.12.1",
+ "json-int64": "~1.0.2",
+ "node-int64": "~0.4.0",
+ "nopt": "~4.0"
+ }
+ },
+ "node_modules/@babel/parser": {
"version": "7.19.4",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.4.tgz",
"integrity": "sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
},
- "@types/linkify-it": {
+ "node_modules/@types/linkify-it": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz",
"integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==",
"dev": true
},
- "@types/markdown-it": {
+ "node_modules/@types/markdown-it": {
"version": "12.2.3",
"resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
"integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"@types/linkify-it": "*",
"@types/mdurl": "*"
}
},
- "@types/mdurl": {
+ "node_modules/@types/mdurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz",
"integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==",
"dev": true
},
- "JSONStream": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
- "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
- "dev": true,
- "requires": {
- "jsonparse": "^1.2.0",
- "through": ">=2.2.7 <3"
- }
- },
- "abbrev": {
+ "node_modules/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
},
- "acorn": {
+ "node_modules/acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
- "acorn-node": {
+ "node_modules/acorn-node": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
"integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
"dev": true,
- "requires": {
+ "dependencies": {
"acorn": "^7.0.0",
"acorn-walk": "^7.0.0",
"xtend": "^4.0.2"
}
},
- "acorn-walk": {
+ "node_modules/acorn-walk": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz",
"integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
- "ansi-regex": {
+ "node_modules/ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "ansi-styles": {
+ "node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
- "requires": {
+ "dependencies": {
"color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "argparse": {
+ "node_modules/argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- },
"dependencies": {
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
- }
+ "sprintf-js": "~1.0.2"
}
},
- "array-each": {
+ "node_modules/argparse/node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "node_modules/array-each": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
"integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "array-slice": {
+ "node_modules/array-slice": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
"integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "asn1.js": {
+ "node_modules/asn1.js": {
"version": "4.10.1",
"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
"integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
"dev": true,
- "requires": {
+ "dependencies": {
"bn.js": "^4.0.0",
"inherits": "^2.0.1",
"minimalistic-assert": "^1.0.0"
}
},
- "assert": {
+ "node_modules/assert": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
"integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
"dev": true,
- "requires": {
+ "dependencies": {
"object-assign": "^4.1.1",
"util": "0.10.3"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
- "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
- "dev": true
- },
- "util": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
- "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
- "dev": true,
- "requires": {
- "inherits": "2.0.1"
- }
- }
}
},
- "async": {
+ "node_modules/assert/node_modules/inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+ "dev": true
+ },
+ "node_modules/assert/node_modules/util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "dev": true,
+ "dependencies": {
+ "inherits": "2.0.1"
+ }
+ },
+ "node_modules/async": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
"integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==",
"dev": true
},
- "async-limiter": {
+ "node_modules/async-limiter": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
"integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
"dev": true
},
- "balanced-match": {
+ "node_modules/balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
- "base64-js": {
+ "node_modules/base64-js": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
"integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
"dev": true
},
- "bluebird": {
+ "node_modules/bluebird": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
"dev": true
},
- "bn.js": {
+ "node_modules/bn.js": {
"version": "4.11.8",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
"integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
"dev": true
},
- "brace-expansion": {
+ "node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
- "requires": {
+ "dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
- "braces": {
+ "node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
- "requires": {
+ "dependencies": {
"fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "brorand": {
+ "node_modules/brorand": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
"integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
"dev": true
},
- "browser-pack": {
+ "node_modules/browser-pack": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
"integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
"dev": true,
- "requires": {
- "JSONStream": "^1.0.3",
+ "dependencies": {
"combine-source-map": "~0.8.0",
"defined": "^1.0.0",
+ "JSONStream": "^1.0.3",
"safe-buffer": "^5.1.1",
"through2": "^2.0.0",
"umd": "^3.0.0"
+ },
+ "bin": {
+ "browser-pack": "bin/cmd.js"
}
},
- "browser-resolve": {
+ "node_modules/browser-resolve": {
"version": "1.11.3",
"resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
"integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"resolve": "1.1.7"
}
},
- "browserify": {
+ "node_modules/browserify": {
"version": "16.5.0",
"resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.0.tgz",
"integrity": "sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw==",
"dev": true,
- "requires": {
- "JSONStream": "^1.0.3",
+ "dependencies": {
"assert": "^1.4.0",
"browser-pack": "^6.0.1",
"browser-resolve": "^1.11.0",
@@ -265,6 +304,7 @@
"https-browserify": "^1.0.0",
"inherits": "~2.0.1",
"insert-module-globals": "^7.0.0",
+ "JSONStream": "^1.0.3",
"labeled-stream-splicer": "^2.0.0",
"mkdirp": "^0.5.0",
"module-deps": "^6.0.0",
@@ -292,72 +332,19 @@
"vm-browserify": "^1.0.0",
"xtend": "^4.0.0"
},
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- },
- "dependencies": {
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
- "string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.2.0"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
- "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
- "dev": true
- }
- }
- }
+ "bin": {
+ "browserify": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">= 0.8"
}
},
- "browserify-aes": {
+ "node_modules/browserify-aes": {
"version": "1.2.0",
"resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
"integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
"dev": true,
- "requires": {
+ "dependencies": {
"buffer-xor": "^1.0.3",
"cipher-base": "^1.0.0",
"create-hash": "^1.1.0",
@@ -366,45 +353,45 @@
"safe-buffer": "^5.0.1"
}
},
- "browserify-cipher": {
+ "node_modules/browserify-cipher": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
"integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
"dev": true,
- "requires": {
+ "dependencies": {
"browserify-aes": "^1.0.4",
"browserify-des": "^1.0.0",
"evp_bytestokey": "^1.0.0"
}
},
- "browserify-des": {
+ "node_modules/browserify-des": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
"integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
"dev": true,
- "requires": {
+ "dependencies": {
"cipher-base": "^1.0.1",
"des.js": "^1.0.0",
"inherits": "^2.0.1",
"safe-buffer": "^5.1.2"
}
},
- "browserify-rsa": {
+ "node_modules/browserify-rsa": {
"version": "4.0.1",
"resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
"integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
"dev": true,
- "requires": {
+ "dependencies": {
"bn.js": "^4.1.0",
"randombytes": "^2.0.1"
}
},
- "browserify-sign": {
+ "node_modules/browserify-sign": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
"integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
"dev": true,
- "requires": {
+ "dependencies": {
"bn.js": "^4.1.1",
"browserify-rsa": "^4.0.0",
"create-hash": "^1.1.0",
@@ -414,243 +401,322 @@
"parse-asn1": "^5.0.0"
}
},
- "browserify-zlib": {
+ "node_modules/browserify-zlib": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
"integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
"dev": true,
- "requires": {
+ "dependencies": {
"pako": "~1.0.5"
}
},
- "buffer": {
+ "node_modules/browserify/node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/browserify/node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/browserify/node_modules/readable-stream/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/browserify/node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/browserify/node_modules/string_decoder/node_modules/safe-buffer": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
+ "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+ "dev": true
+ },
+ "node_modules/buffer": {
"version": "5.4.3",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz",
"integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==",
"dev": true,
- "requires": {
+ "dependencies": {
"base64-js": "^1.0.2",
"ieee754": "^1.1.4"
}
},
- "buffer-crc32": {
+ "node_modules/buffer-crc32": {
"version": "0.2.13",
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
"integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
},
- "buffer-from": {
+ "node_modules/buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
"dev": true
},
- "buffer-shims": {
+ "node_modules/buffer-shims": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
"integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=",
"dev": true
},
- "buffer-xor": {
+ "node_modules/buffer-xor": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
"integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
"dev": true
},
- "builtin-status-codes": {
+ "node_modules/builtin-status-codes": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
"integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
"dev": true
},
- "cached-path-relative": {
+ "node_modules/cached-path-relative": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz",
"integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==",
"dev": true
},
- "catharsis": {
+ "node_modules/catharsis": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
"integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==",
"dev": true,
- "requires": {
+ "dependencies": {
"lodash": "^4.17.15"
+ },
+ "engines": {
+ "node": ">= 10"
}
},
- "chalk": {
+ "node_modules/chalk": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
"integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "cipher-base": {
+ "node_modules/cipher-base": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
"integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "^2.0.1",
"safe-buffer": "^5.0.1"
}
},
- "cli": {
+ "node_modules/cli": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
"integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==",
"dev": true,
- "requires": {
+ "dependencies": {
"exit": "0.1.2",
"glob": "^7.1.1"
},
- "dependencies": {
- "glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- }
+ "engines": {
+ "node": ">=0.2.5"
}
},
- "color-convert": {
+ "node_modules/cli/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
- "requires": {
+ "dependencies": {
"color-name": "1.1.3"
}
},
- "color-name": {
+ "node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
- "colors": {
+ "node_modules/colors": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
"integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
},
- "combine-source-map": {
+ "node_modules/combine-source-map": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
"integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=",
"dev": true,
- "requires": {
+ "dependencies": {
"convert-source-map": "~1.1.0",
"inline-source-map": "~0.6.0",
"lodash.memoize": "~3.0.3",
"source-map": "~0.5.3"
}
},
- "commander": {
+ "node_modules/commander": {
"version": "2.20.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
"integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
"dev": true
},
- "concat-map": {
+ "node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
- "concat-stream": {
+ "node_modules/concat-stream": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
"dev": true,
- "requires": {
+ "engines": [
+ "node >= 0.8"
+ ],
+ "dependencies": {
"buffer-from": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^2.2.2",
"typedarray": "^0.0.6"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
- "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
}
},
- "console-browserify": {
+ "node_modules/concat-stream/node_modules/readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/concat-stream/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/console-browserify": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
"integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
"dev": true,
- "requires": {
+ "dependencies": {
"date-now": "^0.1.4"
}
},
- "constants-browserify": {
+ "node_modules/constants-browserify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
"integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
"dev": true
},
- "convert-source-map": {
+ "node_modules/convert-source-map": {
"version": "1.1.3",
"resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
"integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=",
"dev": true
},
- "core-util-is": {
+ "node_modules/core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true
},
- "create-ecdh": {
+ "node_modules/create-ecdh": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
"integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
"dev": true,
- "requires": {
+ "dependencies": {
"bn.js": "^4.1.0",
"elliptic": "^6.0.0"
}
},
- "create-hash": {
+ "node_modules/create-hash": {
"version": "1.2.0",
"resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
"integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
"dev": true,
- "requires": {
+ "dependencies": {
"cipher-base": "^1.0.1",
"inherits": "^2.0.1",
"md5.js": "^1.3.4",
@@ -658,12 +724,12 @@
"sha.js": "^2.4.0"
}
},
- "create-hmac": {
+ "node_modules/create-hmac": {
"version": "1.1.7",
"resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
"integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
"dev": true,
- "requires": {
+ "dependencies": {
"cipher-base": "^1.0.3",
"create-hash": "^1.1.0",
"inherits": "^2.0.1",
@@ -672,34 +738,41 @@
"sha.js": "^2.4.8"
}
},
- "cross-spawn": {
+ "node_modules/cross-spawn": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
"integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
"dev": true,
- "requires": {
+ "dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
},
- "dependencies": {
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- }
+ "engines": {
+ "node": ">= 8"
}
},
- "crypto-browserify": {
+ "node_modules/cross-spawn/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-browserify": {
"version": "3.12.0",
"resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
"integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
"dev": true,
- "requires": {
+ "dependencies": {
"browserify-cipher": "^1.0.0",
"browserify-sign": "^4.0.0",
"create-ecdh": "^4.0.0",
@@ -711,193 +784,220 @@
"public-encrypt": "^4.0.0",
"randombytes": "^2.0.0",
"randomfill": "^1.0.3"
+ },
+ "engines": {
+ "node": "*"
}
},
- "dash-ast": {
+ "node_modules/dash-ast": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz",
"integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==",
"dev": true
},
- "date-now": {
+ "node_modules/date-now": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
"integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
"dev": true
},
- "dateformat": {
+ "node_modules/dateformat": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
"integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
},
- "debug": {
+ "node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
- "requires": {
+ "dependencies": {
"ms": "2.0.0"
}
},
- "defined": {
+ "node_modules/defined": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
"integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
"dev": true
},
- "deps-sort": {
+ "node_modules/deps-sort": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz",
"integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==",
"dev": true,
- "requires": {
+ "dependencies": {
"JSONStream": "^1.0.3",
"shasum-object": "^1.0.0",
"subarg": "^1.0.0",
"through2": "^2.0.0"
+ },
+ "bin": {
+ "deps-sort": "bin/cmd.js"
}
},
- "des.js": {
+ "node_modules/des.js": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
"integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "^2.0.1",
"minimalistic-assert": "^1.0.0"
}
},
- "detect-file": {
+ "node_modules/detect-file": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
"integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "detective": {
+ "node_modules/detective": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
"integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
"dev": true,
- "requires": {
+ "dependencies": {
"acorn-node": "^1.6.1",
"defined": "^1.0.0",
"minimist": "^1.1.1"
+ },
+ "bin": {
+ "detective": "bin/detective.js"
+ },
+ "engines": {
+ "node": ">=0.8.0"
}
},
- "diffie-hellman": {
+ "node_modules/diffie-hellman": {
"version": "5.0.3",
"resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
"integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
"dev": true,
- "requires": {
+ "dependencies": {
"bn.js": "^4.1.0",
"miller-rabin": "^4.0.0",
"randombytes": "^2.0.0"
}
},
- "dom-serializer": {
+ "node_modules/dom-serializer": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
"integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
"dev": true,
- "requires": {
+ "dependencies": {
"domelementtype": "^2.0.1",
"entities": "^2.0.0"
- },
- "dependencies": {
- "domelementtype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
- "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
- "dev": true
- },
- "entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
- "dev": true
- }
}
},
- "domain-browser": {
+ "node_modules/dom-serializer/node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/dom-serializer/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/domain-browser": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
"integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.4",
+ "npm": ">=1.2"
+ }
},
- "domelementtype": {
+ "node_modules/domelementtype": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
"integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
"dev": true
},
- "domhandler": {
+ "node_modules/domhandler": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
"integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"domelementtype": "1"
}
},
- "domutils": {
+ "node_modules/domutils": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
"integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==",
"dev": true,
- "requires": {
+ "dependencies": {
"dom-serializer": "0",
"domelementtype": "1"
}
},
- "duplexer": {
+ "node_modules/duplexer": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
"integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
"dev": true
},
- "duplexer2": {
+ "node_modules/duplexer2": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
"integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
"dev": true,
- "requires": {
- "readable-stream": "^2.0.2"
- },
"dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
+ "readable-stream": "^2.0.2"
}
},
- "elliptic": {
+ "node_modules/duplexer2/node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/duplexer2/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/elliptic": {
"version": "6.5.4",
"resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
"integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"bn.js": "^4.11.9",
"brorand": "^1.1.0",
"hash.js": "^1.0.0",
@@ -905,276 +1005,330 @@
"inherits": "^2.0.4",
"minimalistic-assert": "^1.0.1",
"minimalistic-crypto-utils": "^1.0.1"
- },
- "dependencies": {
- "bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- }
}
},
- "entities": {
+ "node_modules/elliptic/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ },
+ "node_modules/elliptic/node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/entities": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
"integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==",
"dev": true
},
- "es6-promise": {
+ "node_modules/es6-promise": {
"version": "4.2.5",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
"integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==",
"dev": true
},
- "es6-promisify": {
+ "node_modules/es6-promisify": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
"integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
"dev": true,
- "requires": {
+ "dependencies": {
"es6-promise": "^4.0.3"
}
},
- "escape-string-regexp": {
+ "node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
},
- "esprima": {
+ "node_modules/esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
},
- "eventemitter2": {
+ "node_modules/eventemitter2": {
"version": "0.4.14",
"resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
"integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
"dev": true
},
- "events": {
+ "node_modules/events": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz",
"integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
},
- "evp_bytestokey": {
+ "node_modules/evp_bytestokey": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
"integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
"dev": true,
- "requires": {
+ "dependencies": {
"md5.js": "^1.3.4",
"safe-buffer": "^5.1.1"
}
},
- "exit": {
+ "node_modules/exit": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
"integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
},
- "expand-tilde": {
+ "node_modules/expand-tilde": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
"integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
"dev": true,
- "requires": {
+ "dependencies": {
"homedir-polyfill": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "extend": {
+ "node_modules/extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"dev": true
},
- "extract-zip": {
+ "node_modules/extract-zip": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz",
"integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==",
"dev": true,
- "requires": {
+ "dependencies": {
"concat-stream": "^1.6.2",
"debug": "^2.6.9",
"mkdirp": "^0.5.4",
"yauzl": "^2.10.0"
+ },
+ "bin": {
+ "extract-zip": "cli.js"
}
},
- "fast-safe-stringify": {
+ "node_modules/fast-safe-stringify": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
"integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==",
"dev": true
},
- "fd-slicer": {
+ "node_modules/fd-slicer": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
"integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
"dev": true,
- "requires": {
+ "dependencies": {
"pend": "~1.2.0"
}
},
- "figures": {
+ "node_modules/figures": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
"integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
"dev": true,
- "requires": {
+ "dependencies": {
"escape-string-regexp": "^1.0.5",
"object-assign": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "fill-range": {
+ "node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "findup-sync": {
+ "node_modules/findup-sync": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
"integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
"dev": true,
- "requires": {
+ "dependencies": {
"glob": "~5.0.0"
},
- "dependencies": {
- "glob": {
- "version": "5.0.15",
- "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
- "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
- "dev": true,
- "requires": {
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "2 || 3",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- }
+ "engines": {
+ "node": ">= 0.6.0"
}
},
- "fined": {
+ "node_modules/findup-sync/node_modules/glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "dependencies": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/fined": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
"integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
"dev": true,
- "requires": {
+ "dependencies": {
"expand-tilde": "^2.0.2",
"is-plain-object": "^2.0.3",
"object.defaults": "^1.1.0",
"object.pick": "^1.2.0",
"parse-filepath": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
}
},
- "flagged-respawn": {
+ "node_modules/flagged-respawn": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
"integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
},
- "for-in": {
+ "node_modules/for-in": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
"integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "for-own": {
+ "node_modules/for-own": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
"integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
"dev": true,
- "requires": {
+ "dependencies": {
"for-in": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "fs.realpath": {
+ "node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
- "function-bind": {
+ "node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
- "get-assigned-identifiers": {
+ "node_modules/get-assigned-identifiers": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
"integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==",
"dev": true
},
- "getobject": {
+ "node_modules/getobject": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz",
"integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
},
- "glob": {
+ "node_modules/glob": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
"integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
"dev": true,
- "requires": {
+ "dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.2",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
}
},
- "global-modules": {
+ "node_modules/global-modules": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
"integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
"dev": true,
- "requires": {
+ "dependencies": {
"global-prefix": "^1.0.1",
"is-windows": "^1.0.1",
"resolve-dir": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "global-prefix": {
+ "node_modules/global-prefix": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
"integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
"dev": true,
- "requires": {
+ "dependencies": {
"expand-tilde": "^2.0.2",
"homedir-polyfill": "^1.0.1",
"ini": "^1.3.4",
"is-windows": "^1.0.1",
"which": "^1.2.14"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "graceful-fs": {
+ "node_modules/graceful-fs": {
"version": "4.2.10",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
"dev": true
},
- "grunt": {
+ "node_modules/grunt": {
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.3.tgz",
"integrity": "sha512-mKwmo4X2d8/4c/BmcOETHek675uOqw0RuA/zy12jaspWqvTp4+ZeQF1W+OTpcbncnaBsfbQJ6l0l4j+Sn/GmaQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"dateformat": "~3.0.3",
"eventemitter2": "~0.4.13",
"exit": "~0.1.2",
@@ -1191,294 +1345,330 @@
"nopt": "~3.0.6",
"rimraf": "~3.0.2"
},
- "dependencies": {
- "glob": {
- "version": "7.1.7",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
- "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "minimatch": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
- "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true
- },
- "nopt": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
- "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
- "dev": true,
- "requires": {
- "abbrev": "1"
- }
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- }
+ "bin": {
+ "grunt": "bin/grunt"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "grunt-cli": {
+ "node_modules/grunt-cli": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz",
"integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"grunt-known-options": "~2.0.0",
"interpret": "~1.1.0",
"liftup": "~3.0.1",
"nopt": "~4.0.1",
"v8flags": "~3.2.0"
+ },
+ "bin": {
+ "grunt": "bin/grunt"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "grunt-contrib-concat": {
+ "node_modules/grunt-contrib-concat": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz",
"integrity": "sha1-YVCYYwhOhx1+ht5IwBUlntl3Rb0=",
"dev": true,
- "requires": {
+ "dependencies": {
"chalk": "^1.0.0",
"source-map": "^0.5.3"
},
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "peerDependencies": {
+ "grunt": ">=0.4.0"
}
},
- "grunt-contrib-jshint": {
+ "node_modules/grunt-contrib-concat/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/grunt-contrib-concat/node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/grunt-contrib-concat/node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/grunt-contrib-jshint": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-3.2.0.tgz",
"integrity": "sha512-pcXWCSZWfoMSvcV4BwH21TUtLtcX0Ms8IGuOPIcLeXK3fud9KclY7iqMKY94jFx8TxZzh028YYtpR+io8DiEaQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"chalk": "~4.1.2",
"hooker": "^0.2.3",
"jshint": "~2.13.4"
},
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
+ "engines": {
+ "node": ">=10"
}
},
- "grunt-contrib-qunit": {
+ "node_modules/grunt-contrib-jshint/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/grunt-contrib-jshint/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/grunt-contrib-jshint/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/grunt-contrib-jshint/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/grunt-contrib-jshint/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/grunt-contrib-jshint/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/grunt-contrib-qunit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/grunt-contrib-qunit/-/grunt-contrib-qunit-3.1.0.tgz",
"integrity": "sha512-mdk8UltH6mxCD63E0hTXMAts42DOi4z4bBBrY7qnuHiShflMF7IueSMYe0zWaZ2dO8mgujh57Zfny2EbigJhRg==",
"dev": true,
- "requires": {
+ "dependencies": {
"eventemitter2": "^5.0.1",
"p-each-series": "^1.0.0",
"puppeteer": "^1.11.0"
},
- "dependencies": {
- "eventemitter2": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz",
- "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=",
- "dev": true
- }
+ "engines": {
+ "node": ">=6"
}
},
- "grunt-contrib-uglify": {
+ "node_modules/grunt-contrib-qunit/node_modules/eventemitter2": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz",
+ "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=",
+ "dev": true
+ },
+ "node_modules/grunt-contrib-uglify": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-4.0.1.tgz",
"integrity": "sha512-dwf8/+4uW1+7pH72WButOEnzErPGmtUvc8p08B0eQS/6ON0WdeQu0+WFeafaPTbbY1GqtS25lsHWaDeiTQNWPg==",
"dev": true,
- "requires": {
+ "dependencies": {
"chalk": "^2.4.1",
"maxmin": "^2.1.0",
"uglify-js": "^3.5.0",
"uri-path": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "grunt-jsdoc": {
+ "node_modules/grunt-jsdoc": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/grunt-jsdoc/-/grunt-jsdoc-2.4.1.tgz",
"integrity": "sha512-S0zxU0wDewRu7z+vijEItOWe/UttxWVmvz0qz2ZVcAYR2GpXjsiski2CAVN0b18t2qeVLdmxZkJaEWCOsKzcAw==",
"dev": true,
- "requires": {
+ "dependencies": {
"cross-spawn": "^7.0.1",
"jsdoc": "^3.6.3"
+ },
+ "bin": {
+ "grunt-jsdoc": "bin/grunt-jsdoc"
+ },
+ "engines": {
+ "node": ">= 8.12.0"
}
},
- "grunt-known-options": {
+ "node_modules/grunt-known-options": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz",
"integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "grunt-legacy-log": {
+ "node_modules/grunt-legacy-log": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz",
"integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==",
"dev": true,
- "requires": {
+ "dependencies": {
"colors": "~1.1.2",
"grunt-legacy-log-utils": "~2.1.0",
"hooker": "~0.2.3",
"lodash": "~4.17.19"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
}
},
- "grunt-legacy-log-utils": {
+ "node_modules/grunt-legacy-log-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz",
"integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==",
"dev": true,
- "requires": {
+ "dependencies": {
"chalk": "~4.1.0",
"lodash": "~4.17.19"
},
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
+ "engines": {
+ "node": ">=10"
}
},
- "grunt-legacy-util": {
+ "node_modules/grunt-legacy-log-utils/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/grunt-legacy-log-utils/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/grunt-legacy-log-utils/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/grunt-legacy-log-utils/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/grunt-legacy-log-utils/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/grunt-legacy-log-utils/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/grunt-legacy-util": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz",
"integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==",
"dev": true,
- "requires": {
+ "dependencies": {
"async": "~3.2.0",
"exit": "~0.1.2",
"getobject": "~1.0.0",
@@ -1487,118 +1677,226 @@
"underscore.string": "~3.3.5",
"which": "~2.0.2"
},
- "dependencies": {
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- }
+ "engines": {
+ "node": ">=10"
}
},
- "grunt-shell-spawn": {
+ "node_modules/grunt-legacy-util/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/grunt-shell-spawn": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/grunt-shell-spawn/-/grunt-shell-spawn-0.4.0.tgz",
"integrity": "sha512-lfYvEQjbO1Wv+1Fk3d3XlcEpuQjyXiErZMkiz/i/tDQeMHHGF1LziqA4ZcietBAo/bM2RHdEEUJfnNWt1VRMwQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"grunt": ">=0.4.x"
+ },
+ "bin": {
+ "grunt-shell-spawn": "bin/grunt-shell-spawn"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "gzip-size": {
+ "node_modules/grunt/node_modules/glob": {
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/grunt/node_modules/minimatch": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
+ "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/grunt/node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/grunt/node_modules/nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "dependencies": {
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ }
+ },
+ "node_modules/grunt/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/gzip-size": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz",
"integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=",
"dev": true,
- "requires": {
+ "dependencies": {
"duplexer": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.12.0"
}
},
- "has": {
+ "node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
- "requires": {
+ "dependencies": {
"function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
}
},
- "has-ansi": {
+ "node_modules/has-ansi": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
"dev": true,
- "requires": {
+ "dependencies": {
"ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "has-flag": {
+ "node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "hash-base": {
+ "node_modules/hash-base": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
"integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "^2.0.1",
"safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "hash.js": {
+ "node_modules/hash.js": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
"integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "^2.0.3",
"minimalistic-assert": "^1.0.1"
}
},
- "hmac-drbg": {
+ "node_modules/hmac-drbg": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
"integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
"dev": true,
- "requires": {
+ "dependencies": {
"hash.js": "^1.0.3",
"minimalistic-assert": "^1.0.0",
"minimalistic-crypto-utils": "^1.0.1"
}
},
- "homedir-polyfill": {
+ "node_modules/homedir-polyfill": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
"integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
"dev": true,
- "requires": {
+ "dependencies": {
"parse-passwd": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "hooker": {
+ "node_modules/hooker": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
"integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
},
- "htmlescape": {
+ "node_modules/htmlescape": {
"version": "1.1.1",
"resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
"integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10"
+ }
},
- "htmlparser2": {
+ "node_modules/htmlparser2": {
"version": "3.8.3",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
"integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"domelementtype": "1",
"domhandler": "2.3",
"domutils": "1.5",
@@ -1606,240 +1904,283 @@
"readable-stream": "1.1"
}
},
- "https-browserify": {
+ "node_modules/https-browserify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
"integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
"dev": true
},
- "https-proxy-agent": {
+ "node_modules/https-proxy-agent": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
"integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
"dev": true,
- "requires": {
+ "dependencies": {
"agent-base": "^4.3.0",
"debug": "^3.1.0"
},
- "dependencies": {
- "agent-base": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
- "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
- "dev": true,
- "requires": {
- "es6-promisify": "^5.0.0"
- }
- },
- "debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- }
+ "engines": {
+ "node": ">= 4.5.0"
}
},
- "iconv-lite": {
+ "node_modules/https-proxy-agent/node_modules/agent-base": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
+ "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
+ "dev": true,
+ "dependencies": {
+ "es6-promisify": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/https-proxy-agent/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/https-proxy-agent/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dev": true,
- "requires": {
+ "dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "ieee754": {
+ "node_modules/ieee754": {
"version": "1.1.13",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
"integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
"dev": true
},
- "inflight": {
+ "node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
- "requires": {
+ "dependencies": {
"once": "^1.3.0",
"wrappy": "1"
}
},
- "inherits": {
+ "node_modules/inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
},
- "ini": {
+ "node_modules/ini": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
},
- "inline-source-map": {
+ "node_modules/inline-source-map": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
"integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=",
"dev": true,
- "requires": {
+ "dependencies": {
"source-map": "~0.5.3"
}
},
- "insert-module-globals": {
+ "node_modules/insert-module-globals": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz",
"integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==",
"dev": true,
- "requires": {
- "JSONStream": "^1.0.3",
+ "dependencies": {
"acorn-node": "^1.5.2",
"combine-source-map": "^0.8.0",
"concat-stream": "^1.6.1",
"is-buffer": "^1.1.0",
+ "JSONStream": "^1.0.3",
"path-is-absolute": "^1.0.1",
"process": "~0.11.0",
"through2": "^2.0.0",
"undeclared-identifiers": "^1.1.2",
"xtend": "^4.0.0"
+ },
+ "bin": {
+ "insert-module-globals": "bin/cmd.js"
}
},
- "interpret": {
+ "node_modules/interpret": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
"integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
"dev": true
},
- "is-absolute": {
+ "node_modules/is-absolute": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
"integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-relative": "^1.0.0",
"is-windows": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-buffer": {
+ "node_modules/is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
"dev": true
},
- "is-core-module": {
+ "node_modules/is-core-module": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
"integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
"dev": true,
- "requires": {
+ "dependencies": {
"has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "is-extglob": {
+ "node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "is-glob": {
+ "node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-number": {
+ "node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
},
- "is-plain-object": {
+ "node_modules/is-plain-object": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
"dev": true,
- "requires": {
+ "dependencies": {
"isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-relative": {
+ "node_modules/is-relative": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
"integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-unc-path": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-unc-path": {
+ "node_modules/is-unc-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
"integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"unc-path-regex": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-windows": {
+ "node_modules/is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "isarray": {
+ "node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
- "isexe": {
+ "node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true
},
- "isobject": {
+ "node_modules/isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "js-yaml": {
+ "node_modules/js-yaml": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
- "requires": {
+ "dependencies": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
}
},
- "js2xmlparser": {
+ "node_modules/js2xmlparser": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz",
"integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
"dev": true,
- "requires": {
+ "dependencies": {
"xmlcreate": "^2.0.4"
}
},
- "jsdoc": {
+ "node_modules/jsdoc": {
"version": "3.6.11",
"resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.11.tgz",
"integrity": "sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg==",
"dev": true,
- "requires": {
+ "dependencies": {
"@babel/parser": "^7.9.4",
"@types/markdown-it": "^12.2.3",
"bluebird": "^3.7.2",
@@ -1856,27 +2197,40 @@
"taffydb": "2.6.2",
"underscore": "~1.13.2"
},
- "dependencies": {
- "escape-string-regexp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
- "dev": true
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true
- }
+ "bin": {
+ "jsdoc": "jsdoc.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
}
},
- "jshint": {
+ "node_modules/jsdoc/node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jsdoc/node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jshint": {
"version": "2.13.5",
"resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.5.tgz",
"integrity": "sha512-dB2n1w3OaQ35PLcBGIWXlszjbPZwsgZoxsg6G8PtNf2cFMC1l0fObkYLUuXqTTdi6tKw4sAjfUseTdmDMHQRcg==",
"dev": true,
- "requires": {
+ "dependencies": {
"cli": "~1.0.0",
"console-browserify": "1.1.x",
"exit": "0.1.x",
@@ -1885,134 +2239,179 @@
"minimatch": "~3.0.2",
"strip-json-comments": "1.0.x"
},
- "dependencies": {
- "minimatch": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
- "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "strip-json-comments": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
- "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==",
- "dev": true
- }
+ "bin": {
+ "jshint": "bin/jshint"
}
},
- "jslint": {
+ "node_modules/jshint/node_modules/minimatch": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
+ "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/jshint/node_modules/strip-json-comments": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
+ "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==",
+ "dev": true,
+ "bin": {
+ "strip-json-comments": "cli.js"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/jslint": {
"version": "0.12.1",
"resolved": "https://registry.npmjs.org/jslint/-/jslint-0.12.1.tgz",
"integrity": "sha512-q5iHswjOmJffbsGVq/1umGh4YBxb5pCArNHCZeHpkuVDDKM6IldqUn4hLehKSwQr7Bn07VXjD34Lx3nw+6j8eA==",
"dev": true,
- "requires": {
+ "dependencies": {
"exit": "~0.1.2",
"glob": "~7.1.3",
"nopt": "~4.0.1",
"readable-stream": "~2.1.5"
},
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "process-nextick-args": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
- "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
- "dev": true
- },
- "readable-stream": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz",
- "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=",
- "dev": true,
- "requires": {
- "buffer-shims": "^1.0.0",
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "~1.0.0",
- "process-nextick-args": "~1.0.6",
- "string_decoder": "~0.10.x",
- "util-deprecate": "~1.0.1"
- }
- }
+ "bin": {
+ "jslint": "bin/jslint.js"
+ },
+ "engines": {
+ "node": ">=0.8.0"
}
},
- "json-int64": {
+ "node_modules/jslint/node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/jslint/node_modules/process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ },
+ "node_modules/jslint/node_modules/readable-stream": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz",
+ "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=",
+ "dev": true,
+ "dependencies": {
+ "buffer-shims": "^1.0.0",
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~1.0.6",
+ "string_decoder": "~0.10.x",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/json-int64": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json-int64/-/json-int64-1.0.2.tgz",
"integrity": "sha512-uGrIXtRehbksM17S2lJRLPljufK52KL2ewbJi0xgcRPONoRLXa4yAUIKAUxF69dbnqIoBu33fB28MAWSxupB8Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"node-int64": "0.4.0"
}
},
- "json-stable-stringify": {
+ "node_modules/json-stable-stringify": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
"integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=",
"dev": true,
- "requires": {
+ "dependencies": {
"jsonify": "~0.0.0"
}
},
- "jsonify": {
+ "node_modules/jsonify": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
"integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
},
- "jsonparse": {
+ "node_modules/jsonparse": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
"integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
- "dev": true
+ "dev": true,
+ "engines": [
+ "node >= 0.2.0"
+ ]
},
- "kind-of": {
+ "node_modules/JSONStream": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
+ "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
+ "dev": true,
+ "dependencies": {
+ "jsonparse": "^1.2.0",
+ "through": ">=2.2.7 <3"
+ },
+ "bin": {
+ "JSONStream": "bin.js"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "klaw": {
+ "node_modules/klaw": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
"integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
"dev": true,
- "requires": {
+ "dependencies": {
"graceful-fs": "^4.1.9"
}
},
- "labeled-stream-splicer": {
+ "node_modules/labeled-stream-splicer": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz",
"integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "^2.0.1",
"stream-splicer": "^2.0.0"
}
},
- "liftup": {
+ "node_modules/liftup": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz",
"integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==",
"dev": true,
- "requires": {
+ "dependencies": {
"extend": "^3.0.2",
"findup-sync": "^4.0.0",
"fined": "^1.2.0",
@@ -2022,231 +2421,285 @@
"rechoir": "^0.7.0",
"resolve": "^1.19.0"
},
- "dependencies": {
- "findup-sync": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz",
- "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==",
- "dev": true,
- "requires": {
- "detect-file": "^1.0.0",
- "is-glob": "^4.0.0",
- "micromatch": "^4.0.2",
- "resolve-dir": "^1.0.1"
- }
- },
- "resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
- }
- }
+ "engines": {
+ "node": ">=10"
}
},
- "linkify-it": {
+ "node_modules/liftup/node_modules/findup-sync": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz",
+ "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==",
+ "dev": true,
+ "dependencies": {
+ "detect-file": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "micromatch": "^4.0.2",
+ "resolve-dir": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/liftup/node_modules/resolve": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+ "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.2.0",
+ "path-parse": "^1.0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/linkify-it": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
"integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"uc.micro": "^1.0.1"
}
},
- "lodash": {
+ "node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
- "lodash.memoize": {
+ "node_modules/lodash.memoize": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
"integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=",
"dev": true
},
- "make-iterator": {
+ "node_modules/make-iterator": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
"integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
"dev": true,
- "requires": {
+ "dependencies": {
"kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "map-cache": {
+ "node_modules/map-cache": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
"integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "markdown-it": {
+ "node_modules/markdown-it": {
"version": "12.3.2",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
"integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
"dev": true,
- "requires": {
+ "dependencies": {
"argparse": "^2.0.1",
"entities": "~2.1.0",
"linkify-it": "^3.0.1",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
},
- "dependencies": {
- "argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
- },
- "entities": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
- "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
- "dev": true
- }
+ "bin": {
+ "markdown-it": "bin/markdown-it.js"
}
},
- "markdown-it-anchor": {
+ "node_modules/markdown-it-anchor": {
"version": "8.6.5",
"resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz",
"integrity": "sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ==",
+ "dev": true,
+ "peerDependencies": {
+ "@types/markdown-it": "*",
+ "markdown-it": "*"
+ }
+ },
+ "node_modules/markdown-it/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
},
- "marked": {
+ "node_modules/markdown-it/node_modules/entities": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+ "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/marked": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz",
"integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
},
- "maxmin": {
+ "node_modules/maxmin": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz",
"integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=",
"dev": true,
- "requires": {
+ "dependencies": {
"chalk": "^1.0.0",
"figures": "^1.0.1",
"gzip-size": "^3.0.0",
"pretty-bytes": "^3.0.0"
},
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
+ "engines": {
+ "node": ">=0.12"
}
},
- "md5.js": {
+ "node_modules/maxmin/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/maxmin/node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/maxmin/node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/md5.js": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
"integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
"dev": true,
- "requires": {
+ "dependencies": {
"hash-base": "^3.0.0",
"inherits": "^2.0.1",
"safe-buffer": "^5.1.2"
}
},
- "mdurl": {
+ "node_modules/mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
"integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
"dev": true
},
- "micromatch": {
+ "node_modules/micromatch": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
"dev": true,
- "requires": {
+ "dependencies": {
"braces": "^3.0.1",
"picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": ">=8.6"
}
},
- "miller-rabin": {
+ "node_modules/miller-rabin": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
"integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
"dev": true,
- "requires": {
+ "dependencies": {
"bn.js": "^4.0.0",
"brorand": "^1.0.1"
+ },
+ "bin": {
+ "miller-rabin": "bin/miller-rabin"
}
},
- "mime": {
+ "node_modules/mime": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz",
"integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
},
- "minimalistic-assert": {
+ "node_modules/minimalistic-assert": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
"integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
"dev": true
},
- "minimalistic-crypto-utils": {
+ "node_modules/minimalistic-crypto-utils": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
"integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
"dev": true
},
- "minimatch": {
+ "node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
- "requires": {
+ "dependencies": {
"brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
}
},
- "minimist": {
+ "node_modules/minimist": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
"dev": true
},
- "mkdirp": {
+ "node_modules/mkdirp": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"minimist": "^1.2.5"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
}
},
- "module-deps": {
+ "node_modules/module-deps": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.2.tgz",
"integrity": "sha512-a9y6yDv5u5I4A+IPHTnqFxcaKr4p50/zxTjcQJaX2ws9tN/W6J6YXnEKhqRyPhl494dkcxx951onSKVezmI+3w==",
"dev": true,
- "requires": {
- "JSONStream": "^1.0.3",
+ "dependencies": {
"browser-resolve": "^1.7.0",
"cached-path-relative": "^1.0.2",
"concat-stream": "~1.6.0",
@@ -2254,6 +2707,7 @@
"detective": "^5.2.0",
"duplexer2": "^0.1.2",
"inherits": "^2.0.1",
+ "JSONStream": "^1.0.3",
"parents": "^1.0.0",
"readable-stream": "^2.0.2",
"resolve": "^1.4.0",
@@ -2262,180 +2716,217 @@
"through2": "^2.0.0",
"xtend": "^4.0.0"
},
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "resolve": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
- "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
- "dev": true,
- "requires": {
- "path-parse": "^1.0.6"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
+ "bin": {
+ "module-deps": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "ms": {
+ "node_modules/module-deps/node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/module-deps/node_modules/resolve": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "dev": true,
+ "dependencies": {
+ "path-parse": "^1.0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/module-deps/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
- "node-int64": {
+ "node_modules/node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
"integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
"dev": true
},
- "nopt": {
+ "node_modules/nopt": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
"integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
"dev": true,
- "requires": {
+ "dependencies": {
"abbrev": "1",
"osenv": "^0.1.4"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
}
},
- "number-is-nan": {
+ "node_modules/number-is-nan": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "object-assign": {
+ "node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "object.defaults": {
+ "node_modules/object.defaults": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
"integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
"dev": true,
- "requires": {
+ "dependencies": {
"array-each": "^1.0.1",
"array-slice": "^1.0.0",
"for-own": "^1.0.0",
"isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "object.map": {
+ "node_modules/object.map": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
"integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
"dev": true,
- "requires": {
+ "dependencies": {
"for-own": "^1.0.0",
"make-iterator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "object.pick": {
+ "node_modules/object.pick": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
"integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
"dev": true,
- "requires": {
+ "dependencies": {
"isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "once": {
+ "node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
- "requires": {
+ "dependencies": {
"wrappy": "1"
}
},
- "os-browserify": {
+ "node_modules/os-browserify": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
"integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
"dev": true
},
- "os-homedir": {
+ "node_modules/os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "os-tmpdir": {
+ "node_modules/os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "osenv": {
+ "node_modules/osenv": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"dev": true,
- "requires": {
+ "dependencies": {
"os-homedir": "^1.0.0",
"os-tmpdir": "^1.0.0"
}
},
- "p-each-series": {
+ "node_modules/p-each-series": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz",
"integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=",
"dev": true,
- "requires": {
+ "dependencies": {
"p-reduce": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "p-reduce": {
+ "node_modules/p-reduce": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz",
"integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "pako": {
+ "node_modules/pako": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
"dev": true
},
- "parents": {
+ "node_modules/parents": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
"integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
"dev": true,
- "requires": {
+ "dependencies": {
"path-platform": "~0.11.15"
}
},
- "parse-asn1": {
+ "node_modules/parse-asn1": {
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
"integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"asn1.js": "^4.0.0",
"browserify-aes": "^1.0.0",
"create-hash": "^1.1.0",
@@ -2444,132 +2935,171 @@
"safe-buffer": "^5.1.1"
}
},
- "parse-filepath": {
+ "node_modules/parse-filepath": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
"integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
"dev": true,
- "requires": {
+ "dependencies": {
"is-absolute": "^1.0.0",
"map-cache": "^0.2.0",
"path-root": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8"
}
},
- "parse-passwd": {
+ "node_modules/parse-passwd": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
"integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "path-browserify": {
+ "node_modules/path-browserify": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
"integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
"dev": true
},
- "path-is-absolute": {
+ "node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "path-key": {
+ "node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "path-parse": {
+ "node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
- "path-platform": {
+ "node_modules/path-platform": {
"version": "0.11.15",
"resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
"integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
},
- "path-root": {
+ "node_modules/path-root": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
"integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
"dev": true,
- "requires": {
+ "dependencies": {
"path-root-regex": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "path-root-regex": {
+ "node_modules/path-root-regex": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
"integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "pbkdf2": {
+ "node_modules/pbkdf2": {
"version": "3.0.17",
"resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
"integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
"dev": true,
- "requires": {
+ "dependencies": {
"create-hash": "^1.1.2",
"create-hmac": "^1.1.4",
"ripemd160": "^2.0.1",
"safe-buffer": "^5.0.1",
"sha.js": "^2.4.8"
+ },
+ "engines": {
+ "node": ">=0.12"
}
},
- "pend": {
+ "node_modules/pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
"integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
"dev": true
},
- "picomatch": {
+ "node_modules/picomatch": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
},
- "pretty-bytes": {
+ "node_modules/pretty-bytes": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz",
"integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=",
"dev": true,
- "requires": {
+ "dependencies": {
"number-is-nan": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "process": {
+ "node_modules/process": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
"integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6.0"
+ }
},
- "process-nextick-args": {
+ "node_modules/process-nextick-args": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
"dev": true
},
- "progress": {
+ "node_modules/progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
- "proxy-from-env": {
+ "node_modules/proxy-from-env": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
"integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=",
"dev": true
},
- "public-encrypt": {
+ "node_modules/public-encrypt": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
"integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"bn.js": "^4.1.0",
"browserify-rsa": "^4.0.0",
"create-hash": "^1.1.0",
@@ -2578,18 +3108,20 @@
"safe-buffer": "^5.1.2"
}
},
- "punycode": {
+ "node_modules/punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
"dev": true
},
- "puppeteer": {
+ "node_modules/puppeteer": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz",
"integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==",
+ "deprecated": "< 19.4.0 is no longer supported",
"dev": true,
- "requires": {
+ "hasInstallScript": true,
+ "dependencies": {
"debug": "^4.1.0",
"extract-zip": "^1.6.6",
"https-proxy-agent": "^2.2.1",
@@ -2599,690 +3131,764 @@
"rimraf": "^2.6.1",
"ws": "^6.1.0"
},
+ "engines": {
+ "node": ">=6.4.0"
+ }
+ },
+ "node_modules/puppeteer/node_modules/debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
"dependencies": {
- "debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
}
}
},
- "querystring": {
+ "node_modules/puppeteer/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/querystring": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
"integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
- "dev": true
+ "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
},
- "querystring-es3": {
+ "node_modules/querystring-es3": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
"integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
},
- "randombytes": {
+ "node_modules/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"safe-buffer": "^5.1.0"
}
},
- "randomfill": {
+ "node_modules/randomfill": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
"integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
"dev": true,
- "requires": {
+ "dependencies": {
"randombytes": "^2.0.5",
"safe-buffer": "^5.1.0"
}
},
- "read-only-stream": {
+ "node_modules/read-only-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
"integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=",
"dev": true,
- "requires": {
- "readable-stream": "^2.0.2"
- },
"dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
+ "readable-stream": "^2.0.2"
}
},
- "readable-stream": {
+ "node_modules/read-only-stream/node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/read-only-stream/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/readable-stream": {
"version": "1.1.14",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
"integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.1",
"isarray": "0.0.1",
"string_decoder": "~0.10.x"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
- "dev": true
- }
}
},
- "rechoir": {
+ "node_modules/readable-stream/node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+ "dev": true
+ },
+ "node_modules/rechoir": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
"integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
"dev": true,
- "requires": {
+ "dependencies": {
"resolve": "^1.9.0"
},
- "dependencies": {
- "resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
- }
- }
+ "engines": {
+ "node": ">= 0.10"
}
},
- "requizzle": {
+ "node_modules/rechoir/node_modules/resolve": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+ "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.2.0",
+ "path-parse": "^1.0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/requizzle": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz",
"integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"lodash": "^4.17.14"
}
},
- "resolve": {
+ "node_modules/resolve": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
"integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
"dev": true
},
- "resolve-dir": {
+ "node_modules/resolve-dir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
"integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
"dev": true,
- "requires": {
+ "dependencies": {
"expand-tilde": "^2.0.0",
"global-modules": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "rimraf": {
+ "node_modules/rimraf": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
"integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
"dev": true,
- "requires": {
+ "dependencies": {
"glob": "^7.0.5"
+ },
+ "bin": {
+ "rimraf": "bin.js"
}
},
- "ripemd160": {
+ "node_modules/ripemd160": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
"integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
"dev": true,
- "requires": {
+ "dependencies": {
"hash-base": "^3.0.0",
"inherits": "^2.0.1"
}
},
- "safe-buffer": {
+ "node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
- "safer-buffer": {
+ "node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
- "sha.js": {
+ "node_modules/sha.js": {
"version": "2.4.11",
"resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
"integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "^2.0.1",
"safe-buffer": "^5.0.1"
+ },
+ "bin": {
+ "sha.js": "bin.js"
}
},
- "shasum": {
+ "node_modules/shasum": {
"version": "1.0.2",
"resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
"integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=",
"dev": true,
- "requires": {
+ "dependencies": {
"json-stable-stringify": "~0.0.0",
"sha.js": "~2.4.4"
}
},
- "shasum-object": {
+ "node_modules/shasum-object": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz",
"integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==",
"dev": true,
- "requires": {
+ "dependencies": {
"fast-safe-stringify": "^2.0.7"
}
},
- "shebang-command": {
+ "node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
- "requires": {
+ "dependencies": {
"shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "shebang-regex": {
+ "node_modules/shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "shell-quote": {
+ "node_modules/shell-quote": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
"integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
"dev": true
},
- "simple-concat": {
+ "node_modules/simple-concat": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
"integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=",
"dev": true
},
- "source-map": {
+ "node_modules/source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "sprintf-js": {
+ "node_modules/sprintf-js": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
"integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
"dev": true
},
- "stream-browserify": {
+ "node_modules/stream-browserify": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
"integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "~2.0.1",
"readable-stream": "^2.0.2"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
}
},
- "stream-combiner2": {
+ "node_modules/stream-browserify/node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/stream-browserify/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/stream-combiner2": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
"integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
"dev": true,
- "requires": {
+ "dependencies": {
"duplexer2": "~0.1.0",
"readable-stream": "^2.0.2"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
}
},
- "stream-http": {
+ "node_modules/stream-combiner2/node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/stream-combiner2/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/stream-http": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz",
"integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==",
"dev": true,
- "requires": {
+ "dependencies": {
"builtin-status-codes": "^3.0.0",
"inherits": "^2.0.1",
"readable-stream": "^3.0.6",
"xtend": "^4.0.0"
- },
- "dependencies": {
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- },
- "safe-buffer": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
- "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
- "dev": true
- },
- "string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.2.0"
- }
- }
}
},
- "stream-splicer": {
+ "node_modules/stream-http/node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/stream-http/node_modules/safe-buffer": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
+ "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+ "dev": true
+ },
+ "node_modules/stream-http/node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/stream-splicer": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz",
"integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "^2.0.1",
"readable-stream": "^2.0.2"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
}
},
- "string_decoder": {
+ "node_modules/stream-splicer/node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/stream-splicer/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
"dev": true
},
- "strip-ansi": {
+ "node_modules/strip-ansi": {
"version": "3.0.1",
"resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
- "requires": {
+ "dependencies": {
"ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "strip-json-comments": {
+ "node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "subarg": {
+ "node_modules/subarg": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
"integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
"dev": true,
- "requires": {
+ "dependencies": {
"minimist": "^1.1.0"
}
},
- "supports-color": {
+ "node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
- "requires": {
+ "dependencies": {
"has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "syntax-error": {
+ "node_modules/syntax-error": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
"integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
"dev": true,
- "requires": {
+ "dependencies": {
"acorn-node": "^1.2.0"
}
},
- "taffydb": {
+ "node_modules/taffydb": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz",
"integrity": "sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA==",
"dev": true
},
- "through": {
+ "node_modules/through": {
"version": "2.3.8",
"resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
"dev": true
},
- "through2": {
+ "node_modules/through2": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
"integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"readable-stream": "~2.3.6",
"xtend": "~4.0.1"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
}
},
- "timers-browserify": {
+ "node_modules/through2/node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/through2/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/timers-browserify": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
"integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=",
"dev": true,
- "requires": {
+ "dependencies": {
"process": "~0.11.0"
+ },
+ "engines": {
+ "node": ">=0.6.0"
}
},
- "to-regex-range": {
+ "node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
}
},
- "tty-browserify": {
+ "node_modules/tty-browserify": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
"integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
"dev": true
},
- "typedarray": {
+ "node_modules/typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
"dev": true
},
- "uc.micro": {
+ "node_modules/uc.micro": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
"dev": true
},
- "uglify-js": {
+ "node_modules/uglify-js": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz",
"integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==",
"dev": true,
- "requires": {
+ "dependencies": {
"commander": "~2.20.0",
"source-map": "~0.6.1"
},
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
}
},
- "umd": {
+ "node_modules/uglify-js/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/umd": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
"integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "umd": "bin/cli.js"
+ }
},
- "unc-path-regex": {
+ "node_modules/unc-path-regex": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
"integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "undeclared-identifiers": {
+ "node_modules/undeclared-identifiers": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz",
"integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==",
"dev": true,
- "requires": {
+ "dependencies": {
"acorn-node": "^1.3.0",
"dash-ast": "^1.0.0",
"get-assigned-identifiers": "^1.2.0",
"simple-concat": "^1.0.0",
"xtend": "^4.0.1"
+ },
+ "bin": {
+ "undeclared-identifiers": "bin.js"
}
},
- "underscore": {
+ "node_modules/underscore": {
"version": "1.13.6",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
"integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==",
"dev": true
},
- "underscore.string": {
+ "node_modules/underscore.string": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz",
"integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"sprintf-js": "^1.1.1",
"util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": "*"
}
},
- "uri-path": {
+ "node_modules/uri-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz",
"integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
},
- "url": {
+ "node_modules/url": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
"integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
"dev": true,
- "requires": {
+ "dependencies": {
"punycode": "1.3.2",
"querystring": "0.2.0"
- },
- "dependencies": {
- "punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
- "dev": true
- }
}
},
- "util": {
+ "node_modules/url/node_modules/punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+ "dev": true
+ },
+ "node_modules/util": {
"version": "0.10.4",
"resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
"integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "2.0.3"
}
},
- "util-deprecate": {
+ "node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true
},
- "v8flags": {
+ "node_modules/v8flags": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
"integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==",
"dev": true,
- "requires": {
+ "dependencies": {
"homedir-polyfill": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
}
},
- "vm-browserify": {
+ "node_modules/vm-browserify": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
"integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
"dev": true
},
- "which": {
+ "node_modules/which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
}
},
- "wrappy": {
+ "node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
- "ws": {
+ "node_modules/ws": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
"integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
"dev": true,
- "requires": {
+ "dependencies": {
"async-limiter": "~1.0.0"
}
},
- "xmlcreate": {
+ "node_modules/xmlcreate": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
"integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==",
"dev": true
},
- "xtend": {
+ "node_modules/xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.4"
+ }
},
- "yauzl": {
+ "node_modules/yauzl": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
"integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
"dev": true,
- "requires": {
+ "dependencies": {
"buffer-crc32": "~0.2.3",
"fd-slicer": "~1.1.0"
}
diff --git a/lib/js/package.json b/lib/js/package.json
index 57b4bb2..8543b25 100644
--- a/lib/js/package.json
+++ b/lib/js/package.json
@@ -1,6 +1,6 @@
{
"name": "thrift",
- "version": "0.19.0",
+ "version": "0.20.0",
"description": "Thrift is a software framework for scalable cross-language services development.",
"main": "./src/thrift",
"author": {
diff --git a/lib/js/src/thrift.js b/lib/js/src/thrift.js
index 78fdfb2..7dbb560 100644
--- a/lib/js/src/thrift.js
+++ b/lib/js/src/thrift.js
@@ -46,7 +46,7 @@
* @const {string} Version
* @memberof Thrift
*/
- Version: '0.19.0',
+ Version: '0.20.0',
/**
* Thrift IDL type string to Id mapping.
diff --git a/lib/kotlin/build.gradle.kts b/lib/kotlin/build.gradle.kts
index 0ec8859..5c9929b 100644
--- a/lib/kotlin/build.gradle.kts
+++ b/lib/kotlin/build.gradle.kts
@@ -29,17 +29,21 @@
dependencies {
implementation(platform("org.jetbrains.kotlin:kotlin-bom"))
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
- implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.7.1")
+ implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.7.3")
implementation("org.apache.thrift:libthrift:INCLUDED")
testImplementation(kotlin("test"))
}
kotlin {
jvmToolchain {
- (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(11))
+ (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(8))
}
}
+tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
+ kotlinOptions.jvmTarget = "1.8"
+}
+
tasks {
if (JavaVersion.current().isJava11Compatible) {
ktfmt {
@@ -53,7 +57,7 @@
task<Exec>("compileThrift") {
val thriftBin = if (hasProperty("thrift.compiler")) {
- file(property("thrift.compiler"))
+ file(property("thrift.compiler")!!)
} else {
project.rootDir.resolve("../../compiler/cpp/thrift")
}
diff --git a/lib/kotlin/cross-test-client/build.gradle.kts b/lib/kotlin/cross-test-client/build.gradle.kts
index 579d01e..8a2c234 100644
--- a/lib/kotlin/cross-test-client/build.gradle.kts
+++ b/lib/kotlin/cross-test-client/build.gradle.kts
@@ -52,7 +52,7 @@
kotlin {
jvmToolchain {
- (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(11))
+ (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(8))
}
}
@@ -70,7 +70,7 @@
task<Exec>("compileThrift") {
val thriftBin = if (hasProperty("thrift.compiler")) {
- file(property("thrift.compiler"))
+ file(property("thrift.compiler")!!)
} else {
project.rootDir.resolve("../../compiler/cpp/thrift")
}
diff --git a/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt b/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt
index 39500df..c238d0b 100644
--- a/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt
+++ b/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt
@@ -101,9 +101,12 @@
private fun createProtocol(transport: TTransport): TProtocol =
when (protocolType) {
- ProtocolType.Binary, ProtocolType.Multi -> TBinaryProtocol(transport)
- ProtocolType.Compact, ProtocolType.MultiCompact -> TCompactProtocol(transport)
- ProtocolType.Json, ProtocolType.MultiJson -> TJSONProtocol(transport)
+ ProtocolType.Binary,
+ ProtocolType.Multi -> TBinaryProtocol(transport)
+ ProtocolType.Compact,
+ ProtocolType.MultiCompact -> TCompactProtocol(transport)
+ ProtocolType.Json,
+ ProtocolType.MultiJson -> TJSONProtocol(transport)
}
private fun createTransport(): TNonblockingTransport =
@@ -283,7 +286,8 @@
if (whoa.size == 2 && whoa.containsKey(1L) && whoa.containsKey(2L)) {
val firstMap = whoa[1L]!!
val secondMap = whoa[2L]!!
- if (firstMap.size == 2 &&
+ if (
+ firstMap.size == 2 &&
firstMap.containsKey(Numberz.TWO) &&
firstMap.containsKey(Numberz.THREE) &&
secondMap.size == 1 &&
@@ -361,7 +365,8 @@
private suspend fun multiplexTest(returnCode: Int): Int {
var code = returnCode
- if (protocolType == ProtocolType.Multi ||
+ if (
+ protocolType == ProtocolType.Multi ||
protocolType == ProtocolType.MultiJson ||
protocolType == ProtocolType.MultiCompact
) {
@@ -574,7 +579,8 @@
} else {
val m1 = mm[4]!!
val m2 = mm[-4]!!
- if (m1[1] != 1 ||
+ if (
+ m1[1] != 1 ||
m1[2] != 2 ||
m1[3] != 3 ||
m1[4] != 4 ||
diff --git a/lib/kotlin/cross-test-server/build.gradle.kts b/lib/kotlin/cross-test-server/build.gradle.kts
index 4f6e12d..eda1ebd 100644
--- a/lib/kotlin/cross-test-server/build.gradle.kts
+++ b/lib/kotlin/cross-test-server/build.gradle.kts
@@ -50,7 +50,7 @@
kotlin {
jvmToolchain {
- (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(11))
+ (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(8))
}
}
diff --git a/lib/kotlin/cross-test-server/src/main/kotlin/org/apache/thrift/test/TestServer.kt b/lib/kotlin/cross-test-server/src/main/kotlin/org/apache/thrift/test/TestServer.kt
index 566e53d..315d12e 100644
--- a/lib/kotlin/cross-test-server/src/main/kotlin/org/apache/thrift/test/TestServer.kt
+++ b/lib/kotlin/cross-test-server/src/main/kotlin/org/apache/thrift/test/TestServer.kt
@@ -226,11 +226,12 @@
private fun getProtocolFactory(): TProtocolFactory =
when (protocolType) {
- ProtocolType.Json, ProtocolType.MultiJson -> TJSONProtocol.Factory()
- ProtocolType.Compact, ProtocolType.MultiCompact ->
- TCompactProtocol.Factory(stringLimit, containerLimit)
- ProtocolType.Binary, ProtocolType.Multi ->
- TBinaryProtocol.Factory(stringLimit, containerLimit)
+ ProtocolType.Json,
+ ProtocolType.MultiJson -> TJSONProtocol.Factory()
+ ProtocolType.Compact,
+ ProtocolType.MultiCompact -> TCompactProtocol.Factory(stringLimit, containerLimit)
+ ProtocolType.Binary,
+ ProtocolType.Multi -> TBinaryProtocol.Factory(stringLimit, containerLimit)
}
}
@@ -258,7 +259,8 @@
multiplexedProcessor.registerProcessor("ThriftTest", testProcessor)
multiplexedProcessor.registerProcessor("SecondService", secondProcessor)
when (serverType) {
- ServerType.NonBlocking, ServerType.ThreadedSelector -> {
+ ServerType.NonBlocking,
+ ServerType.ThreadedSelector -> {
val tNonblockingServerSocket =
TNonblockingServerSocket(NonblockingAbstractServerSocketArgs().port(port))
when (serverType) {
@@ -283,7 +285,8 @@
}
}
}
- ServerType.Simple, ServerType.ThreadPool -> {
+ ServerType.Simple,
+ ServerType.ThreadPool -> {
// SSL socket
val tServerSocket: TServerSocket =
if (ssl) {
diff --git a/lib/kotlin/settings.gradle.kts b/lib/kotlin/settings.gradle.kts
index 99ceaf0..9eea8d1 100644
--- a/lib/kotlin/settings.gradle.kts
+++ b/lib/kotlin/settings.gradle.kts
@@ -18,8 +18,8 @@
*/
pluginManagement {
plugins {
- kotlin("jvm") version "1.8.21"
- id("com.ncorti.ktfmt.gradle") version "0.8.0"
+ kotlin("jvm") version "1.9.10"
+ id("com.ncorti.ktfmt.gradle") version "0.12.0"
}
}
diff --git a/lib/lua/Thrift.lua b/lib/lua/Thrift.lua
index c249278..1f9a562 100644
--- a/lib/lua/Thrift.lua
+++ b/lib/lua/Thrift.lua
@@ -48,7 +48,7 @@
return count
end
-version = '0.19.0'
+version = '0.20.0'
TType = {
STOP = 0,
diff --git a/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj b/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj
index aed36cd..b5afef5 100644
--- a/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj
+++ b/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj
@@ -27,7 +27,7 @@
</PropertyGroup>
<ItemGroup>
- <PackageReference Include="BenchmarkDotNet" Version="0.13.4" />
+ <PackageReference Include="BenchmarkDotNet" Version="0.13.6" />
</ItemGroup>
<ItemGroup>
diff --git a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj
index 19065c6..98e8007 100644
--- a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj
+++ b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj
@@ -22,7 +22,7 @@
<TargetFramework>net7.0</TargetFramework>
<AssemblyName>Thrift.IntegrationTests</AssemblyName>
<PackageId>Thrift.IntegrationTests</PackageId>
- <Version>0.19.0.0</Version>
+ <Version>0.20.0.0</Version>
<OutputType>Exe</OutputType>
<GenerateAssemblyTitleAttribute>false</GenerateAssemblyTitleAttribute>
<GenerateAssemblyDescriptionAttribute>false</GenerateAssemblyDescriptionAttribute>
@@ -35,10 +35,10 @@
<ItemGroup>
<PackageReference Include="CompareNETObjects" Version="4.79.0" />
- <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
- <PackageReference Include="MSTest.TestAdapter" Version="3.0.2" />
- <PackageReference Include="MSTest.TestFramework" Version="3.0.2" />
- <PackageReference Include="System.ServiceModel.Primitives" Version="4.10.0" />
+ <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.3" />
+ <PackageReference Include="MSTest.TestAdapter" Version="3.1.1" />
+ <PackageReference Include="MSTest.TestFramework" Version="3.1.1" />
+ <PackageReference Include="System.ServiceModel.Primitives" Version="6.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Thrift\Thrift.csproj" />
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj
index 990b240..6f3abb1 100644
--- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj
+++ b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj
@@ -19,7 +19,7 @@
-->
<PropertyGroup>
- <ThriftVersion>0.19.0</ThriftVersion>
+ <ThriftVersion>0.20.0</ThriftVersion>
<ThriftVersionOutput>Thrift version $(ThriftVersion)</ThriftVersionOutput>
<TargetFramework>net7.0</TargetFramework>
<Version>$(ThriftVersion).0</Version>
@@ -37,7 +37,7 @@
</ItemGroup>
<ItemGroup>
- <PackageReference Include="System.ServiceModel.Primitives" Version="4.10.0" />
+ <PackageReference Include="System.ServiceModel.Primitives" Version="6.0.0" />
</ItemGroup>
<ItemGroup>
diff --git a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj
index bae55ea..94b7b09 100644
--- a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj
+++ b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj
@@ -20,15 +20,15 @@
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
- <Version>0.19.0.0</Version>
+ <Version>0.20.0.0</Version>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CompareNETObjects" Version="4.79.0" />
- <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
- <PackageReference Include="MSTest.TestAdapter" Version="3.0.2" />
- <PackageReference Include="MSTest.TestFramework" Version="3.0.2" />
+ <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.3" />
+ <PackageReference Include="MSTest.TestAdapter" Version="3.1.1" />
+ <PackageReference Include="MSTest.TestFramework" Version="3.1.1" />
<PackageReference Include="NSubstitute" Version="5.0.0" />
</ItemGroup>
diff --git a/lib/netstd/Thrift/Properties/AssemblyInfo.cs b/lib/netstd/Thrift/Properties/AssemblyInfo.cs
index 3dd0cc6..bd84c4e 100644
--- a/lib/netstd/Thrift/Properties/AssemblyInfo.cs
+++ b/lib/netstd/Thrift/Properties/AssemblyInfo.cs
@@ -52,5 +52,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
-[assembly: AssemblyVersion("0.19.0.0")]
-[assembly: AssemblyFileVersion("0.19.0.0")]
+[assembly: AssemblyVersion("0.20.0.0")]
+[assembly: AssemblyFileVersion("0.20.0.0")]
diff --git a/lib/netstd/Thrift/Protocol/TJSONProtocol.cs b/lib/netstd/Thrift/Protocol/TJSONProtocol.cs
index 82e758b..9f761ae 100644
--- a/lib/netstd/Thrift/Protocol/TJSONProtocol.cs
+++ b/lib/netstd/Thrift/Protocol/TJSONProtocol.cs
@@ -435,11 +435,11 @@
// escaped?
if (ch != TJSONProtocolConstants.EscSequences[0])
{
-#if NETSTANDARD2_0
- await buffer.WriteAsync(new[] {ch}, 0, 1, cancellationToken);
-#else
+#if NET5_0_OR_GREATER
var wbuf = new[] { ch };
await buffer.WriteAsync(wbuf.AsMemory(0, 1), cancellationToken);
+#else
+ await buffer.WriteAsync(new[] { ch }, 0, 1, cancellationToken);
#endif
continue;
}
@@ -454,11 +454,11 @@
throw new TProtocolException(TProtocolException.INVALID_DATA, "Expected control char");
}
ch = TJSONProtocolConstants.EscapeCharValues[off];
-#if NETSTANDARD2_0
- await buffer.WriteAsync(new[] {ch}, 0, 1, cancellationToken);
-#else
+#if NET5_0_OR_GREATER
var wbuf = new[] { ch };
await buffer.WriteAsync( wbuf.AsMemory(0, 1), cancellationToken);
+#else
+ await buffer.WriteAsync(new[] { ch }, 0, 1, cancellationToken);
#endif
continue;
}
@@ -488,20 +488,20 @@
codeunits.Add((char) wch);
var tmp = Utf8Encoding.GetBytes(codeunits.ToArray());
-#if NETSTANDARD2_0
- await buffer.WriteAsync(tmp, 0, tmp.Length, cancellationToken);
-#else
+#if NET5_0_OR_GREATER
await buffer.WriteAsync(tmp.AsMemory(0, tmp.Length), cancellationToken);
+#else
+ await buffer.WriteAsync(tmp, 0, tmp.Length, cancellationToken);
#endif
codeunits.Clear();
}
else
{
var tmp = Utf8Encoding.GetBytes(new[] { (char)wch });
-#if NETSTANDARD2_0
- await buffer.WriteAsync(tmp, 0, tmp.Length, cancellationToken);
-#else
+#if NET5_0_OR_GREATER
await buffer.WriteAsync(tmp.AsMemory( 0, tmp.Length), cancellationToken);
+#else
+ await buffer.WriteAsync(tmp, 0, tmp.Length, cancellationToken);
#endif
}
}
diff --git a/lib/netstd/Thrift/Thrift.csproj b/lib/netstd/Thrift/Thrift.csproj
index 760ffe4..2ebfb06 100644
--- a/lib/netstd/Thrift/Thrift.csproj
+++ b/lib/netstd/Thrift/Thrift.csproj
@@ -40,8 +40,8 @@
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>thrift.snk</AssemblyOriginatorKeyFile>
<DelaySign>false</DelaySign>
- <Title>Apache Thrift 0.19.0</Title>
- <Version>0.19.0.0</Version>
+ <Title>Apache Thrift 0.20.0</Title>
+ <Version>0.20.0.0</Version>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<PackageProjectUrl>http://thrift.apache.org/</PackageProjectUrl>
<Authors>Apache Thrift Developers</Authors>
@@ -50,18 +50,18 @@
<PackageDescription>C# .NET Core bindings for the Apache Thrift RPC system</PackageDescription>
<PackageReleaseNotes></PackageReleaseNotes>
<PackageTags>Apache Thrift RPC</PackageTags>
- <PackageReleaseNotes>https://github.com/apache/thrift/blob/0.19.0/CHANGES.md</PackageReleaseNotes>
+ <PackageReleaseNotes>https://github.com/apache/thrift/blob/0.20.0/CHANGES.md</PackageReleaseNotes>
<PackageReadmeFile>README.md</PackageReadmeFile>
<Copyright>Copyright 2023 The Apache Software Foundation</Copyright>
</PropertyGroup>
<ItemGroup>
- <PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
+ <PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" Condition="'$(TargetFramework.StartsWith(`netstandard2.`))' == 'true'" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="7.0.0" />
<PackageReference Include="System.IO.Pipes" Version="[4.3,)" />
- <PackageReference Include="System.IO.Pipes.AccessControl" Version="5.0.0" />
+ <PackageReference Include="System.IO.Pipes.AccessControl" Version="5.0.0" Condition="'$(TargetFramework.StartsWith(`netstandard2.`))' == 'true'" />
<PackageReference Include="System.Net.Http.WinHttpHandler" Version="7.0.0" />
<PackageReference Include="System.Net.NameResolution" Version="[4.3,)" />
<PackageReference Include="System.Net.Requests" Version="[4.3,)" />
@@ -70,12 +70,22 @@
</ItemGroup>
<ItemGroup>
+ <FrameworkReference Include="Microsoft.AspNetCore.App" Condition="'$(TargetFramework.StartsWith(`netstandard2.`))' == 'false'" />
+ </ItemGroup>
+
+ <ItemGroup>
<PackageReference Update="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" />
</ItemGroup>
<ItemGroup>
<None Include="..\README.md" Pack="true" PackagePath="\" />
</ItemGroup>
+
+ <ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
+ <PackageReference Include="Microsoft.AspNetCore.Components.Web">
+ <Version>7.0.9</Version>
+ </PackageReference>
+ </ItemGroup>
<Target Name="SetTFMAssemblyAttributesPath" BeforeTargets="GenerateTargetFrameworkMonikerAttribute">
<PropertyGroup>
diff --git a/lib/netstd/Thrift/Transport/Client/THttpTransport.cs b/lib/netstd/Thrift/Transport/Client/THttpTransport.cs
index 60ed59c..1ab1caf 100644
--- a/lib/netstd/Thrift/Transport/Client/THttpTransport.cs
+++ b/lib/netstd/Thrift/Transport/Client/THttpTransport.cs
@@ -150,10 +150,10 @@
try
{
-#if NETSTANDARD2_0
- var ret = await _inputStream.ReadAsync(buffer, offset, length, cancellationToken);
-#else
+#if NET5_0_OR_GREATER
var ret = await _inputStream.ReadAsync(new Memory<byte>(buffer, offset, length), cancellationToken);
+#else
+ var ret = await _inputStream.ReadAsync(buffer, offset, length, cancellationToken);
#endif
if (ret == -1)
{
@@ -173,10 +173,10 @@
{
cancellationToken.ThrowIfCancellationRequested();
-#if NETSTANDARD2_0
- await _outputStream.WriteAsync(buffer, offset, length, cancellationToken);
-#else
+#if NET5_0_OR_GREATER
await _outputStream.WriteAsync(buffer.AsMemory(offset, length), cancellationToken);
+#else
+ await _outputStream.WriteAsync(buffer, offset, length, cancellationToken);
#endif
}
@@ -245,10 +245,10 @@
var response = (await _httpClient.PostAsync(_uri, contentStream, cancellationToken)).EnsureSuccessStatusCode();
_inputStream?.Dispose();
-#if NETSTANDARD2_0 || NETSTANDARD2_1
- _inputStream = await response.Content.ReadAsStreamAsync();
-#else
+#if NET5_0_OR_GREATER
_inputStream = await response.Content.ReadAsStreamAsync(cancellationToken);
+#else
+ _inputStream = await response.Content.ReadAsStreamAsync();
#endif
if (_inputStream.CanSeek)
{
diff --git a/lib/netstd/Thrift/Transport/Client/TNamedPipeTransport.cs b/lib/netstd/Thrift/Transport/Client/TNamedPipeTransport.cs
index 071c660..8e60f9f 100644
--- a/lib/netstd/Thrift/Transport/Client/TNamedPipeTransport.cs
+++ b/lib/netstd/Thrift/Transport/Client/TNamedPipeTransport.cs
@@ -76,10 +76,10 @@
}
CheckReadBytesAvailable(length);
-#if NETSTANDARD2_0
- var numRead = await PipeStream.ReadAsync(buffer, offset, length, cancellationToken);
-#else
+#if NET5_0_OR_GREATER
var numRead = await PipeStream.ReadAsync(new Memory<byte>(buffer, offset, length), cancellationToken);
+#else
+ var numRead = await PipeStream.ReadAsync(buffer, offset, length, cancellationToken);
#endif
CountConsumedMessageBytes(numRead);
return numRead;
@@ -98,10 +98,10 @@
var nBytes = Math.Min(15 * 4096, length); // 16 would exceed the limit
while (nBytes > 0)
{
-#if NETSTANDARD2_0
- await PipeStream.WriteAsync(buffer, offset, nBytes, cancellationToken);
-#else
+#if NET5_0_OR_GREATER
await PipeStream.WriteAsync(buffer.AsMemory(offset, nBytes), cancellationToken);
+#else
+ await PipeStream.WriteAsync(buffer, offset, nBytes, cancellationToken);
#endif
offset += nBytes;
length -= nBytes;
diff --git a/lib/netstd/Thrift/Transport/Client/TStreamTransport.cs b/lib/netstd/Thrift/Transport/Client/TStreamTransport.cs
index 55b636d..7237b8d 100644
--- a/lib/netstd/Thrift/Transport/Client/TStreamTransport.cs
+++ b/lib/netstd/Thrift/Transport/Client/TStreamTransport.cs
@@ -81,10 +81,10 @@
"Cannot read from null inputstream");
}
-#if NETSTANDARD2_0
- return await InputStream.ReadAsync(buffer, offset, length, cancellationToken);
-#else
+#if NET5_0_OR_GREATER
return await InputStream.ReadAsync(new Memory<byte>(buffer, offset, length), cancellationToken);
+#else
+ return await InputStream.ReadAsync(buffer, offset, length, cancellationToken);
#endif
}
@@ -96,10 +96,10 @@
"Cannot write to null outputstream");
}
-#if NETSTANDARD2_0
- await OutputStream.WriteAsync(buffer, offset, length, cancellationToken);
-#else
+#if NET5_0_OR_GREATER
await OutputStream.WriteAsync(buffer.AsMemory(offset, length), cancellationToken);
+#else
+ await OutputStream.WriteAsync(buffer, offset, length, cancellationToken);
#endif
}
diff --git a/lib/netstd/Thrift/Transport/Server/TNamedPipeServerTransport.cs b/lib/netstd/Thrift/Transport/Server/TNamedPipeServerTransport.cs
index 66018b0..b1ed91e 100644
--- a/lib/netstd/Thrift/Transport/Server/TNamedPipeServerTransport.cs
+++ b/lib/netstd/Thrift/Transport/Server/TNamedPipeServerTransport.cs
@@ -382,10 +382,10 @@
}
CheckReadBytesAvailable(length);
-#if NETSTANDARD2_0
- var numBytes = await PipeStream.ReadAsync(buffer, offset, length, cancellationToken);
-#else
+#if NET5_0_OR_GREATER
var numBytes = await PipeStream.ReadAsync(buffer.AsMemory(offset, length), cancellationToken);
+#else
+ var numBytes = await PipeStream.ReadAsync(buffer, offset, length, cancellationToken);
#endif
CountConsumedMessageBytes(numBytes);
return numBytes;
diff --git a/lib/ocaml/_oasis b/lib/ocaml/_oasis
index cd4a0c7..be1ce12 100644
--- a/lib/ocaml/_oasis
+++ b/lib/ocaml/_oasis
@@ -1,5 +1,5 @@
Name: libthrift-ocaml
-Version: 0.19.0
+Version: 0.20.0
OASISFormat: 0.3
Synopsis: OCaml bindings for the Apache Thrift RPC system
Authors: Apache Thrift Developers <dev@thrift.apache.org>
diff --git a/lib/perl/lib/Thrift.pm b/lib/perl/lib/Thrift.pm
index 08eb841..4b5f781 100644
--- a/lib/perl/lib/Thrift.pm
+++ b/lib/perl/lib/Thrift.pm
@@ -31,6 +31,6 @@
#
package Thrift;
-use version 0.77; our $VERSION = version->declare("v0.19.0");
+use version 0.77; our $VERSION = version->declare("v0.20.0");
1;
diff --git a/lib/php/lib/Exception/TException.php b/lib/php/lib/Exception/TException.php
index 7dbf832..228d761 100644
--- a/lib/php/lib/Exception/TException.php
+++ b/lib/php/lib/Exception/TException.php
@@ -52,7 +52,7 @@
}
}
} else {
- parent::__construct($p1, $p2);
+ parent::__construct((string)$p1, $p2);
}
}
diff --git a/lib/php/src/Thrift.php b/lib/php/src/Thrift.php
index 4fe4392..0364c90 100644
--- a/lib/php/src/Thrift.php
+++ b/lib/php/src/Thrift.php
@@ -82,7 +82,7 @@
}
}
} else {
- parent::__construct($p1, $p2);
+ parent::__construct((string)$p1, $p2);
}
}
diff --git a/lib/py/setup.py b/lib/py/setup.py
index 6e365f8..f5371af 100644
--- a/lib/py/setup.py
+++ b/lib/py/setup.py
@@ -105,7 +105,7 @@
twisted_deps = ['twisted']
setup(name='thrift',
- version='0.19.0',
+ version='0.20.0',
description='Python bindings for the Apache Thrift RPC system',
long_description=read_file("README.md"),
long_description_content_type="text/markdown",
diff --git a/lib/rb/thrift.gemspec b/lib/rb/thrift.gemspec
index f6ac77c..6b510c7 100644
--- a/lib/rb/thrift.gemspec
+++ b/lib/rb/thrift.gemspec
@@ -3,7 +3,7 @@
Gem::Specification.new do |s|
s.name = 'thrift'
- s.version = '0.19.0'
+ s.version = '0.20.0'
s.authors = ['Apache Thrift Developers']
s.email = ['dev@thrift.apache.org']
s.homepage = 'http://thrift.apache.org'
@@ -31,7 +31,7 @@
s.add_development_dependency 'pry', '~> 0.11.3'
s.add_development_dependency 'pry-byebug', '~> 3.6'
s.add_development_dependency 'pry-stack_explorer', '~> 0.4.9.2'
- s.add_development_dependency 'rack', '= 2.0.8'
+ s.add_development_dependency 'rack', '= 2.2.6.4'
s.add_development_dependency 'rack-test', '~> 0.8.3'
s.add_development_dependency 'rake', '~> 12.3'
s.add_development_dependency 'rspec', '~> 3.7'
diff --git a/lib/rs/Cargo.toml b/lib/rs/Cargo.toml
index 4b3c857..a6e8533 100644
--- a/lib/rs/Cargo.toml
+++ b/lib/rs/Cargo.toml
@@ -2,7 +2,7 @@
name = "thrift"
description = "Rust bindings for the Apache Thrift RPC system"
edition = "2021"
-version = "0.19.0"
+version = "0.20.0"
license = "Apache-2.0"
authors = ["Apache Thrift Developers <dev@thrift.apache.org>"]
homepage = "http://thrift.apache.org"
@@ -15,6 +15,7 @@
[dependencies]
byteorder = "1.3"
integer-encoding = "3.0.3"
+uuid = "1"
log = {version = "0.4", optional = true}
ordered-float = "3.0"
threadpool = {version = "1.7", optional = true}
@@ -22,3 +23,6 @@
[features]
default = ["server"]
server = ["threadpool", "log"]
+
+[dev-dependencies]
+uuid = { version = "*", features = ["v4"] }
diff --git a/lib/rs/src/errors.rs b/lib/rs/src/errors.rs
index fc26330..3cd77e5 100644
--- a/lib/rs/src/errors.rs
+++ b/lib/rs/src/errors.rs
@@ -441,6 +441,15 @@
}
}
+impl From<uuid::Error> for Error {
+ fn from(err: uuid::Error) -> Self {
+ Error::Protocol(ProtocolError {
+ kind: ProtocolErrorKind::InvalidData,
+ message: err.to_string(), // FIXME: use fmt::Error's debug string
+ })
+ }
+}
+
impl From<string::FromUtf8Error> for Error {
fn from(err: string::FromUtf8Error) -> Self {
Error::Protocol(ProtocolError {
diff --git a/lib/rs/src/protocol/binary.rs b/lib/rs/src/protocol/binary.rs
index 9f8af43..5da8018 100644
--- a/lib/rs/src/protocol/binary.rs
+++ b/lib/rs/src/protocol/binary.rs
@@ -190,6 +190,14 @@
self.transport.read_f64::<BigEndian>().map_err(From::from)
}
+ fn read_uuid(&mut self) -> crate::Result<uuid::Uuid> {
+ let mut buf = [0u8; 16];
+ self.transport
+ .read_exact(&mut buf)
+ .map(|_| uuid::Uuid::from_bytes(buf))
+ .map_err(From::from)
+ }
+
fn read_string(&mut self) -> crate::Result<String> {
let bytes = self.read_bytes()?;
String::from_utf8(bytes).map_err(From::from)
@@ -389,6 +397,12 @@
self.write_bytes(s.as_bytes())
}
+ fn write_uuid(&mut self, uuid: &uuid::Uuid) -> crate::Result<()> {
+ self.transport
+ .write_all(uuid.as_bytes())
+ .map_err(From::from)
+ }
+
fn write_list_begin(&mut self, identifier: &TListIdentifier) -> crate::Result<()> {
self.write_byte(field_type_to_u8(identifier.element_type))?;
self.write_i32(identifier.size)
@@ -470,8 +484,7 @@
TType::Map => 0x0D,
TType::Set => 0x0E,
TType::List => 0x0F,
- TType::Utf8 => 0x10,
- TType::Utf16 => 0x11,
+ TType::Uuid => 0x10,
}
}
@@ -490,8 +503,7 @@
0x0D => Ok(TType::Map),
0x0E => Ok(TType::Set),
0x0F => Ok(TType::List),
- 0x10 => Ok(TType::Utf8),
- 0x11 => Ok(TType::Utf16),
+ 0x10 => Ok(TType::Uuid),
unkn => Err(crate::Error::Protocol(ProtocolError {
kind: ProtocolErrorKind::InvalidData,
message: format!("cannot convert {} to TType", unkn),
@@ -886,6 +898,25 @@
}
#[test]
+ fn must_write_uuid() {
+ let (_, mut o_prot) = test_objects(true);
+ let uuid = uuid::Uuid::new_v4();
+ assert!(o_prot.write_uuid(&uuid).is_ok());
+ let buf = o_prot.transport.write_bytes();
+ assert_eq!(&buf, uuid.as_bytes());
+ }
+
+ #[test]
+ fn must_round_trip_uuid() {
+ let (mut i_prot, mut o_prot) = test_objects(true);
+ let uuid = uuid::uuid!("F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4");
+ assert!(o_prot.write_uuid(&uuid).is_ok());
+ copy_write_buffer_to_read_buffer!(o_prot);
+ let received_uuid = assert_success!(i_prot.read_uuid());
+ assert_eq!(&received_uuid, &uuid);
+ }
+
+ #[test]
fn must_round_trip_bytes() {
let (mut i_prot, mut o_prot) = test_objects(true);
diff --git a/lib/rs/src/protocol/compact.rs b/lib/rs/src/protocol/compact.rs
index 87cfbfc..a1aa253 100644
--- a/lib/rs/src/protocol/compact.rs
+++ b/lib/rs/src/protocol/compact.rs
@@ -252,6 +252,10 @@
.map_err(From::from)
}
+ fn read_uuid(&mut self) -> crate::Result<uuid::Uuid> {
+ uuid::Uuid::from_slice(&self.read_bytes()?).map_err(From::from)
+ }
+
fn read_string(&mut self) -> crate::Result<String> {
let bytes = self.read_bytes()?;
String::from_utf8(bytes).map_err(From::from)
@@ -538,6 +542,10 @@
.map_err(From::from)
}
+ fn write_uuid(&mut self, uuid: &uuid::Uuid) -> crate::Result<()> {
+ self.write_bytes(uuid.as_bytes())
+ }
+
fn write_string(&mut self, s: &str) -> crate::Result<()> {
self.write_bytes(s.as_bytes())
}
@@ -637,6 +645,7 @@
TType::Set => 0x0A,
TType::Map => 0x0B,
TType::Struct => 0x0C,
+ TType::Uuid => 0x0D,
_ => panic!("should not have attempted to convert {} to u8", field_type),
}
}
@@ -661,6 +670,7 @@
0x0A => Ok(TType::Set),
0x0B => Ok(TType::Map),
0x0C => Ok(TType::Struct),
+ 0x0D => Ok(TType::Uuid),
unkn => Err(crate::Error::Protocol(crate::ProtocolError {
kind: crate::ProtocolErrorKind::InvalidData,
message: format!("cannot convert {} into TType", unkn),
diff --git a/lib/rs/src/protocol/mod.rs b/lib/rs/src/protocol/mod.rs
index 019f717..8bbbb3c 100644
--- a/lib/rs/src/protocol/mod.rs
+++ b/lib/rs/src/protocol/mod.rs
@@ -171,6 +171,8 @@
fn read_i64(&mut self) -> crate::Result<i64>;
/// Read a 64-bit float.
fn read_double(&mut self) -> crate::Result<f64>;
+ /// Read a UUID.
+ fn read_uuid(&mut self) -> crate::Result<uuid::Uuid>;
/// Read a fixed-length string (not null terminated).
fn read_string(&mut self) -> crate::Result<String>;
/// Read the beginning of a list.
@@ -323,6 +325,8 @@
fn write_i64(&mut self, i: i64) -> crate::Result<()>;
/// Write a 64-bit float.
fn write_double(&mut self, d: f64) -> crate::Result<()>;
+ /// Write a UUID
+ fn write_uuid(&mut self, uuid: &uuid::Uuid) -> crate::Result<()>;
/// Write a fixed-length string.
fn write_string(&mut self, s: &str) -> crate::Result<()>;
/// Write the beginning of a list.
@@ -405,6 +409,10 @@
(**self).read_double()
}
+ fn read_uuid(&mut self) -> crate::Result<uuid::Uuid> {
+ (**self).read_uuid()
+ }
+
fn read_string(&mut self) -> crate::Result<String> {
(**self).read_string()
}
@@ -498,6 +506,10 @@
(**self).write_double(d)
}
+ fn write_uuid(&mut self, uuid: &uuid::Uuid) -> crate::Result<()> {
+ (**self).write_uuid(uuid)
+ }
+
fn write_string(&mut self, s: &str) -> crate::Result<()> {
(**self).write_string(s)
}
@@ -821,10 +833,8 @@
Set,
/// List.
List,
- /// UTF-8 string.
- Utf8,
- /// UTF-16 string. *Unsupported*.
- Utf16,
+ /// Uuid.
+ Uuid,
}
impl Display for TType {
@@ -844,8 +854,7 @@
TType::Map => write!(f, "map"),
TType::Set => write!(f, "set"),
TType::List => write!(f, "list"),
- TType::Utf8 => write!(f, "UTF8"),
- TType::Utf16 => write!(f, "UTF16"),
+ TType::Uuid => write!(f, "UUID"),
}
}
}
diff --git a/lib/rs/src/protocol/multiplexed.rs b/lib/rs/src/protocol/multiplexed.rs
index 697b7e6..48d4989 100644
--- a/lib/rs/src/protocol/multiplexed.rs
+++ b/lib/rs/src/protocol/multiplexed.rs
@@ -152,6 +152,10 @@
self.inner.write_string(s)
}
+ fn write_uuid(&mut self, uuid: &uuid::Uuid) -> crate::Result<()> {
+ self.inner.write_uuid(uuid)
+ }
+
fn write_list_begin(&mut self, identifier: &TListIdentifier) -> crate::Result<()> {
self.inner.write_list_begin(identifier)
}
diff --git a/lib/rs/src/protocol/stored.rs b/lib/rs/src/protocol/stored.rs
index 179ae07..f4bdfb1 100644
--- a/lib/rs/src/protocol/stored.rs
+++ b/lib/rs/src/protocol/stored.rs
@@ -158,6 +158,10 @@
self.inner.read_double()
}
+ fn read_uuid(&mut self) -> crate::Result<uuid::Uuid> {
+ self.inner.read_uuid()
+ }
+
fn read_string(&mut self) -> crate::Result<String> {
self.inner.read_string()
}
diff --git a/lib/rs/src/server/threaded.rs b/lib/rs/src/server/threaded.rs
index ad55b44..ee86395 100644
--- a/lib/rs/src/server/threaded.rs
+++ b/lib/rs/src/server/threaded.rs
@@ -183,6 +183,7 @@
for stream in listener.incoming() {
match stream {
Ok(s) => {
+ s.set_nodelay(true).ok();
let channel = TTcpChannel::with_stream(s);
self.handle_stream(channel)?;
}
diff --git a/lib/rs/test/Cargo.toml b/lib/rs/test/Cargo.toml
index a1c6836..4c64f38 100644
--- a/lib/rs/test/Cargo.toml
+++ b/lib/rs/test/Cargo.toml
@@ -10,6 +10,7 @@
clap = "~2.33"
bitflags = "=1.2"
log = "0.4"
+uuid = "1"
[dependencies.thrift]
path = "../"
diff --git a/lib/rs/test/thrifts/Base_One.thrift b/lib/rs/test/thrifts/Base_One.thrift
index c5fa6c2..f1214c9 100644
--- a/lib/rs/test/thrifts/Base_One.thrift
+++ b/lib/rs/test/thrifts/Base_One.thrift
@@ -74,6 +74,7 @@
1: string recipeName
2: string cuisine
3: i8 page
+ 4: uuid recipeId
}
union CookingTools {
diff --git a/lib/st/package.xml b/lib/st/package.xml
index 63dd3af..7af883e 100644
--- a/lib/st/package.xml
+++ b/lib/st/package.xml
@@ -17,7 +17,7 @@
specific language governing permissions and limitations
under the License.
-->
-<!-- Apache Thrift Smalltalk library version 0.19.0 -->
+<!-- Apache Thrift Smalltalk library version 0.20.0 -->
<package>
<name>libthrift-st</name>
<file>thrift.st</file>
diff --git a/lib/swift/Sources/Thrift.swift b/lib/swift/Sources/Thrift.swift
index df1b658..22981a0 100644
--- a/lib/swift/Sources/Thrift.swift
+++ b/lib/swift/Sources/Thrift.swift
@@ -1,3 +1,3 @@
class Thrift {
- let version = "0.19.0"
+ let version = "0.20.0"
}
diff --git a/lib/swift/Tests/ThriftTests/ThriftTests.swift b/lib/swift/Tests/ThriftTests/ThriftTests.swift
index aea9bc8..3c6854c 100644
--- a/lib/swift/Tests/ThriftTests/ThriftTests.swift
+++ b/lib/swift/Tests/ThriftTests/ThriftTests.swift
@@ -3,7 +3,7 @@
class ThriftTests: XCTestCase {
func testVersion() {
- XCTAssertEqual(Thrift().version, "0.19.0")
+ XCTAssertEqual(Thrift().version, "0.20.0")
}
static var allTests : [(String, (ThriftTests) -> () throws -> Void)] {
diff --git a/lib/ts/package-lock.json b/lib/ts/package-lock.json
index fed7fe4..b7a591b 100644
--- a/lib/ts/package-lock.json
+++ b/lib/ts/package-lock.json
@@ -1,391 +1,486 @@
{
"name": "thrift",
- "version": "0.19.0",
- "lockfileVersion": 1,
+ "version": "0.20.0",
+ "lockfileVersion": 3,
"requires": true,
- "dependencies": {
- "@babel/parser": {
+ "packages": {
+ "": {
+ "name": "thrift",
+ "version": "0.19.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bufferutil": "^4.0.1",
+ "jsdoc": "^3.6.7",
+ "json-int64": "^1.0.0",
+ "nopt": "^4.0.1"
+ },
+ "devDependencies": {
+ "@types/node-int64": "^0.4.29",
+ "@types/phantom": "^3.2.5",
+ "@types/qunit": "^2.5.4",
+ "browserify": "^16.2.3",
+ "bufferutil": "^4.0.1",
+ "grunt": "^1.4.1",
+ "grunt-cli": "^1.4.3",
+ "grunt-contrib-concat": "^1.0.1",
+ "grunt-contrib-jshint": "^3.2.0",
+ "grunt-contrib-qunit": "^3.1.0",
+ "grunt-contrib-uglify": "^1.0.1",
+ "grunt-jsdoc": "^2.4.1",
+ "grunt-shell-spawn": "^0.3.12",
+ "jslint": "^0.12.0",
+ "node-int64": "^0.4.0",
+ "phantom": "^6.0.3",
+ "typescript": "^3.2.4"
+ }
+ },
+ "node_modules/@babel/parser": {
"version": "7.19.3",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz",
- "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ=="
+ "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==",
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
},
- "@types/linkify-it": {
+ "node_modules/@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@dabh/diagnostics": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
+ "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
+ "dev": true,
+ "dependencies": {
+ "colorspace": "1.1.x",
+ "enabled": "2.0.x",
+ "kuler": "^2.0.0"
+ }
+ },
+ "node_modules/@types/linkify-it": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz",
"integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA=="
},
- "@types/markdown-it": {
+ "node_modules/@types/markdown-it": {
"version": "12.2.3",
"resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
"integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
- "requires": {
+ "dependencies": {
"@types/linkify-it": "*",
"@types/mdurl": "*"
}
},
- "@types/mdurl": {
+ "node_modules/@types/mdurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz",
"integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA=="
},
- "@types/node": {
+ "node_modules/@types/node": {
"version": "10.12.18",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz",
"integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==",
"dev": true
},
- "@types/node-int64": {
+ "node_modules/@types/node-int64": {
"version": "0.4.29",
"resolved": "https://registry.npmjs.org/@types/node-int64/-/node-int64-0.4.29.tgz",
"integrity": "sha512-rHXvenLTj/CcsmNAebaBOhxQ2MqEGl3yXZZcZ21XYR+gzGTTcpOy2N4IxpvTCz48loyQNatHvfn6GhIbbZ1R3Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"@types/node": "*"
}
},
- "@types/phantom": {
+ "node_modules/@types/phantom": {
"version": "3.2.5",
"resolved": "https://registry.npmjs.org/@types/phantom/-/phantom-3.2.5.tgz",
"integrity": "sha512-7m36DoKSvZgBGWp0xiJ74eHnuotyrpDyQ6m+lers5iMvW4QX+RvBENn7PCjNix7OVqPWlBM+7AqzYVIQ7NrKrA==",
"dev": true
},
- "@types/qunit": {
+ "node_modules/@types/qunit": {
"version": "2.5.4",
"resolved": "https://registry.npmjs.org/@types/qunit/-/qunit-2.5.4.tgz",
"integrity": "sha512-VHi2lEd4/zp8OOouf43JXGJJ5ZxHvdLL1dU0Yakp6Iy73SjpuXl7yjwAwmh1qhTv8krDgHteSwaySr++uXX9YQ==",
"dev": true
},
- "JSONStream": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
- "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
- "dev": true,
- "requires": {
- "jsonparse": "^1.2.0",
- "through": ">=2.2.7 <3"
- }
+ "node_modules/@types/triple-beam": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz",
+ "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==",
+ "dev": true
},
- "abbrev": {
+ "node_modules/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
},
- "acorn": {
+ "node_modules/acorn": {
"version": "6.4.2",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
"integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
- "acorn-dynamic-import": {
+ "node_modules/acorn-dynamic-import": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz",
"integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==",
- "dev": true
+ "deprecated": "This is probably built in to whatever tool you're using. If you still need it... idk",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0"
+ }
},
- "acorn-node": {
+ "node_modules/acorn-node": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.2.tgz",
"integrity": "sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==",
"dev": true,
- "requires": {
+ "dependencies": {
"acorn": "^6.0.2",
"acorn-dynamic-import": "^4.0.0",
"acorn-walk": "^6.1.0",
"xtend": "^4.0.1"
}
},
- "acorn-walk": {
+ "node_modules/acorn-walk": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz",
"integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
- "ajv": {
+ "node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
- "requires": {
+ "dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
- "dependencies": {
- "fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
- }
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "align-text": {
+ "node_modules/ajv/node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/align-text": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
"integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
"dev": true,
- "requires": {
+ "dependencies": {
"kind-of": "^3.0.2",
"longest": "^1.0.1",
"repeat-string": "^1.5.2"
},
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "ansi-regex": {
+ "node_modules/align-text/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "ansi-styles": {
+ "node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
- "requires": {
+ "dependencies": {
"color-convert": "^2.0.1"
},
- "dependencies": {
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- }
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "argparse": {
+ "node_modules/ansi-styles/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/ansi-styles/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- },
"dependencies": {
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
- }
+ "sprintf-js": "~1.0.2"
}
},
- "array-each": {
+ "node_modules/argparse/node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "node_modules/array-each": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
"integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "array-find-index": {
+ "node_modules/array-find-index": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
"integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "array-slice": {
+ "node_modules/array-slice": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
"integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "asn1": {
+ "node_modules/asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
"dev": true,
- "requires": {
+ "dependencies": {
"safer-buffer": "~2.1.0"
}
},
- "asn1.js": {
+ "node_modules/asn1.js": {
"version": "4.10.1",
"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
"integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
"dev": true,
- "requires": {
+ "dependencies": {
"bn.js": "^4.0.0",
"inherits": "^2.0.1",
"minimalistic-assert": "^1.0.0"
}
},
- "assert": {
+ "node_modules/assert": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
"integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
"dev": true,
- "requires": {
- "util": "0.10.3"
- },
"dependencies": {
- "inherits": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
- "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
- "dev": true
- },
- "util": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
- "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
- "dev": true,
- "requires": {
- "inherits": "2.0.1"
- }
- }
+ "util": "0.10.3"
}
},
- "assert-plus": {
+ "node_modules/assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/assert/node_modules/inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
"dev": true
},
- "async": {
+ "node_modules/assert/node_modules/util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "dev": true,
+ "dependencies": {
+ "inherits": "2.0.1"
+ }
+ },
+ "node_modules/async": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
"dev": true
},
- "async-limiter": {
+ "node_modules/async-limiter": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
"integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
"dev": true
},
- "asynckit": {
+ "node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
"dev": true
},
- "aws-sign2": {
+ "node_modules/aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
},
- "aws4": {
+ "node_modules/aws4": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
"integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
"dev": true
},
- "balanced-match": {
+ "node_modules/balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
- "base64-js": {
+ "node_modules/base64-js": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
"integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
"dev": true
},
- "bcrypt-pbkdf": {
+ "node_modules/bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"dev": true,
- "requires": {
+ "dependencies": {
"tweetnacl": "^0.14.3"
}
},
- "bluebird": {
+ "node_modules/bluebird": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
},
- "bn.js": {
+ "node_modules/bn.js": {
"version": "4.11.8",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
"integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
"dev": true
},
- "brace-expansion": {
+ "node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
- "requires": {
+ "dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
- "braces": {
+ "node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
- "requires": {
+ "dependencies": {
"fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "brorand": {
+ "node_modules/brorand": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
"integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
"dev": true
},
- "browser-pack": {
+ "node_modules/browser-pack": {
"version": "6.1.0",
"resolved": "http://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
"integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
"dev": true,
- "requires": {
- "JSONStream": "^1.0.3",
+ "dependencies": {
"combine-source-map": "~0.8.0",
"defined": "^1.0.0",
+ "JSONStream": "^1.0.3",
"safe-buffer": "^5.1.1",
"through2": "^2.0.0",
"umd": "^3.0.0"
+ },
+ "bin": {
+ "browser-pack": "bin/cmd.js"
}
},
- "browser-resolve": {
+ "node_modules/browser-resolve": {
"version": "1.11.3",
"resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
"integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
"dev": true,
- "requires": {
- "resolve": "1.1.7"
- },
"dependencies": {
- "resolve": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
- "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
- "dev": true
- }
+ "resolve": "1.1.7"
}
},
- "browserify": {
+ "node_modules/browser-resolve/node_modules/resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
+ "dev": true
+ },
+ "node_modules/browserify": {
"version": "16.2.3",
"resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz",
"integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==",
"dev": true,
- "requires": {
- "JSONStream": "^1.0.3",
+ "dependencies": {
"assert": "^1.4.0",
"browser-pack": "^6.0.1",
"browser-resolve": "^1.11.0",
@@ -407,6 +502,7 @@
"https-browserify": "^1.0.0",
"inherits": "~2.0.1",
"insert-module-globals": "^7.0.0",
+ "JSONStream": "^1.0.3",
"labeled-stream-splicer": "^2.0.0",
"mkdirp": "^0.5.0",
"module-deps": "^6.0.0",
@@ -433,14 +529,20 @@
"util": "~0.10.1",
"vm-browserify": "^1.0.0",
"xtend": "^4.0.0"
+ },
+ "bin": {
+ "browserify": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">= 0.8"
}
},
- "browserify-aes": {
+ "node_modules/browserify-aes": {
"version": "1.2.0",
"resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
"integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
"dev": true,
- "requires": {
+ "dependencies": {
"buffer-xor": "^1.0.3",
"cipher-base": "^1.0.0",
"create-hash": "^1.1.0",
@@ -449,45 +551,45 @@
"safe-buffer": "^5.0.1"
}
},
- "browserify-cipher": {
+ "node_modules/browserify-cipher": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
"integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
"dev": true,
- "requires": {
+ "dependencies": {
"browserify-aes": "^1.0.4",
"browserify-des": "^1.0.0",
"evp_bytestokey": "^1.0.0"
}
},
- "browserify-des": {
+ "node_modules/browserify-des": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
"integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
"dev": true,
- "requires": {
+ "dependencies": {
"cipher-base": "^1.0.1",
"des.js": "^1.0.0",
"inherits": "^2.0.1",
"safe-buffer": "^5.1.2"
}
},
- "browserify-rsa": {
+ "node_modules/browserify-rsa": {
"version": "4.0.1",
"resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
"integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
"dev": true,
- "requires": {
+ "dependencies": {
"bn.js": "^4.1.0",
"randombytes": "^2.0.1"
}
},
- "browserify-sign": {
+ "node_modules/browserify-sign": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
"integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
"dev": true,
- "requires": {
+ "dependencies": {
"bn.js": "^4.1.1",
"browserify-rsa": "^4.0.0",
"create-hash": "^1.1.0",
@@ -497,295 +599,327 @@
"parse-asn1": "^5.0.0"
}
},
- "browserify-zlib": {
+ "node_modules/browserify-zlib": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
"integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
"dev": true,
- "requires": {
+ "dependencies": {
"pako": "~1.0.5"
}
},
- "buffer": {
+ "node_modules/buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
"integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
"dev": true,
- "requires": {
+ "dependencies": {
"base64-js": "^1.0.2",
"ieee754": "^1.1.4"
}
},
- "buffer-crc32": {
+ "node_modules/buffer-crc32": {
"version": "0.2.13",
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
"integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
},
- "buffer-from": {
+ "node_modules/buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
"dev": true
},
- "buffer-shims": {
+ "node_modules/buffer-shims": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
"integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=",
"dev": true
},
- "buffer-xor": {
+ "node_modules/buffer-xor": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
"integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
"dev": true
},
- "bufferutil": {
+ "node_modules/bufferutil": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.1.tgz",
"integrity": "sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA==",
- "requires": {
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
"node-gyp-build": "~3.7.0"
}
},
- "builtin-modules": {
+ "node_modules/builtin-modules": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
"integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "builtin-status-codes": {
+ "node_modules/builtin-status-codes": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
"integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
"dev": true
},
- "cached-path-relative": {
+ "node_modules/cached-path-relative": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz",
"integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==",
"dev": true
},
- "camelcase": {
+ "node_modules/camelcase": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
"integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "camelcase-keys": {
+ "node_modules/camelcase-keys": {
"version": "2.1.0",
"resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
"integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
"dev": true,
- "requires": {
+ "dependencies": {
"camelcase": "^2.0.0",
"map-obj": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "caseless": {
+ "node_modules/caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
"dev": true
},
- "catharsis": {
+ "node_modules/catharsis": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
"integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==",
- "requires": {
+ "dependencies": {
"lodash": "^4.17.15"
+ },
+ "engines": {
+ "node": ">= 10"
}
},
- "center-align": {
+ "node_modules/center-align": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
"integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
"dev": true,
- "requires": {
+ "dependencies": {
"align-text": "^0.1.3",
"lazy-cache": "^1.0.3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "chalk": {
+ "node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
- "requires": {
+ "dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "cipher-base": {
+ "node_modules/cipher-base": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
"integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "^2.0.1",
"safe-buffer": "^5.0.1"
}
},
- "cli": {
+ "node_modules/cli": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
"integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==",
"dev": true,
- "requires": {
+ "dependencies": {
"exit": "0.1.2",
"glob": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=0.2.5"
}
},
- "cliui": {
+ "node_modules/cliui": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
"integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
"dev": true,
- "requires": {
+ "dependencies": {
"center-align": "^0.1.1",
"right-align": "^0.1.1",
"wordwrap": "0.0.2"
}
},
- "color": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz",
- "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==",
+ "node_modules/color": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
+ "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
"dev": true,
- "requires": {
- "color-convert": "^1.9.1",
- "color-string": "^1.5.2"
+ "dependencies": {
+ "color-convert": "^1.9.3",
+ "color-string": "^1.6.0"
}
},
- "color-convert": {
+ "node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
- "requires": {
+ "dependencies": {
"color-name": "1.1.3"
}
},
- "color-name": {
+ "node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true
},
- "color-string": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz",
- "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==",
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
"dev": true,
- "requires": {
+ "dependencies": {
"color-name": "^1.0.0",
"simple-swizzle": "^0.2.2"
}
},
- "colornames": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz",
- "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=",
- "dev": true
- },
- "colors": {
+ "node_modules/colors": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
"integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
- "dev": true
- },
- "colorspace": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.1.tgz",
- "integrity": "sha512-pI3btWyiuz7Ken0BWh9Elzsmv2bM9AhA7psXib4anUXy/orfZ/E0MbQwhSOG/9L8hLlalqrU0UhOuqxW1YjmVw==",
"dev": true,
- "requires": {
- "color": "3.0.x",
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/colorspace": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
+ "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
+ "dev": true,
+ "dependencies": {
+ "color": "^3.1.3",
"text-hex": "1.0.x"
}
},
- "combine-source-map": {
+ "node_modules/combine-source-map": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
"integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=",
"dev": true,
- "requires": {
+ "dependencies": {
"convert-source-map": "~1.1.0",
"inline-source-map": "~0.6.0",
"lodash.memoize": "~3.0.3",
"source-map": "~0.5.3"
}
},
- "combined-stream": {
+ "node_modules/combined-stream": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
"integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
"dev": true,
- "requires": {
+ "dependencies": {
"delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
}
},
- "concat-map": {
+ "node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
- "concat-stream": {
+ "node_modules/concat-stream": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
"dev": true,
- "requires": {
+ "engines": [
+ "node >= 0.8"
+ ],
+ "dependencies": {
"buffer-from": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^2.2.2",
"typedarray": "^0.0.6"
}
},
- "console-browserify": {
+ "node_modules/console-browserify": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
"integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
"dev": true,
- "requires": {
+ "dependencies": {
"date-now": "^0.1.4"
}
},
- "constants-browserify": {
+ "node_modules/constants-browserify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
"integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
"dev": true
},
- "convert-source-map": {
+ "node_modules/convert-source-map": {
"version": "1.1.3",
"resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
"integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=",
"dev": true
},
- "core-util-is": {
+ "node_modules/core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true
},
- "create-ecdh": {
+ "node_modules/create-ecdh": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
"integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
"dev": true,
- "requires": {
+ "dependencies": {
"bn.js": "^4.1.0",
"elliptic": "^6.0.0"
}
},
- "create-hash": {
+ "node_modules/create-hash": {
"version": "1.2.0",
"resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
"integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
"dev": true,
- "requires": {
+ "dependencies": {
"cipher-base": "^1.0.1",
"inherits": "^2.0.1",
"md5.js": "^1.3.4",
@@ -793,12 +927,12 @@
"sha.js": "^2.4.0"
}
},
- "create-hmac": {
+ "node_modules/create-hmac": {
"version": "1.1.7",
"resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
"integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
"dev": true,
- "requires": {
+ "dependencies": {
"cipher-base": "^1.0.3",
"create-hash": "^1.1.0",
"inherits": "^2.0.1",
@@ -807,34 +941,41 @@
"sha.js": "^2.4.8"
}
},
- "cross-spawn": {
+ "node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
- "requires": {
+ "dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
},
- "dependencies": {
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- }
+ "engines": {
+ "node": ">= 8"
}
},
- "crypto-browserify": {
+ "node_modules/cross-spawn/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-browserify": {
"version": "3.12.0",
"resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
"integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
"dev": true,
- "requires": {
+ "dependencies": {
"browserify-cipher": "^1.0.0",
"browserify-sign": "^4.0.0",
"create-ecdh": "^4.0.0",
@@ -846,206 +987,236 @@
"public-encrypt": "^4.0.0",
"randombytes": "^2.0.0",
"randomfill": "^1.0.3"
+ },
+ "engines": {
+ "node": "*"
}
},
- "currently-unhandled": {
+ "node_modules/currently-unhandled": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
"integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
"dev": true,
- "requires": {
+ "dependencies": {
"array-find-index": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "dashdash": {
+ "node_modules/dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"dev": true,
- "requires": {
+ "dependencies": {
"assert-plus": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10"
}
},
- "date-now": {
+ "node_modules/date-now": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
"integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
"dev": true
},
- "dateformat": {
+ "node_modules/dateformat": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
"integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
},
- "debug": {
+ "node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
- "requires": {
+ "dependencies": {
"ms": "2.0.0"
}
},
- "decamelize": {
+ "node_modules/decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "defined": {
+ "node_modules/defined": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
"integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
"dev": true
},
- "delayed-stream": {
+ "node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
- "deps-sort": {
+ "node_modules/deps-sort": {
"version": "2.0.0",
"resolved": "http://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz",
"integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=",
"dev": true,
- "requires": {
+ "dependencies": {
"JSONStream": "^1.0.3",
"shasum": "^1.0.0",
"subarg": "^1.0.0",
"through2": "^2.0.0"
+ },
+ "bin": {
+ "deps-sort": "bin/cmd.js"
}
},
- "des.js": {
+ "node_modules/des.js": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
"integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "^2.0.1",
"minimalistic-assert": "^1.0.0"
}
},
- "detect-file": {
+ "node_modules/detect-file": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
"integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "detective": {
+ "node_modules/detective": {
"version": "5.1.0",
"resolved": "http://registry.npmjs.org/detective/-/detective-5.1.0.tgz",
"integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"acorn-node": "^1.3.0",
"defined": "^1.0.0",
"minimist": "^1.1.1"
+ },
+ "bin": {
+ "detective": "bin/detective.js"
+ },
+ "engines": {
+ "node": ">=0.8.0"
}
},
- "diagnostics": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz",
- "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==",
- "dev": true,
- "requires": {
- "colorspace": "1.1.x",
- "enabled": "1.0.x",
- "kuler": "1.0.x"
- }
- },
- "diffie-hellman": {
+ "node_modules/diffie-hellman": {
"version": "5.0.3",
"resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
"integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
"dev": true,
- "requires": {
+ "dependencies": {
"bn.js": "^4.1.0",
"miller-rabin": "^4.0.0",
"randombytes": "^2.0.0"
}
},
- "dom-serializer": {
+ "node_modules/dom-serializer": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
"integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
"dev": true,
- "requires": {
+ "dependencies": {
"domelementtype": "^2.0.1",
"entities": "^2.0.0"
- },
- "dependencies": {
- "domelementtype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
- "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
- "dev": true
- },
- "entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
- "dev": true
- }
}
},
- "domain-browser": {
+ "node_modules/dom-serializer/node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/dom-serializer/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/domain-browser": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
"integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.4",
+ "npm": ">=1.2"
+ }
},
- "domelementtype": {
+ "node_modules/domelementtype": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
"integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
"dev": true
},
- "domhandler": {
+ "node_modules/domhandler": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
"integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"domelementtype": "1"
}
},
- "domutils": {
+ "node_modules/domutils": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
"integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==",
"dev": true,
- "requires": {
+ "dependencies": {
"dom-serializer": "0",
"domelementtype": "1"
}
},
- "duplexer2": {
+ "node_modules/duplexer2": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
"integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
"dev": true,
- "requires": {
+ "dependencies": {
"readable-stream": "^2.0.2"
}
},
- "ecc-jsbn": {
+ "node_modules/ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"dev": true,
- "requires": {
+ "dependencies": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
- "elliptic": {
+ "node_modules/elliptic": {
"version": "6.5.4",
"resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
"integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"bn.js": "^4.11.9",
"brorand": "^1.1.0",
"hash.js": "^1.0.0",
@@ -1053,381 +1224,439 @@
"inherits": "^2.0.4",
"minimalistic-assert": "^1.0.1",
"minimalistic-crypto-utils": "^1.0.1"
- },
- "dependencies": {
- "bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- }
}
},
- "enabled": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz",
- "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=",
- "dev": true,
- "requires": {
- "env-variable": "0.0.x"
- }
+ "node_modules/elliptic/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
},
- "entities": {
+ "node_modules/elliptic/node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/enabled": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
+ "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==",
+ "dev": true
+ },
+ "node_modules/entities": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
"integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==",
"dev": true
},
- "env-variable": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz",
- "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==",
- "dev": true
- },
- "error-ex": {
+ "node_modules/error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
"integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-arrayish": "^0.2.1"
}
},
- "es6-promise": {
+ "node_modules/es6-promise": {
"version": "4.2.5",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
"integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==",
"dev": true
},
- "es6-promisify": {
+ "node_modules/es6-promisify": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
"integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
"dev": true,
- "requires": {
+ "dependencies": {
"es6-promise": "^4.0.3"
}
},
- "escape-string-regexp": {
+ "node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
},
- "esprima": {
+ "node_modules/esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
},
- "eventemitter2": {
+ "node_modules/eventemitter2": {
"version": "0.4.14",
"resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
"integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
"dev": true
},
- "events": {
+ "node_modules/events": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz",
"integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
},
- "evp_bytestokey": {
+ "node_modules/evp_bytestokey": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
"integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
"dev": true,
- "requires": {
+ "dependencies": {
"md5.js": "^1.3.4",
"safe-buffer": "^5.1.1"
}
},
- "exit": {
+ "node_modules/exit": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
"integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
},
- "expand-tilde": {
+ "node_modules/expand-tilde": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
"integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
"dev": true,
- "requires": {
+ "dependencies": {
"homedir-polyfill": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "extend": {
+ "node_modules/extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"dev": true
},
- "extract-zip": {
+ "node_modules/extract-zip": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz",
"integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==",
"dev": true,
- "requires": {
+ "dependencies": {
"concat-stream": "^1.6.2",
"debug": "^2.6.9",
"mkdirp": "^0.5.4",
"yauzl": "^2.10.0"
+ },
+ "bin": {
+ "extract-zip": "cli.js"
}
},
- "extsprintf": {
+ "node_modules/extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
- "dev": true
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ]
},
- "fast-json-stable-stringify": {
+ "node_modules/fast-json-stable-stringify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
"dev": true
},
- "fast-safe-stringify": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz",
- "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==",
- "dev": true
- },
- "fd-slicer": {
+ "node_modules/fd-slicer": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
"integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
"dev": true,
- "requires": {
+ "dependencies": {
"pend": "~1.2.0"
}
},
- "fecha": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz",
- "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==",
+ "node_modules/fecha": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
+ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==",
"dev": true
},
- "figures": {
+ "node_modules/figures": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
"integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
"dev": true,
- "requires": {
+ "dependencies": {
"escape-string-regexp": "^1.0.5",
"object-assign": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "fill-range": {
+ "node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "find-up": {
+ "node_modules/find-up": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
"integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
"dev": true,
- "requires": {
+ "dependencies": {
"path-exists": "^2.0.0",
"pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "findup-sync": {
+ "node_modules/findup-sync": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
"integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
"dev": true,
- "requires": {
+ "dependencies": {
"glob": "~5.0.0"
},
- "dependencies": {
- "glob": {
- "version": "5.0.15",
- "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
- "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
- "dev": true,
- "requires": {
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "2 || 3",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- }
+ "engines": {
+ "node": ">= 0.6.0"
}
},
- "fined": {
+ "node_modules/findup-sync/node_modules/glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "dependencies": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/fined": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
"integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
"dev": true,
- "requires": {
+ "dependencies": {
"expand-tilde": "^2.0.2",
"is-plain-object": "^2.0.3",
"object.defaults": "^1.1.0",
"object.pick": "^1.2.0",
"parse-filepath": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
}
},
- "flagged-respawn": {
+ "node_modules/flagged-respawn": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
"integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/fn.name": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
+ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==",
"dev": true
},
- "for-in": {
+ "node_modules/for-in": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
"integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "for-own": {
+ "node_modules/for-own": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
"integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
"dev": true,
- "requires": {
+ "dependencies": {
"for-in": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "forever-agent": {
+ "node_modules/forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
},
- "form-data": {
+ "node_modules/form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
}
},
- "fs-extra": {
+ "node_modules/fs-extra": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
"integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=",
"dev": true,
- "requires": {
+ "dependencies": {
"graceful-fs": "^4.1.2",
"jsonfile": "^2.1.0",
"klaw": "^1.0.0"
- },
- "dependencies": {
- "klaw": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
- "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.9"
- }
- }
}
},
- "fs.realpath": {
+ "node_modules/fs-extra/node_modules/klaw": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
+ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
+ "dev": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.9"
+ }
+ },
+ "node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
- "function-bind": {
+ "node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
- "get-assigned-identifiers": {
+ "node_modules/get-assigned-identifiers": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
"integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==",
"dev": true
},
- "get-stdin": {
+ "node_modules/get-stdin": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
"integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "getobject": {
+ "node_modules/getobject": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz",
"integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
},
- "getpass": {
+ "node_modules/getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"dev": true,
- "requires": {
+ "dependencies": {
"assert-plus": "^1.0.0"
}
},
- "glob": {
+ "node_modules/glob": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
}
},
- "global-modules": {
+ "node_modules/global-modules": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
"integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
"dev": true,
- "requires": {
+ "dependencies": {
"global-prefix": "^1.0.1",
"is-windows": "^1.0.1",
"resolve-dir": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "global-prefix": {
+ "node_modules/global-prefix": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
"integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
"dev": true,
- "requires": {
+ "dependencies": {
"expand-tilde": "^2.0.2",
"homedir-polyfill": "^1.0.1",
"ini": "^1.3.4",
"is-windows": "^1.0.1",
"which": "^1.2.14"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "graceful-fs": {
+ "node_modules/graceful-fs": {
"version": "4.1.15",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
},
- "grunt": {
+ "node_modules/grunt": {
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.3.tgz",
"integrity": "sha512-mKwmo4X2d8/4c/BmcOETHek675uOqw0RuA/zy12jaspWqvTp4+ZeQF1W+OTpcbncnaBsfbQJ6l0l4j+Sn/GmaQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"dateformat": "~3.0.3",
"eventemitter2": "~0.4.13",
"exit": "~0.1.2",
@@ -1444,220 +1673,225 @@
"nopt": "~3.0.6",
"rimraf": "~3.0.2"
},
- "dependencies": {
- "glob": {
- "version": "7.1.7",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
- "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "minimatch": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
- "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true
- },
- "nopt": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
- "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
- "dev": true,
- "requires": {
- "abbrev": "1"
- }
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- }
+ "bin": {
+ "grunt": "bin/grunt"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "grunt-cli": {
+ "node_modules/grunt-cli": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz",
"integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"grunt-known-options": "~2.0.0",
"interpret": "~1.1.0",
"liftup": "~3.0.1",
"nopt": "~4.0.1",
"v8flags": "~3.2.0"
+ },
+ "bin": {
+ "grunt": "bin/grunt"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "grunt-contrib-concat": {
+ "node_modules/grunt-contrib-concat": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz",
"integrity": "sha1-YVCYYwhOhx1+ht5IwBUlntl3Rb0=",
"dev": true,
- "requires": {
+ "dependencies": {
"chalk": "^1.0.0",
"source-map": "^0.5.3"
},
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "peerDependencies": {
+ "grunt": ">=0.4.0"
}
},
- "grunt-contrib-jshint": {
+ "node_modules/grunt-contrib-concat/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/grunt-contrib-concat/node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/grunt-contrib-concat/node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/grunt-contrib-jshint": {
"version": "3.2.0",
"resolved": "http://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-3.2.0.tgz",
"integrity": "sha512-pcXWCSZWfoMSvcV4BwH21TUtLtcX0Ms8IGuOPIcLeXK3fud9KclY7iqMKY94jFx8TxZzh028YYtpR+io8DiEaQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"chalk": "~4.1.2",
"hooker": "^0.2.3",
"jshint": "~2.13.4"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "grunt-contrib-qunit": {
+ "node_modules/grunt-contrib-qunit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/grunt-contrib-qunit/-/grunt-contrib-qunit-3.1.0.tgz",
"integrity": "sha512-mdk8UltH6mxCD63E0hTXMAts42DOi4z4bBBrY7qnuHiShflMF7IueSMYe0zWaZ2dO8mgujh57Zfny2EbigJhRg==",
"dev": true,
- "requires": {
+ "dependencies": {
"eventemitter2": "^5.0.1",
"p-each-series": "^1.0.0",
"puppeteer": "^1.11.0"
},
- "dependencies": {
- "eventemitter2": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz",
- "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=",
- "dev": true
- }
+ "engines": {
+ "node": ">=6"
}
},
- "grunt-contrib-uglify": {
+ "node_modules/grunt-contrib-qunit/node_modules/eventemitter2": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz",
+ "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=",
+ "dev": true
+ },
+ "node_modules/grunt-contrib-uglify": {
"version": "1.0.2",
"resolved": "http://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-1.0.2.tgz",
"integrity": "sha1-rmekb5FT7dTLEYE6Vetpxw19svs=",
"dev": true,
- "requires": {
+ "dependencies": {
"chalk": "^1.0.0",
"lodash": "^4.0.1",
"maxmin": "^1.1.0",
"uglify-js": "~2.6.2",
"uri-path": "^1.0.0"
},
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "grunt-jsdoc": {
+ "node_modules/grunt-contrib-uglify/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/grunt-contrib-uglify/node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/grunt-contrib-uglify/node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/grunt-jsdoc": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/grunt-jsdoc/-/grunt-jsdoc-2.4.1.tgz",
"integrity": "sha512-S0zxU0wDewRu7z+vijEItOWe/UttxWVmvz0qz2ZVcAYR2GpXjsiski2CAVN0b18t2qeVLdmxZkJaEWCOsKzcAw==",
"dev": true,
- "requires": {
+ "dependencies": {
"cross-spawn": "^7.0.1",
"jsdoc": "^3.6.3"
+ },
+ "bin": {
+ "grunt-jsdoc": "bin/grunt-jsdoc"
+ },
+ "engines": {
+ "node": ">= 8.12.0"
}
},
- "grunt-known-options": {
+ "node_modules/grunt-known-options": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz",
"integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "grunt-legacy-log": {
+ "node_modules/grunt-legacy-log": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz",
"integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==",
"dev": true,
- "requires": {
+ "dependencies": {
"colors": "~1.1.2",
"grunt-legacy-log-utils": "~2.1.0",
"hooker": "~0.2.3",
"lodash": "~4.17.19"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
}
},
- "grunt-legacy-log-utils": {
+ "node_modules/grunt-legacy-log-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz",
"integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==",
"dev": true,
- "requires": {
+ "dependencies": {
"chalk": "~4.1.0",
"lodash": "~4.17.19"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "grunt-legacy-util": {
+ "node_modules/grunt-legacy-util": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz",
"integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==",
"dev": true,
- "requires": {
+ "dependencies": {
"async": "~3.2.0",
"exit": "~0.1.2",
"getobject": "~1.0.0",
@@ -1666,507 +1900,683 @@
"underscore.string": "~3.3.5",
"which": "~2.0.2"
},
- "dependencies": {
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- }
+ "engines": {
+ "node": ">=10"
}
},
- "grunt-shell-spawn": {
+ "node_modules/grunt-legacy-util/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/grunt-shell-spawn": {
"version": "0.3.12",
"resolved": "https://registry.npmjs.org/grunt-shell-spawn/-/grunt-shell-spawn-0.3.12.tgz",
"integrity": "sha512-TprZct92sQ4M2Q92piaeLsCrx4+gq/ageuxjZsRG6cglKt7x7rGA3YHt8D30+G789v+/pw4l0tDjEyrkMXx2tA==",
"dev": true,
- "requires": {
+ "dependencies": {
"grunt": ">=0.4.x"
+ },
+ "bin": {
+ "grunt-shell-spawn": "bin/grunt-shell-spawn"
+ },
+ "engines": {
+ "node": ">=0.12.0"
}
},
- "gzip-size": {
+ "node_modules/grunt/node_modules/glob": {
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/grunt/node_modules/minimatch": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
+ "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/grunt/node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/grunt/node_modules/nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "dependencies": {
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ }
+ },
+ "node_modules/grunt/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/gzip-size": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz",
"integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=",
"dev": true,
- "requires": {
+ "dependencies": {
"browserify-zlib": "^0.1.4",
"concat-stream": "^1.4.1"
},
- "dependencies": {
- "browserify-zlib": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
- "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
- "dev": true,
- "requires": {
- "pako": "~0.2.0"
- }
- },
- "pako": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
- "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
- "dev": true
- }
+ "bin": {
+ "gzip-size": "cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "har-schema": {
+ "node_modules/gzip-size/node_modules/browserify-zlib": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
+ "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
+ "dev": true,
+ "dependencies": {
+ "pako": "~0.2.0"
+ }
+ },
+ "node_modules/gzip-size/node_modules/pako": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+ "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
+ "dev": true
+ },
+ "node_modules/har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "har-validator": {
+ "node_modules/har-validator": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
"integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+ "deprecated": "this library is no longer supported",
"dev": true,
- "requires": {
+ "dependencies": {
"ajv": "^6.5.5",
"har-schema": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "has": {
+ "node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
- "requires": {
+ "dependencies": {
"function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
}
},
- "has-ansi": {
+ "node_modules/has-ansi": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
"dev": true,
- "requires": {
+ "dependencies": {
"ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "has-flag": {
+ "node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "hash-base": {
+ "node_modules/hash-base": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
"integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "^2.0.1",
"safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "hash.js": {
+ "node_modules/hash.js": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
"integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "^2.0.3",
"minimalistic-assert": "^1.0.1"
}
},
- "hasha": {
+ "node_modules/hasha": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz",
"integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=",
"dev": true,
- "requires": {
+ "dependencies": {
"is-stream": "^1.0.1",
"pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "hmac-drbg": {
+ "node_modules/hmac-drbg": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
"integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
"dev": true,
- "requires": {
+ "dependencies": {
"hash.js": "^1.0.3",
"minimalistic-assert": "^1.0.0",
"minimalistic-crypto-utils": "^1.0.1"
}
},
- "homedir-polyfill": {
+ "node_modules/homedir-polyfill": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
"integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
"dev": true,
- "requires": {
+ "dependencies": {
"parse-passwd": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "hooker": {
+ "node_modules/hooker": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
"integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
},
- "hosted-git-info": {
+ "node_modules/hosted-git-info": {
"version": "2.8.9",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"dev": true
},
- "htmlescape": {
+ "node_modules/htmlescape": {
"version": "1.1.1",
"resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
"integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10"
+ }
},
- "htmlparser2": {
+ "node_modules/htmlparser2": {
"version": "3.8.3",
"resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
"integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"domelementtype": "1",
"domhandler": "2.3",
"domutils": "1.5",
"entities": "1.0",
"readable-stream": "1.1"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
- "dev": true
- },
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
- "dev": true
- }
}
},
- "http-signature": {
+ "node_modules/htmlparser2/node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+ "dev": true
+ },
+ "node_modules/htmlparser2/node_modules/readable-stream": {
+ "version": "1.1.14",
+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/htmlparser2/node_modules/string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
+ "dev": true
+ },
+ "node_modules/http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"dev": true,
- "requires": {
+ "dependencies": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
+ },
+ "engines": {
+ "node": ">=0.8",
+ "npm": ">=1.3.7"
}
},
- "https-browserify": {
+ "node_modules/https-browserify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
"integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
"dev": true
},
- "https-proxy-agent": {
+ "node_modules/https-proxy-agent": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
"integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
"dev": true,
- "requires": {
+ "dependencies": {
"agent-base": "^4.3.0",
"debug": "^3.1.0"
},
- "dependencies": {
- "agent-base": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
- "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
- "dev": true,
- "requires": {
- "es6-promisify": "^5.0.0"
- }
- },
- "debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- }
+ "engines": {
+ "node": ">= 4.5.0"
}
},
- "iconv-lite": {
+ "node_modules/https-proxy-agent/node_modules/agent-base": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
+ "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
+ "dev": true,
+ "dependencies": {
+ "es6-promisify": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/https-proxy-agent/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/https-proxy-agent/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dev": true,
- "requires": {
+ "dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "ieee754": {
+ "node_modules/ieee754": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
"integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==",
"dev": true
},
- "indent-string": {
+ "node_modules/indent-string": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
"integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
"dev": true,
- "requires": {
+ "dependencies": {
"repeating": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "inflight": {
+ "node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
- "requires": {
+ "dependencies": {
"once": "^1.3.0",
"wrappy": "1"
}
},
- "inherits": {
+ "node_modules/inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
},
- "ini": {
+ "node_modules/ini": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
},
- "inline-source-map": {
+ "node_modules/inline-source-map": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
"integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=",
"dev": true,
- "requires": {
+ "dependencies": {
"source-map": "~0.5.3"
}
},
- "insert-module-globals": {
+ "node_modules/insert-module-globals": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz",
"integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==",
"dev": true,
- "requires": {
- "JSONStream": "^1.0.3",
+ "dependencies": {
"acorn-node": "^1.5.2",
"combine-source-map": "^0.8.0",
"concat-stream": "^1.6.1",
"is-buffer": "^1.1.0",
+ "JSONStream": "^1.0.3",
"path-is-absolute": "^1.0.1",
"process": "~0.11.0",
"through2": "^2.0.0",
"undeclared-identifiers": "^1.1.2",
"xtend": "^4.0.0"
+ },
+ "bin": {
+ "insert-module-globals": "bin/cmd.js"
}
},
- "interpret": {
+ "node_modules/interpret": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
"integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
"dev": true
},
- "is-absolute": {
+ "node_modules/is-absolute": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
"integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-relative": "^1.0.0",
"is-windows": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-arrayish": {
+ "node_modules/is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
"dev": true
},
- "is-buffer": {
+ "node_modules/is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
"dev": true
},
- "is-builtin-module": {
+ "node_modules/is-builtin-module": {
"version": "1.0.0",
"resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
"integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
"dev": true,
- "requires": {
+ "dependencies": {
"builtin-modules": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-core-module": {
+ "node_modules/is-core-module": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
"integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
"dev": true,
- "requires": {
+ "dependencies": {
"has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "is-extglob": {
+ "node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "is-finite": {
+ "node_modules/is-finite": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
"integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
"dev": true,
- "requires": {
+ "dependencies": {
"number-is-nan": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-glob": {
+ "node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-number": {
+ "node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
},
- "is-plain-object": {
+ "node_modules/is-plain-object": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
"dev": true,
- "requires": {
+ "dependencies": {
"isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-relative": {
+ "node_modules/is-relative": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
"integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-unc-path": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-stream": {
+ "node_modules/is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "is-typedarray": {
+ "node_modules/is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
"dev": true
},
- "is-unc-path": {
+ "node_modules/is-unc-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
"integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"unc-path-regex": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-utf8": {
+ "node_modules/is-utf8": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
"integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
"dev": true
},
- "is-windows": {
+ "node_modules/is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "isarray": {
+ "node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
- "isexe": {
+ "node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true
},
- "isobject": {
+ "node_modules/isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "isstream": {
+ "node_modules/isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
"dev": true
},
- "js-yaml": {
+ "node_modules/js-yaml": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
- "requires": {
+ "dependencies": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
}
},
- "js2xmlparser": {
+ "node_modules/js2xmlparser": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz",
"integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
- "requires": {
+ "dependencies": {
"xmlcreate": "^2.0.4"
}
},
- "jsbn": {
+ "node_modules/jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
"dev": true
},
- "jsdoc": {
+ "node_modules/jsdoc": {
"version": "3.6.11",
"resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.11.tgz",
"integrity": "sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg==",
- "requires": {
+ "dependencies": {
"@babel/parser": "^7.9.4",
"@types/markdown-it": "^12.2.3",
"bluebird": "^3.7.2",
@@ -2183,25 +2593,38 @@
"taffydb": "2.6.2",
"underscore": "~1.13.2"
},
- "dependencies": {
- "escape-string-regexp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
- }
+ "bin": {
+ "jsdoc": "jsdoc.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
}
},
- "jshint": {
+ "node_modules/jsdoc/node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jsdoc/node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jshint": {
"version": "2.13.5",
"resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.5.tgz",
"integrity": "sha512-dB2n1w3OaQ35PLcBGIWXlszjbPZwsgZoxsg6G8PtNf2cFMC1l0fObkYLUuXqTTdi6tKw4sAjfUseTdmDMHQRcg==",
"dev": true,
- "requires": {
+ "dependencies": {
"cli": "~1.0.0",
"console-browserify": "1.1.x",
"exit": "0.1.x",
@@ -2210,204 +2633,245 @@
"minimatch": "~3.0.2",
"strip-json-comments": "1.0.x"
},
- "dependencies": {
- "minimatch": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
- "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "strip-json-comments": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
- "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==",
- "dev": true
- }
+ "bin": {
+ "jshint": "bin/jshint"
}
},
- "jslint": {
+ "node_modules/jshint/node_modules/minimatch": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
+ "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/jshint/node_modules/strip-json-comments": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
+ "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==",
+ "dev": true,
+ "bin": {
+ "strip-json-comments": "cli.js"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/jslint": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/jslint/-/jslint-0.12.0.tgz",
"integrity": "sha512-RoCsyICcKA+6TFsbys9DpKTfPVaC71Mm5QSjvrWA0lDVN+LIvx6apa42FFisMqmCTvJ8DxkcoQGJ0j7m3kTVow==",
"dev": true,
- "requires": {
+ "dependencies": {
"exit": "~0.1.2",
"glob": "~7.1.2",
"nopt": "~3.0.1",
"readable-stream": "~2.1.5"
},
- "dependencies": {
- "nopt": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
- "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
- "dev": true,
- "requires": {
- "abbrev": "1"
- }
- },
- "process-nextick-args": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
- "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
- "dev": true
- },
- "readable-stream": {
- "version": "2.1.5",
- "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz",
- "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=",
- "dev": true,
- "requires": {
- "buffer-shims": "^1.0.0",
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "~1.0.0",
- "process-nextick-args": "~1.0.6",
- "string_decoder": "~0.10.x",
- "util-deprecate": "~1.0.1"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- }
+ "bin": {
+ "jslint": "bin/jslint.js"
+ },
+ "engines": {
+ "node": ">=0.8.0"
}
},
- "json-int64": {
+ "node_modules/jslint/node_modules/nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "dependencies": {
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ }
+ },
+ "node_modules/jslint/node_modules/process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ },
+ "node_modules/jslint/node_modules/readable-stream": {
+ "version": "2.1.5",
+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz",
+ "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=",
+ "dev": true,
+ "dependencies": {
+ "buffer-shims": "^1.0.0",
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~1.0.6",
+ "string_decoder": "~0.10.x",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/jslint/node_modules/string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "node_modules/json-int64": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-int64/-/json-int64-1.0.0.tgz",
"integrity": "sha512-yrTg9swToElhEPETLMdZkEzDhbXLs+cxkw/b2rglMPOBlM1DE0utH1EReSMLcnpYJk5iUvD12r0fP2/xHitF5Q==",
- "requires": {
+ "dependencies": {
"node-int64": "0.4.0"
}
},
- "json-schema-traverse": {
+ "node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
- "json-stable-stringify": {
+ "node_modules/json-stable-stringify": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
"integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=",
"dev": true,
- "requires": {
+ "dependencies": {
"jsonify": "~0.0.0"
}
},
- "json-stringify-safe": {
+ "node_modules/json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
"dev": true
},
- "jsonfile": {
+ "node_modules/jsonfile": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
"integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
"dev": true,
- "requires": {
+ "optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
- "jsonify": {
+ "node_modules/jsonify": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
"integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
},
- "jsonparse": {
+ "node_modules/jsonparse": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
"integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
- "dev": true
+ "dev": true,
+ "engines": [
+ "node >= 0.2.0"
+ ]
},
- "jsprim": {
+ "node_modules/JSONStream": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
+ "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
+ "dev": true,
+ "dependencies": {
+ "jsonparse": "^1.2.0",
+ "through": ">=2.2.7 <3"
+ },
+ "bin": {
+ "JSONStream": "bin.js"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/jsprim": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
"integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
"dev": true,
- "requires": {
+ "dependencies": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.4.0",
"verror": "1.10.0"
},
- "dependencies": {
- "json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "dev": true
- }
+ "engines": {
+ "node": ">=0.6.0"
}
},
- "kew": {
+ "node_modules/jsprim/node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "dev": true
+ },
+ "node_modules/kew": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz",
"integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=",
"dev": true
},
- "kind-of": {
+ "node_modules/kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "klaw": {
+ "node_modules/klaw": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
"integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
- "requires": {
+ "dependencies": {
"graceful-fs": "^4.1.9"
}
},
- "kuler": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz",
- "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==",
- "dev": true,
- "requires": {
- "colornames": "^1.1.1"
- }
+ "node_modules/kuler": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
+ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==",
+ "dev": true
},
- "labeled-stream-splicer": {
+ "node_modules/labeled-stream-splicer": {
"version": "2.0.1",
"resolved": "http://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz",
"integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "^2.0.1",
"isarray": "^2.0.4",
"stream-splicer": "^2.0.0"
- },
- "dependencies": {
- "isarray": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz",
- "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==",
- "dev": true
- }
}
},
- "lazy-cache": {
+ "node_modules/labeled-stream-splicer/node_modules/isarray": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz",
+ "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==",
+ "dev": true
+ },
+ "node_modules/lazy-cache": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
"integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "liftup": {
+ "node_modules/liftup": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz",
"integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==",
"dev": true,
- "requires": {
+ "dependencies": {
"extend": "^3.0.2",
"findup-sync": "^4.0.0",
"fined": "^1.2.0",
@@ -2417,222 +2881,264 @@
"rechoir": "^0.7.0",
"resolve": "^1.19.0"
},
- "dependencies": {
- "findup-sync": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz",
- "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==",
- "dev": true,
- "requires": {
- "detect-file": "^1.0.0",
- "is-glob": "^4.0.0",
- "micromatch": "^4.0.2",
- "resolve-dir": "^1.0.1"
- }
- },
- "resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
- }
- }
+ "engines": {
+ "node": ">=10"
}
},
- "linkify-it": {
+ "node_modules/liftup/node_modules/findup-sync": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz",
+ "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==",
+ "dev": true,
+ "dependencies": {
+ "detect-file": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "micromatch": "^4.0.2",
+ "resolve-dir": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/liftup/node_modules/resolve": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+ "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.2.0",
+ "path-parse": "^1.0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/linkify-it": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
"integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
- "requires": {
+ "dependencies": {
"uc.micro": "^1.0.1"
}
},
- "load-json-file": {
+ "node_modules/load-json-file": {
"version": "1.1.0",
"resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
"dev": true,
- "requires": {
+ "dependencies": {
"graceful-fs": "^4.1.2",
"parse-json": "^2.2.0",
"pify": "^2.0.0",
"pinkie-promise": "^2.0.0",
"strip-bom": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "lodash": {
+ "node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
- "lodash.memoize": {
+ "node_modules/lodash.memoize": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
"integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=",
"dev": true
},
- "logform": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/logform/-/logform-1.10.0.tgz",
- "integrity": "sha512-em5ojIhU18fIMOw/333mD+ZLE2fis0EzXl1ZwHx4iQzmpQi6odNiY/t+ITNr33JZhT9/KEaH+UPIipr6a9EjWg==",
+ "node_modules/logform": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz",
+ "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==",
"dev": true,
- "requires": {
- "colors": "^1.2.1",
- "fast-safe-stringify": "^2.0.4",
- "fecha": "^2.3.3",
- "ms": "^2.1.1",
- "triple-beam": "^1.2.0"
- },
"dependencies": {
- "colors": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz",
- "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==",
- "dev": true
- },
- "ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
- "dev": true
- }
+ "@colors/colors": "1.5.0",
+ "@types/triple-beam": "^1.3.2",
+ "fecha": "^4.2.0",
+ "ms": "^2.1.1",
+ "safe-stable-stringify": "^2.3.1",
+ "triple-beam": "^1.3.0"
}
},
- "longest": {
+ "node_modules/logform/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/longest": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "loud-rejection": {
+ "node_modules/loud-rejection": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
"integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
"dev": true,
- "requires": {
+ "dependencies": {
"currently-unhandled": "^0.4.1",
"signal-exit": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "make-iterator": {
+ "node_modules/make-iterator": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
"integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
"dev": true,
- "requires": {
+ "dependencies": {
"kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "map-cache": {
+ "node_modules/map-cache": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
"integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "map-obj": {
+ "node_modules/map-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
"integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "markdown-it": {
+ "node_modules/markdown-it": {
"version": "12.3.2",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
"integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
- "requires": {
+ "dependencies": {
"argparse": "^2.0.1",
"entities": "~2.1.0",
"linkify-it": "^3.0.1",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
},
- "dependencies": {
- "argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
- },
- "entities": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
- "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w=="
- }
+ "bin": {
+ "markdown-it": "bin/markdown-it.js"
}
},
- "markdown-it-anchor": {
+ "node_modules/markdown-it-anchor": {
"version": "8.6.5",
"resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz",
- "integrity": "sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ=="
+ "integrity": "sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ==",
+ "peerDependencies": {
+ "@types/markdown-it": "*",
+ "markdown-it": "*"
+ }
},
- "marked": {
+ "node_modules/markdown-it/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "node_modules/markdown-it/node_modules/entities": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+ "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/marked": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz",
- "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw=="
+ "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
},
- "maxmin": {
+ "node_modules/maxmin": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz",
"integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=",
"dev": true,
- "requires": {
+ "dependencies": {
"chalk": "^1.0.0",
"figures": "^1.0.1",
"gzip-size": "^1.0.0",
"pretty-bytes": "^1.0.0"
},
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "md5.js": {
+ "node_modules/maxmin/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/maxmin/node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/maxmin/node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/md5.js": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
"integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
"dev": true,
- "requires": {
+ "dependencies": {
"hash-base": "^3.0.0",
"inherits": "^2.0.1",
"safe-buffer": "^5.1.2"
}
},
- "mdurl": {
+ "node_modules/mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
"integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g=="
},
- "meow": {
+ "node_modules/meow": {
"version": "3.7.0",
"resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
"integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
"dev": true,
- "requires": {
+ "dependencies": {
"camelcase-keys": "^2.0.0",
"decamelize": "^1.1.2",
"loud-rejection": "^1.0.0",
@@ -2643,92 +3149,118 @@
"read-pkg-up": "^1.0.1",
"redent": "^1.0.0",
"trim-newlines": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "micromatch": {
+ "node_modules/micromatch": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
"dev": true,
- "requires": {
+ "dependencies": {
"braces": "^3.0.1",
"picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": ">=8.6"
}
},
- "miller-rabin": {
+ "node_modules/miller-rabin": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
"integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
"dev": true,
- "requires": {
+ "dependencies": {
"bn.js": "^4.0.0",
"brorand": "^1.0.1"
+ },
+ "bin": {
+ "miller-rabin": "bin/miller-rabin"
}
},
- "mime": {
+ "node_modules/mime": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz",
"integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
},
- "mime-db": {
+ "node_modules/mime-db": {
"version": "1.37.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
"integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
},
- "mime-types": {
+ "node_modules/mime-types": {
"version": "2.1.21",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
"integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
"dev": true,
- "requires": {
+ "dependencies": {
"mime-db": "~1.37.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
}
},
- "minimalistic-assert": {
+ "node_modules/minimalistic-assert": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
"integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
"dev": true
},
- "minimalistic-crypto-utils": {
+ "node_modules/minimalistic-crypto-utils": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
"integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
"dev": true
},
- "minimatch": {
+ "node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
- "requires": {
+ "dependencies": {
"brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
}
},
- "minimist": {
+ "node_modules/minimist": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
"dev": true
},
- "mkdirp": {
+ "node_modules/mkdirp": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"minimist": "^1.2.5"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
}
},
- "module-deps": {
+ "node_modules/module-deps": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz",
"integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==",
"dev": true,
- "requires": {
- "JSONStream": "^1.0.3",
+ "dependencies": {
"browser-resolve": "^1.7.0",
"cached-path-relative": "^1.0.0",
"concat-stream": "~1.6.0",
@@ -2736,6 +3268,7 @@
"detective": "^5.0.2",
"duplexer2": "^0.1.2",
"inherits": "^2.0.1",
+ "JSONStream": "^1.0.3",
"parents": "^1.0.0",
"readable-stream": "^2.0.2",
"resolve": "^1.4.0",
@@ -2743,170 +3276,218 @@
"subarg": "^1.0.0",
"through2": "^2.0.0",
"xtend": "^4.0.0"
+ },
+ "bin": {
+ "module-deps": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "ms": {
+ "node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
- "node-gyp-build": {
+ "node_modules/node-gyp-build": {
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz",
- "integrity": "sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w=="
+ "integrity": "sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==",
+ "dev": true,
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
+ }
},
- "node-int64": {
+ "node_modules/node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
"integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs="
},
- "nopt": {
+ "node_modules/nopt": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
"integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
- "requires": {
+ "dependencies": {
"abbrev": "1",
"osenv": "^0.1.4"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
}
},
- "normalize-package-data": {
+ "node_modules/normalize-package-data": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
"integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
"dev": true,
- "requires": {
+ "dependencies": {
"hosted-git-info": "^2.1.4",
"is-builtin-module": "^1.0.0",
"semver": "2 || 3 || 4 || 5",
"validate-npm-package-license": "^3.0.1"
}
},
- "number-is-nan": {
+ "node_modules/number-is-nan": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "oauth-sign": {
+ "node_modules/oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
},
- "object-assign": {
+ "node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "object.defaults": {
+ "node_modules/object.defaults": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
"integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
"dev": true,
- "requires": {
+ "dependencies": {
"array-each": "^1.0.1",
"array-slice": "^1.0.0",
"for-own": "^1.0.0",
"isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "object.map": {
+ "node_modules/object.map": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
"integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
"dev": true,
- "requires": {
+ "dependencies": {
"for-own": "^1.0.0",
"make-iterator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "object.pick": {
+ "node_modules/object.pick": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
"integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
"dev": true,
- "requires": {
+ "dependencies": {
"isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "once": {
+ "node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
- "requires": {
+ "dependencies": {
"wrappy": "1"
}
},
- "one-time": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz",
- "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=",
- "dev": true
+ "node_modules/one-time": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
+ "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
+ "dev": true,
+ "dependencies": {
+ "fn.name": "1.x.x"
+ }
},
- "os-browserify": {
+ "node_modules/os-browserify": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
"integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
"dev": true
},
- "os-homedir": {
+ "node_modules/os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "os-tmpdir": {
+ "node_modules/os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "osenv": {
+ "node_modules/osenv": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
- "requires": {
+ "dependencies": {
"os-homedir": "^1.0.0",
"os-tmpdir": "^1.0.0"
}
},
- "p-each-series": {
+ "node_modules/p-each-series": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz",
"integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=",
"dev": true,
- "requires": {
+ "dependencies": {
"p-reduce": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "p-reduce": {
+ "node_modules/p-reduce": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz",
"integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "pako": {
+ "node_modules/pako": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz",
"integrity": "sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==",
"dev": true
},
- "parents": {
+ "node_modules/parents": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
"integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
"dev": true,
- "requires": {
+ "dependencies": {
"path-platform": "~0.11.15"
}
},
- "parse-asn1": {
+ "node_modules/parse-asn1": {
"version": "5.1.1",
"resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
"integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
"dev": true,
- "requires": {
+ "dependencies": {
"asn1.js": "^4.0.0",
"browserify-aes": "^1.0.0",
"create-hash": "^1.1.0",
@@ -2914,139 +3495,181 @@
"pbkdf2": "^3.0.3"
}
},
- "parse-filepath": {
+ "node_modules/parse-filepath": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
"integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
"dev": true,
- "requires": {
+ "dependencies": {
"is-absolute": "^1.0.0",
"map-cache": "^0.2.0",
"path-root": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8"
}
},
- "parse-json": {
+ "node_modules/parse-json": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
"integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
"dev": true,
- "requires": {
+ "dependencies": {
"error-ex": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "parse-passwd": {
+ "node_modules/parse-passwd": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
"integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "path-browserify": {
+ "node_modules/path-browserify": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
"integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
"dev": true
},
- "path-exists": {
+ "node_modules/path-exists": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
"integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
"dev": true,
- "requires": {
+ "dependencies": {
"pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "path-is-absolute": {
+ "node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "path-key": {
+ "node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "path-parse": {
+ "node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
- "path-platform": {
+ "node_modules/path-platform": {
"version": "0.11.15",
"resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
"integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
},
- "path-root": {
+ "node_modules/path-root": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
"integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
"dev": true,
- "requires": {
+ "dependencies": {
"path-root-regex": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "path-root-regex": {
+ "node_modules/path-root-regex": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
"integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "path-type": {
+ "node_modules/path-type": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
"integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
"dev": true,
- "requires": {
+ "dependencies": {
"graceful-fs": "^4.1.2",
"pify": "^2.0.0",
"pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "pbkdf2": {
+ "node_modules/pbkdf2": {
"version": "3.0.17",
"resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
"integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
"dev": true,
- "requires": {
+ "dependencies": {
"create-hash": "^1.1.2",
"create-hmac": "^1.1.4",
"ripemd160": "^2.0.1",
"safe-buffer": "^5.0.1",
"sha.js": "^2.4.8"
+ },
+ "engines": {
+ "node": ">=0.12"
}
},
- "pend": {
+ "node_modules/pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
"integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
"dev": true
},
- "performance-now": {
+ "node_modules/performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
"dev": true
},
- "phantom": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/phantom/-/phantom-6.0.3.tgz",
- "integrity": "sha512-8bb8urWoUiZ0E+JC4goaYBDPxljTnnxGwogz5cvash2SQovf//QAPoshXQz06kY/tpI+5caBVng0K0oZkVMNIQ==",
+ "node_modules/phantom": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/phantom/-/phantom-6.3.0.tgz",
+ "integrity": "sha512-Ptlwjp5eJiBmr3KQzFr9V/ehhcC+PGyJB38q7mnxJiwrssOEtmIWDEzQ7gIsdOXlHoW0n0+KjdAdP9U89Cm9Pw==",
+ "deprecated": "This package is no longer maintained",
"dev": true,
- "requires": {
+ "dependencies": {
"phantomjs-prebuilt": "^2.1.16",
"split": "^1.0.1",
- "winston": "^3.0.0"
+ "winston": "^3.2.1"
+ },
+ "bin": {
+ "phantom": "bin/phantom.js"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "phantomjs-prebuilt": {
+ "node_modules/phantomjs-prebuilt": {
"version": "2.1.16",
"resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz",
- "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=",
+ "integrity": "sha512-PIiRzBhW85xco2fuj41FmsyuYHKjKuXWmhjy3A/Y+CMpN/63TV+s9uzfVhsUwFe0G77xWtHBG8xmXf5BqEUEuQ==",
+ "deprecated": "this package is now deprecated",
"dev": true,
- "requires": {
+ "hasInstallScript": true,
+ "dependencies": {
"es6-promise": "^4.0.3",
"extract-zip": "^1.6.5",
"fs-extra": "^1.0.0",
@@ -3057,88 +3680,119 @@
"request-progress": "^2.0.1",
"which": "^1.2.10"
},
- "dependencies": {
- "progress": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
- "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=",
- "dev": true
- }
+ "bin": {
+ "phantomjs": "bin/phantomjs"
}
},
- "picomatch": {
+ "node_modules/phantomjs-prebuilt/node_modules/progress": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
+ "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/picomatch": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
},
- "pify": {
+ "node_modules/pify": {
"version": "2.3.0",
"resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "pinkie": {
+ "node_modules/pinkie": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
"integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "pinkie-promise": {
+ "node_modules/pinkie-promise": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
"dev": true,
- "requires": {
+ "dependencies": {
"pinkie": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "pretty-bytes": {
+ "node_modules/pretty-bytes": {
"version": "1.0.4",
"resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz",
"integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=",
"dev": true,
- "requires": {
+ "dependencies": {
"get-stdin": "^4.0.1",
"meow": "^3.1.0"
+ },
+ "bin": {
+ "pretty-bytes": "cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "process": {
+ "node_modules/process": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
"integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6.0"
+ }
},
- "process-nextick-args": {
+ "node_modules/process-nextick-args": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
"dev": true
},
- "progress": {
+ "node_modules/progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
- "proxy-from-env": {
+ "node_modules/proxy-from-env": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
"integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=",
"dev": true
},
- "psl": {
- "version": "1.1.31",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
- "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==",
+ "node_modules/psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
"dev": true
},
- "public-encrypt": {
+ "node_modules/public-encrypt": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
"integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"bn.js": "^4.1.0",
"browserify-rsa": "^4.0.0",
"create-hash": "^1.1.0",
@@ -3147,18 +3801,20 @@
"safe-buffer": "^5.1.2"
}
},
- "punycode": {
+ "node_modules/punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
"dev": true
},
- "puppeteer": {
+ "node_modules/puppeteer": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz",
"integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==",
+ "deprecated": "< 19.4.0 is no longer supported",
"dev": true,
- "requires": {
+ "hasInstallScript": true,
+ "dependencies": {
"debug": "^4.1.0",
"extract-zip": "^1.6.6",
"https-proxy-agent": "^2.2.1",
@@ -3168,97 +3824,122 @@
"rimraf": "^2.6.1",
"ws": "^6.1.0"
},
+ "engines": {
+ "node": ">=6.4.0"
+ }
+ },
+ "node_modules/puppeteer/node_modules/debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
"dependencies": {
- "debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
}
}
},
- "qs": {
+ "node_modules/puppeteer/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/qs": {
"version": "6.5.3",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
"integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
},
- "querystring": {
+ "node_modules/querystring": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
"integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
- "dev": true
+ "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
},
- "querystring-es3": {
+ "node_modules/querystring-es3": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
"integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
},
- "randombytes": {
+ "node_modules/randombytes": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
"integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
"dev": true,
- "requires": {
+ "dependencies": {
"safe-buffer": "^5.1.0"
}
},
- "randomfill": {
+ "node_modules/randomfill": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
"integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
"dev": true,
- "requires": {
+ "dependencies": {
"randombytes": "^2.0.5",
"safe-buffer": "^5.1.0"
}
},
- "read-only-stream": {
+ "node_modules/read-only-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
"integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=",
"dev": true,
- "requires": {
+ "dependencies": {
"readable-stream": "^2.0.2"
}
},
- "read-pkg": {
+ "node_modules/read-pkg": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
"integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
"dev": true,
- "requires": {
+ "dependencies": {
"load-json-file": "^1.0.0",
"normalize-package-data": "^2.3.2",
"path-type": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "read-pkg-up": {
+ "node_modules/read-pkg-up": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
"integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
"dev": true,
- "requires": {
+ "dependencies": {
"find-up": "^1.0.0",
"read-pkg": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "readable-stream": {
+ "node_modules/readable-stream": {
"version": "2.3.6",
"resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
- "requires": {
+ "dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
@@ -3266,59 +3947,70 @@
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
- },
- "dependencies": {
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
}
},
- "rechoir": {
+ "node_modules/readable-stream/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/rechoir": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
"integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
"dev": true,
- "requires": {
+ "dependencies": {
"resolve": "^1.9.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
}
},
- "redent": {
+ "node_modules/redent": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
"integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
"dev": true,
- "requires": {
+ "dependencies": {
"indent-string": "^2.1.0",
"strip-indent": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "repeat-string": {
+ "node_modules/repeat-string": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10"
+ }
},
- "repeating": {
+ "node_modules/repeating": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
"integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
"dev": true,
- "requires": {
+ "dependencies": {
"is-finite": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "request": {
- "version": "2.88.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
- "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "node_modules/request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
"dev": true,
- "requires": {
+ "dependencies": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
"caseless": "~0.12.0",
@@ -3326,7 +4018,7 @@
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
- "har-validator": "~5.1.0",
+ "har-validator": "~5.1.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
@@ -3336,222 +4028,259 @@
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
- "tough-cookie": "~2.4.3",
+ "tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
+ },
+ "engines": {
+ "node": ">= 6"
}
},
- "request-progress": {
+ "node_modules/request-progress": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz",
"integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=",
"dev": true,
- "requires": {
+ "dependencies": {
"throttleit": "^1.0.0"
}
},
- "requizzle": {
+ "node_modules/requizzle": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz",
"integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==",
- "requires": {
+ "dependencies": {
"lodash": "^4.17.14"
}
},
- "resolve": {
+ "node_modules/resolve": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz",
"integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"path-parse": "^1.0.6"
}
},
- "resolve-dir": {
+ "node_modules/resolve-dir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
"integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
"dev": true,
- "requires": {
+ "dependencies": {
"expand-tilde": "^2.0.0",
"global-modules": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "right-align": {
+ "node_modules/right-align": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
"integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
"dev": true,
- "requires": {
+ "dependencies": {
"align-text": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "rimraf": {
+ "node_modules/rimraf": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
"integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
"dev": true,
- "requires": {
+ "dependencies": {
"glob": "^7.0.5"
+ },
+ "bin": {
+ "rimraf": "bin.js"
}
},
- "ripemd160": {
+ "node_modules/ripemd160": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
"integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
"dev": true,
- "requires": {
+ "dependencies": {
"hash-base": "^3.0.0",
"inherits": "^2.0.1"
}
},
- "safe-buffer": {
+ "node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
- "safer-buffer": {
+ "node_modules/safe-stable-stringify": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz",
+ "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
- "semver": {
+ "node_modules/semver": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
"integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
},
- "sha.js": {
+ "node_modules/sha.js": {
"version": "2.4.11",
"resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
"integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "^2.0.1",
"safe-buffer": "^5.0.1"
+ },
+ "bin": {
+ "sha.js": "bin.js"
}
},
- "shasum": {
+ "node_modules/shasum": {
"version": "1.0.2",
"resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
"integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=",
"dev": true,
- "requires": {
+ "dependencies": {
"json-stable-stringify": "~0.0.0",
"sha.js": "~2.4.4"
}
},
- "shebang-command": {
+ "node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
- "requires": {
+ "dependencies": {
"shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "shebang-regex": {
+ "node_modules/shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "shell-quote": {
+ "node_modules/shell-quote": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
"integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
"dev": true
},
- "signal-exit": {
+ "node_modules/signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"dev": true
},
- "simple-concat": {
+ "node_modules/simple-concat": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
"integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=",
"dev": true
},
- "simple-swizzle": {
+ "node_modules/simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
- "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
"dev": true,
- "requires": {
- "is-arrayish": "^0.3.1"
- },
"dependencies": {
- "is-arrayish": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
- "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
- "dev": true
- }
+ "is-arrayish": "^0.3.1"
}
},
- "source-map": {
+ "node_modules/simple-swizzle/node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+ "dev": true
+ },
+ "node_modules/source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "spdx-correct": {
+ "node_modules/spdx-correct": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
"integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"spdx-expression-parse": "^3.0.0",
"spdx-license-ids": "^3.0.0"
}
},
- "spdx-exceptions": {
+ "node_modules/spdx-exceptions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
"integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
"dev": true
},
- "spdx-expression-parse": {
+ "node_modules/spdx-expression-parse": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
"integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
"dev": true,
- "requires": {
+ "dependencies": {
"spdx-exceptions": "^2.1.0",
"spdx-license-ids": "^3.0.0"
}
},
- "spdx-license-ids": {
+ "node_modules/spdx-license-ids": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz",
"integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==",
"dev": true
},
- "split": {
+ "node_modules/split": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
"integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
"dev": true,
- "requires": {
+ "dependencies": {
"through": "2"
+ },
+ "engines": {
+ "node": "*"
}
},
- "sprintf-js": {
+ "node_modules/sprintf-js": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
"integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
"dev": true
},
- "sshpk": {
+ "node_modules/sshpk": {
"version": "1.16.0",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.0.tgz",
"integrity": "sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
"bcrypt-pbkdf": "^1.0.0",
@@ -3561,40 +4290,51 @@
"jsbn": "~0.1.0",
"safer-buffer": "^2.0.2",
"tweetnacl": "~0.14.0"
+ },
+ "bin": {
+ "sshpk-conv": "bin/sshpk-conv",
+ "sshpk-sign": "bin/sshpk-sign",
+ "sshpk-verify": "bin/sshpk-verify"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "stack-trace": {
+ "node_modules/stack-trace": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
- "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
- "dev": true
+ "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
},
- "stream-browserify": {
+ "node_modules/stream-browserify": {
"version": "2.0.1",
"resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
"integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "~2.0.1",
"readable-stream": "^2.0.2"
}
},
- "stream-combiner2": {
+ "node_modules/stream-combiner2": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
"integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
"dev": true,
- "requires": {
+ "dependencies": {
"duplexer2": "~0.1.0",
"readable-stream": "^2.0.2"
}
},
- "stream-http": {
+ "node_modules/stream-http": {
"version": "2.8.3",
"resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
"integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
"dev": true,
- "requires": {
+ "dependencies": {
"builtin-status-codes": "^3.0.0",
"inherits": "^2.0.1",
"readable-stream": "^2.3.6",
@@ -3602,475 +4342,606 @@
"xtend": "^4.0.0"
}
},
- "stream-splicer": {
+ "node_modules/stream-splicer": {
"version": "2.0.0",
"resolved": "http://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz",
"integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "^2.0.1",
"readable-stream": "^2.0.2"
}
},
- "string_decoder": {
+ "node_modules/string_decoder": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz",
"integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==",
"dev": true,
- "requires": {
+ "dependencies": {
"safe-buffer": "~5.1.0"
}
},
- "strip-ansi": {
+ "node_modules/strip-ansi": {
"version": "3.0.1",
"resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
- "requires": {
+ "dependencies": {
"ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "strip-bom": {
+ "node_modules/strip-bom": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
"integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
"dev": true,
- "requires": {
+ "dependencies": {
"is-utf8": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "strip-indent": {
+ "node_modules/strip-indent": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
"integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
"dev": true,
- "requires": {
+ "dependencies": {
"get-stdin": "^4.0.1"
+ },
+ "bin": {
+ "strip-indent": "cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "strip-json-comments": {
+ "node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "subarg": {
+ "node_modules/subarg": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
"integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
"dev": true,
- "requires": {
+ "dependencies": {
"minimist": "^1.1.0"
}
},
- "supports-color": {
+ "node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
- "requires": {
+ "dependencies": {
"has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "syntax-error": {
+ "node_modules/syntax-error": {
"version": "1.4.0",
"resolved": "http://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
"integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
"dev": true,
- "requires": {
+ "dependencies": {
"acorn-node": "^1.2.0"
}
},
- "taffydb": {
+ "node_modules/taffydb": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz",
"integrity": "sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA=="
},
- "text-hex": {
+ "node_modules/text-hex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
"integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==",
"dev": true
},
- "throttleit": {
+ "node_modules/throttleit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
"integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=",
"dev": true
},
- "through": {
+ "node_modules/through": {
"version": "2.3.8",
"resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
"dev": true
},
- "through2": {
+ "node_modules/through2": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
"integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"readable-stream": "~2.3.6",
"xtend": "~4.0.1"
}
},
- "timers-browserify": {
+ "node_modules/timers-browserify": {
"version": "1.4.2",
"resolved": "http://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
"integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=",
"dev": true,
- "requires": {
+ "dependencies": {
"process": "~0.11.0"
+ },
+ "engines": {
+ "node": ">=0.6.0"
}
},
- "to-arraybuffer": {
+ "node_modules/to-arraybuffer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
"integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
"dev": true
},
- "to-regex-range": {
+ "node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
}
},
- "tough-cookie": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
- "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "node_modules/tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
"dev": true,
- "requires": {
- "psl": "^1.1.24",
- "punycode": "^1.4.1"
+ "dependencies": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.8"
}
},
- "trim-newlines": {
+ "node_modules/tough-cookie/node_modules/punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/trim-newlines": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
- "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
- "dev": true
+ "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "triple-beam": {
+ "node_modules/triple-beam": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
"integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==",
"dev": true
},
- "tty-browserify": {
+ "node_modules/tty-browserify": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
"integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
"dev": true
},
- "tunnel-agent": {
+ "node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"dev": true,
- "requires": {
+ "dependencies": {
"safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
}
},
- "tweetnacl": {
+ "node_modules/tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
"dev": true
},
- "typedarray": {
+ "node_modules/typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
"dev": true
},
- "typescript": {
+ "node_modules/typescript": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz",
"integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
},
- "uc.micro": {
+ "node_modules/uc.micro": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
},
- "uglify-js": {
+ "node_modules/uglify-js": {
"version": "2.6.4",
"resolved": "http://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz",
"integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=",
"dev": true,
- "requires": {
+ "dependencies": {
"async": "~0.2.6",
"source-map": "~0.5.1",
"uglify-to-browserify": "~1.0.0",
"yargs": "~3.10.0"
},
- "dependencies": {
- "async": {
- "version": "0.2.10",
- "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
- "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==",
- "dev": true
- }
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
}
},
- "uglify-to-browserify": {
+ "node_modules/uglify-js/node_modules/async": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
+ "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==",
+ "dev": true
+ },
+ "node_modules/uglify-to-browserify": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
"dev": true
},
- "umd": {
+ "node_modules/umd": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
"integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "umd": "bin/cli.js"
+ }
},
- "unc-path-regex": {
+ "node_modules/unc-path-regex": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
"integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "undeclared-identifiers": {
+ "node_modules/undeclared-identifiers": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz",
"integrity": "sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"acorn-node": "^1.3.0",
"get-assigned-identifiers": "^1.2.0",
"simple-concat": "^1.0.0",
"xtend": "^4.0.1"
+ },
+ "bin": {
+ "undeclared-identifiers": "bin.js"
}
},
- "underscore": {
+ "node_modules/underscore": {
"version": "1.13.6",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
"integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="
},
- "underscore.string": {
+ "node_modules/underscore.string": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz",
"integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"sprintf-js": "^1.1.1",
"util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": "*"
}
},
- "uri-js": {
+ "node_modules/uri-js": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
"dev": true,
- "requires": {
- "punycode": "^2.1.0"
- },
"dependencies": {
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true
- }
+ "punycode": "^2.1.0"
}
},
- "uri-path": {
+ "node_modules/uri-js/node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/uri-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz",
"integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
},
- "url": {
+ "node_modules/url": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
"integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
"dev": true,
- "requires": {
+ "dependencies": {
"punycode": "1.3.2",
"querystring": "0.2.0"
- },
- "dependencies": {
- "punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
- "dev": true
- }
}
},
- "util": {
+ "node_modules/url/node_modules/punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+ "dev": true
+ },
+ "node_modules/util": {
"version": "0.10.4",
"resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
"integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
"dev": true,
- "requires": {
+ "dependencies": {
"inherits": "2.0.3"
}
},
- "util-deprecate": {
+ "node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true
},
- "uuid": {
+ "node_modules/uuid": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
- "dev": true
+ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
+ "dev": true,
+ "bin": {
+ "uuid": "bin/uuid"
+ }
},
- "v8flags": {
+ "node_modules/v8flags": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
"integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==",
"dev": true,
- "requires": {
+ "dependencies": {
"homedir-polyfill": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
}
},
- "validate-npm-package-license": {
+ "node_modules/validate-npm-package-license": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
"integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
"dev": true,
- "requires": {
+ "dependencies": {
"spdx-correct": "^3.0.0",
"spdx-expression-parse": "^3.0.0"
}
},
- "verror": {
+ "node_modules/verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"dev": true,
- "requires": {
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "dependencies": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
- "vm-browserify": {
+ "node_modules/vm-browserify": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz",
"integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==",
"dev": true
},
- "which": {
+ "node_modules/which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
}
},
- "window-size": {
+ "node_modules/window-size": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
"integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
- "dev": true
- },
- "winston": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/winston/-/winston-3.1.0.tgz",
- "integrity": "sha512-FsQfEE+8YIEeuZEYhHDk5cILo1HOcWkGwvoidLrDgPog0r4bser1lEIOco2dN9zpDJ1M88hfDgZvxe5z4xNcwg==",
"dev": true,
- "requires": {
- "async": "^2.6.0",
- "diagnostics": "^1.1.1",
- "is-stream": "^1.1.0",
- "logform": "^1.9.1",
- "one-time": "0.0.4",
- "readable-stream": "^2.3.6",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/winston": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-3.9.0.tgz",
+ "integrity": "sha512-jW51iW/X95BCW6MMtZWr2jKQBP4hV5bIDq9QrIjfDk6Q9QuxvTKEAlpUNAzP+HYHFFCeENhph16s0zEunu4uuQ==",
+ "dev": true,
+ "dependencies": {
+ "@colors/colors": "1.5.0",
+ "@dabh/diagnostics": "^2.0.2",
+ "async": "^3.2.3",
+ "is-stream": "^2.0.0",
+ "logform": "^2.4.0",
+ "one-time": "^1.0.0",
+ "readable-stream": "^3.4.0",
+ "safe-stable-stringify": "^2.3.1",
"stack-trace": "0.0.x",
"triple-beam": "^1.3.0",
- "winston-transport": "^4.2.0"
+ "winston-transport": "^4.5.0"
},
- "dependencies": {
- "async": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
- "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.14"
- }
- }
+ "engines": {
+ "node": ">= 12.0.0"
}
},
- "winston-transport": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz",
- "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==",
+ "node_modules/winston-transport": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz",
+ "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==",
"dev": true,
- "requires": {
- "readable-stream": "^2.3.6",
- "triple-beam": "^1.2.0"
+ "dependencies": {
+ "logform": "^2.3.2",
+ "readable-stream": "^3.6.0",
+ "triple-beam": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 6.4.0"
}
},
- "wordwrap": {
+ "node_modules/winston-transport/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/winston/node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/winston/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/wordwrap": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
"integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
- "wrappy": {
+ "node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
- "ws": {
+ "node_modules/ws": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
"integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
"dev": true,
- "requires": {
+ "dependencies": {
"async-limiter": "~1.0.0"
}
},
- "xmlcreate": {
+ "node_modules/xmlcreate": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
"integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg=="
},
- "xtend": {
+ "node_modules/xtend": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
"integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.4"
+ }
},
- "yargs": {
+ "node_modules/yargs": {
"version": "3.10.0",
"resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
"dev": true,
- "requires": {
+ "dependencies": {
"camelcase": "^1.0.2",
"cliui": "^2.1.0",
"decamelize": "^1.0.0",
"window-size": "0.1.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
- "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
- "dev": true
- }
}
},
- "yauzl": {
+ "node_modules/yargs/node_modules/camelcase": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/yauzl": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
"integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
"dev": true,
- "requires": {
+ "dependencies": {
"buffer-crc32": "~0.2.3",
"fd-slicer": "~1.1.0"
}
diff --git a/lib/ts/package.json b/lib/ts/package.json
index 2d93d32..054807f 100644
--- a/lib/ts/package.json
+++ b/lib/ts/package.json
@@ -1,6 +1,6 @@
{
"name": "thrift",
- "version": "0.19.0",
+ "version": "0.20.0",
"description": "Thrift is a software framework for scalable cross-language services development.",
"author": {
"name": "Apache Thrift Developers",
diff --git a/package-lock.json b/package-lock.json
index df62965..e1440f0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,24 +1,58 @@
{
"name": "thrift",
- "version": "0.19.0",
- "lockfileVersion": 1,
+ "version": "0.20.0",
+ "lockfileVersion": 3,
"requires": true,
- "dependencies": {
- "@babel/code-frame": {
+ "packages": {
+ "": {
+ "name": "thrift",
+ "version": "0.19.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "browser-or-node": "^1.2.1",
+ "isomorphic-ws": "^4.0.1",
+ "node-int64": "^0.4.0",
+ "q": "^1.5.0",
+ "ws": "^5.2.3"
+ },
+ "devDependencies": {
+ "@types/node": "^10.12.6",
+ "@types/node-int64": "^0.4.29",
+ "@types/q": "^1.5.1",
+ "buffer-equals": "^1.0.4",
+ "commander": "^2.14.1",
+ "connect": "^3.6.6",
+ "eslint": "^5.7.0",
+ "eslint-config-prettier": "^3.1.0",
+ "eslint-plugin-prettier": "^3.0.0",
+ "html-validator-cli": "^2.0.0",
+ "jsdoc": "^4.0.2",
+ "json-int64": "^1.0.2",
+ "nyc": "^15.0.0",
+ "prettier": "^1.14.3",
+ "tape": "^4.9.0",
+ "typescript": "^3.1.6",
+ "utf-8-validate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 10.18.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
"integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
"dev": true,
- "requires": {
+ "dependencies": {
"@babel/highlight": "^7.0.0"
}
},
- "@babel/core": {
+ "node_modules/@babel/core": {
"version": "7.8.4",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz",
"integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==",
"dev": true,
- "requires": {
+ "dependencies": {
"@babel/code-frame": "^7.8.3",
"@babel/generator": "^7.8.4",
"@babel/helpers": "^7.8.4",
@@ -35,195 +69,198 @@
"semver": "^5.4.1",
"source-map": "^0.5.0"
},
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.8.3"
- }
- },
- "@babel/highlight": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
- "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.0",
- "esutils": "^2.0.2",
- "js-tokens": "^4.0.0"
- }
- },
- "@babel/parser": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz",
- "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==",
- "dev": true
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "resolve": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
- "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
- "dev": true,
- "requires": {
- "path-parse": "^1.0.6"
- },
- "dependencies": {
- "path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- }
- }
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- }
- }
- },
- "@babel/generator": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz",
- "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3",
- "jsesc": "^2.5.1",
- "lodash": "^4.17.13",
- "source-map": "^0.5.0"
+ "engines": {
+ "node": ">=6.9.0"
},
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/code-frame": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+ "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+ "dev": true,
"dependencies": {
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- }
+ "@babel/highlight": "^7.8.3"
}
},
- "@babel/helper-function-name": {
+ "node_modules/@babel/core/node_modules/@babel/highlight": {
"version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
- "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
+ "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
"dev": true,
- "requires": {
- "@babel/helper-get-function-arity": "^7.8.3",
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-get-function-arity": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
- "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-split-export-declaration": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
- "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helpers": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz",
- "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==",
- "dev": true,
- "requires": {
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.8.4",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/highlight": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
- "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
- "dev": true,
- "requires": {
+ "dependencies": {
"chalk": "^2.0.0",
"esutils": "^2.0.2",
"js-tokens": "^4.0.0"
}
},
- "@babel/parser": {
- "version": "7.19.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.4.tgz",
- "integrity": "sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==",
+ "node_modules/@babel/core/node_modules/debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/@babel/core/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
- "@babel/template": {
+ "node_modules/@babel/core/node_modules/resolve": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "dev": true,
+ "dependencies": {
+ "path-parse": "^1.0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/@babel/core/node_modules/resolve/node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/@babel/core/node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz",
+ "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.8.3",
+ "jsesc": "^2.5.1",
+ "lodash": "^4.17.13",
+ "source-map": "^0.5.0"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
+ "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.8.3",
+ "@babel/template": "^7.8.3",
+ "@babel/types": "^7.8.3"
+ }
+ },
+ "node_modules/@babel/helper-get-function-arity": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
+ "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.8.3"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
+ "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.8.3"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz",
+ "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.8.3",
+ "@babel/traverse": "^7.8.4",
+ "@babel/types": "^7.8.3"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz",
+ "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/template": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz",
"integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"@babel/code-frame": "^7.8.3",
"@babel/parser": "^7.8.3",
"@babel/types": "^7.8.3"
- },
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.8.3"
- }
- },
- "@babel/highlight": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
- "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.0",
- "esutils": "^2.0.2",
- "js-tokens": "^4.0.0"
- }
- },
- "@babel/parser": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz",
- "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==",
- "dev": true
- }
}
},
- "@babel/traverse": {
+ "node_modules/@babel/template/node_modules/@babel/code-frame": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+ "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.8.3"
+ }
+ },
+ "node_modules/@babel/template/node_modules/@babel/highlight": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
+ "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
"version": "7.8.4",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz",
"integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==",
"dev": true,
- "requires": {
+ "dependencies": {
"@babel/code-frame": "^7.8.3",
"@babel/generator": "^7.8.4",
"@babel/helper-function-name": "^7.8.3",
@@ -233,610 +270,722 @@
"debug": "^4.1.0",
"globals": "^11.1.0",
"lodash": "^4.17.13"
- },
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.8.3"
- }
- },
- "@babel/highlight": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
- "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.0",
- "esutils": "^2.0.2",
- "js-tokens": "^4.0.0"
- }
- },
- "@babel/parser": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz",
- "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==",
- "dev": true
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
}
},
- "@babel/types": {
+ "node_modules/@babel/traverse/node_modules/@babel/code-frame": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+ "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.8.3"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/@babel/highlight": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
+ "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/@babel/types": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz",
"integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==",
"dev": true,
- "requires": {
+ "dependencies": {
"esutils": "^2.0.2",
"lodash": "^4.17.13",
"to-fast-properties": "^2.0.0"
}
},
- "@istanbuljs/load-nyc-config": {
+ "node_modules/@istanbuljs/load-nyc-config": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz",
"integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==",
"dev": true,
- "requires": {
+ "dependencies": {
"camelcase": "^5.3.1",
"find-up": "^4.1.0",
"js-yaml": "^3.13.1",
"resolve-from": "^5.0.0"
},
- "dependencies": {
- "resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true
- }
+ "engines": {
+ "node": ">=8"
}
},
- "@istanbuljs/schema": {
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz",
"integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "@types/color-name": {
+ "node_modules/@jsdoc/salty": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.5.tgz",
+ "integrity": "sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.21"
+ },
+ "engines": {
+ "node": ">=v12.0.0"
+ }
+ },
+ "node_modules/@types/color-name": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
"dev": true
},
- "@types/linkify-it": {
+ "node_modules/@types/linkify-it": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz",
"integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==",
"dev": true
},
- "@types/markdown-it": {
+ "node_modules/@types/markdown-it": {
"version": "12.2.3",
"resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
"integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"@types/linkify-it": "*",
"@types/mdurl": "*"
}
},
- "@types/mdurl": {
+ "node_modules/@types/mdurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz",
"integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==",
"dev": true
},
- "@types/node": {
+ "node_modules/@types/node": {
"version": "10.12.6",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.6.tgz",
"integrity": "sha512-+ZWB5Ec1iki99xQFzBlivlKxSZQ+fuUKBott8StBOnLN4dWbRHlgdg1XknpW6g0tweniN5DcOqA64CJyOUPSAw==",
"dev": true
},
- "@types/node-int64": {
+ "node_modules/@types/node-int64": {
"version": "0.4.29",
"resolved": "https://registry.npmjs.org/@types/node-int64/-/node-int64-0.4.29.tgz",
"integrity": "sha512-rHXvenLTj/CcsmNAebaBOhxQ2MqEGl3yXZZcZ21XYR+gzGTTcpOy2N4IxpvTCz48loyQNatHvfn6GhIbbZ1R3Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"@types/node": "*"
}
},
- "@types/q": {
+ "node_modules/@types/q": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz",
"integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==",
"dev": true
},
- "acorn": {
+ "node_modules/acorn": {
"version": "6.4.2",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
"integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
- "acorn-jsx": {
+ "node_modules/acorn-jsx": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.0.tgz",
"integrity": "sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg==",
- "dev": true
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0"
+ }
},
- "aggregate-error": {
+ "node_modules/aggregate-error": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz",
"integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==",
"dev": true,
- "requires": {
+ "dependencies": {
"clean-stack": "^2.0.0",
"indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "ajv": {
+ "node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
- "requires": {
+ "dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
- "dependencies": {
- "fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
- }
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "ansi-escapes": {
+ "node_modules/ajv/node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/ansi-escapes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
"integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "ansi-regex": {
+ "node_modules/ansi-regex": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
"integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "ansi-styles": {
+ "node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
- "requires": {
+ "dependencies": {
"color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "append-transform": {
+ "node_modules/append-transform": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz",
"integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==",
"dev": true,
- "requires": {
+ "dependencies": {
"default-require-extensions": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "archy": {
+ "node_modules/archy": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
"integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
"dev": true
},
- "argparse": {
+ "node_modules/argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
- "requires": {
+ "dependencies": {
"sprintf-js": "~1.0.2"
}
},
- "array-union": {
+ "node_modules/array-union": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
"integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
"dev": true,
- "requires": {
+ "dependencies": {
"array-uniq": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "array-uniq": {
+ "node_modules/array-uniq": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
"integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "arrify": {
+ "node_modules/arrify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
- "dev": true
- },
- "asn1": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
- "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
"dev": true,
- "requires": {
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/asn1": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+ "dev": true,
+ "dependencies": {
"safer-buffer": "~2.1.0"
}
},
- "assert-plus": {
+ "node_modules/assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
},
- "async-limiter": {
+ "node_modules/async-limiter": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
"integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
},
- "asynckit": {
+ "node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"dev": true
},
- "aws-sign2": {
+ "node_modules/aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/aws4": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
+ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
"dev": true
},
- "aws4": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
- "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
- "dev": true
- },
- "balanced-match": {
+ "node_modules/balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
- "bcrypt-pbkdf": {
+ "node_modules/bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
"dev": true,
- "requires": {
+ "dependencies": {
"tweetnacl": "^0.14.3"
}
},
- "bluebird": {
+ "node_modules/bluebird": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
"dev": true
},
- "brace-expansion": {
+ "node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
- "requires": {
+ "dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
- "browser-or-node": {
+ "node_modules/browser-or-node": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-1.2.1.tgz",
"integrity": "sha512-sVIA0cysIED0nbmNOm7sZzKfgN1rpFmrqvLZaFWspaBAftfQcezlC81G6j6U2RJf4Lh66zFxrCeOsvkUXIcPWg=="
},
- "buffer-equals": {
+ "node_modules/buffer-equals": {
"version": "1.0.4",
"resolved": "http://registry.npmjs.org/buffer-equals/-/buffer-equals-1.0.4.tgz",
"integrity": "sha1-A1O1T9B/2VZBcGca5vZrnPENJ/U=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "caching-transform": {
+ "node_modules/caching-transform": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz",
"integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==",
"dev": true,
- "requires": {
+ "dependencies": {
"hasha": "^5.0.0",
"make-dir": "^3.0.0",
"package-hash": "^4.0.0",
"write-file-atomic": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "caller-path": {
+ "node_modules/caller-path": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
"integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
"dev": true,
- "requires": {
+ "dependencies": {
"callsites": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "callsites": {
+ "node_modules/callsites": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
"integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "camelcase": {
+ "node_modules/camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
},
- "caseless": {
+ "node_modules/caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
"dev": true
},
- "catharsis": {
+ "node_modules/catharsis": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
"integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==",
"dev": true,
- "requires": {
+ "dependencies": {
"lodash": "^4.17.15"
+ },
+ "engines": {
+ "node": ">= 10"
}
},
- "chalk": {
+ "node_modules/chalk": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
"integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "chardet": {
+ "node_modules/chardet": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
"dev": true
},
- "circular-json": {
+ "node_modules/circular-json": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
"integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
+ "deprecated": "CircularJSON is in maintenance only, flatted is its successor.",
"dev": true
},
- "clean-stack": {
+ "node_modules/clean-stack": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
"integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
},
- "cli-cursor": {
+ "node_modules/cli-cursor": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
"integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
"dev": true,
- "requires": {
+ "dependencies": {
"restore-cursor": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "cli-width": {
+ "node_modules/cli-width": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
"integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
"dev": true
},
- "cliui": {
+ "node_modules/cliui": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
"integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^6.2.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
}
},
- "color-convert": {
+ "node_modules/cliui/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
- "requires": {
+ "dependencies": {
"color-name": "1.1.3"
}
},
- "color-name": {
+ "node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
- "combined-stream": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
- "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
- "requires": {
+ "dependencies": {
"delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
}
},
- "commander": {
+ "node_modules/commander": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
"integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
"dev": true
},
- "commondir": {
+ "node_modules/commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
"integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
"dev": true
},
- "concat-map": {
+ "node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
- "connect": {
+ "node_modules/connect": {
"version": "3.6.6",
"resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
"integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=",
"dev": true,
- "requires": {
+ "dependencies": {
"debug": "2.6.9",
"finalhandler": "1.1.0",
"parseurl": "~1.3.2",
"utils-merge": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
}
},
- "convert-source-map": {
+ "node_modules/convert-source-map": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
"integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
"dev": true,
- "requires": {
+ "dependencies": {
"safe-buffer": "~5.1.1"
}
},
- "core-util-is": {
+ "node_modules/core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
"dev": true
},
- "cross-spawn": {
+ "node_modules/cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"nice-try": "^1.0.4",
"path-key": "^2.0.1",
"semver": "^5.5.0",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
+ },
+ "engines": {
+ "node": ">=4.8"
}
},
- "dashdash": {
+ "node_modules/dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
"dev": true,
- "requires": {
+ "dependencies": {
"assert-plus": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10"
}
},
- "debug": {
+ "node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
- "requires": {
+ "dependencies": {
"ms": "2.0.0"
}
},
- "decamelize": {
+ "node_modules/decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "deep-equal": {
+ "node_modules/deep-equal": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
"integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
"dev": true
},
- "deep-is": {
+ "node_modules/deep-is": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
"dev": true
},
- "default-require-extensions": {
+ "node_modules/default-require-extensions": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz",
"integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==",
"dev": true,
- "requires": {
+ "dependencies": {
"strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "define-properties": {
+ "node_modules/define-properties": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"object-keys": "^1.0.12"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
- "defined": {
+ "node_modules/defined": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
"integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
"dev": true
},
- "del": {
+ "node_modules/del": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
"integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
"dev": true,
- "requires": {
+ "dependencies": {
"globby": "^5.0.0",
"is-path-cwd": "^1.0.0",
"is-path-in-cwd": "^1.0.0",
@@ -844,105 +993,129 @@
"pify": "^2.0.0",
"pinkie-promise": "^2.0.0",
"rimraf": "^2.2.8"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "delayed-stream": {
+ "node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
- "doctrine": {
+ "node_modules/doctrine": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
"integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
"dev": true,
- "requires": {
+ "dependencies": {
"esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "ecc-jsbn": {
+ "node_modules/ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
"dev": true,
- "requires": {
+ "dependencies": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
- "ee-first": {
+ "node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
"dev": true
},
- "emoji-regex": {
+ "node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
- "encodeurl": {
+ "node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
},
- "entities": {
+ "node_modules/entities": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
"integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
- "dev": true
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
},
- "es-abstract": {
+ "node_modules/es-abstract": {
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
"integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
"dev": true,
- "requires": {
+ "dependencies": {
"es-to-primitive": "^1.1.1",
"function-bind": "^1.1.1",
"has": "^1.0.1",
"is-callable": "^1.1.3",
"is-regex": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
- "es-to-primitive": {
+ "node_modules/es-to-primitive": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
"integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-callable": "^1.1.4",
"is-date-object": "^1.0.1",
"is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
- "es6-error": {
+ "node_modules/es6-error": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
"integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
"dev": true
},
- "escape-html": {
+ "node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
"dev": true
},
- "escape-string-regexp": {
+ "node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
},
- "eslint": {
+ "node_modules/eslint": {
"version": "5.7.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-5.7.0.tgz",
"integrity": "sha512-zYCeFQahsxffGl87U2aJ7DPyH8CbWgxBC213Y8+TCanhUTf2gEvfq3EKpHmEcozTLyPmGe9LZdMAwC/CpJBM5A==",
"dev": true,
- "requires": {
+ "dependencies": {
"@babel/code-frame": "^7.0.0",
"ajv": "^6.5.3",
"chalk": "^2.1.0",
@@ -982,188 +1155,250 @@
"table": "^5.0.2",
"text-table": "^0.2.0"
},
- "dependencies": {
- "debug": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
- "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
- "dev": true
- }
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^6.14.0 || ^8.10.0 || >=9.10.0"
}
},
- "eslint-config-prettier": {
+ "node_modules/eslint-config-prettier": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-3.1.0.tgz",
"integrity": "sha512-QYGfmzuc4q4J6XIhlp8vRKdI/fI0tQfQPy1dME3UOLprE+v4ssH/3W9LM2Q7h5qBcy5m0ehCrBDU2YF8q6OY8w==",
"dev": true,
- "requires": {
+ "dependencies": {
"get-stdin": "^6.0.0"
+ },
+ "bin": {
+ "eslint-config-prettier-check": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=3.14.1"
}
},
- "eslint-plugin-prettier": {
+ "node_modules/eslint-plugin-prettier": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.0.tgz",
"integrity": "sha512-4g11opzhqq/8+AMmo5Vc2Gn7z9alZ4JqrbZ+D4i8KlSyxeQhZHlmIrY8U9Akf514MoEhogPa87Jgkq87aZ2Ohw==",
"dev": true,
- "requires": {
+ "dependencies": {
"prettier-linter-helpers": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">= 5.0.0",
+ "prettier": ">= 1.13.0"
}
},
- "eslint-scope": {
+ "node_modules/eslint-scope": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
"integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
"dev": true,
- "requires": {
+ "dependencies": {
"esrecurse": "^4.1.0",
"estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=4.0.0"
}
},
- "eslint-utils": {
+ "node_modules/eslint-utils": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
"integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"eslint-visitor-keys": "^1.1.0"
},
- "dependencies": {
- "eslint-visitor-keys": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
- "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
- "dev": true
- }
+ "engines": {
+ "node": ">=6"
}
},
- "eslint-visitor-keys": {
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
+ "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
"integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint/node_modules/debug": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
+ "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==",
+ "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint/node_modules/ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
"dev": true
},
- "espree": {
+ "node_modules/espree": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz",
"integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==",
"dev": true,
- "requires": {
+ "dependencies": {
"acorn": "^6.0.2",
"acorn-jsx": "^5.0.0",
"eslint-visitor-keys": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "esprima": {
+ "node_modules/esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
},
- "esquery": {
+ "node_modules/esquery": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
"integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
"dev": true,
- "requires": {
+ "dependencies": {
"estraverse": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.6"
}
},
- "esrecurse": {
+ "node_modules/esrecurse": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
"integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"estraverse": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=4.0"
}
},
- "estraverse": {
+ "node_modules/estraverse": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
"integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "esutils": {
+ "node_modules/esutils": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "extend": {
+ "node_modules/extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"dev": true
},
- "external-editor": {
+ "node_modules/external-editor": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
"integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
"dev": true,
- "requires": {
+ "dependencies": {
"chardet": "^0.7.0",
"iconv-lite": "^0.4.24",
"tmp": "^0.0.33"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "extsprintf": {
+ "node_modules/extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
- "dev": true
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ]
},
- "fast-diff": {
+ "node_modules/fast-diff": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
"integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
"dev": true
},
- "fast-json-stable-stringify": {
+ "node_modules/fast-json-stable-stringify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
"dev": true
},
- "fast-levenshtein": {
+ "node_modules/fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
- "figures": {
+ "node_modules/figures": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
"integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
"dev": true,
- "requires": {
+ "dependencies": {
"escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "file-entry-cache": {
+ "node_modules/file-entry-cache": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
"integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
"dev": true,
- "requires": {
+ "dependencies": {
"flat-cache": "^1.2.1",
"object-assign": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "finalhandler": {
+ "node_modules/finalhandler": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
"integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
"dev": true,
- "requires": {
+ "dependencies": {
"debug": "2.6.9",
"encodeurl": "~1.0.1",
"escape-html": "~1.0.3",
@@ -1171,352 +1406,453 @@
"parseurl": "~1.3.2",
"statuses": "~1.3.1",
"unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
}
},
- "find-cache-dir": {
+ "node_modules/find-cache-dir": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz",
"integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==",
"dev": true,
- "requires": {
+ "dependencies": {
"commondir": "^1.0.1",
"make-dir": "^3.0.0",
"pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
}
},
- "find-up": {
+ "node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
- "requires": {
+ "dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "flat-cache": {
+ "node_modules/flat-cache": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
"integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
"dev": true,
- "requires": {
+ "dependencies": {
"circular-json": "^0.3.1",
"del": "^2.0.2",
"graceful-fs": "^4.1.2",
"write": "^0.2.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "for-each": {
+ "node_modules/for-each": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
"integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-callable": "^1.1.3"
}
},
- "foreground-child": {
+ "node_modules/foreground-child": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
"integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
"dev": true,
- "requires": {
+ "dependencies": {
"cross-spawn": "^7.0.0",
"signal-exit": "^3.0.2"
},
- "dependencies": {
- "cross-spawn": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
- "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
- "dev": true,
- "requires": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- }
- },
- "path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true
- },
- "shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "requires": {
- "shebang-regex": "^3.0.0"
- }
- },
- "shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- }
+ "engines": {
+ "node": ">=8.0.0"
}
},
- "forever-agent": {
+ "node_modules/foreground-child/node_modules/cross-spawn": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
+ "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/foreground-child/node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/foreground-child/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/foreground-child/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/foreground-child/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "dev": true
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
},
- "form-data": {
+ "node_modules/form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
}
},
- "fromentries": {
+ "node_modules/fromentries": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz",
"integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==",
"dev": true
},
- "fs.realpath": {
+ "node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
- "function-bind": {
+ "node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
- "functional-red-black-tree": {
+ "node_modules/functional-red-black-tree": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
"dev": true
},
- "gensync": {
+ "node_modules/gensync": {
"version": "1.0.0-beta.1",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
"integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
},
- "get-caller-file": {
+ "node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
},
- "get-stdin": {
+ "node_modules/get-stdin": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
"integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "getpass": {
+ "node_modules/getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
"dev": true,
- "requires": {
+ "dependencies": {
"assert-plus": "^1.0.0"
}
},
- "glob": {
+ "node_modules/glob": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
}
},
- "globals": {
+ "node_modules/globals": {
"version": "11.8.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz",
"integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "globby": {
+ "node_modules/globby": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
"integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
"dev": true,
- "requires": {
+ "dependencies": {
"array-union": "^1.0.1",
"arrify": "^1.0.0",
"glob": "^7.0.3",
"object-assign": "^4.0.1",
"pify": "^2.0.0",
"pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "graceful-fs": {
+ "node_modules/graceful-fs": {
"version": "4.1.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
- "dev": true
- },
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
- "dev": true
- },
- "har-validator": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
- "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
"dev": true,
- "requires": {
- "ajv": "^6.5.5",
- "har-schema": "^2.0.0"
+ "engines": {
+ "node": ">=0.4.0"
}
},
- "has": {
+ "node_modules/har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "deprecated": "this library is no longer supported",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
- "requires": {
+ "dependencies": {
"function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
}
},
- "has-flag": {
+ "node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "has-symbols": {
+ "node_modules/has-symbols": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
"integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
},
- "hasha": {
+ "node_modules/hasha": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz",
"integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-stream": "^2.0.0",
"type-fest": "^0.8.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "html-escaper": {
+ "node_modules/html-escaper": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz",
"integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==",
"dev": true
},
- "html-validator": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/html-validator/-/html-validator-3.1.3.tgz",
- "integrity": "sha512-RhjcQIHS/SfYzQ+/JrFWKU6AVve6AuwftAG/cWX3+bpvBK/tGMqbOleKlsAxLrKD84+GSJ1oJGnkyhdVLBGCqg==",
+ "node_modules/html-validator": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/html-validator/-/html-validator-0.0.8.tgz",
+ "integrity": "sha512-7iL7tXUZ73BpRgb9n9dkLCIFbMLUu+liJVOmGwltrMjZf1eVwoIGfpBxnLLCSq9iefAoWb/I1DUiRJWUj9tbUA==",
"dev": true,
- "requires": {
- "request": "2.88.0",
- "valid-url": "1.0.9"
- }
- },
- "html-validator-cli": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/html-validator-cli/-/html-validator-cli-4.1.4.tgz",
- "integrity": "sha512-4vGP107UDhhNHeWA5N8j/nUPlQbtB/W/K2x/P7aElbWMWrOkJA0MRSVFsMFrTPSAAjZWCG9uki2+1cQDzFtVcQ==",
- "dev": true,
- "requires": {
- "html-validator": "3.1.3",
- "minimist": "1.2.0"
- },
"dependencies": {
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
- "dev": true
- }
+ "minimist": "^1.1.0",
+ "request": "^2.42.0",
+ "valid-url": "^1.0.9"
+ },
+ "bin": {
+ "html-validator": "cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "http-signature": {
+ "node_modules/html-validator-cli": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/html-validator-cli/-/html-validator-cli-2.0.0.tgz",
+ "integrity": "sha512-bfWxpGvVdenUqpJrI4HSCiVP+QPtik86epTTnXGtUU1USAi2sGfJOHTf8cLFqPKsooF+9i0xcH8h7fILnFxEbA==",
+ "dev": true,
+ "dependencies": {
+ "html-validator": "^0.0.8",
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "html-validator": "index.js"
+ },
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
+ },
+ "engines": {
+ "node": ">=0.8",
+ "npm": ">=1.3.7"
}
},
- "iconv-lite": {
+ "node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dev": true,
- "requires": {
+ "dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "ignore": {
+ "node_modules/ignore": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
},
- "imurmurhash": {
+ "node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
},
- "indent-string": {
+ "node_modules/indent-string": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "inflight": {
+ "node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
- "requires": {
+ "dependencies": {
"once": "^1.3.0",
"wrappy": "1"
}
},
- "inherits": {
+ "node_modules/inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
},
- "inquirer": {
+ "node_modules/inquirer": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz",
"integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==",
"dev": true,
- "requires": {
+ "dependencies": {
"ansi-escapes": "^3.0.0",
"chalk": "^2.0.0",
"cli-cursor": "^2.1.0",
@@ -1530,136 +1866,178 @@
"string-width": "^2.1.0",
"strip-ansi": "^4.0.0",
"through": "^2.3.6"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "is-callable": {
+ "node_modules/is-callable": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
"integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
},
- "is-date-object": {
+ "node_modules/is-date-object": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
"integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
},
- "is-fullwidth-code-point": {
+ "node_modules/is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "is-path-cwd": {
+ "node_modules/is-path-cwd": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
"integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "is-path-in-cwd": {
+ "node_modules/is-path-in-cwd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
"integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-path-inside": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-path-inside": {
+ "node_modules/is-path-inside": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
"integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
"dev": true,
- "requires": {
+ "dependencies": {
"path-is-inside": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-promise": {
+ "node_modules/is-promise": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
"integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
"dev": true
},
- "is-regex": {
+ "node_modules/is-regex": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
"integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
"dev": true,
- "requires": {
+ "dependencies": {
"has": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
- "is-resolvable": {
+ "node_modules/is-resolvable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
"integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
"dev": true
},
- "is-stream": {
+ "node_modules/is-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
"integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "is-symbol": {
+ "node_modules/is-symbol": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
"integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
"dev": true,
- "requires": {
+ "dependencies": {
"has-symbols": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
- "is-typedarray": {
+ "node_modules/is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
"dev": true
},
- "is-windows": {
+ "node_modules/is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "isexe": {
+ "node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true
},
- "isomorphic-ws": {
+ "node_modules/isomorphic-ws": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz",
- "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="
+ "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==",
+ "peerDependencies": {
+ "ws": "*"
+ }
},
- "isstream": {
+ "node_modules/isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
"dev": true
},
- "istanbul-lib-coverage": {
+ "node_modules/istanbul-lib-coverage": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
"integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "istanbul-lib-hook": {
+ "node_modules/istanbul-lib-hook": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz",
"integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"append-transform": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "istanbul-lib-instrument": {
+ "node_modules/istanbul-lib-instrument": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz",
"integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==",
"dev": true,
- "requires": {
+ "dependencies": {
"@babel/core": "^7.7.5",
"@babel/parser": "^7.7.5",
"@babel/template": "^7.7.4",
@@ -1668,27 +2046,25 @@
"istanbul-lib-coverage": "^3.0.0",
"semver": "^6.3.0"
},
- "dependencies": {
- "@babel/parser": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz",
- "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==",
- "dev": true
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
+ "engines": {
+ "node": ">=8"
}
},
- "istanbul-lib-processinfo": {
+ "node_modules/istanbul-lib-instrument/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz",
"integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==",
"dev": true,
- "requires": {
+ "dependencies": {
"archy": "^1.0.0",
"cross-spawn": "^7.0.0",
"istanbul-lib-coverage": "^3.0.0-alpha.1",
@@ -1697,175 +2073,213 @@
"rimraf": "^3.0.0",
"uuid": "^3.3.3"
},
- "dependencies": {
- "cross-spawn": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
- "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
- "dev": true,
- "requires": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- }
- },
- "path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "requires": {
- "shebang-regex": "^3.0.0"
- }
- },
- "shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true
- },
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "dev": true
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- }
+ "engines": {
+ "node": ">=8"
}
},
- "istanbul-lib-report": {
+ "node_modules/istanbul-lib-processinfo/node_modules/cross-spawn": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
+ "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo/node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
"integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
"dev": true,
- "requires": {
+ "dependencies": {
"istanbul-lib-coverage": "^3.0.0",
"make-dir": "^3.0.0",
"supports-color": "^7.1.0"
},
- "dependencies": {
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
+ "engines": {
+ "node": ">=8"
}
},
- "istanbul-lib-source-maps": {
+ "node_modules/istanbul-lib-report/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz",
"integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==",
"dev": true,
- "requires": {
+ "dependencies": {
"debug": "^4.1.1",
"istanbul-lib-coverage": "^3.0.0",
"source-map": "^0.6.1"
},
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
+ "engines": {
+ "node": ">=8"
}
},
- "istanbul-reports": {
+ "node_modules/istanbul-lib-source-maps/node_modules/debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/istanbul-reports": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
"integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==",
"dev": true,
- "requires": {
+ "dependencies": {
"html-escaper": "^2.0.0",
"istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "js-tokens": {
+ "node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
- "js-yaml": {
+ "node_modules/js-yaml": {
"version": "3.13.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
"integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
"dev": true,
- "requires": {
+ "dependencies": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
}
},
- "js2xmlparser": {
+ "node_modules/js2xmlparser": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz",
"integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
"dev": true,
- "requires": {
+ "dependencies": {
"xmlcreate": "^2.0.4"
}
},
- "jsbn": {
+ "node_modules/jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
"dev": true
},
- "jsdoc": {
- "version": "3.6.11",
- "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.11.tgz",
- "integrity": "sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg==",
+ "node_modules/jsdoc": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz",
+ "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==",
"dev": true,
- "requires": {
- "@babel/parser": "^7.9.4",
+ "dependencies": {
+ "@babel/parser": "^7.20.15",
+ "@jsdoc/salty": "^0.2.1",
"@types/markdown-it": "^12.2.3",
"bluebird": "^3.7.2",
"catharsis": "^0.9.0",
@@ -1878,291 +2292,370 @@
"mkdirp": "^1.0.4",
"requizzle": "^0.2.3",
"strip-json-comments": "^3.1.0",
- "taffydb": "2.6.2",
"underscore": "~1.13.2"
},
- "dependencies": {
- "escape-string-regexp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
- "dev": true
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true
- },
- "strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true
- }
+ "bin": {
+ "jsdoc": "jsdoc.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
}
},
- "jsesc": {
+ "node_modules/jsdoc/node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jsdoc/node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jsdoc/node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
},
- "json-int64": {
+ "node_modules/json-int64": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json-int64/-/json-int64-1.0.2.tgz",
"integrity": "sha512-uGrIXtRehbksM17S2lJRLPljufK52KL2ewbJi0xgcRPONoRLXa4yAUIKAUxF69dbnqIoBu33fB28MAWSxupB8Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"node-int64": "0.4.0"
}
},
- "json-schema-traverse": {
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
- "json-stable-stringify-without-jsonify": {
+ "node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
- "json-stringify-safe": {
+ "node_modules/json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
"dev": true
},
- "json5": {
+ "node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
},
- "jsprim": {
+ "node_modules/jsprim": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
"integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
"dev": true,
- "requires": {
+ "dependencies": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.4.0",
"verror": "1.10.0"
},
- "dependencies": {
- "json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "dev": true
- }
+ "engines": {
+ "node": ">=0.6.0"
}
},
- "klaw": {
+ "node_modules/klaw": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
"integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
"dev": true,
- "requires": {
+ "dependencies": {
"graceful-fs": "^4.1.9"
}
},
- "levn": {
+ "node_modules/levn": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
"integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
"dev": true,
- "requires": {
+ "dependencies": {
"prelude-ls": "~1.1.2",
"type-check": "~0.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "linkify-it": {
+ "node_modules/linkify-it": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
"integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"uc.micro": "^1.0.1"
}
},
- "locate-path": {
+ "node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
- "requires": {
+ "dependencies": {
"p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "lodash": {
+ "node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
- "lodash.flattendeep": {
+ "node_modules/lodash.flattendeep": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
"integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
"dev": true
},
- "make-dir": {
+ "node_modules/make-dir": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz",
"integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==",
"dev": true,
- "requires": {
+ "dependencies": {
"semver": "^6.0.0"
},
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "markdown-it": {
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/markdown-it": {
"version": "12.3.2",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
"integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
"dev": true,
- "requires": {
+ "dependencies": {
"argparse": "^2.0.1",
"entities": "~2.1.0",
"linkify-it": "^3.0.1",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
},
- "dependencies": {
- "argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
- }
+ "bin": {
+ "markdown-it": "bin/markdown-it.js"
}
},
- "markdown-it-anchor": {
+ "node_modules/markdown-it-anchor": {
"version": "8.6.5",
"resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz",
"integrity": "sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ==",
+ "dev": true,
+ "peerDependencies": {
+ "@types/markdown-it": "*",
+ "markdown-it": "*"
+ }
+ },
+ "node_modules/markdown-it/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
},
- "marked": {
+ "node_modules/marked": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz",
"integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
},
- "mdurl": {
+ "node_modules/mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
"integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
"dev": true
},
- "mime-db": {
- "version": "1.37.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
- "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
- "dev": true
- },
- "mime-types": {
- "version": "2.1.21",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
- "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"dev": true,
- "requires": {
- "mime-db": "~1.37.0"
+ "engines": {
+ "node": ">= 0.6"
}
},
- "mimic-fn": {
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
"integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "minimatch": {
+ "node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
- "requires": {
+ "dependencies": {
"brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
}
},
- "mkdirp": {
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mkdirp": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"minimist": "^1.2.5"
},
- "dependencies": {
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
- }
+ "bin": {
+ "mkdirp": "bin/cmd.js"
}
},
- "ms": {
+ "node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
- "mute-stream": {
+ "node_modules/mute-stream": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
"integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
"dev": true
},
- "natural-compare": {
+ "node_modules/natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"dev": true
},
- "nice-try": {
+ "node_modules/nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true
},
- "node-gyp-build": {
+ "node_modules/node-gyp-build": {
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz",
"integrity": "sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
+ }
},
- "node-int64": {
+ "node_modules/node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
"integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs="
},
- "node-preload": {
+ "node_modules/node-preload": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
"integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"process-on-spawn": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "nyc": {
+ "node_modules/nyc": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz",
"integrity": "sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg==",
"dev": true,
- "requires": {
+ "dependencies": {
"@istanbuljs/load-nyc-config": "^1.0.0",
"@istanbuljs/schema": "^0.1.2",
"caching-transform": "^4.0.0",
@@ -2192,320 +2685,432 @@
"uuid": "^3.3.3",
"yargs": "^15.0.2"
},
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "dev": true
- }
+ "bin": {
+ "nyc": "bin/nyc.js"
+ },
+ "engines": {
+ "node": ">=8.9"
}
},
- "oauth-sign": {
+ "node_modules/nyc/node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/nyc/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
},
- "object-assign": {
+ "node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "object-inspect": {
+ "node_modules/object-inspect": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
"integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==",
"dev": true
},
- "object-keys": {
+ "node_modules/object-keys": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
"integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
},
- "on-finished": {
+ "node_modules/on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
"dev": true,
- "requires": {
+ "dependencies": {
"ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
}
},
- "once": {
+ "node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
- "requires": {
+ "dependencies": {
"wrappy": "1"
}
},
- "onetime": {
+ "node_modules/onetime": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
"integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
"dev": true,
- "requires": {
+ "dependencies": {
"mimic-fn": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "optionator": {
+ "node_modules/optionator": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
"integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
"dev": true,
- "requires": {
+ "dependencies": {
"deep-is": "~0.1.3",
"fast-levenshtein": "~2.0.4",
"levn": "~0.3.0",
"prelude-ls": "~1.1.2",
"type-check": "~0.3.2",
"wordwrap": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "os-tmpdir": {
+ "node_modules/os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "p-limit": {
+ "node_modules/p-limit": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
"integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "p-locate": {
+ "node_modules/p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
- "requires": {
+ "dependencies": {
"p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "p-map": {
+ "node_modules/p-map": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
"integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "p-try": {
+ "node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
},
- "package-hash": {
+ "node_modules/package-hash": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz",
"integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"graceful-fs": "^4.1.15",
"hasha": "^5.0.0",
"lodash.flattendeep": "^4.4.0",
"release-zalgo": "^1.0.0"
},
- "dependencies": {
- "graceful-fs": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
- "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
- "dev": true
- }
+ "engines": {
+ "node": ">=8"
}
},
- "parseurl": {
+ "node_modules/package-hash/node_modules/graceful-fs": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
+ "dev": true
+ },
+ "node_modules/parseurl": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
"integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
},
- "path-exists": {
+ "node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "path-is-absolute": {
+ "node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "path-is-inside": {
+ "node_modules/path-is-inside": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
"integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
"dev": true
},
- "path-key": {
+ "node_modules/path-key": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
"integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "performance-now": {
+ "node_modules/performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
"dev": true
},
- "pify": {
+ "node_modules/pify": {
"version": "2.3.0",
"resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "pinkie": {
+ "node_modules/pinkie": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
"integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "pinkie-promise": {
+ "node_modules/pinkie-promise": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
"dev": true,
- "requires": {
+ "dependencies": {
"pinkie": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "pkg-dir": {
+ "node_modules/pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "pluralize": {
+ "node_modules/pluralize": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
"integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "prelude-ls": {
+ "node_modules/prelude-ls": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
},
- "prettier": {
+ "node_modules/prettier": {
"version": "1.14.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-1.14.3.tgz",
"integrity": "sha512-qZDVnCrnpsRJJq5nSsiHCE3BYMED2OtsI+cmzIzF1QIfqm5ALf8tEJcO27zV1gKNKRPdhjO0dNWnrzssDQ1tFg==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
},
- "prettier-linter-helpers": {
+ "node_modules/prettier-linter-helpers": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
"integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
"dev": true,
- "requires": {
+ "dependencies": {
"fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "process-on-spawn": {
+ "node_modules/process-on-spawn": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz",
"integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==",
"dev": true,
- "requires": {
+ "dependencies": {
"fromentries": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "progress": {
+ "node_modules/progress": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz",
"integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
"dev": true
},
- "psl": {
- "version": "1.1.31",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
- "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==",
- "dev": true
- },
- "punycode": {
+ "node_modules/punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
},
- "q": {
+ "node_modules/q": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+ "engines": {
+ "node": ">=0.6.0",
+ "teleport": ">=0.2.0"
+ }
},
- "qs": {
+ "node_modules/qs": {
"version": "6.5.3",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
"integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
},
- "regexpp": {
+ "node_modules/regexpp": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
"integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6.5.0"
+ }
},
- "release-zalgo": {
+ "node_modules/release-zalgo": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
"integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=",
"dev": true,
- "requires": {
+ "dependencies": {
"es6-error": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "request": {
- "version": "2.88.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
- "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "node_modules/request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
"dev": true,
- "requires": {
+ "dependencies": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
"caseless": "~0.12.0",
@@ -2513,7 +3118,7 @@
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
- "har-validator": "~5.1.0",
+ "har-validator": "~5.1.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
@@ -2523,154 +3128,190 @@
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
- "tough-cookie": "~2.4.3",
+ "tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
+ },
+ "engines": {
+ "node": ">= 6"
}
},
- "require-directory": {
+ "node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "require-main-filename": {
+ "node_modules/require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"dev": true
},
- "require-uncached": {
+ "node_modules/require-uncached": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
"integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
"dev": true,
- "requires": {
+ "dependencies": {
"caller-path": "^0.1.0",
"resolve-from": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "requizzle": {
+ "node_modules/requizzle": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz",
"integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"lodash": "^4.17.14"
}
},
- "resolve-from": {
+ "node_modules/resolve-from": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
"integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "restore-cursor": {
+ "node_modules/restore-cursor": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
"integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
"dev": true,
- "requires": {
+ "dependencies": {
"onetime": "^2.0.0",
"signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "resumer": {
+ "node_modules/resumer": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
"integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=",
"dev": true,
- "requires": {
+ "dependencies": {
"through": "~2.3.4"
}
},
- "rimraf": {
+ "node_modules/rimraf": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
"integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
"dev": true,
- "requires": {
+ "dependencies": {
"glob": "^7.0.5"
+ },
+ "bin": {
+ "rimraf": "bin.js"
}
},
- "run-async": {
+ "node_modules/run-async": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
"integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
"dev": true,
- "requires": {
+ "dependencies": {
"is-promise": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=0.12.0"
}
},
- "rxjs": {
+ "node_modules/rxjs": {
"version": "6.3.3",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
"integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
"dev": true,
- "requires": {
+ "dependencies": {
"tslib": "^1.9.0"
+ },
+ "engines": {
+ "npm": ">=2.0.0"
}
},
- "safe-buffer": {
+ "node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
- "safer-buffer": {
+ "node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
- "semver": {
+ "node_modules/semver": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
"integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
},
- "set-blocking": {
+ "node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"dev": true
},
- "shebang-command": {
+ "node_modules/shebang-command": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
"integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
"dev": true,
- "requires": {
+ "dependencies": {
"shebang-regex": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "shebang-regex": {
+ "node_modules/shebang-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "signal-exit": {
+ "node_modules/signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"dev": true
},
- "slice-ansi": {
+ "node_modules/slice-ansi": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
"integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-fullwidth-code-point": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "spawn-wrap": {
+ "node_modules/spawn-wrap": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
"integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==",
"dev": true,
- "requires": {
+ "dependencies": {
"foreground-child": "^2.0.0",
"is-windows": "^1.0.2",
"make-dir": "^3.0.0",
@@ -2678,39 +3319,52 @@
"signal-exit": "^3.0.2",
"which": "^2.0.1"
},
- "dependencies": {
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- }
+ "engines": {
+ "node": ">=8"
}
},
- "sprintf-js": {
+ "node_modules/spawn-wrap/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/spawn-wrap/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
- "sshpk": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
- "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+ "node_modules/sshpk": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
+ "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
"bcrypt-pbkdf": "^1.0.0",
@@ -2720,89 +3374,115 @@
"jsbn": "~0.1.0",
"safer-buffer": "^2.0.2",
"tweetnacl": "~0.14.0"
+ },
+ "bin": {
+ "sshpk-conv": "bin/sshpk-conv",
+ "sshpk-sign": "bin/sshpk-sign",
+ "sshpk-verify": "bin/sshpk-verify"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "statuses": {
+ "node_modules/statuses": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
"integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
},
- "string-width": {
+ "node_modules/string-width": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "string.prototype.trim": {
+ "node_modules/string.prototype.trim": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz",
"integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=",
"dev": true,
- "requires": {
+ "dependencies": {
"define-properties": "^1.1.2",
"es-abstract": "^1.5.0",
"function-bind": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
- "strip-ansi": {
+ "node_modules/strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"dev": true,
- "requires": {
+ "dependencies": {
"ansi-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "strip-bom": {
+ "node_modules/strip-bom": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
"integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "strip-json-comments": {
+ "node_modules/strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "supports-color": {
+ "node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
- "requires": {
+ "dependencies": {
"has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "table": {
+ "node_modules/table": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz",
"integrity": "sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==",
"dev": true,
- "requires": {
+ "dependencies": {
"ajv": "^6.5.3",
"lodash": "^4.17.10",
"slice-ansi": "1.0.0",
"string-width": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "taffydb": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz",
- "integrity": "sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA==",
- "dev": true
- },
- "tape": {
+ "node_modules/tape": {
"version": "4.9.1",
"resolved": "https://registry.npmjs.org/tape/-/tape-4.9.1.tgz",
"integrity": "sha512-6fKIXknLpoe/Jp4rzHKFPpJUHDHDqn8jus99IfPnHIjyz78HYlefTGD3b5EkbQzuLfaEvmfPK3IolLgq2xT3kw==",
"dev": true,
- "requires": {
+ "dependencies": {
"deep-equal": "~1.0.1",
"defined": "~1.0.0",
"for-each": "~0.3.3",
@@ -2817,364 +3497,423 @@
"string.prototype.trim": "~1.1.2",
"through": "~2.3.8"
},
- "dependencies": {
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
- },
- "resolve": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
- "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
- "dev": true,
- "requires": {
- "path-parse": "^1.0.5"
- },
- "dependencies": {
- "path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- }
- }
- }
+ "bin": {
+ "tape": "bin/tape"
}
},
- "test-exclude": {
+ "node_modules/tape/node_modules/resolve": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
+ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
+ "dev": true,
+ "dependencies": {
+ "path-parse": "^1.0.5"
+ }
+ },
+ "node_modules/tape/node_modules/resolve/node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/test-exclude": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
"integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
"dev": true,
- "requires": {
+ "dependencies": {
"@istanbuljs/schema": "^0.1.2",
"glob": "^7.1.4",
"minimatch": "^3.0.4"
},
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- }
+ "engines": {
+ "node": ">=8"
}
},
- "text-table": {
+ "node_modules/test-exclude/node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
"dev": true
},
- "through": {
+ "node_modules/through": {
"version": "2.3.8",
"resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
"dev": true
},
- "tmp": {
+ "node_modules/tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
"integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
"dev": true,
- "requires": {
+ "dependencies": {
"os-tmpdir": "~1.0.2"
+ },
+ "engines": {
+ "node": ">=0.6.0"
}
},
- "to-fast-properties": {
+ "node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
- "dev": true
- },
- "tough-cookie": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
- "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
"dev": true,
- "requires": {
- "psl": "^1.1.24",
- "punycode": "^1.4.1"
- },
- "dependencies": {
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
- "dev": true
- }
+ "engines": {
+ "node": ">=4"
}
},
- "tslib": {
+ "node_modules/tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "dev": true,
+ "dependencies": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tslib": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
"integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
"dev": true
},
- "tunnel-agent": {
+ "node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
"dev": true,
- "requires": {
+ "dependencies": {
"safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
}
},
- "tweetnacl": {
+ "node_modules/tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
"dev": true
},
- "type-check": {
+ "node_modules/type-check": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
"integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
"dev": true,
- "requires": {
+ "dependencies": {
"prelude-ls": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "type-fest": {
+ "node_modules/type-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "typedarray-to-buffer": {
+ "node_modules/typedarray-to-buffer": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
"integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-typedarray": "^1.0.0"
}
},
- "typescript": {
+ "node_modules/typescript": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz",
"integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
},
- "uc.micro": {
+ "node_modules/uc.micro": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
"dev": true
},
- "underscore": {
+ "node_modules/underscore": {
"version": "1.13.6",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
"integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==",
"dev": true
},
- "unpipe": {
+ "node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
},
- "uri-js": {
+ "node_modules/uri-js": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"punycode": "^2.1.0"
}
},
- "utf-8-validate": {
+ "node_modules/utf-8-validate": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.2.tgz",
"integrity": "sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw==",
"dev": true,
- "requires": {
+ "hasInstallScript": true,
+ "dependencies": {
"node-gyp-build": "~3.7.0"
}
},
- "utils-merge": {
+ "node_modules/utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4.0"
+ }
},
- "uuid": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
- "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
- "dev": true
+ "node_modules/uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
+ "dev": true,
+ "bin": {
+ "uuid": "bin/uuid"
+ }
},
- "valid-url": {
+ "node_modules/valid-url": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz",
- "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=",
+ "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==",
"dev": true
},
- "verror": {
+ "node_modules/verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
"dev": true,
- "requires": {
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "dependencies": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
- "which": {
+ "node_modules/which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
}
},
- "which-module": {
+ "node_modules/which-module": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
"dev": true
},
- "wordwrap": {
+ "node_modules/wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
"dev": true
},
- "wrap-ansi": {
+ "node_modules/wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
"integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
- "requires": {
+ "dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
- "dependencies": {
- "ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true
- },
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "dev": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
+ "engines": {
+ "node": ">=8"
}
},
- "wrappy": {
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "dependencies": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
- "write": {
+ "node_modules/write": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
"integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
"dev": true,
- "requires": {
+ "dependencies": {
"mkdirp": "^0.5.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "write-file-atomic": {
+ "node_modules/write-file-atomic": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz",
"integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==",
"dev": true,
- "requires": {
+ "dependencies": {
"imurmurhash": "^0.1.4",
"is-typedarray": "^1.0.0",
"signal-exit": "^3.0.2",
"typedarray-to-buffer": "^3.1.5"
}
},
- "ws": {
+ "node_modules/ws": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz",
"integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==",
- "requires": {
+ "dependencies": {
"async-limiter": "~1.0.0"
}
},
- "xmlcreate": {
+ "node_modules/xmlcreate": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
"integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==",
"dev": true
},
- "y18n": {
+ "node_modules/y18n": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
"dev": true
},
- "yargs": {
+ "node_modules/yargs": {
"version": "15.4.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
"integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
"dev": true,
- "requires": {
+ "dependencies": {
"cliui": "^6.0.0",
"decamelize": "^1.2.0",
"find-up": "^4.1.0",
@@ -3187,49 +3926,65 @@
"y18n": "^4.0.0",
"yargs-parser": "^18.1.2"
},
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
"dependencies": {
- "ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- }
- },
- "strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.1"
- }
- },
- "yargs-parser": {
- "version": "18.1.3",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
- "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- }
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
}
}
}
diff --git a/package.json b/package.json
index 84080a6..47f9e87 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,7 @@
"type": "git",
"url": "https://github.com/apache/thrift.git"
},
- "version": "0.19.0",
+ "version": "0.20.0",
"author": {
"name": "Apache Thrift Developers",
"email": "dev@thrift.apache.org",
@@ -52,8 +52,8 @@
"eslint": "^5.7.0",
"eslint-config-prettier": "^3.1.0",
"eslint-plugin-prettier": "^3.0.0",
- "html-validator-cli": "^4.1.4",
- "jsdoc": "^3.6.7",
+ "html-validator-cli": "^2.0.0",
+ "jsdoc": "^4.0.2",
"json-int64": "^1.0.2",
"nyc": "^15.0.0",
"prettier": "^1.14.3",
diff --git a/sonar-project.properties b/sonar-project.properties
index cac8e8c..258dfe9 100644
--- a/sonar-project.properties
+++ b/sonar-project.properties
@@ -16,7 +16,7 @@
services that work efficiently and seamlessly between all major languages.
# Apache Thrift Version
-sonar.projectVersion=0.19.0
+sonar.projectVersion=0.20.0
# use this to set another version string
# $ sonar-runner -D sonar.projectVersion=`git rev-parse HEAD`
# set projectDate in combination with projectVersion for imports of old releases
@@ -54,7 +54,7 @@
module1.sonar.projectBaseDir=lib/java
module1.sonar.sources=src
module1.sonar.tests=test
-module1.sonar.binaries=build/libs/libthrift-0.19.0.jar
+module1.sonar.binaries=build/libs/libthrift-0.20.0.jar
module1.sonar.libraries=build/deps/*.jar
module1.sonar.language=java
@@ -62,7 +62,7 @@
module2.sonar.projectBaseDir=.
module2.sonar.sources=tutorial/java/src, tutorial/java/gen-java
module2.sonar.binaries=tutorial/java/tutorial.jar
-module2.sonar.libraries=lib/java/build/deps/*.jar,lib/java/build/libs/libthrift-0.19.0.jar
+module2.sonar.libraries=lib/java/build/deps/*.jar,lib/java/build/libs/libthrift-0.20.0.jar
module2.sonar.language=java
module3.sonar.projectName=Apache Thrift - JavaScript Library
diff --git a/test/crossrunner/util.py b/test/crossrunner/util.py
index 8511f58..c214df8 100644
--- a/test/crossrunner/util.py
+++ b/test/crossrunner/util.py
@@ -21,7 +21,7 @@
def domain_socket_path(port):
- return '/tmp/v0.16/ThriftTest.thrift.%d' % port
+ return '/tmp/ThriftTest.thrift.%d' % port
def merge_dict(base, update):
diff --git a/test/dart/test_client/pubspec.yaml b/test/dart/test_client/pubspec.yaml
index c34d693..177e2cd 100644
--- a/test/dart/test_client/pubspec.yaml
+++ b/test/dart/test_client/pubspec.yaml
@@ -16,7 +16,7 @@
# under the License.
name: thrift_test_client
-version: 0.19.0
+version: 0.20.0
description: A client integration test for the Dart Thrift library
author: Apache Thrift Developers <dev@thrift.apache.org>
homepage: http://thrift.apache.org
@@ -26,7 +26,7 @@
dependencies:
args: ">=0.13.0 <2.0.0"
- http: ^0.11.0
+ http: ^0.13.3
thrift:
path: ../../../lib/dart
thrift_test:
diff --git a/test/erl/src/thrift_test.app.src b/test/erl/src/thrift_test.app.src
index 4a850d0..9d68a56 100644
--- a/test/erl/src/thrift_test.app.src
+++ b/test/erl/src/thrift_test.app.src
@@ -22,7 +22,7 @@
{description, "Thrift cross language test"},
% The version of the applicaton
- {vsn, "0.19.0"},
+ {vsn, "0.20.0"},
% All modules used by the application.
{modules, [
diff --git a/test/go/go.mod b/test/go/go.mod
index ff88c9b..723069b 100644
--- a/test/go/go.mod
+++ b/test/go/go.mod
@@ -1,6 +1,6 @@
module github.com/apache/thrift/test/go
-go 1.19
+go 1.20
require (
github.com/apache/thrift v0.0.0-00010101000000-000000000000
diff --git a/test/netstd/Client/Client.csproj b/test/netstd/Client/Client.csproj
index bd7d1ee..1ae67fa 100644
--- a/test/netstd/Client/Client.csproj
+++ b/test/netstd/Client/Client.csproj
@@ -24,7 +24,7 @@
<AssemblyName>Client</AssemblyName>
<PackageId>Client</PackageId>
<OutputType>Exe</OutputType>
- <Version>0.19.0.0</Version>
+ <Version>0.20.0.0</Version>
<GenerateAssemblyTitleAttribute>false</GenerateAssemblyTitleAttribute>
<GenerateAssemblyDescriptionAttribute>false</GenerateAssemblyDescriptionAttribute>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
@@ -37,7 +37,7 @@
<ItemGroup>
<PackageReference Include="System.Net.Http.WinHttpHandler" Version="7.0.0" />
<PackageReference Include="System.Runtime.Serialization.Primitives" Version="[4.3,)" />
- <PackageReference Include="System.ServiceModel.Primitives" Version="4.10.0" />
+ <PackageReference Include="System.ServiceModel.Primitives" Version="6.0.0" />
<PackageReference Include="System.Threading" Version="[4.3,)" />
</ItemGroup>
diff --git a/test/netstd/Server/Server.csproj b/test/netstd/Server/Server.csproj
index 85c1ad4..020b8d5 100644
--- a/test/netstd/Server/Server.csproj
+++ b/test/netstd/Server/Server.csproj
@@ -24,7 +24,7 @@
<AssemblyName>Server</AssemblyName>
<PackageId>Server</PackageId>
<OutputType>Exe</OutputType>
- <Version>0.19.0.0</Version>
+ <Version>0.20.0.0</Version>
<GenerateAssemblyTitleAttribute>false</GenerateAssemblyTitleAttribute>
<GenerateAssemblyDescriptionAttribute>false</GenerateAssemblyDescriptionAttribute>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
@@ -36,10 +36,9 @@
<ItemGroup>
<PackageReference Include="System.IO.Pipes" Version="4.3.0" />
- <PackageReference Include="System.IO.Pipes.AccessControl" Version="5.0.0" />
<PackageReference Include="System.Net.Http.WinHttpHandler" Version="7.0.0" />
<PackageReference Include="System.Runtime.Serialization.Primitives" Version="[4.3,)" />
- <PackageReference Include="System.ServiceModel.Primitives" Version="4.10.0" />
+ <PackageReference Include="System.ServiceModel.Primitives" Version="6.0.0" />
<PackageReference Include="System.Threading" Version="[4.3,)" />
</ItemGroup>
diff --git a/test/py/TestClient.py b/test/py/TestClient.py
index 8a30c3a..61a9c60 100755
--- a/test/py/TestClient.py
+++ b/test/py/TestClient.py
@@ -256,6 +256,35 @@
y = self.client.testMultiException('success', 'foobar')
self.assertEqual(y.string_thing, 'foobar')
+ def testException__traceback__(self):
+ print('testException__traceback__')
+ self.client.testException('Safe')
+ expect_slots = uses_slots = False
+ expect_dynamic = uses_dynamic = False
+ try:
+ self.client.testException('Xception')
+ self.fail("should have gotten exception")
+ except Xception as x:
+ uses_slots = hasattr(x, '__slots__')
+ uses_dynamic = (not isinstance(x, TException))
+ # We set expected values here so that we get clean tracebackes when
+ # the assertions fail.
+ try:
+ x.__traceback__ = x.__traceback__
+ # If `__traceback__` was set without errors than we expect that
+ # the slots option was used and that dynamic classes were not.
+ expect_slots = True
+ expect_dynamic = False
+ except Exception as e:
+ self.assertTrue(isinstance(e, TypeError))
+ # There are no other meaningful tests we can preform because we
+ # are unable to determine the desired state of either `__slots__`
+ # or `dynamic`.
+ return
+
+ self.assertEqual(expect_slots, uses_slots)
+ self.assertEqual(expect_dynamic, uses_dynamic)
+
def testOneway(self):
print('testOneway')
start = time.time()
diff --git a/test/py/explicit_module/EnumSerializationTest.py b/test/py/explicit_module/EnumSerializationTest.py
new file mode 100644
index 0000000..8d82708
--- /dev/null
+++ b/test/py/explicit_module/EnumSerializationTest.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+from __future__ import annotations
+
+import sys
+from shared_types.ttypes import SharedEnum
+from thrift.TSerialization import serialize, deserialize
+from thrift.protocol import TBinaryProtocol
+from thrift.transport import TTransport
+
+def deserialize_immutable(base,
+ buf,
+ protocol_factory=TBinaryProtocol.TBinaryProtocolFactory()):
+ transport = TTransport.TMemoryBuffer(buf)
+ protocol = protocol_factory.getProtocol(transport)
+ return base.read(protocol)
+
+def serialization_deserialization_struct_enum_test():
+ test_obj = TestStruct(param1="test_string", param2=TestEnum.TestEnum1, param3=SharedEnum.SharedEnum1)
+ test_obj_serialized = serialize(test_obj)
+ test_obj2 = deserialize(TestStruct(), test_obj_serialized)
+ assert test_obj.param1 == test_obj2.param1
+ assert test_obj.param2 == test_obj2.param2
+ assert test_obj.param3 == test_obj2.param3
+
+def serialization_deserialization_struct_enum_as_string_test():
+ test_obj = TestStruct(param1="test_string", param2=TestEnum.TestEnum1.name, param3=SharedEnum.SharedEnum1.name)
+ test_obj_serialized = serialize(test_obj)
+ test_obj2 = deserialize(TestStruct(), test_obj_serialized)
+ assert test_obj.param1 == test_obj2.param1
+ assert test_obj.param2 == test_obj2.param2
+ assert test_obj.param3 == test_obj2.param3
+
+def serialization_deserialization_exception_enum_as_string_test():
+ test_obj = TestException(whatOp=0, why=SharedEnum.SharedEnum0.name, who=TestEnum.TestEnum0.name)
+ test_obj_serialized = serialize(test_obj)
+ test_obj2 = deserialize_immutable(TestException, test_obj_serialized)
+ assert test_obj.whatOp == test_obj2.whatOp
+ assert test_obj.why == test_obj2.why
+ assert test_obj.who == test_obj2.who
+
+def serialization_deserialization_exception_enum_test():
+ test_obj = TestException(whatOp=0, why=SharedEnum.SharedEnum0, who=TestEnum.TestEnum0)
+ test_obj_serialized = serialize(test_obj)
+ test_obj2 = deserialize_immutable(TestException, test_obj_serialized)
+ assert test_obj.whatOp == test_obj2.whatOp
+ assert test_obj.why == test_obj2.why
+ assert test_obj.who == test_obj2.who
+
+
+
+if __name__ == "__main__":
+ args = sys.argv[1:]
+ if args:
+ from test5_slots.test5.ttypes import TestEnum, TestStruct, TestException
+ else:
+ from test5.ttypes import TestEnum, TestStruct, TestException
+ serialization_deserialization_struct_enum_test()
+ serialization_deserialization_struct_enum_as_string_test()
+ serialization_deserialization_exception_enum_as_string_test()
+ serialization_deserialization_exception_enum_test()
\ No newline at end of file
diff --git a/test/py/explicit_module/runtest.sh b/test/py/explicit_module/runtest.sh
index 6d73462..e4618b2 100755
--- a/test/py/explicit_module/runtest.sh
+++ b/test/py/explicit_module/runtest.sh
@@ -23,9 +23,17 @@
../../../compiler/cpp/thrift --gen py test1.thrift || exit 1
../../../compiler/cpp/thrift --gen py test2.thrift || exit 1
../../../compiler/cpp/thrift --gen py test3.thrift && exit 1 # Fail since test3.thrift has python keywords
+../../../compiler/cpp/thrift --gen py:enum shared_types.thrift || exit 1
+../../../compiler/cpp/thrift --gen py:enum test4.thrift || exit 1
+../../../compiler/cpp/thrift --gen py:enum test5.thrift || exit 1
+mkdir -p ./gen-py/test5_slots
+../../../compiler/cpp/thrift --gen py:enum,slots -out ./gen-py/test5_slots test5.thrift || exit 1
PYTHONPATH=./gen-py python -c 'import foo.bar.baz' || exit 1
PYTHONPATH=./gen-py python -c 'import test2' || exit 1
PYTHONPATH=./gen-py python -c 'import test1' &>/dev/null && exit 1 # Should fail.
+PYTHONPATH=./gen-py python -c 'import test4.constants' || exit 1
+PYTHONPATH=./gen-py python EnumSerializationTest.py || exit 1
+PYTHONPATH=./gen-py python EnumSerializationTest.py slot|| exit 1
cp -r gen-py simple
../../../compiler/cpp/thrift -r --gen py test2.thrift || exit 1
PYTHONPATH=./gen-py python -c 'import test2' || exit 1
diff --git a/test/py/explicit_module/shared_types.thrift b/test/py/explicit_module/shared_types.thrift
new file mode 100644
index 0000000..9150f8e
--- /dev/null
+++ b/test/py/explicit_module/shared_types.thrift
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+namespace py shared_types
+
+enum SharedEnum {
+ SharedEnum0 = 0,
+ SharedEnum1 = 1
+}
+
diff --git a/test/py/explicit_module/test4.thrift b/test/py/explicit_module/test4.thrift
new file mode 100644
index 0000000..91e9b36
--- /dev/null
+++ b/test/py/explicit_module/test4.thrift
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+namespace py test4
+
+include "shared_types.thrift"
+
+enum TestEnum {
+ TestEnum0 = 0,
+ TestEnum1 = 1,
+}
+
+const map<TestEnum, shared_types.SharedEnum> typeConversion = {
+ TestEnum.TestEnum0: shared_types.SharedEnum0,
+ TestEnum.TestEnum1: shared_types.SharedEnum1,
+}
\ No newline at end of file
diff --git a/test/py/explicit_module/test5.thrift b/test/py/explicit_module/test5.thrift
new file mode 100644
index 0000000..f281424
--- /dev/null
+++ b/test/py/explicit_module/test5.thrift
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+namespace py test5
+
+include "shared_types.thrift"
+
+enum TestEnum {
+ TestEnum0 = 0,
+ TestEnum1 = 1,
+}
+
+struct TestStruct {
+ 1: optional string param1
+ 2: optional TestEnum param2
+ 3: optional shared_types.SharedEnum param3
+}
+
+/**
+ * Structs can also be exceptions, if they are nasty.
+ */
+exception TestException {
+ 1: i32 whatOp,
+ 2: shared_types.SharedEnum why
+ 3: TestEnum who
+}
\ No newline at end of file
diff --git a/test/rs/Cargo.toml b/test/rs/Cargo.toml
index b039fff..da53b96 100644
--- a/test/rs/Cargo.toml
+++ b/test/rs/Cargo.toml
@@ -11,7 +11,7 @@
bitflags = "=1.2"
env_logger = "0.8"
log = "0.4"
+uuid = "1"
[dependencies.thrift]
path = "../../lib/rs"
-
diff --git a/test/rs/Makefile.am b/test/rs/Makefile.am
index 103f80c..78db5ee 100644
--- a/test/rs/Makefile.am
+++ b/test/rs/Makefile.am
@@ -17,8 +17,8 @@
# under the License.
#
-stubs: ../v0.16/ThriftTest.thrift
- $(THRIFT) -I ./thrifts -out src --gen rs ../v0.16/ThriftTest.thrift
+stubs: ../ThriftTest.thrift
+ $(THRIFT) -I ./thrifts -out src --gen rs ../ThriftTest.thrift
precross: stubs
$(CARGO) build
diff --git a/test/rs/src/bin/test_client.rs b/test/rs/src/bin/test_client.rs
index a44bac3..fd3a185 100644
--- a/test/rs/src/bin/test_client.rs
+++ b/test/rs/src/bin/test_client.rs
@@ -231,6 +231,12 @@
"thing".to_owned(),
)?;
+ info!("testUuid");
+ verify_expected_result(
+ thrift_test_client.test_uuid(uuid::uuid!("00010203-0405-0607-0809-0a0b0c0d0e0f")),
+ uuid::uuid!("00010203-0405-0607-0809-0a0b0c0d0e0f"),
+ )?;
+
info!("testBool");
verify_expected_result(thrift_test_client.test_bool(true), true)?;
diff --git a/test/rs/src/bin/test_server.rs b/test/rs/src/bin/test_server.rs
index 92a4bcc..3e622d5 100644
--- a/test/rs/src/bin/test_server.rs
+++ b/test/rs/src/bin/test_server.rs
@@ -174,6 +174,11 @@
Ok(thing)
}
+ fn handle_test_uuid(&self, thing: uuid::Uuid) -> thrift::Result<uuid::Uuid> {
+ info!("testUUID({})", &thing);
+ Ok(thing)
+ }
+
fn handle_test_bool(&self, thing: bool) -> thrift::Result<bool> {
info!("testBool({})", thing);
Ok(thing)
diff --git a/tutorial/dart/client/pubspec.yaml b/tutorial/dart/client/pubspec.yaml
index 626c8f9..e8c6db8 100644
--- a/tutorial/dart/client/pubspec.yaml
+++ b/tutorial/dart/client/pubspec.yaml
@@ -16,7 +16,7 @@
# under the License.
name: tutorial_client
-version: 0.19.0
+version: 0.20.0
description: A Dart client implementation of the Apache Thrift tutorial
author: Apache Thrift Developers <dev@thrift.apache.org>
homepage: http://thrift.apache.org
diff --git a/tutorial/dart/console_client/pubspec.yaml b/tutorial/dart/console_client/pubspec.yaml
index 957b96c..e5c0938 100644
--- a/tutorial/dart/console_client/pubspec.yaml
+++ b/tutorial/dart/console_client/pubspec.yaml
@@ -16,7 +16,7 @@
# under the License.
name: tutorial_console_client
-version: 0.19.0
+version: 0.20.0
description: >
A Dart console client to implementation of the Apache Thrift tutorial
author: Apache Thrift Developers <dev@thrift.apache.org>
diff --git a/tutorial/dart/server/pubspec.yaml b/tutorial/dart/server/pubspec.yaml
index 6ad5cdd..5f7edb9 100644
--- a/tutorial/dart/server/pubspec.yaml
+++ b/tutorial/dart/server/pubspec.yaml
@@ -16,7 +16,7 @@
# under the License.
name: tutorial_server
-version: 0.19.0
+version: 0.20.0
description: A Dart server to support the Apache Thrift tutorial
author: Apache Thrift Developers <dev@thrift.apache.org>
homepage: http://thrift.apache.org
diff --git a/tutorial/delphi/DelphiClient/DelphiClient.dproj b/tutorial/delphi/DelphiClient/DelphiClient.dproj
index e55cc06..34d9f03 100644
--- a/tutorial/delphi/DelphiClient/DelphiClient.dproj
+++ b/tutorial/delphi/DelphiClient/DelphiClient.dproj
@@ -124,13 +124,13 @@
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName"/>
<VersionInfoKeys Name="FileDescription">Thrift Tutorial</VersionInfoKeys>
- <VersionInfoKeys Name="FileVersion">0.19.0.0</VersionInfoKeys>
+ <VersionInfoKeys Name="FileVersion">0.20.0.0</VersionInfoKeys>
<VersionInfoKeys Name="InternalName">DelphiClient</VersionInfoKeys>
<VersionInfoKeys Name="LegalCopyright">Copyright © 2012 The Apache Software Foundation</VersionInfoKeys>
<VersionInfoKeys Name="LegalTrademarks"/>
<VersionInfoKeys Name="OriginalFilename">DelphiClient.exe</VersionInfoKeys>
<VersionInfoKeys Name="ProductName">Thrift</VersionInfoKeys>
- <VersionInfoKeys Name="ProductVersion">0.19.0.0</VersionInfoKeys>
+ <VersionInfoKeys Name="ProductVersion">0.20.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Comments"/>
</VersionInfoKeys>
<Source>
diff --git a/tutorial/delphi/DelphiServer/DelphiServer.dproj b/tutorial/delphi/DelphiServer/DelphiServer.dproj
index 4080b92..fa8cb92 100644
--- a/tutorial/delphi/DelphiServer/DelphiServer.dproj
+++ b/tutorial/delphi/DelphiServer/DelphiServer.dproj
@@ -121,13 +121,13 @@
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName"/>
<VersionInfoKeys Name="FileDescription">Thrift Tutorial</VersionInfoKeys>
- <VersionInfoKeys Name="FileVersion">0.19.0.0</VersionInfoKeys>
+ <VersionInfoKeys Name="FileVersion">0.20.0.0</VersionInfoKeys>
<VersionInfoKeys Name="InternalName">DelphiServer</VersionInfoKeys>
<VersionInfoKeys Name="LegalCopyright">Copyright © 2012 The Apache Software Foundation</VersionInfoKeys>
<VersionInfoKeys Name="LegalTrademarks"/>
<VersionInfoKeys Name="OriginalFilename">DelphiServer.exe</VersionInfoKeys>
<VersionInfoKeys Name="ProductName">Thrift</VersionInfoKeys>
- <VersionInfoKeys Name="ProductVersion">0.19.0.0</VersionInfoKeys>
+ <VersionInfoKeys Name="ProductVersion">0.20.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Comments"/>
</VersionInfoKeys>
<Source>
diff --git a/tutorial/netstd/Client/Client.csproj b/tutorial/netstd/Client/Client.csproj
index c21b58d..ee0bc82 100644
--- a/tutorial/netstd/Client/Client.csproj
+++ b/tutorial/netstd/Client/Client.csproj
@@ -24,7 +24,7 @@
<AssemblyName>Client</AssemblyName>
<PackageId>Client</PackageId>
<OutputType>Exe</OutputType>
- <Version>0.19.0.0</Version>
+ <Version>0.20.0.0</Version>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
diff --git a/tutorial/netstd/Interfaces/Interfaces.csproj b/tutorial/netstd/Interfaces/Interfaces.csproj
index 1e1193b..ff7891e 100644
--- a/tutorial/netstd/Interfaces/Interfaces.csproj
+++ b/tutorial/netstd/Interfaces/Interfaces.csproj
@@ -22,7 +22,7 @@
<TargetFramework>net7.0</TargetFramework>
<AssemblyName>Interfaces</AssemblyName>
<PackageId>Interfaces</PackageId>
- <Version>0.19.0.0</Version>
+ <Version>0.20.0.0</Version>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
@@ -34,7 +34,7 @@
</ItemGroup>
<ItemGroup>
- <PackageReference Include="System.ServiceModel.Primitives" Version="4.10.0" />
+ <PackageReference Include="System.ServiceModel.Primitives" Version="6.0.0" />
</ItemGroup>
<Target Name="PreBuild" BeforeTargets="_GenerateRestoreProjectSpec;Restore;Compile">
diff --git a/tutorial/netstd/Server/Server.csproj b/tutorial/netstd/Server/Server.csproj
index 193e3c3..9aa3bc6 100644
--- a/tutorial/netstd/Server/Server.csproj
+++ b/tutorial/netstd/Server/Server.csproj
@@ -24,7 +24,7 @@
<AssemblyName>Server</AssemblyName>
<PackageId>Server</PackageId>
<OutputType>Exe</OutputType>
- <Version>0.19.0.0</Version>
+ <Version>0.20.0.0</Version>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
@@ -36,10 +36,9 @@
<ProjectReference Include="../../../lib/netstd/Thrift/Thrift.csproj" />
</ItemGroup>
- <ItemGroup>
- <PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
- <PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="2.2.1" />
- <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.2.0" />
- <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="7.0.0" />
+ <ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
+ <PackageReference Include="Microsoft.AspNetCore.Components.Web">
+ <Version>7.0.9</Version>
+ </PackageReference>
</ItemGroup>
</Project>
diff --git a/tutorial/ocaml/_oasis b/tutorial/ocaml/_oasis
index 1101740..6072e4b 100644
--- a/tutorial/ocaml/_oasis
+++ b/tutorial/ocaml/_oasis
@@ -1,5 +1,5 @@
Name: tutorial
-Version: 0.19.0
+Version: 0.20.0
OASISFormat: 0.3
Synopsis: OCaml Tutorial example
Authors: Apache Thrift Developers <dev@thrift.apache.org>