From 4276f24d142da8a759cf00e1693bd7830a02e7b0 Mon Sep 17 00:00:00 2001 From: Yongseok Date: Tue, 12 Sep 2023 18:10:26 +0900 Subject: [PATCH] [#125] mysql module support * pinpoint node agent development db modules fixtures * MysqlContainer withCopyFilesToContainer for fixtures * Fix `ERROR 1064 (42000) at line 16: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3` * testcontainer docker-entrypoint-initdb.d learning test * Support SQL_ID AnnotationKey * createConnection endPoint SpanEvent * MySQL connect SpanEvent * MySQL connect async callback SpanEvent * Declare MySQL Service Type * Java agent InstrumentMethod, addScopedInterceptor implementation * MySQL createConnection Interceptor * MySQLConnectionInterceptor * We know hook method API. we need to translate *stack name to human understanding information. Fix wrong Class name for connection test * Query Hook * databaseInfo to MySQLStatementExecuteQueryInterceptor * transformation sql string to normalizedSql * SQL Meta Data gRPC API * DefaultAnnotationKey is no needs. I think it is better to remove it. * If object uses JSON.stringify, It's right. But other cases, It's wrong. ex) string '123' -> '"123"' It is wrong * Fix test failure * annotation * Support Java agent annotationValue and data type annotation to Node Agent * fix async spanevent * Fix audit warning * update testcontainer version * DefaultPredefinedMethodDescriptorRegistry rename refactoring * delete no used commented code * AsyncId must have sequence * recordHTTPURL no standard pinpoint spanevent API * method descriptor builder needs ApiDescriptor Setter method * trace.traceBlockEnd needs log.error('spanevent does not exists in call-stack') guard * Support SQL Bind Value * fix express test failure * mysql query matcher * createPool interceptor * Support mysql Pool query and query with getConnection * MySQL PoolConnection Support * Scope in interceptor like java agent * mysql service type and execute query * Upgrade nodejs engine version matrix version * mysql2 fixtures Logger Adaptor pattern * The Logger must implements pinpoint.json config loading status and a log level. * support integration test * if adaptor doesn't have adaptor outer method, Agent outs logs to console [#117] loglevel default logger integration test [#117] loglevel default logger [#119] Fix "SequenceGenerator is not a constructor" error [#121] Fix testcontainer `It was resolved to update testcontainer v9` [#122] Fix testContainer test failure [#117] make Agent d.ts in repository [#117] node-agent index.d.ts [#122] Fix test failure [#122] fix github action failure [#123] Fix Github action test failure #2 formatting #2 express get function name #86 expectedStackString #86 Fix test failure #86 trace #87 HTTP param annotation key #87 url.parse exception guard #87 setAttribute search Param #87 annotation key #87 remove no needs callstack #87 Express with method name #86 express callstack #86 parse stack trace #86 express method name matcher #86 route name #86 use layer symbol #86 use layer symbol #86 extract method refactoring #86 method descriptor #86 method descriptor Builder #86 method name matcher #86 express API Meta cache #86 extract class refactoring #86 callstack extract method refactoring pattern #86 rename refactoring #86 linenumber #86 methodDescriptorBuilder #86 makeMethodDescriptorBuilder #86 method descriptor builder #86 at Type.functionName [as methodName] (location) and at Type.name (location) in https://v8.dev/docs/stack-trace-api #86 fullName #86 post test [#98] Fix no details error case informations to Error callstack By using the string return value of the stack in the toString method of Error, the developer can check the error information in detail. Fix redis 4.0 redis connection error - upgrade testcontainer to v7 [#101] The middleware should be displayed with the same depth as next, but the bug was fixed in the hierarchical display incorrectly. Provides Middleware Code level visibility Fixed a bug where Error Handler's location was displayed as anonymous Middleware [#101] TypeScript Express Demo app [#101] react app sample [#101] When using React as the front end and Express as the back end, the react sample is unnecessary because it is the same environment as express. [#104] make koa example [#104] koa support code level visibility [#104] remove no used module hook [#104] koa support code level visibility [#104] koa wrap guard [#104] koa module parameter descriptor https://github.com/koajs/router/blob/master/API.md router.get('/', (ctx, next) => { // ctx.router available }); [#104] remove no needs files [#104] koa module https://github.com/koajs/router/blob/1aead99e0e0fdb8666e9c6fa2f52b0463c622025/lib/layer.js#L25 [#104] koa moudle callstack parsing [#104] Support call stack `Router. [as get]` with `Function.app. [as get]` [#104] koa module MethodDescriptorBuilder [#104] koa support code level visibility [#104] koa and express module status code 200 verification [#104] remove no needs match wrap [#111] When a large number of grpc streams occur, the subChannelPool running test has different results depending on the server environment and is deleted [#117] Support logger, authentication adaptor pattern typescript tools support for .d.ts * https://nodejs.org/api/modules.html#enabling * fix license convention by https://docs.npmjs.com/cli/v8/configuring-npm/package-json#license --- .github/workflows/main.yml | 16 +- .gitignore | 2 - .gitmodules | 3 + .nycrc | 2 +- CHANGELOG.md | 13 + demo/express-ts/.env | 10 + demo/express-ts/.gitignore | 8 + demo/express-ts/build.ts | 63 + demo/express-ts/package.json | 98 + demo/express-ts/spec/index.ts | 55 + demo/express-ts/spec/loadEnv.ts | 10 + demo/express-ts/spec/nodemon.json | 6 + demo/express-ts/spec/support/jasmine.json | 11 + demo/express-ts/spec/support/types.ts | 14 + demo/express-ts/spec/tests/Users.spec.ts | 210 + demo/express-ts/src/@types/express/index.d.ts | 9 + demo/express-ts/src/Server.ts | 63 + .../src/daos/MockDb/MockDao.mock.ts | 25 + .../src/daos/MockDb/MockDb.backup.json | 19 + demo/express-ts/src/daos/MockDb/MockDb.json | 19 + demo/express-ts/src/daos/User/UserDao.mock.ts | 62 + demo/express-ts/src/daos/User/UserDao.ts | 64 + demo/express-ts/src/entities/User.ts | 26 + demo/express-ts/src/index.ts | 12 + .../src/pre-start/env/development.env | 14 + .../src/pre-start/env/production.env | 14 + demo/express-ts/src/pre-start/env/test.env | 14 + demo/express-ts/src/pre-start/index.ts | 29 + demo/express-ts/src/public/scripts/index.js | 171 + .../src/public/stylesheets/style.css | 33 + demo/express-ts/src/routes/Users.ts | 75 + demo/express-ts/src/routes/index.ts | 16 + demo/express-ts/src/shared/Logger.ts | 12 + demo/express-ts/src/shared/constants.ts | 3 + demo/express-ts/src/shared/functions.ts | 11 + demo/express-ts/src/views/index.html | 34 + demo/express-ts/tsconfig.json | 90 + demo/express-ts/tsconfig.prod.json | 11 + demo/koa-example/index.js | 17 + demo/koa-example/package.json | 16 + grpc/README.md | 11 + index.d.ts | 7 + lib/agent.js | 48 +- lib/client/data-sender-factory.js | 29 +- lib/client/data-sender.js | 3 + lib/client/grpc-data-sender.js | 30 +- lib/client/sql-meta-data.js | 23 + lib/config.js | 6 +- lib/constant/annotation-key.js | 36 +- ...t-predefined-method-descriptor-registry.js | 31 + lib/constant/method-descriptor.js | 20 - lib/constant/method-type.js | 12 +- lib/constant/service-type.js | 12 +- lib/context/annotation-key-utils.js | 41 + lib/context/annotation-key.js | 16 +- lib/context/annotation.js | 2 +- lib/context/api-meta-service.js | 25 +- lib/context/async-id-accessor.js | 20 - lib/context/async-id.js | 22 +- lib/context/async-method-descriptor.js | 18 - lib/context/async-trace.js | 19 +- lib/context/context-manager.js | 1 - lib/context/disable-span-event-recorder.js | 119 +- lib/context/disable-trace.js | 8 +- .../express-method-descriptor-builder.js | 30 + lib/context/koa-method-descriptor-builder.js | 18 + lib/context/make-method-descriptor-builder.js | 116 + lib/context/method-descriptor-builder.js | 238 + lib/context/method-descriptor-builder2.js | 157 + lib/context/method-descriptor.js | 59 +- lib/context/sequence-generator.js | 18 +- lib/context/sequence-generators.js | 12 + lib/context/service-type.js | 23 +- lib/context/span-chunk.js | 24 +- lib/context/span-event-recorder.js | 131 +- lib/context/span-event.js | 9 + lib/context/span-events.js | 4 +- lib/context/span-recorder.js | 50 +- lib/context/span.js | 24 +- lib/context/string-meta-service.js | 2 +- lib/context/trace-context.js | 53 +- lib/context/trace.js | 57 +- lib/context/transaction-id.js | 2 +- lib/data/dto/api-meta-info.js | 46 +- lib/data/grpc-data-convertor.js | 48 +- lib/data/grpc/spec/Annotation.proto | 60 - lib/data/grpc/spec/Cmd.proto | 101 - lib/data/grpc/spec/README.md | 15 - lib/data/grpc/spec/Service.proto | 52 - lib/data/grpc/spec/Span.proto | 147 - lib/data/grpc/spec/Stat.proto | 155 - lib/data/grpc/spec/ThreadDump.proto | 70 - lib/data/typed-value.js | 16 +- lib/data/{grpc => v1}/Annotation_grpc_pb.js | 0 lib/data/{grpc => v1}/Annotation_pb.js | 738 +- lib/data/{grpc => v1}/Cmd_grpc_pb.js | 0 lib/data/{grpc => v1}/Cmd_pb.js | 26 +- .../CustomMetric_grpc_pb.js} | 0 lib/data/v1/CustomMetric_pb.js | 2314 +++ lib/data/{grpc => v1}/Service_grpc_pb.js | 113 +- lib/data/{grpc => v1}/Service_pb.js | 16 +- .../Stat_grpc_pb.js => v1/Span_grpc_pb.js} | 0 lib/data/{grpc => v1}/Span_pb.js | 116 +- .../Stat_grpc_pb.js} | 0 lib/data/{grpc => v1}/Stat_pb.js | 1280 +- lib/data/v1/ThreadDump_grpc_pb.js | 1 + lib/data/{grpc => v1}/ThreadDump_pb.js | 6 +- lib/instrumentation/call-stack.js | 76 + .../context/annotation/annotations.js | 42 + .../context/annotation/boolean-annotation.js | 36 + .../annotation/data-type-annotation.js | 43 + .../context/annotation/int-annotation.js | 40 + .../annotation/int-string-string-value.js | 54 + .../context/annotation/int-string-value.js | 44 + .../context/annotation/null-annotation.js | 34 + .../context/annotation/object-annotation.js | 40 + .../context/annotation/string-annotation.js | 40 + .../context/annotation/string-string-value.js | 51 + lib/instrumentation/context/span-builder.js | 56 + lib/instrumentation/http-shared.js | 57 +- lib/instrumentation/instrument-method.js | 133 + lib/instrumentation/method-descriptor2.js | 58 + lib/instrumentation/module-hook.js | 10 +- lib/instrumentation/module/bluebird.js | 4 +- lib/instrumentation/module/elasticsearch.js | 87 - lib/instrumentation/module/express.js | 192 +- lib/instrumentation/module/ioredis.js | 6 +- lib/instrumentation/module/koa-route.js | 36 - lib/instrumentation/module/koa-router.js | 108 +- lib/instrumentation/module/koa.js | 95 +- lib/instrumentation/module/mongodb-core.js | 22 +- .../mongodb/mongo-json-data-annotation-key.js | 11 + lib/instrumentation/module/mysql.js | 156 +- .../mysql/mysql-cluster-of-interceptor.js | 31 + .../mysql/mysql-connection-interceptor.js | 39 + .../mysql-create-connection-interceptor.js | 37 + .../mysql-create-pool-cluster-interceptor.js | 31 + .../mysql/mysql-create-pool-interceptor.js | 40 + .../mysql-database-information-context.js | 24 + .../mysql-database-information-symbol.js | 9 + .../mysql/mysql-execute-query-service-type.js | 12 + .../mysql/mysql-get-connection-interceptor.js | 51 + .../module/mysql/mysql-service-type.js | 12 + ...sql-statement-execute-query-interceptor.js | 62 + lib/instrumentation/module/mysql2.js | 106 +- lib/instrumentation/module/redis.js | 6 +- lib/instrumentation/module/request.js | 65 - lib/instrumentation/request-header-utils.js | 31 +- .../default-interceptor-scope-invocation.js | 59 + lib/instrumentation/scope/execution-policy.js | 32 + lib/instrumentation/sql/normalized-sql.js | 26 + lib/instrumentation/sql/parsing-result.js | 30 + .../sql/sql-metadata-service.js | 51 + lib/instrumentation/sql/sql-parser.js | 273 + lib/sampler/sampler.js | 2 +- lib/supports.js | 40 + lib/utils/log/log-level-logger.js | 31 + lib/utils/log/logger-output-adaptor.js | 63 + lib/utils/log/logger2.js | 132 + package-lock.json | 13469 ++++++++++++++++ package.json | 26 +- test/agent.test.js | 2 +- test/agent/env-config.test.js | 23 +- test/client/data-sender.test.js | 4 +- ...c-data-sender-bidirectional-stream.test.js | 71 +- ...rpc-data-sender-client-side-stream.test.js | 5 +- test/client/grpc-data-sender.test.js | 777 +- test/client/grpc-stream-deadline.test.js | 4 +- test/client/grpc-stream.test.js | 12 +- test/client/grpc-unary-rpc.test.js | 72 +- test/client/mock-grpc-data-sender.js | 4 + test/context/callstack.test.js | 91 +- .../make-method-descriptor-builder.test.js | 126 + .../context/method-descriptor-builder.test.js | 51 + test/context/service-type.test.js | 4 +- test/context/span-event-recorder.test.js | 13 +- test/context/span-recorder.test.js | 9 +- test/context/trace-context.test.js | 18 +- test/context/trace.test.js | 4 +- test/context/transaction-id.test.js | 2 +- .../db/innodb-cluster/docker-compose.yml | 23 + .../db/innodb-cluster/mysql-router.env | 5 + .../db/innodb-cluster/mysql-server.env | 2 + test/fixtures/db/mysql.sql | 10 + .../fix-async-call-stack.test.js | 14 +- test/instrumentation/module/express.test.js | 325 +- test/instrumentation/module/fix-redis.test.js | 20 +- test/instrumentation/module/http.test.js | 9 +- test/instrumentation/module/koa.test.js | 36 +- test/instrumentation/module/mysql.test.js | 513 + test/instrumentation/module/mysql2.test.js | 417 + test/instrumentation/sql/sql-parser.test.js | 56 + test/support/agent-singleton-mock.js | 21 +- test/support/data-sender-mock.js | 19 +- test/utils/ant-path-matcher.test.js | 2 +- test/utils/log/logger-output-adaptor.test.js | 118 + test/utils/log/logger.integration.test.js | 57 + test/utils/log/logger.test.js | 75 + test/utils/logger.test.js | 31 - tsconfig.json | 23 + 200 files changed, 24783 insertions(+), 2892 deletions(-) create mode 100644 .gitmodules create mode 100644 demo/express-ts/.env create mode 100644 demo/express-ts/.gitignore create mode 100644 demo/express-ts/build.ts create mode 100644 demo/express-ts/package.json create mode 100644 demo/express-ts/spec/index.ts create mode 100644 demo/express-ts/spec/loadEnv.ts create mode 100644 demo/express-ts/spec/nodemon.json create mode 100644 demo/express-ts/spec/support/jasmine.json create mode 100644 demo/express-ts/spec/support/types.ts create mode 100644 demo/express-ts/spec/tests/Users.spec.ts create mode 100644 demo/express-ts/src/@types/express/index.d.ts create mode 100644 demo/express-ts/src/Server.ts create mode 100644 demo/express-ts/src/daos/MockDb/MockDao.mock.ts create mode 100644 demo/express-ts/src/daos/MockDb/MockDb.backup.json create mode 100644 demo/express-ts/src/daos/MockDb/MockDb.json create mode 100644 demo/express-ts/src/daos/User/UserDao.mock.ts create mode 100644 demo/express-ts/src/daos/User/UserDao.ts create mode 100644 demo/express-ts/src/entities/User.ts create mode 100644 demo/express-ts/src/index.ts create mode 100644 demo/express-ts/src/pre-start/env/development.env create mode 100644 demo/express-ts/src/pre-start/env/production.env create mode 100644 demo/express-ts/src/pre-start/env/test.env create mode 100644 demo/express-ts/src/pre-start/index.ts create mode 100644 demo/express-ts/src/public/scripts/index.js create mode 100644 demo/express-ts/src/public/stylesheets/style.css create mode 100644 demo/express-ts/src/routes/Users.ts create mode 100644 demo/express-ts/src/routes/index.ts create mode 100644 demo/express-ts/src/shared/Logger.ts create mode 100644 demo/express-ts/src/shared/constants.ts create mode 100644 demo/express-ts/src/shared/functions.ts create mode 100644 demo/express-ts/src/views/index.html create mode 100644 demo/express-ts/tsconfig.json create mode 100644 demo/express-ts/tsconfig.prod.json create mode 100644 demo/koa-example/index.js create mode 100644 demo/koa-example/package.json create mode 100644 grpc/README.md create mode 100644 index.d.ts create mode 100644 lib/client/sql-meta-data.js create mode 100644 lib/constant/default-predefined-method-descriptor-registry.js delete mode 100644 lib/constant/method-descriptor.js create mode 100644 lib/context/annotation-key-utils.js delete mode 100644 lib/context/async-id-accessor.js delete mode 100644 lib/context/async-method-descriptor.js create mode 100644 lib/context/express-method-descriptor-builder.js create mode 100644 lib/context/koa-method-descriptor-builder.js create mode 100644 lib/context/make-method-descriptor-builder.js create mode 100644 lib/context/method-descriptor-builder.js create mode 100644 lib/context/method-descriptor-builder2.js create mode 100644 lib/context/sequence-generators.js delete mode 100644 lib/data/grpc/spec/Annotation.proto delete mode 100644 lib/data/grpc/spec/Cmd.proto delete mode 100644 lib/data/grpc/spec/README.md delete mode 100644 lib/data/grpc/spec/Service.proto delete mode 100644 lib/data/grpc/spec/Span.proto delete mode 100644 lib/data/grpc/spec/Stat.proto delete mode 100644 lib/data/grpc/spec/ThreadDump.proto rename lib/data/{grpc => v1}/Annotation_grpc_pb.js (100%) rename lib/data/{grpc => v1}/Annotation_pb.js (63%) rename lib/data/{grpc => v1}/Cmd_grpc_pb.js (100%) rename lib/data/{grpc => v1}/Cmd_pb.js (99%) rename lib/data/{grpc/Span_grpc_pb.js => v1/CustomMetric_grpc_pb.js} (100%) create mode 100644 lib/data/v1/CustomMetric_pb.js rename lib/data/{grpc => v1}/Service_grpc_pb.js (73%) rename lib/data/{grpc => v1}/Service_pb.js (59%) rename lib/data/{grpc/Stat_grpc_pb.js => v1/Span_grpc_pb.js} (100%) rename lib/data/{grpc => v1}/Span_pb.js (97%) rename lib/data/{grpc/ThreadDump_grpc_pb.js => v1/Stat_grpc_pb.js} (100%) rename lib/data/{grpc => v1}/Stat_pb.js (80%) create mode 100644 lib/data/v1/ThreadDump_grpc_pb.js rename lib/data/{grpc => v1}/ThreadDump_pb.js (99%) create mode 100644 lib/instrumentation/call-stack.js create mode 100644 lib/instrumentation/context/annotation/annotations.js create mode 100644 lib/instrumentation/context/annotation/boolean-annotation.js create mode 100644 lib/instrumentation/context/annotation/data-type-annotation.js create mode 100644 lib/instrumentation/context/annotation/int-annotation.js create mode 100644 lib/instrumentation/context/annotation/int-string-string-value.js create mode 100644 lib/instrumentation/context/annotation/int-string-value.js create mode 100644 lib/instrumentation/context/annotation/null-annotation.js create mode 100644 lib/instrumentation/context/annotation/object-annotation.js create mode 100644 lib/instrumentation/context/annotation/string-annotation.js create mode 100644 lib/instrumentation/context/annotation/string-string-value.js create mode 100644 lib/instrumentation/context/span-builder.js create mode 100644 lib/instrumentation/instrument-method.js create mode 100644 lib/instrumentation/method-descriptor2.js delete mode 100644 lib/instrumentation/module/elasticsearch.js delete mode 100644 lib/instrumentation/module/koa-route.js create mode 100644 lib/instrumentation/module/mongodb/mongo-json-data-annotation-key.js create mode 100644 lib/instrumentation/module/mysql/mysql-cluster-of-interceptor.js create mode 100644 lib/instrumentation/module/mysql/mysql-connection-interceptor.js create mode 100644 lib/instrumentation/module/mysql/mysql-create-connection-interceptor.js create mode 100644 lib/instrumentation/module/mysql/mysql-create-pool-cluster-interceptor.js create mode 100644 lib/instrumentation/module/mysql/mysql-create-pool-interceptor.js create mode 100644 lib/instrumentation/module/mysql/mysql-database-information-context.js create mode 100644 lib/instrumentation/module/mysql/mysql-database-information-symbol.js create mode 100644 lib/instrumentation/module/mysql/mysql-execute-query-service-type.js create mode 100644 lib/instrumentation/module/mysql/mysql-get-connection-interceptor.js create mode 100644 lib/instrumentation/module/mysql/mysql-service-type.js create mode 100644 lib/instrumentation/module/mysql/mysql-statement-execute-query-interceptor.js delete mode 100644 lib/instrumentation/module/request.js create mode 100644 lib/instrumentation/scope/default-interceptor-scope-invocation.js create mode 100644 lib/instrumentation/scope/execution-policy.js create mode 100644 lib/instrumentation/sql/normalized-sql.js create mode 100644 lib/instrumentation/sql/parsing-result.js create mode 100644 lib/instrumentation/sql/sql-metadata-service.js create mode 100644 lib/instrumentation/sql/sql-parser.js create mode 100644 lib/supports.js create mode 100644 lib/utils/log/log-level-logger.js create mode 100644 lib/utils/log/logger-output-adaptor.js create mode 100644 lib/utils/log/logger2.js create mode 100644 package-lock.json create mode 100644 test/context/make-method-descriptor-builder.test.js create mode 100644 test/context/method-descriptor-builder.test.js create mode 100644 test/fixtures/db/innodb-cluster/docker-compose.yml create mode 100644 test/fixtures/db/innodb-cluster/mysql-router.env create mode 100644 test/fixtures/db/innodb-cluster/mysql-server.env create mode 100755 test/fixtures/db/mysql.sql create mode 100644 test/instrumentation/module/mysql.test.js create mode 100644 test/instrumentation/module/mysql2.test.js create mode 100644 test/instrumentation/sql/sql-parser.test.js create mode 100644 test/utils/log/logger-output-adaptor.test.js create mode 100644 test/utils/log/logger.integration.test.js create mode 100644 test/utils/log/logger.test.js delete mode 100644 test/utils/logger.test.js create mode 100644 tsconfig.json diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b9f82eaa..4de1ecb6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -5,6 +5,9 @@ name: CI # Controls when the action will run. on: [push, pull_request_target] +permissions: + checks: write # needed for coverage + # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: # This workflow contains a single job called "build" @@ -14,14 +17,13 @@ jobs: strategy: matrix: node_version: - - 12 - 14 - - 10.10.0 + - 16 + - 18 name: Node ${{ matrix.node_version }} on ubuntu-latest steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: setup node environment uses: actions/setup-node@v2 with: @@ -33,11 +35,11 @@ jobs: - uses: jwgmeligmeyling/checkstyle-github-action@master with: path: '**/checkstyle-result.xml' - github-token: ${{ secrets.GITHUB_TOKEN }} - name: Coverage run: npm run coverage + - name: Report coverage - uses: romeovs/lcov-reporter-action@v0.2.21 + uses: romeovs/lcov-reporter-action@2a28ec3e25fb7eae9cb537e9141603486f810d1a with: - github-token: ${{ secrets.GITHUB_TOKEN }} lcov-file: ./coverage/lcov.info + github-token: ${{ secrets.ACTIONS_TOKEN }} diff --git a/.gitignore b/.gitignore index f6e6f1fc..ca2ffac4 100644 --- a/.gitignore +++ b/.gitignore @@ -32,8 +32,6 @@ packages/**/.npmrc .vscode -package-lock.json - yarn.lock .node-version diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..9bb62fe2 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "grpc/grpc-idl"] + path = grpc/grpc-idl + url = https://github.com/feelform/pinpoint-grpc-idl.git diff --git a/.nycrc b/.nycrc index 237faf59..f4f2f13d 100644 --- a/.nycrc +++ b/.nycrc @@ -1,3 +1,3 @@ { - "exclude": ["lib/data/grpc/**/*", "test/**/*"] + "exclude": ["lib/data/v1/**/*", "test/**/*"] } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index e7ebd7d3..12dc9fb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,22 @@ # Changelog All notable changes to Pinpoint Node.js agent will be documented in this file. +## [0.9.0-next.1] - 2021-06-10 +### Added +- #86 Express with method name +- #101 middleware code level visibility +Screen Shot 2021-12-13 at 11 15 20 PM + +>>>>>>> 7d1ec7d (#87 Express with method name) +## [0.9.0-next.0] - 2021-05-27 +### Added +- #87 HTTP param +>>>>>>> 685d7b7 (#87 v0.9.0-next.0) + ## [0.8.3] - 2021-11-19 ### Fixed - #93 Fix Agent ID length validator +- HTTP param ## [0.8.2] - 2021-05-10 ### Fixed diff --git a/demo/express-ts/.env b/demo/express-ts/.env new file mode 100644 index 00000000..bf3f1af8 --- /dev/null +++ b/demo/express-ts/.env @@ -0,0 +1,10 @@ +PINPOINT_COLLECTOR_IP=localhost +PINPOINT_CONTAINER=true +PINPOINT_APPLICATION_NAME=express-node-sample-name +PINPOINT_AGENT_ID=express-node-sample-id +PINPOINT_SAMPLING_RATE=1 +PINPOINT_LOG_LEVEL=WARN +_PINPOINT_TRACE_EXCLUSION_URL_PATTERN=/api +_PINPOINT_TRACE_EXCLUSION_URL_CACHE_SIZE=3 +_GRPC_VERBOSITY=DEBUG +_GRPC_TRACE=call_stream \ No newline at end of file diff --git a/demo/express-ts/.gitignore b/demo/express-ts/.gitignore new file mode 100644 index 00000000..54d209ec --- /dev/null +++ b/demo/express-ts/.gitignore @@ -0,0 +1,8 @@ +package-lock.json +.vscode +.node-version + +# dependencies +node_modules + +*.log diff --git a/demo/express-ts/build.ts b/demo/express-ts/build.ts new file mode 100644 index 00000000..6219682f --- /dev/null +++ b/demo/express-ts/build.ts @@ -0,0 +1,63 @@ +/** + * Remove old files, copy front-end ones. + */ + +import fs from 'fs-extra'; +import Logger from 'jet-logger'; +import childProcess from 'child_process'; + +// Setup logger +const logger = new Logger(); +logger.timestamp = false; + + + + +(async () => { + try { + // Remove current build + await remove('./dist/'); + // Copy front-end files + await copy('./src/public', './dist/public'); + await copy('./src/views', './dist/views'); + // Copy production env file + await copy('./src/pre-start/env/production.env', './dist/pre-start/env/production.env'); + // Copy back-end files + await exec('tsc --build tsconfig.prod.json', './') + } catch (err) { + logger.err(err); + } +})(); + + +function remove(loc: string): Promise { + return new Promise((res, rej) => { + return fs.remove(loc, (err) => { + return (!!err ? rej(err) : res()); + }); + }); +} + + +function copy(src: string, dest: string): Promise { + return new Promise((res, rej) => { + return fs.copy(src, dest, (err) => { + return (!!err ? rej(err) : res()); + }); + }); +} + + +function exec(cmd: string, loc: string): Promise { + return new Promise((res, rej) => { + return childProcess.exec(cmd, {cwd: loc}, (err, stdout, stderr) => { + if (!!stdout) { + logger.info(stdout); + } + if (!!stderr) { + logger.warn(stderr); + } + return (!!err ? rej(err) : res()); + }); + }); +} diff --git a/demo/express-ts/package.json b/demo/express-ts/package.json new file mode 100644 index 00000000..7b4ae6a0 --- /dev/null +++ b/demo/express-ts/package.json @@ -0,0 +1,98 @@ +{ + "name": "express-ts", + "version": "0.0.0", + "scripts": { + "build": "./node_modules/.bin/ts-node build.ts", + "lint": "eslint . --ext .ts", + "start": "node -r module-alias/register ./dist --env=production", + "start:dev": "nodemon", + "test": "nodemon --config ./spec/nodemon.json", + "test:no-reloading": "./node_modules/.bin/ts-node -r tsconfig-paths/register ./spec" + }, + "nodemonConfig": { + "watch": [ + "src" + ], + "ext": "ts, html", + "ignore": [ + "src/public" + ], + "exec": "./node_modules/.bin/ts-node -r tsconfig-paths/register ./src" + }, + "_moduleAliases": { + "@daos": "dist/daos", + "@entities": "dist/entities", + "@shared": "dist/shared", + "@server": "dist/Server" + }, + "eslintConfig": { + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking" + ], + "parserOptions": { + "project": "./tsconfig.json" + }, + "rules": { + "max-len": [ + "error", + { + "code": 100 + } + ], + "no-console": 1, + "no-extra-boolean-cast": 0, + "@typescript-eslint/restrict-plus-operands": 0, + "@typescript-eslint/explicit-module-boundary-types": 0, + "@typescript-eslint/no-explicit-any": 0, + "@typescript-eslint/no-floating-promises": 0, + "@typescript-eslint/no-unsafe-member-access": 0, + "@typescript-eslint/no-unsafe-assignment": 0 + } + }, + "eslintIgnore": [ + "src/public/", + "build.ts" + ], + "dependencies": { + "command-line-args": "^5.2.0", + "cookie-parser": "^1.4.6", + "dotenv": "^10.0.0", + "express": "^4.17.2", + "express-async-errors": "^3.1.1", + "helmet": "^4.6.0", + "http-status-codes": "^2.1.4", + "jet-logger": "^1.0.6", + "jsonfile": "^6.1.0", + "module-alias": "^2.2.2", + "morgan": "^1.10.0" + }, + "devDependencies": { + "@types/command-line-args": "^5.2.0", + "@types/cookie-parser": "^1.4.2", + "@types/express": "^4.17.13", + "@types/find": "^0.2.1", + "@types/fs-extra": "^9.0.13", + "@types/jasmine": "^3.10.2", + "@types/jsonfile": "^6.0.1", + "@types/morgan": "^1.9.3", + "@types/node": "^17.0.4", + "@types/supertest": "^2.0.11", + "@typescript-eslint/eslint-plugin": "^5.8.0", + "@typescript-eslint/parser": "^5.8.0", + "eslint": "^8.5.0", + "find": "^0.3.0", + "fs-extra": "^10.0.0", + "jasmine": "^3.10.0", + "nodemon": "^2.0.15", + "supertest": "^6.1.6", + "ts-node": "^10.4.0", + "tsconfig-paths": "^3.12.0", + "typescript": "^4.5.4" + } +} diff --git a/demo/express-ts/spec/index.ts b/demo/express-ts/spec/index.ts new file mode 100644 index 00000000..78267d23 --- /dev/null +++ b/demo/express-ts/spec/index.ts @@ -0,0 +1,55 @@ +import './loadEnv'; +import find from 'find'; +import Jasmine from 'jasmine'; +import commandLineArgs from 'command-line-args'; +import logger from '@shared/Logger'; + + + +// Setup command line options +const options = commandLineArgs([ + { + name: 'testFile', + alias: 'f', + type: String, + }, +]); + + +// Init Jasmine +const jasmine = new Jasmine(null); + +// Set location of test files +jasmine.loadConfig({ + random: true, + spec_dir: 'spec', + spec_files: [ + './tests/**/*.spec.ts', + ], + stopSpecOnExpectationFailure: false, +}); + +// On complete callback function +jasmine.onComplete((passed: boolean) => { + if (passed) { + logger.info('All tests have passed :)'); + } else { + logger.err('At least one test has failed :('); + } + jasmine.exitCodeCompletion(passed); +}); + +// Run all or a single unit-test +if (options.testFile) { + const testFile = options.testFile as string; + find.file(testFile + '.spec.ts', './spec', (files: string[]) => { + if (files.length === 1) { + jasmine.specFiles = [files[0]]; + jasmine.execute(); + } else { + logger.err('Test file not found!'); + } + }); +} else { + jasmine.execute(); +} diff --git a/demo/express-ts/spec/loadEnv.ts b/demo/express-ts/spec/loadEnv.ts new file mode 100644 index 00000000..80bc8812 --- /dev/null +++ b/demo/express-ts/spec/loadEnv.ts @@ -0,0 +1,10 @@ +// Set the env file, must be first +import dotenv from 'dotenv'; + +const result2 = dotenv.config({ + path: `./src/pre-start/env/test.env`, +}); + +if (result2.error) { + throw result2.error; +} diff --git a/demo/express-ts/spec/nodemon.json b/demo/express-ts/spec/nodemon.json new file mode 100644 index 00000000..c2b04103 --- /dev/null +++ b/demo/express-ts/spec/nodemon.json @@ -0,0 +1,6 @@ +{ + "watch": ["spec"], + "ext": "spec.ts", + "ignore": ["spec/support"], + "exec": "./node_modules/.bin/ts-node -r tsconfig-paths/register ./spec" +} diff --git a/demo/express-ts/spec/support/jasmine.json b/demo/express-ts/spec/support/jasmine.json new file mode 100644 index 00000000..fda752ab --- /dev/null +++ b/demo/express-ts/spec/support/jasmine.json @@ -0,0 +1,11 @@ +{ + "spec_dir": "spec", + "spec_files": [ + "**/*[sS]pec.ts" + ], + "helpers": [ + "helpers/**/*.js" + ], + "stopSpecOnExpectationFailure": false, + "random": true +} diff --git a/demo/express-ts/spec/support/types.ts b/demo/express-ts/spec/support/types.ts new file mode 100644 index 00000000..5265de36 --- /dev/null +++ b/demo/express-ts/spec/support/types.ts @@ -0,0 +1,14 @@ +import { Response } from 'supertest'; +import { IUser } from '@entities/User'; + + +export interface IResponse extends Response { + body: { + users: IUser[]; + error: string; + }; +} + +export interface IReqBody { + user?: IUser; +} diff --git a/demo/express-ts/spec/tests/Users.spec.ts b/demo/express-ts/spec/tests/Users.spec.ts new file mode 100644 index 00000000..06323fde --- /dev/null +++ b/demo/express-ts/spec/tests/Users.spec.ts @@ -0,0 +1,210 @@ +import supertest from 'supertest'; +import StatusCodes from 'http-status-codes'; +import { SuperTest, Test } from 'supertest'; + +import app from '@server'; +import UserDao from '@daos/User/UserDao.mock'; +import User, { IUser } from '@entities/User'; +import { pErr } from '@shared/functions'; +import { paramMissingError } from '@shared/constants'; +import { IReqBody, IResponse } from '../support/types'; + + + +describe('Users Routes', () => { + + const usersPath = '/api/users'; + const getUsersPath = `${usersPath}/all`; + const addUsersPath = `${usersPath}/add`; + const updateUserPath = `${usersPath}/update`; + const deleteUserPath = `${usersPath}/delete/:id`; + + const { BAD_REQUEST, CREATED, OK } = StatusCodes; + let agent: SuperTest; + + beforeAll((done) => { + agent = supertest.agent(app); + done(); + }); + + describe(`"GET:${getUsersPath}"`, () => { + + it(`should return a JSON object with all the users and a status code of "${OK}" if the + request was successful.`, (done) => { + // Setup spy + const users = [ + new User('Sean Maxwell', 'sean.maxwell@gmail.com'), + new User('John Smith', 'john.smith@gmail.com'), + new User('Gordan Freeman', 'gordan.freeman@gmail.com'), + ]; + spyOn(UserDao.prototype, 'getAll').and.returnValue(Promise.resolve(users)); + // Call API + agent.get(getUsersPath) + .end((err: Error, res: IResponse) => { + pErr(err); + expect(res.status).toBe(OK); + // Caste instance-objects to 'User' objects + const respUsers = res.body.users; + const retUsers: User[] = respUsers.map((user: IUser) => { + return new User(user); + }); + expect(retUsers).toEqual(users); + expect(res.body.error).toBeUndefined(); + done(); + }); + }); + + it(`should return a JSON object containing an error message and a status code of + "${BAD_REQUEST}" if the request was unsuccessful.`, (done) => { + // Setup spy + const errMsg = 'Could not fetch users.'; + spyOn(UserDao.prototype, 'getAll').and.throwError(errMsg); + // Call API + agent.get(getUsersPath) + .end((err: Error, res: IResponse) => { + pErr(err); + expect(res.status).toBe(BAD_REQUEST); + expect(res.body.error).toBe(errMsg); + done(); + }); + }); + }); + + + describe(`"POST:${addUsersPath}"`, () => { + + const callApi = (reqBody: IReqBody) => { + return agent.post(addUsersPath).type('form').send(reqBody); + }; + + const userData = { + user: new User('Gordan Freeman', 'gordan.freeman@gmail.com'), + }; + + it(`should return a status code of "${CREATED}" if the request was successful.`, (done) => { + // Setup Spy + spyOn(UserDao.prototype, 'add').and.returnValue(Promise.resolve()); + // Call API + agent.post(addUsersPath).type('form').send(userData) + .end((err: Error, res: IResponse) => { + pErr(err); + expect(res.status).toBe(CREATED); + expect(res.body.error).toBeUndefined(); + done(); + }); + }); + + it(`should return a JSON object with an error message of "${paramMissingError}" and a status + code of "${BAD_REQUEST}" if the user param was missing.`, (done) => { + // Call API + callApi({}) + .end((err: Error, res: IResponse) => { + pErr(err); + expect(res.status).toBe(BAD_REQUEST); + expect(res.body.error).toBe(paramMissingError); + done(); + }); + }); + + it(`should return a JSON object with an error message and a status code of "${BAD_REQUEST}" + if the request was unsuccessful.`, (done) => { + // Setup spy + const errMsg = 'Could not add user.'; + spyOn(UserDao.prototype, 'add').and.throwError(errMsg); + // Call API + callApi(userData) + .end((err: Error, res: IResponse) => { + pErr(err); + expect(res.status).toBe(BAD_REQUEST); + expect(res.body.error).toBe(errMsg); + done(); + }); + }); + }); + + describe(`"PUT:${updateUserPath}"`, () => { + + const callApi = (reqBody: IReqBody) => { + return agent.put(updateUserPath).type('form').send(reqBody); + }; + + const userData = { + user: new User('Gordan Freeman', 'gordan.freeman@gmail.com'), + }; + + it(`should return a status code of "${OK}" if the request was successful.`, (done) => { + // Setup spy + spyOn(UserDao.prototype, 'update').and.returnValue(Promise.resolve()); + // Call Api + callApi(userData) + .end((err: Error, res: IResponse) => { + pErr(err); + expect(res.status).toBe(OK); + expect(res.body.error).toBeUndefined(); + done(); + }); + }); + + it(`should return a JSON object with an error message of "${paramMissingError}" and a + status code of "${BAD_REQUEST}" if the user param was missing.`, (done) => { + // Call api + callApi({}) + .end((err: Error, res: IResponse) => { + pErr(err); + expect(res.status).toBe(BAD_REQUEST); + expect(res.body.error).toBe(paramMissingError); + done(); + }); + }); + + it(`should return a JSON object with an error message and a status code of "${BAD_REQUEST}" + if the request was unsuccessful.`, (done) => { + // Setup spy + const updateErrMsg = 'Could not update user.'; + spyOn(UserDao.prototype, 'update').and.throwError(updateErrMsg); + // Call API + callApi(userData) + .end((err: Error, res: IResponse) => { + pErr(err); + expect(res.status).toBe(BAD_REQUEST); + expect(res.body.error).toBe(updateErrMsg); + done(); + }); + }); + }); + + describe(`"DELETE:${deleteUserPath}"`, () => { + + const callApi = (id: number) => { + return agent.delete(deleteUserPath.replace(':id', id.toString())); + }; + + it(`should return a status code of "${OK}" if the request was successful.`, (done) => { + // Setup spy + spyOn(UserDao.prototype, 'delete').and.returnValue(Promise.resolve()); + // Call api + callApi(5) + .end((err: Error, res: IResponse) => { + pErr(err); + expect(res.status).toBe(OK); + expect(res.body.error).toBeUndefined(); + done(); + }); + }); + + it(`should return a JSON object with an error message and a status code of "${BAD_REQUEST}" + if the request was unsuccessful.`, (done) => { + // Setup spy + const deleteErrMsg = 'Could not delete user.'; + spyOn(UserDao.prototype, 'delete').and.throwError(deleteErrMsg); + // Call Api + callApi(1) + .end((err: Error, res: IResponse) => { + pErr(err); + expect(res.status).toBe(BAD_REQUEST); + expect(res.body.error).toBe(deleteErrMsg); + done(); + }); + }); + }); +}); diff --git a/demo/express-ts/src/@types/express/index.d.ts b/demo/express-ts/src/@types/express/index.d.ts new file mode 100644 index 00000000..96288d20 --- /dev/null +++ b/demo/express-ts/src/@types/express/index.d.ts @@ -0,0 +1,9 @@ +import { IUser } from "@entities/User"; + +declare module 'express' { + export interface Request { + body: { + user: IUser + }; + } +} diff --git a/demo/express-ts/src/Server.ts b/demo/express-ts/src/Server.ts new file mode 100644 index 00000000..8611bdcb --- /dev/null +++ b/demo/express-ts/src/Server.ts @@ -0,0 +1,63 @@ +import cookieParser from 'cookie-parser'; +import morgan from 'morgan'; +import path from 'path'; +import helmet from 'helmet'; + +import express, { NextFunction, Request, Response } from 'express'; +import StatusCodes from 'http-status-codes'; +import 'express-async-errors'; + +import BaseRouter from './routes'; +import logger from '@shared/Logger'; + +const app = express(); +const { BAD_REQUEST } = StatusCodes; + + + +/************************************************************************************ + * Set basic express settings + ***********************************************************************************/ + +app.use(express.json()); +app.use(express.urlencoded({extended: true})); +app.use(cookieParser()); + +// Show routes called in console during development +if (process.env.NODE_ENV === 'development') { + app.use(morgan('dev')); +} + +// Security +if (process.env.NODE_ENV === 'production') { + app.use(helmet()); +} + +// Add APIs +app.use('/api', BaseRouter); + +// Print API errors +// eslint-disable-next-line @typescript-eslint/no-unused-vars +app.use((err: Error, req: Request, res: Response, next: NextFunction) => { + logger.err(err, true); + return res.status(BAD_REQUEST).json({ + error: err.message, + }); +}); + + + +/************************************************************************************ + * Serve front-end content + ***********************************************************************************/ + +const viewsDir = path.join(__dirname, 'views'); +app.set('views', viewsDir); +const staticDir = path.join(__dirname, 'public'); +app.use(express.static(staticDir)); +app.get('*', (req: Request, res: Response) => { + res.sendFile('index.html', {root: viewsDir}); +}); + +// Export express instance +export default app; diff --git a/demo/express-ts/src/daos/MockDb/MockDao.mock.ts b/demo/express-ts/src/daos/MockDb/MockDao.mock.ts new file mode 100644 index 00000000..e78180cc --- /dev/null +++ b/demo/express-ts/src/daos/MockDb/MockDao.mock.ts @@ -0,0 +1,25 @@ +import jsonfile from 'jsonfile'; +import { IUser } from '@entities/User'; + + +interface IDatabase { + users: IUser[]; +} + + +class MockDaoMock { + + private readonly dbFilePath = 'src/daos/MockDb/MockDb.json'; + + + protected openDb(): Promise { + return jsonfile.readFile(this.dbFilePath) as Promise; + } + + + protected saveDb(db: IDatabase): Promise { + return jsonfile.writeFile(this.dbFilePath, db); + } +} + +export default MockDaoMock; diff --git a/demo/express-ts/src/daos/MockDb/MockDb.backup.json b/demo/express-ts/src/daos/MockDb/MockDb.backup.json new file mode 100644 index 00000000..4d75463b --- /dev/null +++ b/demo/express-ts/src/daos/MockDb/MockDb.backup.json @@ -0,0 +1,19 @@ +{ + "users": [ + { + "name": "Sean Maxwell", + "email": "sean.maxwell@gmail.com", + "id": 159123164363 + }, + { + "name": "Gordan Freeman", + "email": "gordan.freeman@halflife.com", + "id": 906524522143 + }, + { + "name": "John Smith", + "email": "jsmith@yahoo.com", + "id": 357437875835 + } + ] +} diff --git a/demo/express-ts/src/daos/MockDb/MockDb.json b/demo/express-ts/src/daos/MockDb/MockDb.json new file mode 100644 index 00000000..4d75463b --- /dev/null +++ b/demo/express-ts/src/daos/MockDb/MockDb.json @@ -0,0 +1,19 @@ +{ + "users": [ + { + "name": "Sean Maxwell", + "email": "sean.maxwell@gmail.com", + "id": 159123164363 + }, + { + "name": "Gordan Freeman", + "email": "gordan.freeman@halflife.com", + "id": 906524522143 + }, + { + "name": "John Smith", + "email": "jsmith@yahoo.com", + "id": 357437875835 + } + ] +} diff --git a/demo/express-ts/src/daos/User/UserDao.mock.ts b/demo/express-ts/src/daos/User/UserDao.mock.ts new file mode 100644 index 00000000..4afbe1ba --- /dev/null +++ b/demo/express-ts/src/daos/User/UserDao.mock.ts @@ -0,0 +1,62 @@ +import { IUser } from '@entities/User'; +import { getRandomInt } from '@shared/functions'; +import { IUserDao } from './UserDao'; +import MockDaoMock from '../MockDb/MockDao.mock'; + + + +class UserDao extends MockDaoMock implements IUserDao { + + + public async getOne(email: string): Promise { + const db = await super.openDb(); + for (const user of db.users) { + if (user.email === email) { + return user; + } + } + return null; + } + + + public async getAll(): Promise { + const db = await super.openDb(); + return db.users; + } + + + public async add(user: IUser): Promise { + const db = await super.openDb(); + user.id = getRandomInt(); + db.users.push(user); + await super.saveDb(db); + } + + + public async update(user: IUser): Promise { + const db = await super.openDb(); + for (let i = 0; i < db.users.length; i++) { + if (db.users[i].id === user.id) { + db.users[i] = user; + await super.saveDb(db); + return; + } + } + throw new Error('User not found'); + } + + + public async delete(id: number): Promise { + const db = await super.openDb(); + for (let i = 0; i < db.users.length; i++) { + if (db.users[i].id === id) { + db.users.splice(i, 1); + await super.saveDb(db); + return; + } + } + throw new Error('User not found'); + } +} + +export default UserDao; diff --git a/demo/express-ts/src/daos/User/UserDao.ts b/demo/express-ts/src/daos/User/UserDao.ts new file mode 100644 index 00000000..4985b86b --- /dev/null +++ b/demo/express-ts/src/daos/User/UserDao.ts @@ -0,0 +1,64 @@ +import { IUser } from '@entities/User'; + + + +export interface IUserDao { + getOne: (email: string) => Promise; + getAll: () => Promise; + add: (user: IUser) => Promise; + update: (user: IUser) => Promise; + delete: (id: number) => Promise; +} + +class UserDao implements IUserDao { + + + /** + * @param email + */ + public getOne(email: string): Promise { + // TODO + return Promise.resolve(null); + } + + + /** + * + */ + public getAll(): Promise { + // TODO + return Promise.resolve([]); + } + + + /** + * + * @param user + */ + public async add(user: IUser): Promise { + // TODO + return Promise.resolve(undefined); + } + + + /** + * + * @param user + */ + public async update(user: IUser): Promise { + // TODO + return Promise.resolve(undefined); + } + + + /** + * + * @param id + */ + public async delete(id: number): Promise { + // TODO + return Promise.resolve(undefined); + } +} + +export default UserDao; diff --git a/demo/express-ts/src/entities/User.ts b/demo/express-ts/src/entities/User.ts new file mode 100644 index 00000000..d2a99dee --- /dev/null +++ b/demo/express-ts/src/entities/User.ts @@ -0,0 +1,26 @@ +export interface IUser { + id: number; + name: string; + email: string; +} + +class User implements IUser { + + public id: number; + public name: string; + public email: string; + + constructor(nameOrUser: string | IUser, email?: string, id?: number) { + if (typeof nameOrUser === 'string') { + this.name = nameOrUser; + this.email = email || ''; + this.id = id || -1; + } else { + this.name = nameOrUser.name; + this.email = nameOrUser.email; + this.id = nameOrUser.id; + } + } +} + +export default User; diff --git a/demo/express-ts/src/index.ts b/demo/express-ts/src/index.ts new file mode 100644 index 00000000..8e1895c1 --- /dev/null +++ b/demo/express-ts/src/index.ts @@ -0,0 +1,12 @@ +import 'dotenv/config' +import 'pinpoint-node-agent' +import './pre-start' // Must be the first import +import app from '@server' +import logger from '@shared/Logger' + + +// Start the server +const port = Number(process.env.PORT || 3000) +app.listen(port, () => { + logger.info('Express server started on port: ' + port) +}) diff --git a/demo/express-ts/src/pre-start/env/development.env b/demo/express-ts/src/pre-start/env/development.env new file mode 100644 index 00000000..e0129c96 --- /dev/null +++ b/demo/express-ts/src/pre-start/env/development.env @@ -0,0 +1,14 @@ +## Environment ## +NODE_ENV=development + + +## Server ## +PORT=3000 +HOST=localhost + + +## Setup jet-logger ## +JET_LOGGER_MODE=CONSOLE +JET_LOGGER_FILEPATH=jet-logger.log +JET_LOGGER_TIMESTAMP=TRUE +JET_LOGGER_FORMAT=LINE diff --git a/demo/express-ts/src/pre-start/env/production.env b/demo/express-ts/src/pre-start/env/production.env new file mode 100644 index 00000000..2ce6ebee --- /dev/null +++ b/demo/express-ts/src/pre-start/env/production.env @@ -0,0 +1,14 @@ +## Environment ## +NODE_ENV=production + + +## Server ## +PORT=8081 +HOST=localhost + + +## Setup jet-logger ## +JET_LOGGER_MODE=FILE +JET_LOGGER_FILEPATH=jet-logger.log +JET_LOGGER_TIMESTAMP=TRUE +JET_LOGGER_FORMAT=LINE diff --git a/demo/express-ts/src/pre-start/env/test.env b/demo/express-ts/src/pre-start/env/test.env new file mode 100644 index 00000000..c2c41cbf --- /dev/null +++ b/demo/express-ts/src/pre-start/env/test.env @@ -0,0 +1,14 @@ +## Environment ## +NODE_ENV=test + + +## Server ## +PORT=4000 +HOST=localhost + + +## Setup jet-logger ## +JET_LOGGER_MODE=CONSOLE +JET_LOGGER_FILEPATH=jet-logger.log +JET_LOGGER_TIMESTAMP=TRUE +JET_LOGGER_FORMAT=LINE diff --git a/demo/express-ts/src/pre-start/index.ts b/demo/express-ts/src/pre-start/index.ts new file mode 100644 index 00000000..4e91bcdf --- /dev/null +++ b/demo/express-ts/src/pre-start/index.ts @@ -0,0 +1,29 @@ +/** + * Pre-start is where we want to place things that must run BEFORE the express server is started. + * This is useful for environment variables, command-line arguments, and cron-jobs. + */ + +import path from 'path'; +import dotenv from 'dotenv'; +import commandLineArgs from 'command-line-args'; + + + +(() => { + // Setup command line options + const options = commandLineArgs([ + { + name: 'env', + alias: 'e', + defaultValue: 'development', + type: String, + }, + ]); + // Set the env file + const result2 = dotenv.config({ + path: path.join(__dirname, `env/${options.env}.env`), + }); + if (result2.error) { + throw result2.error; + } +})(); diff --git a/demo/express-ts/src/public/scripts/index.js b/demo/express-ts/src/public/scripts/index.js new file mode 100644 index 00000000..89ce2993 --- /dev/null +++ b/demo/express-ts/src/public/scripts/index.js @@ -0,0 +1,171 @@ +/****************************************************************************** + * Fetch and display users + ******************************************************************************/ + +displayUsers(); + + +function displayUsers() { + httpGet('/api/users/all') + .then(response => response.json()) + .then((response) => { + var allUsers = response.users; + // Empty the anchor + var allUsersAnchor = document.getElementById('all-users-anchor'); + allUsersAnchor.innerHTML = ''; + // Append users to anchor + allUsers.forEach((user) => { + allUsersAnchor.innerHTML += getUserDisplayEle(user); + }); + }); +}; + + +function getUserDisplayEle(user) { + return `
+ +
+
Name: ${user.name}
+
Email: ${user.email}
+ + +
+ +
+
+ Name: +
+
+ Email: +
+ + +
+
`; +} + + +/****************************************************************************** + * Add, Edit, and Delete Users + ******************************************************************************/ + +document.addEventListener('click', function (event) { + event.preventDefault(); + var ele = event.target; + if (ele.matches('#add-user-btn')) { + addUser(); + } else if (ele.matches('.edit-user-btn')) { + showEditView(ele.parentNode.parentNode); + } else if (ele.matches('.cancel-edit-btn')) { + cancelEdit(ele.parentNode.parentNode); + } else if (ele.matches('.submit-edit-btn')) { + submitEdit(ele); + } else if (ele.matches('.delete-user-btn')) { + deleteUser(ele); + } +}, false) + + +function addUser() { + var nameInput = document.getElementById('name-input'); + var emailInput = document.getElementById('email-input'); + var data = { + user: { + name: nameInput.value, + email: emailInput.value + }, + }; + httpPost('/api/users/add', data) + .then(() => { + displayUsers(); + }) +} + + +function showEditView(userEle) { + var normalView = userEle.getElementsByClassName('normal-view')[0]; + var editView = userEle.getElementsByClassName('edit-view')[0]; + normalView.style.display = 'none'; + editView.style.display = 'block'; +} + + +function cancelEdit(userEle) { + var normalView = userEle.getElementsByClassName('normal-view')[0]; + var editView = userEle.getElementsByClassName('edit-view')[0]; + normalView.style.display = 'block'; + editView.style.display = 'none'; +} + + +function submitEdit(ele) { + var userEle = ele.parentNode.parentNode; + var nameInput = userEle.getElementsByClassName('name-edit-input')[0]; + var emailInput = userEle.getElementsByClassName('email-edit-input')[0]; + var id = ele.getAttribute('data-user-id'); + var data = { + user: { + name: nameInput.value, + email: emailInput.value, + id: id + } + }; + httpPut('/api/users/update', data) + .then(() => { + displayUsers(); + }) +} + + +function deleteUser(ele) { + var id = ele.getAttribute('data-user-id'); + httpDelete('/api/users/delete/' + id) + .then(() => { + displayUsers(); + }) +} + + +function httpGet(path) { + return fetch(path, getOptions('GET')) +} + + +function httpPost(path, data) { + return fetch(path, getOptions('POST', data)); +} + + +function httpPut(path, data) { + return fetch(path, getOptions('PUT', data)); +} + + +function httpDelete(path) { + return fetch(path, getOptions('DELETE')); +} + + +function getOptions(verb, data) { + var options = { + dataType: 'json', + method: verb, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + } + }; + if (data) { + options.body = JSON.stringify(data); + } + return options; +} + diff --git a/demo/express-ts/src/public/stylesheets/style.css b/demo/express-ts/src/public/stylesheets/style.css new file mode 100644 index 00000000..ab045a89 --- /dev/null +++ b/demo/express-ts/src/public/stylesheets/style.css @@ -0,0 +1,33 @@ +body { + padding: 100px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} + +body .users-column { + display: inline-block; + margin-right: 2em; + vertical-align: top; +} + +body .users-column .column-header { + padding-bottom: 5px; + font-weight: 700; + font-size: 1.2em; +} + +body .add-user-col input { + margin-bottom: 10px; +} + +body .users-column .user-display-ele { + padding-bottom: 10px; +} + +body .users-column .user-display-ele button { + margin-top: 2px; + margin-bottom: 10px; +} + +body .users-column .user-display-ele .edit-view { + display: none; +} diff --git a/demo/express-ts/src/routes/Users.ts b/demo/express-ts/src/routes/Users.ts new file mode 100644 index 00000000..18602c28 --- /dev/null +++ b/demo/express-ts/src/routes/Users.ts @@ -0,0 +1,75 @@ +import StatusCodes from 'http-status-codes'; +import { Request, Response } from 'express'; + +import UserDao from '@daos/User/UserDao.mock'; +import { paramMissingError } from '@shared/constants'; + +const userDao = new UserDao(); +const { BAD_REQUEST, CREATED, OK } = StatusCodes; + + + +/** + * Get all users. + * + * @param req + * @param res + * @returns + */ +export async function getAllUsers(req: Request, res: Response) { + const users = await userDao.getAll(); + return res.status(OK).json({users}); +} + + +/** + * Add one user. + * + * @param req + * @param res + * @returns + */ +export async function addOneUser(req: Request, res: Response) { + const { user } = req.body; + if (!user) { + return res.status(BAD_REQUEST).json({ + error: paramMissingError, + }); + } + await userDao.add(user); + return res.status(CREATED).end(); +} + + +/** + * Update one user. + * + * @param req + * @param res + * @returns + */ +export async function updateOneUser(req: Request, res: Response) { + const { user } = req.body; + if (!user) { + return res.status(BAD_REQUEST).json({ + error: paramMissingError, + }); + } + user.id = Number(user.id); + await userDao.update(user); + return res.status(OK).end(); +} + + +/** + * Delete one user. + * + * @param req + * @param res + * @returns + */ +export async function deleteOneUser(req: Request, res: Response) { + const { id } = req.params; + await userDao.delete(Number(id)); + return res.status(OK).end(); +} diff --git a/demo/express-ts/src/routes/index.ts b/demo/express-ts/src/routes/index.ts new file mode 100644 index 00000000..c96b38a7 --- /dev/null +++ b/demo/express-ts/src/routes/index.ts @@ -0,0 +1,16 @@ +import { Router } from 'express'; +import { getAllUsers, addOneUser, updateOneUser, deleteOneUser } from './Users'; + + +// User-route +const userRouter = Router(); +userRouter.get('/all', getAllUsers); +userRouter.post('/add', addOneUser); +userRouter.put('/update', updateOneUser); +userRouter.delete('/delete/:id', deleteOneUser); + + +// Export the base-router +const baseRouter = Router(); +baseRouter.use('/users', userRouter); +export default baseRouter; diff --git a/demo/express-ts/src/shared/Logger.ts b/demo/express-ts/src/shared/Logger.ts new file mode 100644 index 00000000..82f73c08 --- /dev/null +++ b/demo/express-ts/src/shared/Logger.ts @@ -0,0 +1,12 @@ +/** + * Setup the jet-logger. + * + * Documentation: https://github.com/seanpmaxwell/jet-logger + */ + +import Logger from 'jet-logger'; + + +const logger = new Logger(); + +export default logger; diff --git a/demo/express-ts/src/shared/constants.ts b/demo/express-ts/src/shared/constants.ts new file mode 100644 index 00000000..97e16298 --- /dev/null +++ b/demo/express-ts/src/shared/constants.ts @@ -0,0 +1,3 @@ +// Put shared constants here + +export const paramMissingError = 'One or more of the required parameters was missing.'; diff --git a/demo/express-ts/src/shared/functions.ts b/demo/express-ts/src/shared/functions.ts new file mode 100644 index 00000000..7312bc36 --- /dev/null +++ b/demo/express-ts/src/shared/functions.ts @@ -0,0 +1,11 @@ +import logger from './Logger'; + +export const pErr = (err: Error) => { + if (err) { + logger.err(err); + } +}; + +export const getRandomInt = () => { + return Math.floor(Math.random() * 1_000_000_000_000); +}; diff --git a/demo/express-ts/src/views/index.html b/demo/express-ts/src/views/index.html new file mode 100644 index 00000000..13871b9b --- /dev/null +++ b/demo/express-ts/src/views/index.html @@ -0,0 +1,34 @@ + + + + + ExpressGeneratorTypeScriptApp + + + + + +
+
Add User:
+
+ +
+
+ +
+
+ +
+
+ + +
+
Users:
+
+
+ + + + + + diff --git a/demo/express-ts/tsconfig.json b/demo/express-ts/tsconfig.json new file mode 100644 index 00000000..01ab4de1 --- /dev/null +++ b/demo/express-ts/tsconfig.json @@ -0,0 +1,90 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "dist", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true, /* Skip type checking of declaration files. */ + "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ + "paths": { + "@daos/*": [ + "src/daos/*" + ], + "@entities/*": [ + "src/entities/*" + ], + "@shared/*": [ + "src/shared/*" + ], + "@server": [ + "src/Server" + ] + }, + }, + "include": [ + "src/**/*.ts", + "spec/**/*.ts" + ], + "exclude": [ + "src/public/" + ] +} \ No newline at end of file diff --git a/demo/express-ts/tsconfig.prod.json b/demo/express-ts/tsconfig.prod.json new file mode 100644 index 00000000..26af7312 --- /dev/null +++ b/demo/express-ts/tsconfig.prod.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "sourceMap": false + }, + "exclude": [ + "spec", + "src/**/*.mock.ts", + "src/public/" + ] +} diff --git a/demo/koa-example/index.js b/demo/koa-example/index.js new file mode 100644 index 00000000..2750da1c --- /dev/null +++ b/demo/koa-example/index.js @@ -0,0 +1,17 @@ +'use strict' + +const Koa = require('koa') +const Router = require('@koa/router') + +const app = new Koa() +const router = new Router() + +router.get('/', (ctx, next) => { + ctx.body = 'Hello World' +}) + +app + .use(router.routes()) + .use(router.allowedMethods()) + +app.listen(1234) \ No newline at end of file diff --git a/demo/koa-example/package.json b/demo/koa-example/package.json new file mode 100644 index 00000000..69a074bd --- /dev/null +++ b/demo/koa-example/package.json @@ -0,0 +1,16 @@ +{ + "name": "koa-example", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@koa/router": "^10.0.0", + "koa": "^2.13.1" + } +} diff --git a/grpc/README.md b/grpc/README.md new file mode 100644 index 00000000..a3ce34f9 --- /dev/null +++ b/grpc/README.md @@ -0,0 +1,11 @@ +# script +https://github.com/grpc/grpc/tree/v1.32.0/examples/node/static_codegen +``` +$ export PATH="$PATH:$(npm bin -g)" + +$ grpc_tools_node_protoc --version +libprotoc 3.14.0 + +$ cd grpc-idl/proto +$ grpc_tools_node_protoc --js_out=import_style=commonjs,binary:../../../lib/data --grpc_out=grpc_js:../../../lib/data --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` v1/*.proto +``` \ No newline at end of file diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 00000000..3d05b047 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,7 @@ +declare namespace Pinpoint { + export class Agent { + constructor(initOptions: any); + } +} +declare const pinpointAgent: Pinpoint.Agent; +export = pinpointAgent; \ No newline at end of file diff --git a/lib/agent.js b/lib/agent.js index 0a04f635..ec3ab6c1 100644 --- a/lib/agent.js +++ b/lib/agent.js @@ -48,7 +48,7 @@ class Agent { apiMetaService.init(this.dataSender) this.startSchedule(agentId, agentStartTime) - this.initailizeSupportModules() + this.initializeSupportModules() log.warn('[Pinpoint Agent][' + agentId + '] Init Completed') } @@ -58,7 +58,7 @@ class Agent { this.dataSender.send(this.agentInfo) } - initailizeSupportModules() { + initializeSupportModules() { this.moduleHook = new ModuleHook(this) } @@ -76,50 +76,6 @@ class Agent { completeTraceObject(trace) { this.traceContext.completeTraceObject(trace) - if (trace.span) { - /* - const spanEvent = [] - // step1. 우선 비동기 코드 (추후 더미코드) 를 먼저 가져오도록 한다. - const dummyEventMap = trace.span.spanEventList.reduce((map, dummyEvent) => { - if (dummyEvent.serviceType === ServiceTypeCode.callback_dummy) { - map[dummyEvent.nextDummyId] = dummyEvent - } - return map - }, {}) - // step2. 콜백코드로 저장된 걸 가져오도록 한다. (순서가 보장 안되기 때문에 해당 과정이 필요하다.. ) - const callEvent = trace.span.spanEventList.reduce((map, callbackEvent) => { - if (callbackEvent.dummyId !== null) { - map.push(callbackEvent) - } - return map - }, []) - // step3. 비동기 코드를 순차적으로 우회하며 돌도록 한다. - callEvent.forEach((event) => { - const dummyRecoder = dummyEventMap[event.dummyId] - if (dummyRecoder) { - event.sequence = dummyRecoder.sequence - event.depth = dummyRecoder.depth - //TODO. agent view 에서 문제가 있기에 우선 임의로 넣어둔다. (paas와 논의 필요) - // event.startElapsed = dummyRecoder.startElapsed - // event.elapsedTime = dummyRecoder.elapsedTime - - if (event.nextDummyId !== null) { - //TODO. event chaiing인 경우 depth 등을 조정해야한다. 순서가 보장안될 수 있으니.. 차순 변경 후 가도 될 듯 - dummyEventMap[event.nextDummyId].sequence = event.sequence + 1 - dummyEventMap[event.nextDummyId].depth = event.depth + 1 - } - } - }) - - trace.span.spanEventList.forEach((event) => { - if (event.serviceType !== ServiceTypeCode.callback_dummy) { - spanEvent.push(event) - } - }) - trace.span.spanEventList = spanEvent - log.debug('finally->\n', trace.span) - */ - } } createAgentInfo(config, agentStartTime) { diff --git a/lib/client/data-sender-factory.js b/lib/client/data-sender-factory.js index a995ef71..b0bd0fa5 100644 --- a/lib/client/data-sender-factory.js +++ b/lib/client/data-sender-factory.js @@ -9,8 +9,9 @@ const GrpcDataSender = require('./grpc-data-sender') const DataSender = require('./data-sender') +let dataSender const create = (config, agentInfo) => { - return new DataSender(config, new GrpcDataSender( + dataSender = new DataSender(config, new GrpcDataSender( config.collectorIp, config.collectorTcpPort, config.collectorStatPort, @@ -18,8 +19,32 @@ const create = (config, agentInfo) => { agentInfo, config )) + join() + return dataSender +} + +const services = [] +const join = (service) => { + if (service) { + services.push(service) + } + + if (!dataSender) { + return + } + + services.forEach((service) => { + service.dataSender = dataSender + }) +} + +const setDataSender = (sender) => { + dataSender = sender + join() } module.exports = { - create + create, + join, + setDataSender } diff --git a/lib/client/data-sender.js b/lib/client/data-sender.js index 8b1eb03a..eec1b8f9 100644 --- a/lib/client/data-sender.js +++ b/lib/client/data-sender.js @@ -12,6 +12,7 @@ const ApiMetaInfo = require('../data/dto/api-meta-info') const StringMetaInfo = require('../data/dto/string-meta-info') const Span = require('../context/span') const SpanChunk = require('../context/span-chunk') +const SqlMetaData = require('./sql-meta-data') class DataSender { constructor(config, dataSender) { @@ -42,6 +43,8 @@ class DataSender { this.dataSender.sendSpan(data) } else if (data instanceof SpanChunk) { this.dataSender.sendSpanChunk(data) + } else if (data instanceof SqlMetaData) { + this.dataSender.sendSqlMetaInfo(data) } } diff --git a/lib/client/grpc-data-sender.js b/lib/client/grpc-data-sender.js index 4fd9530f..cf4686b3 100644 --- a/lib/client/grpc-data-sender.js +++ b/lib/client/grpc-data-sender.js @@ -8,9 +8,9 @@ const grpc = require('@grpc/grpc-js') const log = require('../utils/logger') -const services = require('../data/grpc/Service_grpc_pb') +const services = require('../data/v1/Service_grpc_pb') const dataConvertor = require('../data/grpc-data-convertor') -const pingIdGenerator = require('../context/sequence-generator').pingIdGenerator +const pingIdGenerator = require('../context/sequence-generators').pingIdGenerator const GrpcBidirectionalStream = require('./grpc-bidirectional-stream') const GrpcClientSideStream = require('./grpc-client-side-stream') const GrpcUnaryRPC = require('./grpc-unary-rpc') @@ -72,6 +72,7 @@ class GrpcDataSender { this.metadataClient = new services.MetadataClient(collectorIp + ":" + collectorTcpPort, grpc.credentials.createInsecure(), { interceptors: [headerInterceptor] }) this.requestApiMetaData = new GrpcUnaryRPC('requestApiMetaData', this.metadataClient, this.metadataClient.requestApiMetaData, DEFAULT_METADATA_RETRY_DELAY_MILLIS, DEFAULT_METADATA_RETRY_MAX_COUNT) this.requestStringMetaData = new GrpcUnaryRPC('requestStringMetaData', this.metadataClient, this.metadataClient.requestStringMetaData, DEFAULT_METADATA_RETRY_DELAY_MILLIS, DEFAULT_METADATA_RETRY_MAX_COUNT) + this.requestSqlMetaData = new GrpcUnaryRPC('requestSqlMetaData', this.metadataClient, this.metadataClient.requestSqlMetaData, DEFAULT_METADATA_RETRY_DELAY_MILLIS, DEFAULT_METADATA_RETRY_MAX_COUNT) } initializeSpanStream(collectorIp, collectorSpanPort, headerInterceptor, config) { @@ -111,7 +112,7 @@ class GrpcDataSender { sendAgentInfo(agentInfo, callback) { const pAgentInfo = dataConvertor.convertAgentInfo(agentInfo) if (log.isDebug()) { - log.debug(`sendAgentInfo pAgentInfo: ${JSON.stringify(pAgentInfo.toObject())}`) + log.debug(`sendAgentInfo pAgentInfo: ${pAgentInfo}`) } this.requestAgentInfo.request(pAgentInfo, (err, response) => { if (callback) { @@ -162,11 +163,26 @@ class GrpcDataSender { }) } + sendSqlMetaInfo(sqlMetaData, callback) { + const pSqlMetaData = sqlMetaData.valueOfProtocolBuffer() + if (log.isDebug()) { + log.debug(`sendSqlMetaInfo sqlMetaData: ${JSON.stringify(pSqlMetaData.toObject())}`) + } + this.requestSqlMetaData.request(pSqlMetaData, (err, response) => { + if (err) { + log.error(err) + } + if (callback) { + callback(err, response) + } + }) + } + sendSpan(span) { try { const pSpan = span.spanMessage if (log.isDebug()) { - log.debug(`sendSpan pSpan: ${JSON.stringify(pSpan.toObject())}`) + log.debug(`sendSpan pSpan: ${pSpan}`) } this.spanStream.write(pSpan) } catch (e) { @@ -180,7 +196,7 @@ class GrpcDataSender { try { const pSpanChunk = spanChunk.spanMessage if (log.isDebug()) { - log.debug(`sendSpanChunk pSpanChunk: ${JSON.stringify(pSpanChunk.toObject())}`) + log.debug(`sendSpanChunk pSpanChunk: ${pSpanChunk}`) } this.spanStream.write(pSpanChunk) } catch (e) { @@ -194,7 +210,7 @@ class GrpcDataSender { try { const pStatMessage = dataConvertor.convertStat(stat) if (log.isDebug()) { - log.debug(`sendStats pStatMessage: ${JSON.stringify(stat)}`) + log.debug(`sendStats pStatMessage: ${stat}`) } this.statStream.write(pStatMessage) } catch (e) { @@ -215,7 +231,7 @@ class GrpcDataSender { sendPing() { const pPing = dataConvertor.convertPing() if (log.isDebug()) { - log.debug(`sendPing pPing: ${JSON.stringify(pPing)}`) + log.debug(`sendPing pPing: ${JSON.stringify(pPing.toObject())}`) } this.pingStream.write(pPing) } diff --git a/lib/client/sql-meta-data.js b/lib/client/sql-meta-data.js new file mode 100644 index 00000000..9de12132 --- /dev/null +++ b/lib/client/sql-meta-data.js @@ -0,0 +1,23 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' +const spanMessages = require('../data/v1/Span_pb') +class SqlMetaData { + constructor(parsingResult) { + this.sqlId = parsingResult.getId() + this.sql = parsingResult.getSql() + } + + valueOfProtocolBuffer() { + const pSqlMetaData = new spanMessages.PSqlMetaData() + pSqlMetaData.setSqlid(this.sqlId) + pSqlMetaData.setSql(this.sql) + return pSqlMetaData + } +} + +module.exports = SqlMetaData \ No newline at end of file diff --git a/lib/config.js b/lib/config.js index 347d7a50..0cfdd3d1 100644 --- a/lib/config.js +++ b/lib/config.js @@ -10,6 +10,8 @@ const path = require('path') const fs = require('fs') const defaultConfig = require('./pinpoint-config-default') const log = require('./utils/logger') +const { setLog } = require('./supports') +const { makeLogLevelLog } = require('./utils/log/log-level-logger') const valueOfString = (envName) => { return () => { @@ -142,6 +144,7 @@ const init = (initOptions = {}) => { readConfigJson(initOptions)) log.init(agentConfig.logLevel) + setLog(makeLogLevelLog(agentConfig.logLevel)) Object.entries(REQUIRE_CONFIG).forEach(([propertyName, description]) => { if (agentConfig.enable && !agentConfig[propertyName]) { @@ -252,5 +255,6 @@ module.exports = { clear, readConfigJson, readRootConfigFile, - getMainModulePath + getMainModulePath, + isContainerEnvironment } diff --git a/lib/constant/annotation-key.js b/lib/constant/annotation-key.js index f9744da3..39bdc17f 100644 --- a/lib/constant/annotation-key.js +++ b/lib/constant/annotation-key.js @@ -6,20 +6,30 @@ 'use strict' +// https://github.com/pinpoint-apm/pinpoint/blob/b6a3f3e8aed8111264bedc77b110e0ffd5aa4852/commons/src/main/java/com/navercorp/pinpoint/common/trace/AnnotationKey.java#L144 const AnnotationKey = require('../context/annotation-key') - -const DefaultAnnotationKey = { - API: new AnnotationKey(12, "API"), - API_METADATA: new AnnotationKey(13, "API-METADATA"), - HTTP_URL: new AnnotationKey(40, "http.url"), - HTTP_STATUS_CODE: new AnnotationKey(46, "http.status.code") -} - -const EventAnnotationKey= { - MONGO_JSON_DATA: new AnnotationKey(150, "MONGO-JSON-Data") -} +const AnnotationKeyProperty = require('./annotation').AnnotationKeyProperty module.exports = { - DefaultAnnotationKey, - EventAnnotationKey, + API: new AnnotationKey(12, 'API'), + API_METADATA: new AnnotationKey(13, 'API-METADATA'), + + SQL_ID: new AnnotationKey(20, "SQL-ID"), + SQL_BINDVALUE: new AnnotationKey(24, "SQL-BindValue", AnnotationKeyProperty.VIEW_IN_RECORD_SET), + + HTTP_URL: new AnnotationKey(40, 'http.url'), + HTTP_PARAM: new AnnotationKey(41, 'http.param', AnnotationKeyProperty.VIEW_IN_RECORD_SET), + HTTP_STATUS_CODE: new AnnotationKey(46, 'http.status.code'), + MAX_ARGS_SIZE: 10, + ARGS0: new AnnotationKey(-1, 'args[0]'), + ARGS1: new AnnotationKey(-2, 'args[1]'), + ARGS2: new AnnotationKey(-3, 'args[2]'), + ARGS3: new AnnotationKey(-4, 'args[3]'), + ARGS4: new AnnotationKey(-5, 'args[4]'), + ARGS5: new AnnotationKey(-6, 'args[5]'), + ARGS6: new AnnotationKey(-7, 'args[6]'), + ARGS7: new AnnotationKey(-8, 'args[7]'), + ARGS8: new AnnotationKey(-9, 'args[8]'), + ARGS9: new AnnotationKey(-10, 'args[9]'), + ARGSN: new AnnotationKey(-11, 'args[N]'), } diff --git a/lib/constant/default-predefined-method-descriptor-registry.js b/lib/constant/default-predefined-method-descriptor-registry.js new file mode 100644 index 00000000..c882294e --- /dev/null +++ b/lib/constant/default-predefined-method-descriptor-registry.js @@ -0,0 +1,31 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2020-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const MethodDescriptorBuilder2 = require('../context/method-descriptor-builder2') +const MethodType = require('./method-type') + +// DefaultPredefinedMethodDescriptorRegistry.java +// Node Server Process SpanEvent.apiId predefined values +class DefaultPredefinedMethodDescriptorRegistry { + registryMethodDescriptor(apiMetaService) { + const nodeServerProcessBuilder = new MethodDescriptorBuilder2().setType(MethodType.WEB_REQUEST).setApiDescriptor('Node Server Process') + const asyncInvocationBuilder = new MethodDescriptorBuilder2().setType(MethodType.INVOCATION).setApiDescriptor('Asynchronous Invocation') + this.nodeServerProcessDescriptor = apiMetaService.cacheApiWithBuilder(nodeServerProcessBuilder) + this.asyncInvocationDescriptor = apiMetaService.cacheApiWithBuilder(asyncInvocationBuilder) + } + + get nodeServerMethodDescriptor() { + return this.nodeServerProcessDescriptor + } + + get asyncInvocationMethodDescriptor() { + return this.asyncInvocationDescriptor + } +} + +module.exports = new DefaultPredefinedMethodDescriptorRegistry() diff --git a/lib/constant/method-descriptor.js b/lib/constant/method-descriptor.js deleted file mode 100644 index 64f81807..00000000 --- a/lib/constant/method-descriptor.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Pinpoint Node.js Agent - * Copyright 2020-present NAVER Corp. - * Apache License v2.0 - */ - -'use strict' - -const MethodDescriptor = require('../context/method-descriptor') -const AsyncMethodDescriptor = require('../context/async-method-descriptor') -const MethodType = require('./method-type').MethodType - -const GeneralMethodDescriptor = { - SERVER_REQUEST: new MethodDescriptor('http', 'Server', 'request', MethodType.WEB_REQUEST, 'Node Server Process'), - AsyncInvocation: new AsyncMethodDescriptor(MethodType.INVOCATION, "Asynchronous Invocation") -} - -module.exports = { - GeneralMethodDescriptor, -} diff --git a/lib/constant/method-type.js b/lib/constant/method-type.js index ec1d9c2f..a3cf11ae 100644 --- a/lib/constant/method-type.js +++ b/lib/constant/method-type.js @@ -6,16 +6,22 @@ 'use strict' +// MethodType.java from pinpoint-java const MethodType = { + // method DEFAULT: 0, + // exception message EXCEPTION: 1, + // information ANNOTATION: 2, + // method parameter PARAMETER: 3, + // tomcat, jetty, ... WEB_REQUEST: 100, + // sync/async INVOCATION: 200, + // corrupted when : 1. slow network, 2. too much node ... CORRUPTED: 900 } -module.exports = { - MethodType -} +module.exports = MethodType \ No newline at end of file diff --git a/lib/constant/service-type.js b/lib/constant/service-type.js index 2b62bff5..94b6b71c 100644 --- a/lib/constant/service-type.js +++ b/lib/constant/service-type.js @@ -8,23 +8,23 @@ const ServiceTypeCode = { async: 100, - + node: 1400, node_method: 1401, express: 6600, - koa : 6610, + koa: 6610, hapi: 6620, restify: 6630, - mongodb : 2650, - redis : 8200, + mongodb: 2650, + redis: 8200, ioredis: 8202, // 임시코드 elasticsearch: 8203, // 임시코드, bluebird: 8204, //임시코드 - mysql: 8205, + mysql: 2100, - ASYNC_HTTP_CLIENT : 9056, + ASYNC_HTTP_CLIENT: 9056, ASYNC_HTTP_CLIENT_INTERNAL: 9057, callback_dummy: 99999, diff --git a/lib/context/annotation-key-utils.js b/lib/context/annotation-key-utils.js new file mode 100644 index 00000000..db3cf60a --- /dev/null +++ b/lib/context/annotation-key-utils.js @@ -0,0 +1,41 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2020-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const annotationKey = require('../constant/annotation-key') + +// https://github.com/pinpoint-apm/pinpoint/blob/master/commons/src/main/java/com/navercorp/pinpoint/common/util/AnnotationKeyUtils.java +class AnnotationKeyUtils { + static getArgs(index) { + switch (index) { + case 0: + return annotationKey.ARGS0 + case 1: + return annotationKey.ARGS1 + case 2: + return annotationKey.ARGS2 + case 3: + return annotationKey.ARGS3 + case 4: + return annotationKey.ARGS4 + case 5: + return annotationKey.ARGS5 + case 6: + return annotationKey.ARGS6 + case 7: + return annotationKey.ARGS7 + case 8: + return annotationKey.ARGS8 + case 9: + return annotationKey.ARGS9 + default: + return annotationKey.ARGSN + } + } +} + +module.exports = AnnotationKeyUtils \ No newline at end of file diff --git a/lib/context/annotation-key.js b/lib/context/annotation-key.js index b7e0ba16..2e68b8cb 100644 --- a/lib/context/annotation-key.js +++ b/lib/context/annotation-key.js @@ -9,9 +9,9 @@ const AnnotationKeyProperty = require('../constant/annotation').AnnotationKeyProperty class AnnotationKey { - constructor (name, code, ...properties) { - this.name = name + constructor (code, name, ...properties) { this.code = code + this.name = name this.viewInRecordSet = false this.errorApiMetadata = false @@ -30,6 +30,18 @@ class AnnotationKey { } }) } + + getCode() { + return this.code + } + + getName() { + return this.name + } + + toString() { + return `AnnotationKey{code=${this.code}, name=${this.name}}` + } } module.exports = AnnotationKey diff --git a/lib/context/annotation.js b/lib/context/annotation.js index de8e64f2..b3a1d488 100644 --- a/lib/context/annotation.js +++ b/lib/context/annotation.js @@ -11,7 +11,7 @@ const TypedValue = require('../data/typed-value') class Annotation { constructor (key, value, valuedType) { this.key = key.name - this.value = new TypedValue(value, valuedType) + this.value = value } } diff --git a/lib/context/api-meta-service.js b/lib/context/api-meta-service.js index f8752bc7..0a7ee21f 100644 --- a/lib/context/api-meta-service.js +++ b/lib/context/api-meta-service.js @@ -6,11 +6,11 @@ 'use strict' -const apiMetaCacheKeyGenerator = require('../context/sequence-generator').apiMetaCacheKeyGenerator +const apiMetaCacheKeyGenerator = require('../context/sequence-generators').apiMetaCacheKeyGenerator const SimpleCache = require('../utils/simple-cache') -const GeneralMethodDescriptor = require('../constant/method-descriptor').GeneralMethodDescriptor const ApiMetaInfo = require('../data/dto/api-meta-info') const log = require('../utils/logger') +const defaultPredefinedMethodDescriptorRegistry = require('../constant/default-predefined-method-descriptor-registry') class StringMetaCache { constructor() { @@ -20,10 +20,7 @@ class StringMetaCache { init(dataSender) { this.dataSender = dataSender - - Object.keys(GeneralMethodDescriptor).forEach(name => { - this.cacheApi(GeneralMethodDescriptor[name]) - }) + defaultPredefinedMethodDescriptorRegistry.registryMethodDescriptor(this) } cacheApi(methodDescriptor) { @@ -40,6 +37,22 @@ class StringMetaCache { return methodDescriptor } + // https://github.com/pinpoint-apm/pinpoint/blob/91ccacfa7940ee2bd1ff231f2072087962294109/profiler/src/main/java/com/navercorp/pinpoint/profiler/metadata/DefaultApiMetaDataService.java#L38 + cacheApiWithBuilder(builder) { + if (!builder) return + + const cacheId = builder.getCacheId() + const cachedValue = this.cache.get(cacheId) + if (cachedValue === null) { + builder.setApiId(apiMetaCacheKeyGenerator.next) + const methodDescriptor = builder.build() + this.cache.put(cacheId, methodDescriptor) + this.sendApiMetaInfo(methodDescriptor) + return methodDescriptor + } + return cachedValue + } + sendApiMetaInfo(methodDescriptor) { const apiMetaInfo = ApiMetaInfo.create(methodDescriptor) try { diff --git a/lib/context/async-id-accessor.js b/lib/context/async-id-accessor.js deleted file mode 100644 index 1f325577..00000000 --- a/lib/context/async-id-accessor.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Pinpoint Node.js Agent - * Copyright 2020-present NAVER Corp. - * Apache License v2.0 - */ - -'use strict' - -const setAsyncId = (object, asyncId) => { - object.__$pinpoint$_asyncId = asyncId -} - -const getAsyncId = (object) => { - return object.__$pinpoint$_asyncId -} - -module.exports = { - setAsyncId, - getAsyncId -} \ No newline at end of file diff --git a/lib/context/async-id.js b/lib/context/async-id.js index a1950a69..bf7f340c 100644 --- a/lib/context/async-id.js +++ b/lib/context/async-id.js @@ -6,18 +6,36 @@ 'use strict' -const SequenceGenerator = require('./sequence-generator').SequenceGenerator +const SequenceGenerator = require('./sequence-generator') class AsyncId { - constructor(asyncId) { + constructor(asyncId, sequence) { this.asyncId = asyncId + if (typeof sequence === 'number') { + this.sequence = sequence + } else { + this.sequence = 0 + } this.sequenceGenerator = new SequenceGenerator() } + getAsyncId() { + return this.asyncId + } + + getSequence() { + return this.sequence + } + get nextAsyncSequence() { return this.sequenceGenerator.next } + nextLocalAsyncId() { + const asyncId = this.getAsyncId() + const sequence = this.nextAsyncSequence() + return new AsyncId(asyncId, sequence) + } } module.exports = AsyncId \ No newline at end of file diff --git a/lib/context/async-method-descriptor.js b/lib/context/async-method-descriptor.js deleted file mode 100644 index b27d534e..00000000 --- a/lib/context/async-method-descriptor.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Pinpoint Node.js Agent - * Copyright 2020-present NAVER Corp. - * Apache License v2.0 - */ - -'use strict' - -class AsyncMethodDescriptor { - constructor(type, apiDescriptor, lineNumber) { - this.type = type - this.apiDescriptor = apiDescriptor - this.apiId = 0 - this.lineNumber = lineNumber || -1 - } -} - -module.exports = AsyncMethodDescriptor \ No newline at end of file diff --git a/lib/context/async-trace.js b/lib/context/async-trace.js index 99104742..f32652bc 100644 --- a/lib/context/async-trace.js +++ b/lib/context/async-trace.js @@ -10,11 +10,9 @@ const SpanEventRecorder = require('./span-event-recorder') const SpanEvent = require('./span-event') const SpanChunk = require('./span-chunk') const BufferedStorage = require('./buffered-storage') -const {ServiceTypeCode} = require('../constant/service-type') -const {GeneralMethodDescriptor} = require('../constant/method-descriptor') class AsyncTrace { - constructor (span, asyncId, traceId, agentInfo, dataSender, sampling) { + constructor(span, asyncId, traceId, agentInfo, dataSender, sampling) { this.span = span this.traceId = traceId this.agentInfo = agentInfo @@ -28,16 +26,9 @@ class AsyncTrace { this.callStack = [] this.sequence = 0 this.sampling = sampling - - const spanEventRecorder = this.traceAsyncBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.async) - spanEventRecorder.recordApiId(GeneralMethodDescriptor.AsyncInvocation.apiId) - spanEventRecorder.spanEvent.endPoint = null - spanEventRecorder.spanEvent.destinationId = null - this.storage.storeSpanEvent(spanEventRecorder.spanEvent) } - traceAsyncBegin () { + traceAsyncBegin() { const spanEvent = new SpanEvent(this.span, this.sequence) spanEvent.startTime = Date.now() spanEvent.startElapsed = spanEvent.startTime - this.span.startTime @@ -49,7 +40,7 @@ class AsyncTrace { return new SpanEventRecorder(spanEvent, this.span) } - traceAsyncEnd (spanEventRecorder) { + traceAsyncEnd(spanEventRecorder) { if (!spanEventRecorder || !spanEventRecorder.spanEvent) return this.storage.storeSpanEvent(spanEventRecorder.spanEvent) this.storage.flush() @@ -58,11 +49,11 @@ class AsyncTrace { this.callStack = this.callStack.filter(spanEvent => spanEvent.sequence != spanEventRecorder.spanEvent.sequence) } - canSampled () { + canSampled() { return this.sampling } - close () { + close() { this.storage.flush() this.callStack = [] } diff --git a/lib/context/context-manager.js b/lib/context/context-manager.js index 5100b4cb..2fb60104 100644 --- a/lib/context/context-manager.js +++ b/lib/context/context-manager.js @@ -7,7 +7,6 @@ 'use strict' const async_hooks = require('async_hooks') -const log = require('../utils/logger') const traceObjectMap = new Map() diff --git a/lib/context/disable-span-event-recorder.js b/lib/context/disable-span-event-recorder.js index 23b7ff34..46b6e456 100644 --- a/lib/context/disable-span-event-recorder.js +++ b/lib/context/disable-span-event-recorder.js @@ -7,65 +7,68 @@ 'use strict' const AsyncId = require('./async-id') -const asyncIdGenerator = require('./sequence-generator').asyncIdGenerator +const asyncIdGenerator = require('./sequence-generators').asyncIdGenerator class DisableSpanEventRecorder { - constructor() { - this.nextAsyncId = null - this.ended = false - this.error = null - } - - recordStartTime(startTime) { - } - - recordServiceType(code, ...properties) { - } - - recordDestinationId(id) { - } - - recordEndPoint(endPoint) { - } - - recordNextSpanId(nextSpanId) { - } - - recordNextAsyncId() { - let asyncId - if (this.nextAsyncId === null) { - asyncId = asyncIdGenerator.next - this.nextAsyncId = asyncId - } else { - asyncId = this.nextAsyncId - } - return new AsyncId(asyncId) - } - - recordApiId(apiId) { - } - - recordApi(methodDescriptor) { - } - - recordApiDesc(desc) { - } - - recordHTTPURL(url) { - } - - recordApiArguments(key, desc, valueType) { - } - - recordAttribute(key, value, valueType) { - } - - recordException(error, isError) { - } - - recordEnd() { - this.ended = true + constructor() { + this.nextAsyncId = null + this.ended = false + this.error = null + } + + recordStartTime() { + } + + recordServiceType() { + } + + recordDestinationId() { + } + + recordEndPoint() { + } + + recordNextSpanId() { + } + + recordNextAsyncId() { + let asyncId + if (this.nextAsyncId === null) { + asyncId = asyncIdGenerator.next + this.nextAsyncId = asyncId + } else { + asyncId = this.nextAsyncId } + return new AsyncId(asyncId) + } + + recordApiId() { + } + + recordApi() { + } + + recordApiWithParameters() { + } + + recordApiDesc() { } - - module.exports = DisableSpanEventRecorder \ No newline at end of file + + recordApiArguments() { + } + + recordAttribute() { + } + + recordException() { + } + + recordSqlInfo() { + } + + recordEnd() { + this.ended = true + } +} + +module.exports = DisableSpanEventRecorder \ No newline at end of file diff --git a/lib/context/disable-trace.js b/lib/context/disable-trace.js index 7932fa8f..7540e630 100644 --- a/lib/context/disable-trace.js +++ b/lib/context/disable-trace.js @@ -50,7 +50,13 @@ class DisableTrace { return (this.span && this.span.startTime) || 0 } - close() {} + close() { + this.closedDisabledTrace = true + } + + completed() { + return this.closedDisabledTrace + } } module.exports = DisableTrace \ No newline at end of file diff --git a/lib/context/express-method-descriptor-builder.js b/lib/context/express-method-descriptor-builder.js new file mode 100644 index 00000000..2776d8ae --- /dev/null +++ b/lib/context/express-method-descriptor-builder.js @@ -0,0 +1,30 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2020-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +class ExpressMethodDescriptorBuilder { + static make(builder, objectName, layerName, handlerArgumentsLength) { + if (!builder) { + return + } + + if (objectName === 'middleware') { + if (typeof handlerArgumentsLength === 'number' && handlerArgumentsLength != 4) { + if (layerName === '') { + return builder.setParameterDescriptor(`(req, res, next)`) + } + return builder.setParameterDescriptor(`(${layerName})`) + } else { + return builder.setParameterDescriptor(`(err, req, res, next)`) + } + } + + return builder.setParameterDescriptor('(path, callback)') + } +} + +module.exports = ExpressMethodDescriptorBuilder \ No newline at end of file diff --git a/lib/context/koa-method-descriptor-builder.js b/lib/context/koa-method-descriptor-builder.js new file mode 100644 index 00000000..20aeb051 --- /dev/null +++ b/lib/context/koa-method-descriptor-builder.js @@ -0,0 +1,18 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2022-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +class KoaMethodDescriptorBuilder { + static make(builder) { + if (!builder) { + return + } + return builder.setParameterDescriptor('(ctx, next)') + } +} + +module.exports = KoaMethodDescriptorBuilder \ No newline at end of file diff --git a/lib/context/make-method-descriptor-builder.js b/lib/context/make-method-descriptor-builder.js new file mode 100644 index 00000000..531aca42 --- /dev/null +++ b/lib/context/make-method-descriptor-builder.js @@ -0,0 +1,116 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2021-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const MethodDescriptorBuilder = require('./method-descriptor-builder') +const makeMethodDescriptorBuilder = (moduleName, index, handlerIndex) => { + const callStack = {} + Error.captureStackTrace(callStack, makeMethodDescriptorBuilder) + + const builder = MethodDescriptorBuilder.make(moduleName, captureNamedGroup(stringStackOfCallStack(callStack, index))) + + if (builder && typeof handlerIndex === 'number') { + const location = locationFileNameLineNumber(stringStackOfCallStack(callStack, handlerIndex)) + if (location && location.groups) { + const locationGroup = location.groups + builder.setFileName(locationGroup.fileName) + + if (typeof locationGroup.location === 'string') { + builder.setLocation(`${locationGroup.location}${locationGroup.fileName}`) + } else { + builder.setLocation(`${locationGroup.fileName}`) + } + + const lineNumber = MethodDescriptorBuilder.makeLineNumber(locationGroup) + if (lineNumber) { + builder.setLineNumber(lineNumber) + } + } + } + return builder +} + +const stringStackOfCallStack = (callstack, index) => { + const stacks = callstack.stack.split(/\n */) + + if (typeof index !== 'number' || stacks.length < index + 1) { + return + } + + return stacks[index] +} + +const captureNamedGroup = (stack) => { + const functionNameMatches = [typeFunctionNameMethodName, newFunctionName, ayncFunctionName] + for (const match of functionNameMatches) { + var group = match(stack) + if (group && group.groups) { + break + } + } + + const locationMatches = [locationFileNameLineNumber, fileNameOfStack] + for (const match of locationMatches) { + var locationGroup = match(stack) + if (locationGroup && locationGroup.groups) { + break + } + } + + if (!group || !group.groups || !locationGroup || !locationGroup.groups) { + return + } + return Object.assign(group.groups, locationGroup.groups) +} + +const typeFunctionNameMethodName = (stack) => { + return stack.match(/at (?\w+(?=\.))?\.?(?[^\s]+)(?: \[as (?\w+)\])? \((?.+\/)(?[^:/]+):(?[0-9]+):(?[0-9]+)\)$/) +} + +const newFunctionName = (stack) => { + const group = stack.match(/at new (?[^\s]+) /) + if (!group || !group.groups || !group.groups.functionName) { + return + } + + const functionName = toUpperCaseOfFirstCharacter(group) + return { 'groups': { 'functionName': functionName } } +} + +function toUpperCaseOfFirstCharacter(group) { + return Array.from(group.groups.functionName) + .map((element, index) => { + if (index == 0 && typeof element === 'string') { + return element.toUpperCase() + } + return element + }) + .join('') +} + +const ayncFunctionName = (stack) => { + const group = stack.match(/at async (?[^\s]+) /) + if (!group || !group.groups || !group.groups.functionName) { + return + } + + const functionName = toUpperCaseOfFirstCharacter(group) + return { 'groups': { 'functionName': functionName } } +} + +const locationFileNameLineNumber = (stack) => { + return stack.match(/ \((?.+\/)(?[^:/]+):(?[0-9]+):(?[0-9]+)\)$/) +} + +const fileNameOfStack = (stack) => { + return stack.match(/ \((?)\)$/) +} + +module.exports = { + makeMethodDescriptorBuilder, + captureNamedGroup, +} \ No newline at end of file diff --git a/lib/context/method-descriptor-builder.js b/lib/context/method-descriptor-builder.js new file mode 100644 index 00000000..f013f420 --- /dev/null +++ b/lib/context/method-descriptor-builder.js @@ -0,0 +1,238 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2021-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const MethodDescriptor = require('./method-descriptor') + +const MethodType = require('../constant/method-type') + +// https://v8.dev/docs/stack-trace-api#appendix%3A-stack-trace-format +class MethodDescriptorBuilder { + constructor(moduleName, objectPath, methodName) { + this.moduleName = moduleName + this.objectPath = objectPath + this.methodName = methodName + this.type = MethodType.DEFAULT + this.parameterDescriptor = '()' + this.apiId = 0 + this.computedApiDescriptor = this.makeApiDescriptor() + this.computedFullName = this.makeFullName(moduleName, objectPath) + } + + makeApiDescriptor() { + const buffer = [] + const typeFunctionString = this.typeFunction() + if (typeFunctionString && typeof typeFunctionString === 'string') { + buffer.push(typeFunctionString) + } + if (this.parameterDescriptor && typeof this.parameterDescriptor === 'string') { + buffer.push(this.parameterDescriptor) + } + return buffer.join('') + } + + typeFunction() { + const buffer = [] + if (this.moduleName && typeof this.moduleName === 'string') { + buffer.push(this.moduleName) + } + if (this.className && typeof this.className === 'string') { + buffer.push(this.className) + } + if (this.objectPath && typeof this.objectPath === 'string') { + buffer.push(this.objectPath) + } + return buffer.join('.') + } + + static make(moduleName, stackRegexNamedGroup) { + if (!stackRegexNamedGroup || !stackRegexNamedGroup.functionName) { + return + } + + const functionName = makeFunctionName(stackRegexNamedGroup) + const builder = new MethodDescriptorBuilder(moduleName, functionName, makeMethodName(stackRegexNamedGroup)) + .setFunctionName(functionName) + .setLineNumber(makeLineNumber(stackRegexNamedGroup)) + .setClassName(stackRegexNamedGroup.type) + .setFileName(stackRegexNamedGroup.fileName) + + if (typeof stackRegexNamedGroup.location === 'string') { + builder.setLocation(`${stackRegexNamedGroup.location}${stackRegexNamedGroup.fileName}`) + } else { + builder.setLocation(`${stackRegexNamedGroup.fileName}`) + } + return builder + } + + static makeWithNameGroup(namedGroup) { + return MethodDescriptorBuilder.make(undefined, namedGroup) + } + + getModuleName() { + return this.moduleName + } + + setType(type) { + this.type = type + return this + } + + setApiDescriptor(apiDescriptor) { + this.apiDescriptor = apiDescriptor + return this + } + + setApiId(apiId) { + this.apiId = apiId + return this + } + + setFullName(fullName) { + this.fullName = fullName + return this + } + + getFullName() { + return this.fullName || this.computedFullName + } + + setLineNumber(lineNumber) { + this.lineNumber = lineNumber + return this + } + + getLineNumber() { + return this.lineNumber + } + + setLocation(location) { + this.location = location + return this + } + + getLocation() { + return this.location + } + + setFileName(fileName) { + this.fileName = fileName + return this + } + + getFileName() { + return this.fileName + } + + build() { + const apiDescriptor = this.apiDescriptor || this.computedApiDescriptor + const fullName = this.fullName || this.computedFullName + return new MethodDescriptor(this.moduleName, this.objectPath, this.methodName, this.type, apiDescriptor, this.apiId, fullName, this.className, this.lineNumber, this.location) + } + + makeFullNameWithApiDescriptor(moduleName, objectPath) { + if (moduleName && !objectPath) { + return `${moduleName}.` + } + return this.makeFullNameWithApiDescriptorAndParameterDescriptor() + } + + makeFullNameWithApiDescriptorAndParameterDescriptor() { + let parameterDescriptor = this.parameterDescriptor + if (!parameterDescriptor || typeof parameterDescriptor !== 'string') { + parameterDescriptor = '()' + } + if (!this.moduleName && this.className && this.objectPath) { + return `${this.className}.${this.objectPath}${parameterDescriptor}` + } + return [this.objectPath, parameterDescriptor] + .filter(v => v) + .join('') + } + + makeFullName(moduleName, objectPath) { + if (moduleName && !objectPath) { + return `${moduleName}.` + } + + if (moduleName) { + return `${moduleName}.${this.makeFullNameWithApiDescriptor(moduleName, objectPath)}` + } else { + return `${this.makeFullNameWithApiDescriptor(moduleName, objectPath)}` + } + } + + getFunctionName() { + return this.functionName + } + + setFunctionName(functionName) { + this.functionName = functionName + return this + } + + getClassName() { + return this.className + } + + setClassName(className) { + this.className = className + this.computedApiDescriptor = this.makeApiDescriptor() + return this + } + + setParameterDescriptor(parameterDescriptor) { + this.parameterDescriptor = parameterDescriptor + this.computedApiDescriptor = this.makeApiDescriptor() + this.computedFullName = this.makeFullName(this.moduleName, this.objectPath) + return this + } + + getCacheId() { + return `${this.getFullName()}:${this.lineNumber}:${this.fileName}` + } + + static makeLineNumber(namedGroups) { + return makeLineNumber(namedGroups) + } +} + +function makeFunctionName(namedGroup) { + const functionName = namedGroup.functionName + if (!functionName) { + return + } + + if (typeof functionName !== 'string') { + return + } + + const computedGroups = functionName.match(/(?.+)(?<=\.)$/) + if (computedGroups && computedGroups.length > 0 && namedGroup.methodName) { + return computedGroups.groups.functionName + namedGroup.methodName + } + if (functionName === '' && typeof namedGroup.type === 'string' && typeof namedGroup.methodName === 'string') { + return namedGroup.methodName + } + return namedGroup.functionName +} + +function makeMethodName(namedGroups) { + if (namedGroups.functionName == '' && !namedGroups.methodName && namedGroups.type) { + return namedGroups.functionName + } + return namedGroups.methodName || namedGroups.functionName +} + +function makeLineNumber(namedGroups) { + if (!namedGroups.lineNumber || typeof namedGroups.lineNumber !== 'string') { + return + } + return parseInt(namedGroups.lineNumber) +} + +module.exports = MethodDescriptorBuilder \ No newline at end of file diff --git a/lib/context/method-descriptor-builder2.js b/lib/context/method-descriptor-builder2.js new file mode 100644 index 00000000..53abf4c5 --- /dev/null +++ b/lib/context/method-descriptor-builder2.js @@ -0,0 +1,157 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +const MethodDescriptor2 = require('../instrumentation/method-descriptor2') +const MethodType = require('../constant/method-type') + +// https://v8.dev/docs/stack-trace-api#appendix%3A-stack-trace-format +class MethodDescriptorBuilder2 { + constructor(functionName) { + this.type = MethodType.DEFAULT + this.apiId = 0 + this.parameterVariableNames = [] + this.functionName = functionName + } + + setType(type) { + this.type = type + return this + } + + setClassName(className) { + this.className = className + return this + } + + setLineNumber(lineNumber) { + this.lineNumber = lineNumber + return this + } + + setLocation(location) { + this.location = location + return this + } + + getFileName() { + return this.fileName + } + + setFileName(fileName) { + this.fileName = fileName + return this + } + + setParameterVariableNames(names) { + this.parameterVariableNames = names + return this + } + + setFunctionName(functionName) { + this.functionName = functionName + return this + } + + setMethodName(methodName) { + this.methodName = methodName + return this + } + + setApiId(apiId) { + this.apiId = apiId + return this + } + + setApiDescriptor(apiDescriptor) { + this.apiDescriptor = apiDescriptor + return this + } + + getCacheId() { + if (this.apiDescriptor) { + return this.apiDescriptor + } + + const cacheId = [this.formattedStringOfCall()] + + if (typeof this.fileName === 'string') { + cacheId.push(this.fileName) + } + + if (typeof this.lineNumber === 'number') { + cacheId.push(this.lineNumber) + } + return cacheId.join(':') + } + + toggleConstruct() { + this.construct = true + delete this.async + delete this.type + return this + } + + toggleAsync() { + this.async = true + delete this.construct + delete this.type + return this + } + + // https://v8.dev/docs/stack-trace-api#appendix%3A-stack-trace-format + formattedStringOfCall() { + if (this.needsMethodAndFunctionName() || (this.needsFunctionNameWhenConstructOrAsync())) { + return `` + } + + if (this.construct) { + return `new ${this.functionName}` + } else if (this.async) { + return `async ${this.functionName}` + } + + const formatted = [] + if (typeof this.className === 'string') { + formatted.push(`${this.className}.`) + } + + if (typeof this.functionName === 'string') { + formatted.push(this.functionName) + } + + if (typeof this.methodName === 'string' && typeof this.functionName === 'string' && this.functionName !== this.methodName) { + formatted.push(` [as ${this.methodName}]`) + } else if (typeof this.methodName === 'string' && typeof this.functionName !== 'string') { + formatted.push(this.methodName) + } + + return formatted.join('') + } + + needsMethodAndFunctionName() { + return !this.functionName && !this.methodName + } + + needsFunctionNameWhenConstructOrAsync() { + return (this.construct || this.async) && !this.functionName + } + + build() { + const value = new MethodDescriptor2() + value.methodName = this.methodName + value.type = this.type + value.parameterVariableNames = this.parameterVariableNames + value.lineNumber = this.lineNumber + value.fullName = this.fullName + value.apiId = this.apiId + value.apiDescriptor = this.apiDescriptor || this.formattedStringOfCall() + value.location = this.location + value.className = this.className + return value + } +} + +module.exports = MethodDescriptorBuilder2 \ No newline at end of file diff --git a/lib/context/method-descriptor.js b/lib/context/method-descriptor.js index 8dc95d58..ca1320f7 100644 --- a/lib/context/method-descriptor.js +++ b/lib/context/method-descriptor.js @@ -6,19 +6,30 @@ 'use strict' -const MethodType = require('../constant/method-type').MethodType +const MethodType = require('../constant/method-type') +// https://github.com/pinpoint-apm/pinpoint/blob/master/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/DefaultMethodDescriptor.java class MethodDescriptor { - constructor (moduleName, objectPath, methodName, type, apiDescriptor) { + constructor(moduleName, objectPath, methodName, type, apiDescriptor, apiId, fullName, className, lineNumber, location) { this.moduleName = moduleName this.objectPath = objectPath this.methodName = methodName this.type = type || MethodType.DEFAULT this.apiDescriptor = apiDescriptor || this.getDescriptor() - this.apiId = 0 + + if (typeof apiId === 'number') { + this.apiId = apiId + } else { + this.apiId = 0 + } + + this.fullName = fullName + this.className = className + this.lineNumber = lineNumber + this.location = location } - static create (moduleName, objectPath, methodName) { + static create(moduleName, objectPath, methodName) { return new MethodDescriptor(moduleName, objectPath, methodName) } @@ -27,6 +38,46 @@ class MethodDescriptor { .filter(v => v) .join('.') } + + getFullName() { + return this.fullName + } + + getApiId() { + return this.apiId + } + + getModuleName() { + return this.moduleName + } + + getFunctionName() { + return this.objectPath + } + + getMethodName() { + return this.methodName + } + + getApiDescriptor() { + return this.apiDescriptor + } + + getClassName() { + return this.className + } + + getLineNumber() { + return this.lineNumber + } + + getType() { + return this.type + } + + getLocation() { + return this.location + } } module.exports = MethodDescriptor diff --git a/lib/context/sequence-generator.js b/lib/context/sequence-generator.js index 28d0942a..d8867ad0 100644 --- a/lib/context/sequence-generator.js +++ b/lib/context/sequence-generator.js @@ -6,14 +6,14 @@ 'use strict' -class SequenceGenerator{ - constructor (initValue = 0, maxValue = Number.MAX_SAFE_INTEGER) { +class SequenceGenerator { + constructor(initValue = 0, maxValue = Number.MAX_SAFE_INTEGER) { this.initValue = initValue this.maxValue = maxValue this.sequence = initValue } - get next () { + get next() { if (this.sequence > this.maxValue) { this.sequence = this.initValue } @@ -21,17 +21,9 @@ class SequenceGenerator{ } // for test - reset () { + reset() { this.sequence = this.initValue } } -module.exports = { - SequenceGenerator, - transactionIdGenerator: new SequenceGenerator(), - asyncIdGenerator: new SequenceGenerator(1), - stringMetaCacheKeyGenerator: new SequenceGenerator(1), - apiMetaCacheKeyGenerator: new SequenceGenerator(1), - pingIdGenerator: new SequenceGenerator(), - dummyIdGenerator: new SequenceGenerator(), -} +module.exports = SequenceGenerator diff --git a/lib/context/sequence-generators.js b/lib/context/sequence-generators.js new file mode 100644 index 00000000..b65d0701 --- /dev/null +++ b/lib/context/sequence-generators.js @@ -0,0 +1,12 @@ +const SequenceGenerator = require('./sequence-generator') + +module.exports = { + transactionIdGenerator: new SequenceGenerator(), + asyncIdGenerator: new SequenceGenerator(1), + stringMetaCacheKeyGenerator: new SequenceGenerator(1), + apiMetaCacheKeyGenerator: new SequenceGenerator(1), + sqlMetaDataCacheKeyGenerator: new SequenceGenerator(1), + pingIdGenerator: new SequenceGenerator(), + dummyIdGenerator: new SequenceGenerator(), + } + \ No newline at end of file diff --git a/lib/context/service-type.js b/lib/context/service-type.js index a5aa93a7..78f7262a 100644 --- a/lib/context/service-type.js +++ b/lib/context/service-type.js @@ -10,9 +10,22 @@ const serviceTypeConstant = require('../constant/service-type') const ServiceTypeProperty = serviceTypeConstant.ServiceTypeProperty class ServiceType { - constructor (code, ...properties) { + static undefinedServiceType = new ServiceType(-1, 'UNDEFINED') + static unknown = new ServiceType(1, 'UNKNOWN') + static async = new ServiceType(100, 'ASYNC') + static node = new ServiceType(1400, 'NODE') + static nodeMethod = new ServiceType(1401, 'NODE_METHOD') + static express = new ServiceType(6600, 'EXPRESS') + static koa = new ServiceType(6610, 'KOA') + static mongodb = new ServiceType(2650, 'MONGODB') + static redis = new ServiceType(8200, 'REDIS') + static ioredis = new ServiceType(8202, 'IOREDIS') + static asyncHttpClient = new ServiceType(9056, 'ASYNC_HTTP_CLIENT') + static asyncHttpClientInternal = new ServiceType(9057, 'ASYNC_HTTP_CLIENT_INTERNAL') + + constructor(code, name, ...properties) { this.code = code - this.name = null + this.name = name this.terminal = false this.queue = false this.recordStatistics = false @@ -21,7 +34,11 @@ class ServiceType { this.setProperties(properties) } - setProperties (properties = []) { + getCode() { + return this.code + } + + setProperties(properties = []) { properties.forEach(p => { switch (p) { case ServiceTypeProperty.TERMINAL: diff --git a/lib/context/span-chunk.js b/lib/context/span-chunk.js index 30bb44fb..42879287 100644 --- a/lib/context/span-chunk.js +++ b/lib/context/span-chunk.js @@ -6,12 +6,12 @@ 'use strict' -const spanMessages = require('../data/grpc/Span_pb') -const {convertTransactionId, convertLocalAsyncId} = require('../data/grpc-data-convertor') +const spanMessages = require('../data/v1/Span_pb') +const { convertTransactionId, convertLocalAsyncId } = require('../data/grpc-data-convertor') const SpanEvents = require('./span-events') class SpanChunk { - constructor (traceId, agentInfo, asyncId, spanEventList) { + constructor(traceId, agentInfo, asyncId, spanEventList) { if (!traceId || !agentInfo) { throw new Error('Can not initialize SpanChunk', traceId, agentInfo) } @@ -29,22 +29,22 @@ class SpanChunk { this.localAsyncId = asyncId } - static getFactoryMethod (agentInfo, traceId) { + static getFactoryMethod(agentInfo, traceId) { return (spanEventList) => new SpanChunk(agentInfo, traceId, null, spanEventList) } - static getAsyncFactoryMethod (agentInfo, traceId, asyncId) { + static getAsyncFactoryMethod(agentInfo, traceId, asyncId) { return (spanEventList) => new SpanChunk(agentInfo, traceId, asyncId, spanEventList) } get spanMessage() { const pSpanMessage = new spanMessages.PSpanMessage() const pSpanChunk = new spanMessages.PSpanChunk() - pSpanChunk.setVersion(1); - + pSpanChunk.setVersion(1) + const pTransactionId = convertTransactionId(this.transactionIdObject) - pSpanChunk.setTransactionid(pTransactionId); - + pSpanChunk.setTransactionid(pTransactionId) + pSpanChunk.setSpanid(this.spanId) pSpanChunk.setEndpoint(this.endPoint) pSpanChunk.setApplicationservicetype(this.applicationServiceType) @@ -52,13 +52,13 @@ class SpanChunk { const keyTime = this.keyTime pSpanChunk.setKeytime(keyTime) - + const spanEvents = new SpanEvents(this.spanEventList) const pSpanEvents = spanEvents.getpSpanEvents(keyTime) if (pSpanEvents.length > 0) { pSpanEvents.forEach(pSpanEvent => pSpanChunk.addSpanevent(pSpanEvent)) } - + pSpanMessage.setSpanchunk(pSpanChunk) return pSpanMessage } @@ -66,7 +66,7 @@ class SpanChunk { get keyTime() { const minStartTimeSpanEvent = this.spanEventList.reduce((minStartTimeSpanEvent, currentSpanEvent) => minStartTimeSpanEvent.startTime < currentSpanEvent.startTime ? minStartTimeSpanEvent : currentSpanEvent) if (!minStartTimeSpanEvent) { - return 0; + return 0 } return minStartTimeSpanEvent.startTime } diff --git a/lib/context/span-event-recorder.js b/lib/context/span-event-recorder.js index b76adf57..a4c2aeae 100644 --- a/lib/context/span-event-recorder.js +++ b/lib/context/span-event-recorder.js @@ -6,15 +6,17 @@ 'use strict' -const Annotation = require('./annotation') -const ServiceType = require('./service-type') -const DefaultAnnotationKey = require('../constant/annotation-key').DefaultAnnotationKey +const annotationKey = require('../constant/annotation-key') const StringMetaService = require('./string-meta-service') const AsyncId = require('./async-id') -const asyncIdGenerator = require('./sequence-generator').asyncIdGenerator -const dummyIdGenerator = require('./sequence-generator').dummyIdGenerator -const { addressStringOf } = require('../utils/convert-utils') - +const asyncIdGenerator = require('./sequence-generators').asyncIdGenerator +const AnnotationKeyUtils = require('./annotation-key-utils') +const log = require('../utils/logger') +const sqlMetaDataService = require('../instrumentation/sql/sql-metadata-service') +const Annotations = require('../instrumentation/context/annotation/annotations') +const IntStringStringValue = require('../instrumentation/context/annotation/int-string-string-value') + +// https://github.com/pinpoint-apm/pinpoint/blob/master/bootstraps/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/context/SpanEventRecorder.java class SpanEventRecorder { constructor(spanEvent, span) { this.spanEvent = spanEvent @@ -27,11 +29,17 @@ class SpanEventRecorder { this.spanEvent.startTime = startTime } - recordServiceType(code, ...properties) { - if (this.spanEvent && code) { - // this.spanEvent.serviceType = new ServiceType(code, properties) - this.spanEvent.serviceType = code + recordServiceType(type) { + if (!this.spanEvent) { + return + } + if (!type) { + return + } + if (typeof type.code !== 'number') { + return } + this.spanEvent.serviceType = type.getCode() } recordDestinationId(id) { @@ -52,11 +60,6 @@ class SpanEventRecorder { } } - recordDummyChaining() { - this.spanEvent.nextDummyId = dummyIdGenerator.next - return this.spanEvent.nextDummyId - } - recordNextAsyncId() { let asyncId if (this.spanEvent.nextAsyncId === null) { @@ -69,35 +72,64 @@ class SpanEventRecorder { } recordApiId(apiId) { - if (this.spanEvent && apiId !== undefined) { - this.spanEvent.apiId = apiId + this.setApiId0(apiId) + } + + setApiId0(apiId) { + if (this.spanEvent && typeof apiId === 'number') { + this.spanEvent.setApiId(apiId) + } + } + + // https://github.com/pinpoint-apm/pinpoint/blob/master/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/recorder/AbstractRecorder.java#L70 + recordApi(methodDescriptor, args) { + if (!methodDescriptor) { + return + } + + if (typeof methodDescriptor.getApiId !== 'function') { + return + } + + if (methodDescriptor.getApiId() == 0) { + this.recordAttribute(annotationKey.API, methodDescriptor.getFullName()) } + + this.setApiId0(methodDescriptor.getApiId()) + + if (args && typeof args.length === 'number') { + this.recordArgs(args) + } + } + + recordApiWithParameters(methodDescriptor, parameters) { + this.recordApi(methodDescriptor) + this.recordArgs(parameters) } - recordApi(methodDescriptor) { - if (this.spanEvent && methodDescriptor) { - if (methodDescriptor.apiId === 0) { - this.recordAttribute(DefaultAnnotationKey.API, methodDescriptor.fullName) - this.recordApiId(0) - } else { - this.recordApiId(methodDescriptor.apiId) + recordArgs(parameters) { + if (!parameters || typeof parameters.length !== 'number') { + return + } + + const max = Math.min(parameters.length, annotationKey.MAX_ARGS_SIZE) + try { + for (let index = 0; index < max; index++) { + let value = parameters[index] + this.recordAttribute(AnnotationKeyUtils.getArgs(index), value) } + } catch (error) { + log.error(`recordArgs error ${error}`) } } recordApiDesc(desc) { if (this.spanEvent && desc) { - this.recordAttribute(DefaultAnnotationKey.API, desc) + this.recordAttribute(annotationKey.API, desc) this.recordApiId(0) } } - recordHTTPURL(url) { - if (this.spanEvent && url) { - this.recordAttribute(DefaultAnnotationKey.HTTP_URL, url) - } - } - recordApiArguments(key, desc, valueType) { if (this.spanEvent && desc) { this.recordAttribute(key, desc, valueType) @@ -106,17 +138,19 @@ class SpanEventRecorder { } recordAttribute(key, value, valueType) { - if (this.spanEvent && key && value) { - this.spanEvent.annotations.push(new Annotation(key, value, valueType)) + if (this.spanEvent && key && typeof key.getCode === 'function' && value) { + this.spanEvent.addAnnotation(Annotations.of(key.getCode(), value, valueType)) } } + // https://github.com/pinpoint-apm/pinpoint/blob/74f3066423fc36b21c0f4c806f9d42d6d236665c/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/recorder/AbstractRecorder.java#L55 recordException(error, isError) { if (this.spanEvent && error) { const metaInfo = StringMetaService.get(error.name || 'Error') + const errorMessage = error && typeof error.stack === 'string' ? error.stack.split(/\r?\n/, 2).join('') : '' this.spanEvent.exceptionInfo = { intValue: metaInfo.stringId, - stringValue: error.toString(), + stringValue: errorMessage, } if (this.span && isError) { this.span.err = 1 @@ -125,6 +159,33 @@ class SpanEventRecorder { } } + recordSqlInfo(sql, bindString) { + if (typeof sql !== 'string' || this.spanEvent === null) { + return + } + + const parsingResult = sqlMetaDataService.cacheSql(sql) + this.recordSqlParsingResult(parsingResult, bindString) + return parsingResult + } + + recordSqlParsingResult(parsingResult, bindString) { + if (!parsingResult) { + return + } + + if (typeof bindString !== 'string') { + bindString = null + } + + this.recordSqlParam(new IntStringStringValue(parsingResult.getId(), parsingResult.getOutput(), bindString)) + } + + recordSqlParam(intStringStringValue) { + const annotation = Annotations.of(annotationKey.SQL_ID.getCode(), intStringStringValue) + this.spanEvent.addAnnotation(annotation) + } + recordEnd() { this.ended = true } diff --git a/lib/context/span-event.js b/lib/context/span-event.js index 5f15a829..81224747 100644 --- a/lib/context/span-event.js +++ b/lib/context/span-event.js @@ -45,6 +45,15 @@ class SpanEvent { isValid() { return this.sequence > -1 && this.spanId && this.serviceType } + + addAnnotation(annotation) { + this.annotations.push(annotation) + } + + setApiId(apiId) { + this.apiId = apiId + } + } module.exports = SpanEvent \ No newline at end of file diff --git a/lib/context/span-events.js b/lib/context/span-events.js index 41abc61c..45d0d434 100644 --- a/lib/context/span-events.js +++ b/lib/context/span-events.js @@ -6,8 +6,8 @@ 'use strict' -const {convertIntStringValue, convertNextEvent, addAnnotations} = require('../data/grpc-data-convertor') -const spanMessages = require('../data/grpc/Span_pb') +const { convertIntStringValue, convertNextEvent, addAnnotations } = require('../data/grpc-data-convertor') +const spanMessages = require('../data/v1/Span_pb') class SpanEvents { constructor(spanEvents) { diff --git a/lib/context/span-recorder.js b/lib/context/span-recorder.js index 56bd5f61..7a8cecc0 100644 --- a/lib/context/span-recorder.js +++ b/lib/context/span-recorder.js @@ -7,66 +7,70 @@ 'use strict' const Annotation = require('./annotation') -const ServiceType = require('./service-type') -const DefaultAnnotationKey = require('../constant/annotation-key').DefaultAnnotationKey +const StringMetaService = require('./string-meta-service') +const annotationKey = require('../constant/annotation-key') +const Annotations = require('../instrumentation/context/annotation/annotations') class SpanRecorder { - constructor (span) { + constructor(span) { this.span = span } - recordServiceType (code, ...properties) { + recordServiceType(code) { if (this.span && code) { - // this.span.serviceType = new ServiceType(code, properties) this.span.serviceType = code } } - recordApiId (apiId) { + recordApiId(apiId) { if (this.span && apiId) { this.span.apiId = apiId } } - recordApi (methodDescriptor) { - if (this.span && methodDescriptor) { - if (methodDescriptor.apiId === 0) { - this.recordAttribute(DefaultAnnotationKey.API, methodDescriptor.fullName) - this.recordApiId(0) - } else { - this.recordApiId(methodDescriptor.apiId) - } + recordApi(methodDescriptor) { + if (!methodDescriptor || typeof methodDescriptor.getApiId !== 'function' || typeof methodDescriptor.getFullName !== 'function') { + return + } + + if (methodDescriptor.getApiId() === 0) { + this.recordAttribute(annotationKey.API, methodDescriptor.getFullName()) + } else { + this.setApiId0(methodDescriptor.getApiId()) } } + setApiId0(apiId) { + this.span.setApiId(apiId) + } - recordAttribute (key, value) { - if (this.span && key && value) { - this.span.annotations.push(new Annotation(key, value)) + recordAttribute(key, value) { + if (this.span && key && typeof key.getCode === 'function' && value) { + this.span.annotations.push(Annotations.of(key.getCode(), value)) } } - recordRpc (rpc) { + recordRpc(rpc) { if (this.span && rpc) { (this.span.rpc = rpc) } } - recordEndPoint (endPoint) { + recordEndPoint(endPoint) { if (this.span && endPoint) { this.span.endPoint = endPoint } } - recordRemoteAddr (remoteAddr) { + recordRemoteAddr(remoteAddr) { if (this.span && remoteAddr) { (this.span.remoteAddr = remoteAddr) } } - recordException (error) { + recordException(error) { if (this.span && error) { - const metaInfo = StringMetaCache.get(error.name || 'Error') + const metaInfo = StringMetaService.get(error.name || 'Error') this.span.exceptionInfo = { intValue: metaInfo.stringId, stringValue: error.toString() @@ -75,7 +79,7 @@ class SpanRecorder { } } - recordSpanEvent (spanEvent) { + recordSpanEvent(spanEvent) { if (this.span && spanEvent) { this.span.spanEventList.push(spanEvent) } diff --git a/lib/context/span.js b/lib/context/span.js index e7565cb3..a7fe57da 100644 --- a/lib/context/span.js +++ b/lib/context/span.js @@ -6,12 +6,12 @@ 'use strict' -const {convertTransactionId, convertAcceptEvent, convertIntStringValue, addAnnotations} = require('../data/grpc-data-convertor') -const spanMessages = require('../data/grpc/Span_pb') +const { convertTransactionId, convertAcceptEvent, convertIntStringValue, addAnnotations } = require('../data/grpc-data-convertor') +const spanMessages = require('../data/v1/Span_pb') const SpanEvents = require('./span-events') class Span { - constructor (traceId, agentInfo, requestData = {}) { + constructor(traceId, agentInfo, requestData = {}) { if (!traceId || !agentInfo) { throw new Error('Can not initialize Span', traceId, agentInfo) } @@ -32,7 +32,7 @@ class Span { this.flag = traceId.flag this.err = null this.spanEventList = [] - this.apiId = null + this.apiId = 0 this.exceptionInfo = null this.applicationServiceType = agentInfo.serviceType // from config this.loggingTransactionInfo = null // ? @@ -42,27 +42,31 @@ class Span { this.parentApplicationType = requestData.parentApplicationType } - markElapsedTime () { + markElapsedTime() { if (this.startTime) { this.elapsedTime = Date.now() - this.startTime } } - get elapsed () { + get elapsed() { return this.elapsedTime } + setApiId(apiId) { + this.apiId = apiId + } + get spanMessage() { const pAcceptEvent = convertAcceptEvent(this) const pSpanMessage = new spanMessages.PSpanMessage() const pSpan = new spanMessages.PSpan() pSpan.setVersion(1) - + if (this.traceId) { const pTransactionId = convertTransactionId(this.traceId.transactionId) pSpan.setTransactionid(pTransactionId) } - + pSpan.setSpanid(this.spanId) pSpan.setParentspanid(this.parentSpanId) pSpan.setStarttime(this.startTime) @@ -75,14 +79,14 @@ class Span { pSpan.setExceptioninfo(convertIntStringValue(this.exceptionInfo)) pSpan.setApplicationservicetype(this.applicationServiceType) pSpan.setLoggingtransactioninfo(this.loggingTransactionInfo) - + const spanEvents = new SpanEvents(this.spanEventList) const pSpanEvents = spanEvents.getpSpanEvents(this.startTime) if (pSpanEvents.length > 0) { pSpanEvents.forEach(pSpanEvent => pSpan.addSpanevent(pSpanEvent)) } addAnnotations(pSpan, this.annotations) - + pSpanMessage.setSpan(pSpan) return pSpanMessage } diff --git a/lib/context/string-meta-service.js b/lib/context/string-meta-service.js index 6ef33914..cf8bdf76 100644 --- a/lib/context/string-meta-service.js +++ b/lib/context/string-meta-service.js @@ -6,7 +6,7 @@ 'use strict' -const stringMetaCacheKeyGenerator = require('../context/sequence-generator').stringMetaCacheKeyGenerator +const stringMetaCacheKeyGenerator = require('../context/sequence-generators').stringMetaCacheKeyGenerator const SimpleCache = require('../utils/simple-cache') const StringMetaInfo = require('../data/dto/string-meta-info') const log = require('../utils/logger') diff --git a/lib/context/trace-context.js b/lib/context/trace-context.js index 7d6eb880..129fa87d 100644 --- a/lib/context/trace-context.js +++ b/lib/context/trace-context.js @@ -17,12 +17,20 @@ const sampler = require('../sampler/sampler') const DisableTrace = require('./disable-trace') class TraceContext { - constructor () { + constructor() { this.agentInfo = null this.dataSender = null } - static init (options, dataSender, config) { + /** + * trace context singleton instance + * @param {string} options + * @param {string} dataSender + * @param {string} config + * @returns {TraceContext} + * @constructor + */ + static init(options, dataSender, config) { if (!options.agentId || !options.applicationName) { throw new Error('Fail to initialize pinpoint context') } @@ -31,10 +39,10 @@ class TraceContext { const instance = new TraceContext() instance.agentInfo = { - agentId : options.agentId, - applicationName : options.applicationName, - agentStartTime : options.agentStartTime, - serviceType : options.serviceType, + agentId: options.agentId, + applicationName: options.applicationName, + agentStartTime: options.agentStartTime, + serviceType: options.serviceType, } instance.dataSender = dataSender if (config) { @@ -45,26 +53,26 @@ class TraceContext { return instance } - continueTraceObject (requestData) { + continueTraceObject(requestData) { const traceId = new TraceId( - requestData.transactionId, - requestData.spanId, - requestData.parentSpanId, - requestData.flag) - + requestData.transactionId, + requestData.spanId, + requestData.parentSpanId, + requestData.flag) + return this.createTraceObject(traceId, requestData.sampled, requestData) } - newTraceObject (sampling) { + newTraceObject(sampling) { const transactionId = new TransactionId(this.agentInfo.agentId, - this.agentInfo.agentStartTime.toString()) + this.agentInfo.agentStartTime.toString()) const spanId = IdGenerator.next const traceId = new TraceId(transactionId, spanId.toString()) return this.createTraceObject(traceId, sampling) } // https://github.com/pinpoint-apm/pinpoint/blob/a113e527e73add4e848de9173923b01e06b3cca1/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/request/ServletRequestListener.java#L117 - createTraceObject (traceId, sampling, requestData) { + createTraceObject(traceId, sampling, requestData) { if (traceId == null || this.agentInfo == null) { return null } @@ -72,7 +80,7 @@ class TraceContext { if (false == sampling) { const disableTrace = new DisableTrace(traceId, this.agentInfo, requestData) this.setCurrentTraceObject(disableTrace) - return disableTrace; + return disableTrace } try { @@ -85,7 +93,7 @@ class TraceContext { } } - completeTraceObject (trace) { + completeTraceObject(trace) { if (!trace || !trace.spanRecorder || !trace.span) { return } @@ -98,11 +106,11 @@ class TraceContext { } } - currentTraceObject () { + currentTraceObject() { return contextManager.getObject() } - setCurrentTraceObject (traceObject) { + setCurrentTraceObject(traceObject) { contextManager.setObject(traceObject) } @@ -127,12 +135,9 @@ class TraceContext { } // only test - getAllTraceObject () { + getAllTraceObject() { return contextManager.getAllObject() } } -module.exports = { - init: TraceContext.init -} - +module.exports = TraceContext diff --git a/lib/context/trace.js b/lib/context/trace.js index ff948f18..7cae3bbb 100644 --- a/lib/context/trace.js +++ b/lib/context/trace.js @@ -14,6 +14,10 @@ const AsyncTrace = require('./async-trace') const BufferedStorage = require('./buffered-storage') const SpanChunk = require('./span-chunk') const log = require('../utils/logger') +const defaultPredefinedMethodDescriptorRegistry = require('../constant/default-predefined-method-descriptor-registry') +const DisableAsyncTrace = require('./disable-async-trace') +const ServiceType = require('../context/service-type') +const calledTraceBlockEnd = Symbol('called-traceBlockEnd') class Trace { constructor(traceId, agentInfo, dataSender, sampling, requestData) { @@ -50,13 +54,17 @@ class Trace { traceBlockEnd(spanEventRecorder) { if (!spanEventRecorder || this.callStack.length < 1) { - return null + return + } + + if (spanEventRecorder[calledTraceBlockEnd]) { + return } const index = this.callStack.findIndex(item => item === spanEventRecorder.spanEvent) if (index < 0) { log.error('SpanEvent does not exists in call-stack', spanEventRecorder.spanEvent) - return null + return } spanEventRecorder.error && delete spanEventRecorder.error._pinpointCheck @@ -70,45 +78,38 @@ class Trace { this.completeSpanEvent(spanEvent[0]) } } + + spanEventRecorder[calledTraceBlockEnd] = true } completeSpanEvent(spanEvent) { if (spanEvent && spanEvent.isValid()) { spanEvent.markElapsedTime() this.storage.storeSpanEvent(spanEvent) - // this.spanRecorder.recordSpanEvent(spanEvent) } } newAsyncTrace(spanEventRecorder) { - if (spanEventRecorder) { - const asyncId = spanEventRecorder.recordNextAsyncId() - return new AsyncTrace(this.span, asyncId, this.traceId, this.agentInfo, this.dataSender, this.sampling) + if (!spanEventRecorder || typeof spanEventRecorder.recordNextAsyncId !== 'function') { + return new DisableAsyncTrace() } + const asyncId = spanEventRecorder.recordNextAsyncId() + return this.newAsyncTraceWithId(asyncId) } newAsyncTraceWithId(asyncId) { - if (asyncId) { - return new AsyncTrace(this.span, asyncId, this.traceId, this.agentInfo, this.dataSender, this.sampling) + if (!asyncId) { + return new DisableAsyncTrace() } - } - - traceCallbackBegin(dummyId) { - const spanEvent = new SpanEvent(this.span, 0) - spanEvent.dummyId = dummyId - spanEvent.startTime = Date.now() - spanEvent.startElapsed = spanEvent.startTime - this.span.startTime - - this.spanEventRecorder = new SpanEventRecorder(spanEvent, this.span) - return this.spanEventRecorder - } - - traceCallbackEnd(spanEventRecorder) { - if (!spanEventRecorder || !spanEventRecorder.spanEvent) return - // this.spanRecorder.recordSpanEvent(spanEventRecorder.spanEvent) - this.storage.storeSpanEvent(spanEventRecorder.spanEvent) - spanEventRecorder.spanEvent.markElapsedTime() - spanEventRecorder.recordEnd() + + const asyncTrace = new AsyncTrace(this.span, asyncId, this.traceId, this.agentInfo, this.dataSender, this.sampling) + const spanEventRecorder = asyncTrace.traceAsyncBegin() + spanEventRecorder.recordServiceType(ServiceType.async) + spanEventRecorder.recordApiId(defaultPredefinedMethodDescriptorRegistry.asyncInvocationMethodDescriptor.getApiId()) + spanEventRecorder.spanEvent.endPoint = null + spanEventRecorder.spanEvent.destinationId = null + asyncTrace.storage.storeSpanEvent(spanEventRecorder.spanEvent) + return asyncTrace } canSampled() { @@ -122,6 +123,10 @@ class Trace { close() { this.storage.storeSpan(this.span) } + + completed() { + return this.spanRecorder && this.spanRecorder.span && typeof this.spanRecorder.span.elapsed === 'number' + } } module.exports = Trace \ No newline at end of file diff --git a/lib/context/transaction-id.js b/lib/context/transaction-id.js index 917193b0..8fa78740 100644 --- a/lib/context/transaction-id.js +++ b/lib/context/transaction-id.js @@ -6,7 +6,7 @@ 'use strict' -const transactionIdGenerator = require('./sequence-generator').transactionIdGenerator +const transactionIdGenerator = require('./sequence-generators').transactionIdGenerator const DELIMETER = '^' diff --git a/lib/data/dto/api-meta-info.js b/lib/data/dto/api-meta-info.js index 14814b38..d5cd0336 100644 --- a/lib/data/dto/api-meta-info.js +++ b/lib/data/dto/api-meta-info.js @@ -7,18 +7,46 @@ 'use strict' class ApiMetaInfo { - constructor(initData = {}) { - this.apiId = initData.apiId - this.apiInfo = initData.apiInfo - this.type = initData.type + constructor(apiId, apiInfo, type) { + this.apiId = apiId + this.apiInfo = apiInfo + this.type = type } static create(methodDescriptor) { - return new ApiMetaInfo({ - apiId: methodDescriptor.apiId, - apiInfo: methodDescriptor.apiDescriptor, - type: methodDescriptor.type, - }) + const builder = new ApiMetaDataBuilder(methodDescriptor.getApiId(), methodDescriptor.getApiDescriptor(), methodDescriptor.getType()) + if (methodDescriptor.getLineNumber && typeof methodDescriptor.getLineNumber() === 'number') { + builder.setLineNumber(methodDescriptor.getLineNumber()) + } + if (methodDescriptor.getLocation && typeof methodDescriptor.getLocation() === 'string') { + builder.setLocation(methodDescriptor.getLocation()) + } + return builder.build() + } +} + +class ApiMetaDataBuilder { + constructor(apiId, apiInfo, type) { + this.apiId = apiId + this.apiInfo = apiInfo + this.type = type + } + + setLineNumber(lineNumber) { + this.lineNumber = lineNumber + return this + } + + setLocation(location) { + this.location = location + return this + } + + build() { + const apiMetaData = new ApiMetaInfo(this.apiId, this.apiInfo, this.type) + apiMetaData.lineNumber = this.lineNumber + apiMetaData.location = this.location + return apiMetaData } } diff --git a/lib/data/grpc-data-convertor.js b/lib/data/grpc-data-convertor.js index aa33bf5e..ad134a2f 100644 --- a/lib/data/grpc-data-convertor.js +++ b/lib/data/grpc-data-convertor.js @@ -6,10 +6,10 @@ 'use strict' -const statMessages = require('./grpc/Stat_pb') -const spanMessages = require('./grpc/Span_pb') -const annotationMessages = require('./grpc/Annotation_pb') -const cmdMessages = require('./grpc/Cmd_pb') +const statMessages = require('./v1/Stat_pb') +const spanMessages = require('./v1/Span_pb') +const annotationMessages = require('./v1/Annotation_pb') +const cmdMessages = require('./v1/Cmd_pb') const wrappers = require('google-protobuf/google/protobuf/wrappers_pb') const convertAgentInfo = (agentInfo) => { @@ -36,7 +36,14 @@ const convertApiMetaInfo = (apiMetaInfo) => { pApiMetaData.setApiid(apiMetaInfo.apiId) pApiMetaData.setApiinfo(apiMetaInfo.apiInfo) pApiMetaData.setType(apiMetaInfo.type) - pApiMetaData.setLine(-1) + if (apiMetaInfo.lineNumber && typeof apiMetaInfo.lineNumber === 'number') { + pApiMetaData.setLine(apiMetaInfo.lineNumber) + } else { + pApiMetaData.setLine(-1) + } + if (apiMetaInfo.location && typeof apiMetaInfo.location === 'string') { + pApiMetaData.setLocation(apiMetaInfo.location) + } return pApiMetaData } @@ -93,7 +100,7 @@ const convertTransactionId = (transactionId) => { pTransactionId.setAgentid(transactionId.agentId) pTransactionId.setAgentstarttime(transactionId.agentStartTime) pTransactionId.setSequence(transactionId.sequence) -return pTransactionId + return pTransactionId } const convertParentInfo = (span) => { @@ -166,18 +173,21 @@ const convertMessageEvent = (spanEvent) => { const addAnnotations = (target, annotations) => { if (annotations && annotations.length > 0) { - annotations.forEach(annotation => target.addAnnotation(convertAnnotation(annotation))) + annotations.forEach(annotation => { + const pAnnotation = convertAnnotation(annotation) + if (pAnnotation) { + target.addAnnotation(pAnnotation) + } + }) } } const convertAnnotation = (annotation) => { - if (!annotation) { + if (!annotation || typeof annotation.pAnnotation !== 'function') { return null } - const pAnnotation = new annotationMessages.PAnnotation() - pAnnotation.setKey(annotation.key) - pAnnotation.setValue(convertAnnotationValue(annotation.value)) - return pAnnotation + + return annotation.pAnnotation() } const convertAnnotationValue = (typedValue) => { @@ -192,11 +202,11 @@ const convertStringStringValue = (value) => { return null } const pStringStringValue = new annotationMessages.PStringStringValue() - + const stringValue1 = new wrappers.StringValue() stringValue1.setValue(value.stringValue1) pStringStringValue.setStringvalue1(stringValue1) - + const stringValue2 = new wrappers.StringValue() stringValue2.setValue(value.stringValue2) pStringStringValue.setStringvalue2(stringValue2) @@ -222,8 +232,8 @@ const convertLocalAsyncId = (localAsyncId) => { } const pLocalAsyncId = new spanMessages.PLocalAsyncId() - pLocalAsyncId.setAsyncid(localAsyncId.asyncId) - pLocalAsyncId.setSequence(localAsyncId.nextAsyncSequence) + pLocalAsyncId.setAsyncid(localAsyncId.getAsyncId()) + pLocalAsyncId.setSequence(localAsyncId.getSequence()) return pLocalAsyncId } @@ -245,11 +255,11 @@ const convertStat = (stat) => { return null } const pStatMessage = new statMessages.PStatMessage() - + const pAgentStat = new statMessages.PAgentStat() pAgentStat.setTimestamp(stat.timestamp) pAgentStat.setCollectinterval(stat.collectInterval) - + const pCpuLoad = new statMessages.PCpuLoad() pCpuLoad.setJvmcpuload(stat.cpu.user) pCpuLoad.setSystemcpuload(stat.cpu.system) @@ -270,7 +280,7 @@ const convertStat = (stat) => { const count = stat.activeTrace.fastCount + stat.activeTrace.normalCount + stat.activeTrace.slowCount + stat.activeTrace.verySlowCount pActiveTraceHistogram.addActivetracecount(count) - + pActiveTrace.setHistogram(pActiveTraceHistogram) } diff --git a/lib/data/grpc/spec/Annotation.proto b/lib/data/grpc/spec/Annotation.proto deleted file mode 100644 index ed1245c8..00000000 --- a/lib/data/grpc/spec/Annotation.proto +++ /dev/null @@ -1,60 +0,0 @@ -syntax = "proto3"; - -import "google/protobuf/wrappers.proto"; - -message PIntStringValue { - int32 intValue = 1; - google.protobuf.StringValue stringValue = 2; -} - -message PIntStringStringValue { - int32 intValue = 1; - google.protobuf.StringValue stringValue1 = 2; - google.protobuf.StringValue stringValue2 = 3; -} - -message PLongIntIntByteByteStringValue { - int64 longValue = 1; - int32 intValue1 = 2; - int32 intValue2 = 3; - sint32 byteValue1 = 4; - sint32 byteValue2 = 5; - google.protobuf.StringValue stringValue = 6; -} - -message PIntBooleanIntBooleanValue { - int32 intValue1 = 1; - bool boolValue1 = 2; - int32 intValue2 = 3; - bool boolValue2 = 4; -} - -message PStringStringValue { - google.protobuf.StringValue stringValue1 = 1; - google.protobuf.StringValue stringValue2 = 2; -} - -message PAnnotationValue { - oneof field { - string stringValue = 1; - bool boolValue = 2; - int32 intValue = 3; - int64 longValue = 4; - // for compatibility - sint32 shortValue = 5; - double doubleValue = 6; - bytes binaryValue = 7; - // for compatibility - sint32 byteValue = 8; - PIntStringValue intStringValue = 9; - PStringStringValue stringStringValue = 10; - PIntStringStringValue intStringStringValue = 11; - PLongIntIntByteByteStringValue longIntIntByteByteStringValue = 12; - PIntBooleanIntBooleanValue intBooleanIntBooleanValue = 13; - } -} - -message PAnnotation { - int32 key = 1; - PAnnotationValue value = 2; -} \ No newline at end of file diff --git a/lib/data/grpc/spec/Cmd.proto b/lib/data/grpc/spec/Cmd.proto deleted file mode 100644 index 26bac21d..00000000 --- a/lib/data/grpc/spec/Cmd.proto +++ /dev/null @@ -1,101 +0,0 @@ -syntax = "proto3"; - -import "google/protobuf/wrappers.proto"; -import "ThreadDump.proto"; - -package v1; - -enum PCommandType { - NONE = 0; - - PING = 100; - PONG = 101; - - ECHO = 710; - - ACTIVE_THREAD_COUNT = 730; - ACTIVE_THREAD_DUMP = 740; - ACTIVE_THREAD_LIGHT_DUMP = 750; -} - -message PCmdMessage { - oneof message { - PCmdServiceHandshake handshakeMessage = 1; - PCmdResponse failMessage = 2; - } -} - -message PCmdServiceHandshake { - // initial message - repeated int32 supportCommandServiceKey = 1; -} - -message PCmdResponse { - int32 responseId = 1; - int32 status = 2; - google.protobuf.StringValue message = 3; -} - -message PCmdStreamResponse { - int32 responseId = 1; - int32 sequenceId = 2; - google.protobuf.StringValue message = 3; -} - -message PCmdRequest { - int32 requestId = 1; - - oneof command { - PCmdEcho commandEcho = 710; - PCmdActiveThreadCount commandActiveThreadCount = 730; - PCmdActiveThreadDump commandActiveThreadDump = 740; - PCmdActiveThreadLightDump commandActiveThreadLightDump = 750; - } -} - -message PCmdEcho { - string message = 1; -} - -message PCmdEchoResponse { - PCmdResponse commonResponse = 1; - string message = 2; -} - -message PCmdActiveThreadDump { - int32 limit = 1; - repeated string threadName = 2; - repeated int64 localTraceId = 3; -} - -message PCmdActiveThreadDumpRes { - PCmdResponse commonResponse = 1; - repeated PActiveThreadDump threadDump = 2; - string type = 3; - string subType = 4; - string version = 5; -} - -message PCmdActiveThreadLightDump { - int32 limit = 1; - repeated string threadName = 2; - repeated int64 localTraceId = 3; -} - -message PCmdActiveThreadLightDumpRes { - PCmdResponse commonResponse = 1; - repeated PActiveThreadLightDump threadDump = 2; - string type = 3; - string subType = 4; - string version = 5; -} - -message PCmdActiveThreadCount { -} - -message PCmdActiveThreadCountRes { - PCmdStreamResponse commonStreamResponse = 1; - int32 histogramSchemaType = 2; - repeated int32 activeThreadCount = 3; - int64 timeStamp = 4; -} \ No newline at end of file diff --git a/lib/data/grpc/spec/README.md b/lib/data/grpc/spec/README.md deleted file mode 100644 index 91bec6db..00000000 --- a/lib/data/grpc/spec/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# script -https://github.com/grpc/grpc/tree/v1.32.0/examples/node/static_codegen -``` -$ export PATH="$PATH:$(npm bin -g)" - -$ grpc_tools_node_protoc --version -libprotoc 3.14.0 - -$ grpc_tools_node_protoc --js_out=import_style=commonjs,binary:../ --grpc_out=grpc_js:../ --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` Span.proto -$ grpc_tools_node_protoc --js_out=import_style=commonjs,binary:../ --grpc_out=grpc_js:../ --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` Service.proto -$ grpc_tools_node_protoc --js_out=import_style=commonjs,binary:../ --grpc_out=grpc_js:../ --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` Cmd.proto -$ grpc_tools_node_protoc --js_out=import_style=commonjs,binary:../ --grpc_out=grpc_js:../ --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` Annotation.proto -$ grpc_tools_node_protoc --js_out=import_style=commonjs,binary:../ --grpc_out=grpc_js:../ --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` Stat.proto -$ grpc_tools_node_protoc --js_out=import_style=commonjs,binary:../ --grpc_out=grpc_js:../ --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` ThreadDump.proto -``` \ No newline at end of file diff --git a/lib/data/grpc/spec/Service.proto b/lib/data/grpc/spec/Service.proto deleted file mode 100644 index 4c90e211..00000000 --- a/lib/data/grpc/spec/Service.proto +++ /dev/null @@ -1,52 +0,0 @@ -syntax = "proto3"; - -import "google/protobuf/empty.proto"; -import "Span.proto"; -import "Stat.proto"; -import "ThreadDump.proto"; -import "Cmd.proto"; - -package v1; - -service Span { - rpc SendSpan (stream PSpanMessage) returns (google.protobuf.Empty) { - } -} - -service Agent { - rpc RequestAgentInfo (PAgentInfo) returns (PResult) { - } - rpc PingSession (stream PPing) returns (stream PPing) { - } -} - -service Metadata { - rpc RequestSqlMetaData (PSqlMetaData) returns (PResult) { - } - rpc RequestApiMetaData (PApiMetaData) returns (PResult) { - } - rpc RequestStringMetaData (PStringMetaData) returns (PResult) { - } -} - -service Stat { - rpc SendAgentStat (stream PStatMessage) returns (google.protobuf.Empty) { - } -} - -service ProfilerCommandService { - rpc HandleCommand (stream PCmdMessage) returns (stream PCmdRequest) { - } - - rpc CommandEcho (PCmdEchoResponse) returns (google.protobuf.Empty) { - } - - rpc CommandStreamActiveThreadCount (stream PCmdActiveThreadCountRes) returns (google.protobuf.Empty) { - } - - rpc CommandActiveThreadDump (PCmdActiveThreadDumpRes) returns (google.protobuf.Empty) { - } - - rpc CommandActiveThreadLightDump (PCmdActiveThreadLightDumpRes) returns (google.protobuf.Empty) { - } -} \ No newline at end of file diff --git a/lib/data/grpc/spec/Span.proto b/lib/data/grpc/spec/Span.proto deleted file mode 100644 index 7f1944dd..00000000 --- a/lib/data/grpc/spec/Span.proto +++ /dev/null @@ -1,147 +0,0 @@ -syntax = "proto3"; - -import "google/protobuf/empty.proto"; -import "Annotation.proto"; - -package v1; - -message PSpanMessage { - oneof field { - PSpan span = 1; - PSpanChunk spanChunk =2; - } -} - -message PSpan { - int32 version = 1; - - PTransactionId transactionId = 2; - - sfixed64 spanId = 3 [jstype = JS_STRING]; - sfixed64 parentSpanId = 4 [jstype = JS_STRING]; - - // span event's startTimestamp - int64 startTime = 5; - int32 elapsed = 6; - int32 apiId = 7; - - int32 serviceType = 8; - - PAcceptEvent acceptEvent = 9; - - repeated PAnnotation annotation = 10; - - int32 flag = 11; - sint32 err = 12; - - repeated PSpanEvent spanEvent = 13; - - PIntStringValue exceptionInfo = 14; - - int32 applicationServiceType = 15; - int32 loggingTransactionInfo = 16; -} - -message PTransactionId { - // identical to agentId if null - string agentId = 1; //nullable - int64 agentStartTime = 2 [jstype = JS_STRING]; - int64 sequence = 3 [jstype = JS_STRING]; -} - -message PAcceptEvent { - string rpc = 1; - string endPoint = 2; - string remoteAddr = 3; - PParentInfo parentInfo = 4; -} - -message PParentInfo { - string parentApplicationName = 1; - int32 parentApplicationType = 2; - string acceptorHost = 3; -} - -message PLocalAsyncId { - int32 asyncId = 1; - int32 sequence = 2; -} - - -message PSpanEvent { - int32 sequence = 1; - int32 depth = 2; - - int32 startElapsed = 3; - int32 endElapsed = 4; - - sint32 serviceType = 5; - - repeated PAnnotation annotation = 6; - - sint32 apiId = 10; - PIntStringValue exceptionInfo = 11; - - PNextEvent nextEvent = 12; - int32 asyncEvent = 13; -} - -message PNextEvent { - oneof field { - PMessageEvent messageEvent = 1; - } -} - -message PMessageEvent { - sfixed64 nextSpanId = 1; - string endPoint = 2; - string destinationId = 3; -} - -message PSpanChunk { - int32 version = 1; - - PTransactionId transactionId = 2; - - sfixed64 spanId = 3 [jstype = JS_STRING]; - - string endPoint = 4; - - repeated PSpanEvent spanEvent = 5; - - int32 applicationServiceType = 6; - - int64 keyTime = 7; - - PLocalAsyncId localAsyncId = 8; - -} - -// 1.6.x- : version = 0; -// 1.7.x+ : version = 1; -//const i8 TRACE_V1 = 0; -//const i8 TRACE_V2 = 1; -// - - -message PResult { - bool success = 1; - string message = 2; -} - -message PSqlMetaData { - int32 sqlId = 1; - string sql = 2; -} - -message PApiMetaData { - int32 apiId = 1; - string apiInfo = 2; - int32 line = 3; - int32 type = 4; -} - -message PStringMetaData { - int32 stringId = 1; - string stringValue = 2; -} \ No newline at end of file diff --git a/lib/data/grpc/spec/Stat.proto b/lib/data/grpc/spec/Stat.proto deleted file mode 100644 index 6621dec8..00000000 --- a/lib/data/grpc/spec/Stat.proto +++ /dev/null @@ -1,155 +0,0 @@ -syntax = "proto3"; - -import "google/protobuf/empty.proto"; -import "ThreadDump.proto"; - -package v1; - -message PPing { -} - -message PStatMessage { - oneof field { - PAgentStat agentStat = 1; - PAgentStatBatch agentStatBatch = 2; - } -} - -message PAgentInfo { - string hostname = 1; - string ip = 2; - string ports = 3; - int32 serviceType = 4; - int32 pid = 5; - string agentVersion = 6; - string vmVersion = 7; - int64 endTimestamp = 8; - int32 endStatus = 9; - PServerMetaData serverMetaData = 10; - PJvmInfo jvmInfo = 11; - bool container = 12; -} - -message PServerMetaData { - string serverInfo = 1; - repeated string vmArg = 2; - repeated PServiceInfo serviceInfo = 3; -} - -message PServiceInfo { - string serviceName = 1; - repeated string serviceLib = 2; -} - -message PJvmInfo { - int32 version = 1; - string vmVersion = 2; - PJvmGcType gcType = 3; -} - -enum PJvmGcType { - JVM_GC_TYPE_UNKNOWN = 0; - JVM_GC_TYPE_SERIAL = 1; - JVM_GC_TYPE_PARALLEL = 2; - JVM_GC_TYPE_CMS = 3; - JVM_GC_TYPE_G1 = 4; -} - -message PAgentStat { - int64 timestamp = 1; - int64 collectInterval =2; - PJvmGc gc = 3; - PCpuLoad cpuLoad = 4; - PTransaction transaction = 5; - PActiveTrace activeTrace = 6; - PDataSourceList dataSourceList = 7; - PResponseTime responseTime = 8; - PDeadlock deadlock = 9; - PFileDescriptor fileDescriptor = 10; - PDirectBuffer directBuffer = 11; - string metadata = 12; -} - -message PAgentStatBatch { - repeated PAgentStat agentStat = 1; -} - -message PDataSource { - int32 id = 1; - int32 serviceTypeCode = 2; - string databaseName = 3; - string url = 4; - int32 activeConnectionSize = 5; - int32 maxConnectionSize = 6; -} - -message PDataSourceList { - repeated PDataSource dataSource = 1; -} - -message PFileDescriptor { - int64 openFileDescriptorCount = 1; -} - -message PJvmGc { - PJvmGcType type = 1; - int64 jvmMemoryHeapUsed = 2; - int64 jvmMemoryHeapMax = 3; - int64 jvmMemoryNonHeapUsed = 4; - int64 jvmMemoryNonHeapMax = 5; - int64 jvmGcOldCount = 6; - int64 jvmGcOldTime = 7; - PJvmGcDetailed jvmGcDetailed = 8; -} - -message PJvmGcDetailed { - int64 jvmGcNewCount = 1; - int64 jvmGcNewTime = 2; - double jvmPoolCodeCacheUsed = 3; - double jvmPoolNewGenUsed = 4; - double jvmPoolOldGenUsed = 5; - double jvmPoolSurvivorSpaceUsed = 6; - double jvmPoolPermGenUsed = 7; - double jvmPoolMetaspaceUsed = 8; -} - -message PCpuLoad { - double jvmCpuLoad = 1; - double systemCpuLoad = 2; -} - -message PTransaction { - int64 sampledNewCount = 2; - int64 sampledContinuationCount = 3; - int64 unsampledNewCount = 4; - int64 unsampledContinuationCount = 5; - int64 skippedNewCount = 6; - int64 skippedContinuationCount = 7; -} - -message PActiveTraceHistogram { - int32 version = 1; - int32 histogramSchemaType = 2; - repeated int32 activeTraceCount = 3; -} - -message PActiveTrace { - PActiveTraceHistogram histogram = 1; -} - -message PResponseTime { - int64 avg = 1; - int64 max = 2; -} - -message PDeadlock { - int32 count = 1; - repeated PThreadDump threadDump = 2; -} - -message PDirectBuffer { - int64 directCount = 1; - int64 directMemoryUsed = 2; - int64 mappedCount = 3; - int64 mappedMemoryUsed = 4; -} \ No newline at end of file diff --git a/lib/data/grpc/spec/ThreadDump.proto b/lib/data/grpc/spec/ThreadDump.proto deleted file mode 100644 index 91d18c19..00000000 --- a/lib/data/grpc/spec/ThreadDump.proto +++ /dev/null @@ -1,70 +0,0 @@ -syntax = "proto3"; - -import "google/protobuf/empty.proto"; -import "google/protobuf/wrappers.proto"; - -package v1; - -enum PThreadState { - THREAD_STATE_NEW = 0; - THREAD_STATE_RUNNABLE = 1; - THREAD_STATE_BLOCKED = 2; - THREAD_STATE_WAITING = 3; - THREAD_STATE_TIMED_WAITING = 4; - THREAD_STATE_TERMINATED = 5; - THREAD_STATE_UNKNOWN = 6; -} - -message PMonitorInfo { - int32 stackDepth = 1; - string stackFrame = 2; -} - -message PThreadDump { - string threadName = 1; - int64 threadId = 2; - int64 blockedTime = 3; - int64 blockedCount = 4; - int64 waitedTime = 5; - int64 waitedCount = 6; - string lockName = 7; - int64 lockOwnerId = 8; - string lockOwnerName = 9; - bool inNative = 10; - bool suspended = 11; - PThreadState threadState = 12; - repeated string stackTrace = 13; - repeated PMonitorInfo lockedMonitor = 14; - repeated string lockedSynchronizer = 15; -} - -message PThreadLightDump { - string threadName = 1; - int64 threadId = 2; - PThreadState threadState = 3; -} - -enum PThreadDumpType { - TARGET = 0; - PENDING = 1; -} - -message PActiveThreadDump { - int64 startTime = 1; - int64 localTraceId = 2; - PThreadDump threadDump = 3; - bool sampled = 4; - string transactionId = 5; - string entryPoint = 6; -} - -message PActiveThreadLightDump { - int64 startTime = 1; - int64 localTraceId = 2; - PThreadLightDump threadDump = 3; - bool sampled = 4; - string transactionId = 5; - string entryPoint = 6; -} - - diff --git a/lib/data/typed-value.js b/lib/data/typed-value.js index 92c5357b..09b95be3 100644 --- a/lib/data/typed-value.js +++ b/lib/data/typed-value.js @@ -7,33 +7,33 @@ 'use strict' const ValuedType = require('../constant/valued-type').ValuedType -const annotationMessages = require('./grpc/Annotation_pb') -const {convertStringStringValue} = require('./grpc-data-convertor') +const annotationMessages = require('./v1/Annotation_pb') +const { convertStringStringValue } = require('./grpc-data-convertor') class TypedValue { constructor(value, valuedType) { switch (typeof value) { case 'number': this.intValue = value - break; + break case 'boolean': this.boolValue = value - break; + break case 'string': this.stringValue = value - break; + break case 'object': if (valuedType === ValuedType.stringStringValue) { this.stringStringValue = value } - break; + break case 'undefined': this.stringValue = value - break; + break } } - static of (value) { + static of(value) { return new TypedValue(value) } diff --git a/lib/data/grpc/Annotation_grpc_pb.js b/lib/data/v1/Annotation_grpc_pb.js similarity index 100% rename from lib/data/grpc/Annotation_grpc_pb.js rename to lib/data/v1/Annotation_grpc_pb.js diff --git a/lib/data/grpc/Annotation_pb.js b/lib/data/v1/Annotation_pb.js similarity index 63% rename from lib/data/grpc/Annotation_pb.js rename to lib/data/v1/Annotation_pb.js index 1ef2d541..8e3f1b0d 100644 --- a/lib/data/grpc/Annotation_pb.js +++ b/lib/data/v1/Annotation_pb.js @@ -1,4 +1,4 @@ -// source: Annotation.proto +// source: v1/Annotation.proto /** * @fileoverview * @enhanceable @@ -16,14 +16,14 @@ var global = Function('return this')(); var google_protobuf_wrappers_pb = require('google-protobuf/google/protobuf/wrappers_pb.js'); goog.object.extend(proto, google_protobuf_wrappers_pb); -goog.exportSymbol('proto.PAnnotation', null, global); -goog.exportSymbol('proto.PAnnotationValue', null, global); -goog.exportSymbol('proto.PAnnotationValue.FieldCase', null, global); -goog.exportSymbol('proto.PIntBooleanIntBooleanValue', null, global); -goog.exportSymbol('proto.PIntStringStringValue', null, global); -goog.exportSymbol('proto.PIntStringValue', null, global); -goog.exportSymbol('proto.PLongIntIntByteByteStringValue', null, global); -goog.exportSymbol('proto.PStringStringValue', null, global); +goog.exportSymbol('proto.v1.PAnnotation', null, global); +goog.exportSymbol('proto.v1.PAnnotationValue', null, global); +goog.exportSymbol('proto.v1.PAnnotationValue.FieldCase', null, global); +goog.exportSymbol('proto.v1.PIntBooleanIntBooleanValue', null, global); +goog.exportSymbol('proto.v1.PIntStringStringValue', null, global); +goog.exportSymbol('proto.v1.PIntStringValue', null, global); +goog.exportSymbol('proto.v1.PLongIntIntByteByteStringValue', null, global); +goog.exportSymbol('proto.v1.PStringStringValue', null, global); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -34,16 +34,16 @@ goog.exportSymbol('proto.PStringStringValue', null, global); * @extends {jspb.Message} * @constructor */ -proto.PIntStringValue = function(opt_data) { +proto.v1.PIntStringValue = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.PIntStringValue, jspb.Message); +goog.inherits(proto.v1.PIntStringValue, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.PIntStringValue.displayName = 'proto.PIntStringValue'; + proto.v1.PIntStringValue.displayName = 'proto.v1.PIntStringValue'; } /** * Generated by JsPbCodeGenerator. @@ -55,16 +55,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.PIntStringStringValue = function(opt_data) { +proto.v1.PIntStringStringValue = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.PIntStringStringValue, jspb.Message); +goog.inherits(proto.v1.PIntStringStringValue, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.PIntStringStringValue.displayName = 'proto.PIntStringStringValue'; + proto.v1.PIntStringStringValue.displayName = 'proto.v1.PIntStringStringValue'; } /** * Generated by JsPbCodeGenerator. @@ -76,16 +76,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.PLongIntIntByteByteStringValue = function(opt_data) { +proto.v1.PLongIntIntByteByteStringValue = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.PLongIntIntByteByteStringValue, jspb.Message); +goog.inherits(proto.v1.PLongIntIntByteByteStringValue, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.PLongIntIntByteByteStringValue.displayName = 'proto.PLongIntIntByteByteStringValue'; + proto.v1.PLongIntIntByteByteStringValue.displayName = 'proto.v1.PLongIntIntByteByteStringValue'; } /** * Generated by JsPbCodeGenerator. @@ -97,16 +97,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.PIntBooleanIntBooleanValue = function(opt_data) { +proto.v1.PIntBooleanIntBooleanValue = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.PIntBooleanIntBooleanValue, jspb.Message); +goog.inherits(proto.v1.PIntBooleanIntBooleanValue, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.PIntBooleanIntBooleanValue.displayName = 'proto.PIntBooleanIntBooleanValue'; + proto.v1.PIntBooleanIntBooleanValue.displayName = 'proto.v1.PIntBooleanIntBooleanValue'; } /** * Generated by JsPbCodeGenerator. @@ -118,16 +118,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.PStringStringValue = function(opt_data) { +proto.v1.PStringStringValue = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.PStringStringValue, jspb.Message); +goog.inherits(proto.v1.PStringStringValue, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.PStringStringValue.displayName = 'proto.PStringStringValue'; + proto.v1.PStringStringValue.displayName = 'proto.v1.PStringStringValue'; } /** * Generated by JsPbCodeGenerator. @@ -139,16 +139,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.PAnnotationValue = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.PAnnotationValue.oneofGroups_); +proto.v1.PAnnotationValue = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.v1.PAnnotationValue.oneofGroups_); }; -goog.inherits(proto.PAnnotationValue, jspb.Message); +goog.inherits(proto.v1.PAnnotationValue, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.PAnnotationValue.displayName = 'proto.PAnnotationValue'; + proto.v1.PAnnotationValue.displayName = 'proto.v1.PAnnotationValue'; } /** * Generated by JsPbCodeGenerator. @@ -160,16 +160,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.PAnnotation = function(opt_data) { +proto.v1.PAnnotation = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.PAnnotation, jspb.Message); +goog.inherits(proto.v1.PAnnotation, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.PAnnotation.displayName = 'proto.PAnnotation'; + proto.v1.PAnnotation.displayName = 'proto.v1.PAnnotation'; } @@ -187,8 +187,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.PIntStringValue.prototype.toObject = function(opt_includeInstance) { - return proto.PIntStringValue.toObject(opt_includeInstance, this); +proto.v1.PIntStringValue.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PIntStringValue.toObject(opt_includeInstance, this); }; @@ -197,11 +197,11 @@ proto.PIntStringValue.prototype.toObject = function(opt_includeInstance) { * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.PIntStringValue} msg The msg instance to transform. + * @param {!proto.v1.PIntStringValue} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.PIntStringValue.toObject = function(includeInstance, msg) { +proto.v1.PIntStringValue.toObject = function(includeInstance, msg) { var f, obj = { intvalue: jspb.Message.getFieldWithDefault(msg, 1, 0), stringvalue: (f = msg.getStringvalue()) && google_protobuf_wrappers_pb.StringValue.toObject(includeInstance, f) @@ -218,23 +218,23 @@ proto.PIntStringValue.toObject = function(includeInstance, msg) { /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PIntStringValue} + * @return {!proto.v1.PIntStringValue} */ -proto.PIntStringValue.deserializeBinary = function(bytes) { +proto.v1.PIntStringValue.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PIntStringValue; - return proto.PIntStringValue.deserializeBinaryFromReader(msg, reader); + var msg = new proto.v1.PIntStringValue; + return proto.v1.PIntStringValue.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.PIntStringValue} msg The message object to deserialize into. + * @param {!proto.v1.PIntStringValue} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PIntStringValue} + * @return {!proto.v1.PIntStringValue} */ -proto.PIntStringValue.deserializeBinaryFromReader = function(msg, reader) { +proto.v1.PIntStringValue.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -263,9 +263,9 @@ proto.PIntStringValue.deserializeBinaryFromReader = function(msg, reader) { * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.PIntStringValue.prototype.serializeBinary = function() { +proto.v1.PIntStringValue.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.PIntStringValue.serializeBinaryToWriter(this, writer); + proto.v1.PIntStringValue.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -273,11 +273,11 @@ proto.PIntStringValue.prototype.serializeBinary = function() { /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.PIntStringValue} message + * @param {!proto.v1.PIntStringValue} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.PIntStringValue.serializeBinaryToWriter = function(message, writer) { +proto.v1.PIntStringValue.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getIntvalue(); if (f !== 0) { @@ -301,16 +301,16 @@ proto.PIntStringValue.serializeBinaryToWriter = function(message, writer) { * optional int32 intValue = 1; * @return {number} */ -proto.PIntStringValue.prototype.getIntvalue = function() { +proto.v1.PIntStringValue.prototype.getIntvalue = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.PIntStringValue} returns this + * @return {!proto.v1.PIntStringValue} returns this */ -proto.PIntStringValue.prototype.setIntvalue = function(value) { +proto.v1.PIntStringValue.prototype.setIntvalue = function(value) { return jspb.Message.setProto3IntField(this, 1, value); }; @@ -319,7 +319,7 @@ proto.PIntStringValue.prototype.setIntvalue = function(value) { * optional google.protobuf.StringValue stringValue = 2; * @return {?proto.google.protobuf.StringValue} */ -proto.PIntStringValue.prototype.getStringvalue = function() { +proto.v1.PIntStringValue.prototype.getStringvalue = function() { return /** @type{?proto.google.protobuf.StringValue} */ ( jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.StringValue, 2)); }; @@ -327,18 +327,18 @@ proto.PIntStringValue.prototype.getStringvalue = function() { /** * @param {?proto.google.protobuf.StringValue|undefined} value - * @return {!proto.PIntStringValue} returns this + * @return {!proto.v1.PIntStringValue} returns this */ -proto.PIntStringValue.prototype.setStringvalue = function(value) { +proto.v1.PIntStringValue.prototype.setStringvalue = function(value) { return jspb.Message.setWrapperField(this, 2, value); }; /** * Clears the message field making it undefined. - * @return {!proto.PIntStringValue} returns this + * @return {!proto.v1.PIntStringValue} returns this */ -proto.PIntStringValue.prototype.clearStringvalue = function() { +proto.v1.PIntStringValue.prototype.clearStringvalue = function() { return this.setStringvalue(undefined); }; @@ -347,7 +347,7 @@ proto.PIntStringValue.prototype.clearStringvalue = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PIntStringValue.prototype.hasStringvalue = function() { +proto.v1.PIntStringValue.prototype.hasStringvalue = function() { return jspb.Message.getField(this, 2) != null; }; @@ -368,8 +368,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.PIntStringStringValue.prototype.toObject = function(opt_includeInstance) { - return proto.PIntStringStringValue.toObject(opt_includeInstance, this); +proto.v1.PIntStringStringValue.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PIntStringStringValue.toObject(opt_includeInstance, this); }; @@ -378,11 +378,11 @@ proto.PIntStringStringValue.prototype.toObject = function(opt_includeInstance) { * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.PIntStringStringValue} msg The msg instance to transform. + * @param {!proto.v1.PIntStringStringValue} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.PIntStringStringValue.toObject = function(includeInstance, msg) { +proto.v1.PIntStringStringValue.toObject = function(includeInstance, msg) { var f, obj = { intvalue: jspb.Message.getFieldWithDefault(msg, 1, 0), stringvalue1: (f = msg.getStringvalue1()) && google_protobuf_wrappers_pb.StringValue.toObject(includeInstance, f), @@ -400,23 +400,23 @@ proto.PIntStringStringValue.toObject = function(includeInstance, msg) { /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PIntStringStringValue} + * @return {!proto.v1.PIntStringStringValue} */ -proto.PIntStringStringValue.deserializeBinary = function(bytes) { +proto.v1.PIntStringStringValue.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PIntStringStringValue; - return proto.PIntStringStringValue.deserializeBinaryFromReader(msg, reader); + var msg = new proto.v1.PIntStringStringValue; + return proto.v1.PIntStringStringValue.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.PIntStringStringValue} msg The message object to deserialize into. + * @param {!proto.v1.PIntStringStringValue} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PIntStringStringValue} + * @return {!proto.v1.PIntStringStringValue} */ -proto.PIntStringStringValue.deserializeBinaryFromReader = function(msg, reader) { +proto.v1.PIntStringStringValue.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -450,9 +450,9 @@ proto.PIntStringStringValue.deserializeBinaryFromReader = function(msg, reader) * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.PIntStringStringValue.prototype.serializeBinary = function() { +proto.v1.PIntStringStringValue.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.PIntStringStringValue.serializeBinaryToWriter(this, writer); + proto.v1.PIntStringStringValue.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -460,11 +460,11 @@ proto.PIntStringStringValue.prototype.serializeBinary = function() { /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.PIntStringStringValue} message + * @param {!proto.v1.PIntStringStringValue} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.PIntStringStringValue.serializeBinaryToWriter = function(message, writer) { +proto.v1.PIntStringStringValue.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getIntvalue(); if (f !== 0) { @@ -496,16 +496,16 @@ proto.PIntStringStringValue.serializeBinaryToWriter = function(message, writer) * optional int32 intValue = 1; * @return {number} */ -proto.PIntStringStringValue.prototype.getIntvalue = function() { +proto.v1.PIntStringStringValue.prototype.getIntvalue = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.PIntStringStringValue} returns this + * @return {!proto.v1.PIntStringStringValue} returns this */ -proto.PIntStringStringValue.prototype.setIntvalue = function(value) { +proto.v1.PIntStringStringValue.prototype.setIntvalue = function(value) { return jspb.Message.setProto3IntField(this, 1, value); }; @@ -514,7 +514,7 @@ proto.PIntStringStringValue.prototype.setIntvalue = function(value) { * optional google.protobuf.StringValue stringValue1 = 2; * @return {?proto.google.protobuf.StringValue} */ -proto.PIntStringStringValue.prototype.getStringvalue1 = function() { +proto.v1.PIntStringStringValue.prototype.getStringvalue1 = function() { return /** @type{?proto.google.protobuf.StringValue} */ ( jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.StringValue, 2)); }; @@ -522,18 +522,18 @@ proto.PIntStringStringValue.prototype.getStringvalue1 = function() { /** * @param {?proto.google.protobuf.StringValue|undefined} value - * @return {!proto.PIntStringStringValue} returns this + * @return {!proto.v1.PIntStringStringValue} returns this */ -proto.PIntStringStringValue.prototype.setStringvalue1 = function(value) { +proto.v1.PIntStringStringValue.prototype.setStringvalue1 = function(value) { return jspb.Message.setWrapperField(this, 2, value); }; /** * Clears the message field making it undefined. - * @return {!proto.PIntStringStringValue} returns this + * @return {!proto.v1.PIntStringStringValue} returns this */ -proto.PIntStringStringValue.prototype.clearStringvalue1 = function() { +proto.v1.PIntStringStringValue.prototype.clearStringvalue1 = function() { return this.setStringvalue1(undefined); }; @@ -542,7 +542,7 @@ proto.PIntStringStringValue.prototype.clearStringvalue1 = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PIntStringStringValue.prototype.hasStringvalue1 = function() { +proto.v1.PIntStringStringValue.prototype.hasStringvalue1 = function() { return jspb.Message.getField(this, 2) != null; }; @@ -551,7 +551,7 @@ proto.PIntStringStringValue.prototype.hasStringvalue1 = function() { * optional google.protobuf.StringValue stringValue2 = 3; * @return {?proto.google.protobuf.StringValue} */ -proto.PIntStringStringValue.prototype.getStringvalue2 = function() { +proto.v1.PIntStringStringValue.prototype.getStringvalue2 = function() { return /** @type{?proto.google.protobuf.StringValue} */ ( jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.StringValue, 3)); }; @@ -559,18 +559,18 @@ proto.PIntStringStringValue.prototype.getStringvalue2 = function() { /** * @param {?proto.google.protobuf.StringValue|undefined} value - * @return {!proto.PIntStringStringValue} returns this + * @return {!proto.v1.PIntStringStringValue} returns this */ -proto.PIntStringStringValue.prototype.setStringvalue2 = function(value) { +proto.v1.PIntStringStringValue.prototype.setStringvalue2 = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.PIntStringStringValue} returns this + * @return {!proto.v1.PIntStringStringValue} returns this */ -proto.PIntStringStringValue.prototype.clearStringvalue2 = function() { +proto.v1.PIntStringStringValue.prototype.clearStringvalue2 = function() { return this.setStringvalue2(undefined); }; @@ -579,7 +579,7 @@ proto.PIntStringStringValue.prototype.clearStringvalue2 = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PIntStringStringValue.prototype.hasStringvalue2 = function() { +proto.v1.PIntStringStringValue.prototype.hasStringvalue2 = function() { return jspb.Message.getField(this, 3) != null; }; @@ -600,8 +600,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.PLongIntIntByteByteStringValue.prototype.toObject = function(opt_includeInstance) { - return proto.PLongIntIntByteByteStringValue.toObject(opt_includeInstance, this); +proto.v1.PLongIntIntByteByteStringValue.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PLongIntIntByteByteStringValue.toObject(opt_includeInstance, this); }; @@ -610,11 +610,11 @@ proto.PLongIntIntByteByteStringValue.prototype.toObject = function(opt_includeIn * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.PLongIntIntByteByteStringValue} msg The msg instance to transform. + * @param {!proto.v1.PLongIntIntByteByteStringValue} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.PLongIntIntByteByteStringValue.toObject = function(includeInstance, msg) { +proto.v1.PLongIntIntByteByteStringValue.toObject = function(includeInstance, msg) { var f, obj = { longvalue: jspb.Message.getFieldWithDefault(msg, 1, 0), intvalue1: jspb.Message.getFieldWithDefault(msg, 2, 0), @@ -635,23 +635,23 @@ proto.PLongIntIntByteByteStringValue.toObject = function(includeInstance, msg) { /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PLongIntIntByteByteStringValue} + * @return {!proto.v1.PLongIntIntByteByteStringValue} */ -proto.PLongIntIntByteByteStringValue.deserializeBinary = function(bytes) { +proto.v1.PLongIntIntByteByteStringValue.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PLongIntIntByteByteStringValue; - return proto.PLongIntIntByteByteStringValue.deserializeBinaryFromReader(msg, reader); + var msg = new proto.v1.PLongIntIntByteByteStringValue; + return proto.v1.PLongIntIntByteByteStringValue.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.PLongIntIntByteByteStringValue} msg The message object to deserialize into. + * @param {!proto.v1.PLongIntIntByteByteStringValue} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PLongIntIntByteByteStringValue} + * @return {!proto.v1.PLongIntIntByteByteStringValue} */ -proto.PLongIntIntByteByteStringValue.deserializeBinaryFromReader = function(msg, reader) { +proto.v1.PLongIntIntByteByteStringValue.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -696,9 +696,9 @@ proto.PLongIntIntByteByteStringValue.deserializeBinaryFromReader = function(msg, * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.PLongIntIntByteByteStringValue.prototype.serializeBinary = function() { +proto.v1.PLongIntIntByteByteStringValue.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.PLongIntIntByteByteStringValue.serializeBinaryToWriter(this, writer); + proto.v1.PLongIntIntByteByteStringValue.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -706,11 +706,11 @@ proto.PLongIntIntByteByteStringValue.prototype.serializeBinary = function() { /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.PLongIntIntByteByteStringValue} message + * @param {!proto.v1.PLongIntIntByteByteStringValue} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.PLongIntIntByteByteStringValue.serializeBinaryToWriter = function(message, writer) { +proto.v1.PLongIntIntByteByteStringValue.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getLongvalue(); if (f !== 0) { @@ -762,16 +762,16 @@ proto.PLongIntIntByteByteStringValue.serializeBinaryToWriter = function(message, * optional int64 longValue = 1; * @return {number} */ -proto.PLongIntIntByteByteStringValue.prototype.getLongvalue = function() { +proto.v1.PLongIntIntByteByteStringValue.prototype.getLongvalue = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.PLongIntIntByteByteStringValue} returns this + * @return {!proto.v1.PLongIntIntByteByteStringValue} returns this */ -proto.PLongIntIntByteByteStringValue.prototype.setLongvalue = function(value) { +proto.v1.PLongIntIntByteByteStringValue.prototype.setLongvalue = function(value) { return jspb.Message.setProto3IntField(this, 1, value); }; @@ -780,16 +780,16 @@ proto.PLongIntIntByteByteStringValue.prototype.setLongvalue = function(value) { * optional int32 intValue1 = 2; * @return {number} */ -proto.PLongIntIntByteByteStringValue.prototype.getIntvalue1 = function() { +proto.v1.PLongIntIntByteByteStringValue.prototype.getIntvalue1 = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** * @param {number} value - * @return {!proto.PLongIntIntByteByteStringValue} returns this + * @return {!proto.v1.PLongIntIntByteByteStringValue} returns this */ -proto.PLongIntIntByteByteStringValue.prototype.setIntvalue1 = function(value) { +proto.v1.PLongIntIntByteByteStringValue.prototype.setIntvalue1 = function(value) { return jspb.Message.setProto3IntField(this, 2, value); }; @@ -798,16 +798,16 @@ proto.PLongIntIntByteByteStringValue.prototype.setIntvalue1 = function(value) { * optional int32 intValue2 = 3; * @return {number} */ -proto.PLongIntIntByteByteStringValue.prototype.getIntvalue2 = function() { +proto.v1.PLongIntIntByteByteStringValue.prototype.getIntvalue2 = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** * @param {number} value - * @return {!proto.PLongIntIntByteByteStringValue} returns this + * @return {!proto.v1.PLongIntIntByteByteStringValue} returns this */ -proto.PLongIntIntByteByteStringValue.prototype.setIntvalue2 = function(value) { +proto.v1.PLongIntIntByteByteStringValue.prototype.setIntvalue2 = function(value) { return jspb.Message.setProto3IntField(this, 3, value); }; @@ -816,16 +816,16 @@ proto.PLongIntIntByteByteStringValue.prototype.setIntvalue2 = function(value) { * optional sint32 byteValue1 = 4; * @return {number} */ -proto.PLongIntIntByteByteStringValue.prototype.getBytevalue1 = function() { +proto.v1.PLongIntIntByteByteStringValue.prototype.getBytevalue1 = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); }; /** * @param {number} value - * @return {!proto.PLongIntIntByteByteStringValue} returns this + * @return {!proto.v1.PLongIntIntByteByteStringValue} returns this */ -proto.PLongIntIntByteByteStringValue.prototype.setBytevalue1 = function(value) { +proto.v1.PLongIntIntByteByteStringValue.prototype.setBytevalue1 = function(value) { return jspb.Message.setProto3IntField(this, 4, value); }; @@ -834,16 +834,16 @@ proto.PLongIntIntByteByteStringValue.prototype.setBytevalue1 = function(value) { * optional sint32 byteValue2 = 5; * @return {number} */ -proto.PLongIntIntByteByteStringValue.prototype.getBytevalue2 = function() { +proto.v1.PLongIntIntByteByteStringValue.prototype.getBytevalue2 = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); }; /** * @param {number} value - * @return {!proto.PLongIntIntByteByteStringValue} returns this + * @return {!proto.v1.PLongIntIntByteByteStringValue} returns this */ -proto.PLongIntIntByteByteStringValue.prototype.setBytevalue2 = function(value) { +proto.v1.PLongIntIntByteByteStringValue.prototype.setBytevalue2 = function(value) { return jspb.Message.setProto3IntField(this, 5, value); }; @@ -852,7 +852,7 @@ proto.PLongIntIntByteByteStringValue.prototype.setBytevalue2 = function(value) { * optional google.protobuf.StringValue stringValue = 6; * @return {?proto.google.protobuf.StringValue} */ -proto.PLongIntIntByteByteStringValue.prototype.getStringvalue = function() { +proto.v1.PLongIntIntByteByteStringValue.prototype.getStringvalue = function() { return /** @type{?proto.google.protobuf.StringValue} */ ( jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.StringValue, 6)); }; @@ -860,18 +860,18 @@ proto.PLongIntIntByteByteStringValue.prototype.getStringvalue = function() { /** * @param {?proto.google.protobuf.StringValue|undefined} value - * @return {!proto.PLongIntIntByteByteStringValue} returns this + * @return {!proto.v1.PLongIntIntByteByteStringValue} returns this */ -proto.PLongIntIntByteByteStringValue.prototype.setStringvalue = function(value) { +proto.v1.PLongIntIntByteByteStringValue.prototype.setStringvalue = function(value) { return jspb.Message.setWrapperField(this, 6, value); }; /** * Clears the message field making it undefined. - * @return {!proto.PLongIntIntByteByteStringValue} returns this + * @return {!proto.v1.PLongIntIntByteByteStringValue} returns this */ -proto.PLongIntIntByteByteStringValue.prototype.clearStringvalue = function() { +proto.v1.PLongIntIntByteByteStringValue.prototype.clearStringvalue = function() { return this.setStringvalue(undefined); }; @@ -880,7 +880,7 @@ proto.PLongIntIntByteByteStringValue.prototype.clearStringvalue = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PLongIntIntByteByteStringValue.prototype.hasStringvalue = function() { +proto.v1.PLongIntIntByteByteStringValue.prototype.hasStringvalue = function() { return jspb.Message.getField(this, 6) != null; }; @@ -901,8 +901,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.PIntBooleanIntBooleanValue.prototype.toObject = function(opt_includeInstance) { - return proto.PIntBooleanIntBooleanValue.toObject(opt_includeInstance, this); +proto.v1.PIntBooleanIntBooleanValue.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PIntBooleanIntBooleanValue.toObject(opt_includeInstance, this); }; @@ -911,11 +911,11 @@ proto.PIntBooleanIntBooleanValue.prototype.toObject = function(opt_includeInstan * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.PIntBooleanIntBooleanValue} msg The msg instance to transform. + * @param {!proto.v1.PIntBooleanIntBooleanValue} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.PIntBooleanIntBooleanValue.toObject = function(includeInstance, msg) { +proto.v1.PIntBooleanIntBooleanValue.toObject = function(includeInstance, msg) { var f, obj = { intvalue1: jspb.Message.getFieldWithDefault(msg, 1, 0), boolvalue1: jspb.Message.getBooleanFieldWithDefault(msg, 2, false), @@ -934,23 +934,23 @@ proto.PIntBooleanIntBooleanValue.toObject = function(includeInstance, msg) { /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PIntBooleanIntBooleanValue} + * @return {!proto.v1.PIntBooleanIntBooleanValue} */ -proto.PIntBooleanIntBooleanValue.deserializeBinary = function(bytes) { +proto.v1.PIntBooleanIntBooleanValue.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PIntBooleanIntBooleanValue; - return proto.PIntBooleanIntBooleanValue.deserializeBinaryFromReader(msg, reader); + var msg = new proto.v1.PIntBooleanIntBooleanValue; + return proto.v1.PIntBooleanIntBooleanValue.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.PIntBooleanIntBooleanValue} msg The message object to deserialize into. + * @param {!proto.v1.PIntBooleanIntBooleanValue} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PIntBooleanIntBooleanValue} + * @return {!proto.v1.PIntBooleanIntBooleanValue} */ -proto.PIntBooleanIntBooleanValue.deserializeBinaryFromReader = function(msg, reader) { +proto.v1.PIntBooleanIntBooleanValue.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -986,9 +986,9 @@ proto.PIntBooleanIntBooleanValue.deserializeBinaryFromReader = function(msg, rea * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.PIntBooleanIntBooleanValue.prototype.serializeBinary = function() { +proto.v1.PIntBooleanIntBooleanValue.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.PIntBooleanIntBooleanValue.serializeBinaryToWriter(this, writer); + proto.v1.PIntBooleanIntBooleanValue.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -996,11 +996,11 @@ proto.PIntBooleanIntBooleanValue.prototype.serializeBinary = function() { /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.PIntBooleanIntBooleanValue} message + * @param {!proto.v1.PIntBooleanIntBooleanValue} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.PIntBooleanIntBooleanValue.serializeBinaryToWriter = function(message, writer) { +proto.v1.PIntBooleanIntBooleanValue.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getIntvalue1(); if (f !== 0) { @@ -1037,16 +1037,16 @@ proto.PIntBooleanIntBooleanValue.serializeBinaryToWriter = function(message, wri * optional int32 intValue1 = 1; * @return {number} */ -proto.PIntBooleanIntBooleanValue.prototype.getIntvalue1 = function() { +proto.v1.PIntBooleanIntBooleanValue.prototype.getIntvalue1 = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.PIntBooleanIntBooleanValue} returns this + * @return {!proto.v1.PIntBooleanIntBooleanValue} returns this */ -proto.PIntBooleanIntBooleanValue.prototype.setIntvalue1 = function(value) { +proto.v1.PIntBooleanIntBooleanValue.prototype.setIntvalue1 = function(value) { return jspb.Message.setProto3IntField(this, 1, value); }; @@ -1055,16 +1055,16 @@ proto.PIntBooleanIntBooleanValue.prototype.setIntvalue1 = function(value) { * optional bool boolValue1 = 2; * @return {boolean} */ -proto.PIntBooleanIntBooleanValue.prototype.getBoolvalue1 = function() { +proto.v1.PIntBooleanIntBooleanValue.prototype.getBoolvalue1 = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** * @param {boolean} value - * @return {!proto.PIntBooleanIntBooleanValue} returns this + * @return {!proto.v1.PIntBooleanIntBooleanValue} returns this */ -proto.PIntBooleanIntBooleanValue.prototype.setBoolvalue1 = function(value) { +proto.v1.PIntBooleanIntBooleanValue.prototype.setBoolvalue1 = function(value) { return jspb.Message.setProto3BooleanField(this, 2, value); }; @@ -1073,16 +1073,16 @@ proto.PIntBooleanIntBooleanValue.prototype.setBoolvalue1 = function(value) { * optional int32 intValue2 = 3; * @return {number} */ -proto.PIntBooleanIntBooleanValue.prototype.getIntvalue2 = function() { +proto.v1.PIntBooleanIntBooleanValue.prototype.getIntvalue2 = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** * @param {number} value - * @return {!proto.PIntBooleanIntBooleanValue} returns this + * @return {!proto.v1.PIntBooleanIntBooleanValue} returns this */ -proto.PIntBooleanIntBooleanValue.prototype.setIntvalue2 = function(value) { +proto.v1.PIntBooleanIntBooleanValue.prototype.setIntvalue2 = function(value) { return jspb.Message.setProto3IntField(this, 3, value); }; @@ -1091,16 +1091,16 @@ proto.PIntBooleanIntBooleanValue.prototype.setIntvalue2 = function(value) { * optional bool boolValue2 = 4; * @return {boolean} */ -proto.PIntBooleanIntBooleanValue.prototype.getBoolvalue2 = function() { +proto.v1.PIntBooleanIntBooleanValue.prototype.getBoolvalue2 = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); }; /** * @param {boolean} value - * @return {!proto.PIntBooleanIntBooleanValue} returns this + * @return {!proto.v1.PIntBooleanIntBooleanValue} returns this */ -proto.PIntBooleanIntBooleanValue.prototype.setBoolvalue2 = function(value) { +proto.v1.PIntBooleanIntBooleanValue.prototype.setBoolvalue2 = function(value) { return jspb.Message.setProto3BooleanField(this, 4, value); }; @@ -1121,8 +1121,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.PStringStringValue.prototype.toObject = function(opt_includeInstance) { - return proto.PStringStringValue.toObject(opt_includeInstance, this); +proto.v1.PStringStringValue.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PStringStringValue.toObject(opt_includeInstance, this); }; @@ -1131,11 +1131,11 @@ proto.PStringStringValue.prototype.toObject = function(opt_includeInstance) { * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.PStringStringValue} msg The msg instance to transform. + * @param {!proto.v1.PStringStringValue} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.PStringStringValue.toObject = function(includeInstance, msg) { +proto.v1.PStringStringValue.toObject = function(includeInstance, msg) { var f, obj = { stringvalue1: (f = msg.getStringvalue1()) && google_protobuf_wrappers_pb.StringValue.toObject(includeInstance, f), stringvalue2: (f = msg.getStringvalue2()) && google_protobuf_wrappers_pb.StringValue.toObject(includeInstance, f) @@ -1152,23 +1152,23 @@ proto.PStringStringValue.toObject = function(includeInstance, msg) { /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PStringStringValue} + * @return {!proto.v1.PStringStringValue} */ -proto.PStringStringValue.deserializeBinary = function(bytes) { +proto.v1.PStringStringValue.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PStringStringValue; - return proto.PStringStringValue.deserializeBinaryFromReader(msg, reader); + var msg = new proto.v1.PStringStringValue; + return proto.v1.PStringStringValue.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.PStringStringValue} msg The message object to deserialize into. + * @param {!proto.v1.PStringStringValue} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PStringStringValue} + * @return {!proto.v1.PStringStringValue} */ -proto.PStringStringValue.deserializeBinaryFromReader = function(msg, reader) { +proto.v1.PStringStringValue.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1198,9 +1198,9 @@ proto.PStringStringValue.deserializeBinaryFromReader = function(msg, reader) { * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.PStringStringValue.prototype.serializeBinary = function() { +proto.v1.PStringStringValue.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.PStringStringValue.serializeBinaryToWriter(this, writer); + proto.v1.PStringStringValue.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1208,11 +1208,11 @@ proto.PStringStringValue.prototype.serializeBinary = function() { /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.PStringStringValue} message + * @param {!proto.v1.PStringStringValue} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.PStringStringValue.serializeBinaryToWriter = function(message, writer) { +proto.v1.PStringStringValue.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getStringvalue1(); if (f != null) { @@ -1237,7 +1237,7 @@ proto.PStringStringValue.serializeBinaryToWriter = function(message, writer) { * optional google.protobuf.StringValue stringValue1 = 1; * @return {?proto.google.protobuf.StringValue} */ -proto.PStringStringValue.prototype.getStringvalue1 = function() { +proto.v1.PStringStringValue.prototype.getStringvalue1 = function() { return /** @type{?proto.google.protobuf.StringValue} */ ( jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.StringValue, 1)); }; @@ -1245,18 +1245,18 @@ proto.PStringStringValue.prototype.getStringvalue1 = function() { /** * @param {?proto.google.protobuf.StringValue|undefined} value - * @return {!proto.PStringStringValue} returns this + * @return {!proto.v1.PStringStringValue} returns this */ -proto.PStringStringValue.prototype.setStringvalue1 = function(value) { +proto.v1.PStringStringValue.prototype.setStringvalue1 = function(value) { return jspb.Message.setWrapperField(this, 1, value); }; /** * Clears the message field making it undefined. - * @return {!proto.PStringStringValue} returns this + * @return {!proto.v1.PStringStringValue} returns this */ -proto.PStringStringValue.prototype.clearStringvalue1 = function() { +proto.v1.PStringStringValue.prototype.clearStringvalue1 = function() { return this.setStringvalue1(undefined); }; @@ -1265,7 +1265,7 @@ proto.PStringStringValue.prototype.clearStringvalue1 = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PStringStringValue.prototype.hasStringvalue1 = function() { +proto.v1.PStringStringValue.prototype.hasStringvalue1 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -1274,7 +1274,7 @@ proto.PStringStringValue.prototype.hasStringvalue1 = function() { * optional google.protobuf.StringValue stringValue2 = 2; * @return {?proto.google.protobuf.StringValue} */ -proto.PStringStringValue.prototype.getStringvalue2 = function() { +proto.v1.PStringStringValue.prototype.getStringvalue2 = function() { return /** @type{?proto.google.protobuf.StringValue} */ ( jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.StringValue, 2)); }; @@ -1282,18 +1282,18 @@ proto.PStringStringValue.prototype.getStringvalue2 = function() { /** * @param {?proto.google.protobuf.StringValue|undefined} value - * @return {!proto.PStringStringValue} returns this + * @return {!proto.v1.PStringStringValue} returns this */ -proto.PStringStringValue.prototype.setStringvalue2 = function(value) { +proto.v1.PStringStringValue.prototype.setStringvalue2 = function(value) { return jspb.Message.setWrapperField(this, 2, value); }; /** * Clears the message field making it undefined. - * @return {!proto.PStringStringValue} returns this + * @return {!proto.v1.PStringStringValue} returns this */ -proto.PStringStringValue.prototype.clearStringvalue2 = function() { +proto.v1.PStringStringValue.prototype.clearStringvalue2 = function() { return this.setStringvalue2(undefined); }; @@ -1302,7 +1302,7 @@ proto.PStringStringValue.prototype.clearStringvalue2 = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PStringStringValue.prototype.hasStringvalue2 = function() { +proto.v1.PStringStringValue.prototype.hasStringvalue2 = function() { return jspb.Message.getField(this, 2) != null; }; @@ -1316,12 +1316,12 @@ proto.PStringStringValue.prototype.hasStringvalue2 = function() { * @private {!Array>} * @const */ -proto.PAnnotationValue.oneofGroups_ = [[1,2,3,4,5,6,7,8,9,10,11,12,13]]; +proto.v1.PAnnotationValue.oneofGroups_ = [[1,2,3,4,5,6,7,8,9,10,11,12,13]]; /** * @enum {number} */ -proto.PAnnotationValue.FieldCase = { +proto.v1.PAnnotationValue.FieldCase = { FIELD_NOT_SET: 0, STRINGVALUE: 1, BOOLVALUE: 2, @@ -1339,10 +1339,10 @@ proto.PAnnotationValue.FieldCase = { }; /** - * @return {proto.PAnnotationValue.FieldCase} + * @return {proto.v1.PAnnotationValue.FieldCase} */ -proto.PAnnotationValue.prototype.getFieldCase = function() { - return /** @type {proto.PAnnotationValue.FieldCase} */(jspb.Message.computeOneofCase(this, proto.PAnnotationValue.oneofGroups_[0])); +proto.v1.PAnnotationValue.prototype.getFieldCase = function() { + return /** @type {proto.v1.PAnnotationValue.FieldCase} */(jspb.Message.computeOneofCase(this, proto.v1.PAnnotationValue.oneofGroups_[0])); }; @@ -1360,8 +1360,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.PAnnotationValue.prototype.toObject = function(opt_includeInstance) { - return proto.PAnnotationValue.toObject(opt_includeInstance, this); +proto.v1.PAnnotationValue.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PAnnotationValue.toObject(opt_includeInstance, this); }; @@ -1370,11 +1370,11 @@ proto.PAnnotationValue.prototype.toObject = function(opt_includeInstance) { * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.PAnnotationValue} msg The msg instance to transform. + * @param {!proto.v1.PAnnotationValue} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.PAnnotationValue.toObject = function(includeInstance, msg) { +proto.v1.PAnnotationValue.toObject = function(includeInstance, msg) { var f, obj = { stringvalue: jspb.Message.getFieldWithDefault(msg, 1, ""), boolvalue: jspb.Message.getBooleanFieldWithDefault(msg, 2, false), @@ -1384,11 +1384,11 @@ proto.PAnnotationValue.toObject = function(includeInstance, msg) { doublevalue: jspb.Message.getFloatingPointFieldWithDefault(msg, 6, 0.0), binaryvalue: msg.getBinaryvalue_asB64(), bytevalue: jspb.Message.getFieldWithDefault(msg, 8, 0), - intstringvalue: (f = msg.getIntstringvalue()) && proto.PIntStringValue.toObject(includeInstance, f), - stringstringvalue: (f = msg.getStringstringvalue()) && proto.PStringStringValue.toObject(includeInstance, f), - intstringstringvalue: (f = msg.getIntstringstringvalue()) && proto.PIntStringStringValue.toObject(includeInstance, f), - longintintbytebytestringvalue: (f = msg.getLongintintbytebytestringvalue()) && proto.PLongIntIntByteByteStringValue.toObject(includeInstance, f), - intbooleanintbooleanvalue: (f = msg.getIntbooleanintbooleanvalue()) && proto.PIntBooleanIntBooleanValue.toObject(includeInstance, f) + intstringvalue: (f = msg.getIntstringvalue()) && proto.v1.PIntStringValue.toObject(includeInstance, f), + stringstringvalue: (f = msg.getStringstringvalue()) && proto.v1.PStringStringValue.toObject(includeInstance, f), + intstringstringvalue: (f = msg.getIntstringstringvalue()) && proto.v1.PIntStringStringValue.toObject(includeInstance, f), + longintintbytebytestringvalue: (f = msg.getLongintintbytebytestringvalue()) && proto.v1.PLongIntIntByteByteStringValue.toObject(includeInstance, f), + intbooleanintbooleanvalue: (f = msg.getIntbooleanintbooleanvalue()) && proto.v1.PIntBooleanIntBooleanValue.toObject(includeInstance, f) }; if (includeInstance) { @@ -1402,23 +1402,23 @@ proto.PAnnotationValue.toObject = function(includeInstance, msg) { /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PAnnotationValue} + * @return {!proto.v1.PAnnotationValue} */ -proto.PAnnotationValue.deserializeBinary = function(bytes) { +proto.v1.PAnnotationValue.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PAnnotationValue; - return proto.PAnnotationValue.deserializeBinaryFromReader(msg, reader); + var msg = new proto.v1.PAnnotationValue; + return proto.v1.PAnnotationValue.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.PAnnotationValue} msg The message object to deserialize into. + * @param {!proto.v1.PAnnotationValue} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PAnnotationValue} + * @return {!proto.v1.PAnnotationValue} */ -proto.PAnnotationValue.deserializeBinaryFromReader = function(msg, reader) { +proto.v1.PAnnotationValue.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1458,28 +1458,28 @@ proto.PAnnotationValue.deserializeBinaryFromReader = function(msg, reader) { msg.setBytevalue(value); break; case 9: - var value = new proto.PIntStringValue; - reader.readMessage(value,proto.PIntStringValue.deserializeBinaryFromReader); + var value = new proto.v1.PIntStringValue; + reader.readMessage(value,proto.v1.PIntStringValue.deserializeBinaryFromReader); msg.setIntstringvalue(value); break; case 10: - var value = new proto.PStringStringValue; - reader.readMessage(value,proto.PStringStringValue.deserializeBinaryFromReader); + var value = new proto.v1.PStringStringValue; + reader.readMessage(value,proto.v1.PStringStringValue.deserializeBinaryFromReader); msg.setStringstringvalue(value); break; case 11: - var value = new proto.PIntStringStringValue; - reader.readMessage(value,proto.PIntStringStringValue.deserializeBinaryFromReader); + var value = new proto.v1.PIntStringStringValue; + reader.readMessage(value,proto.v1.PIntStringStringValue.deserializeBinaryFromReader); msg.setIntstringstringvalue(value); break; case 12: - var value = new proto.PLongIntIntByteByteStringValue; - reader.readMessage(value,proto.PLongIntIntByteByteStringValue.deserializeBinaryFromReader); + var value = new proto.v1.PLongIntIntByteByteStringValue; + reader.readMessage(value,proto.v1.PLongIntIntByteByteStringValue.deserializeBinaryFromReader); msg.setLongintintbytebytestringvalue(value); break; case 13: - var value = new proto.PIntBooleanIntBooleanValue; - reader.readMessage(value,proto.PIntBooleanIntBooleanValue.deserializeBinaryFromReader); + var value = new proto.v1.PIntBooleanIntBooleanValue; + reader.readMessage(value,proto.v1.PIntBooleanIntBooleanValue.deserializeBinaryFromReader); msg.setIntbooleanintbooleanvalue(value); break; default: @@ -1495,9 +1495,9 @@ proto.PAnnotationValue.deserializeBinaryFromReader = function(msg, reader) { * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.PAnnotationValue.prototype.serializeBinary = function() { +proto.v1.PAnnotationValue.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.PAnnotationValue.serializeBinaryToWriter(this, writer); + proto.v1.PAnnotationValue.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1505,11 +1505,11 @@ proto.PAnnotationValue.prototype.serializeBinary = function() { /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.PAnnotationValue} message + * @param {!proto.v1.PAnnotationValue} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.PAnnotationValue.serializeBinaryToWriter = function(message, writer) { +proto.v1.PAnnotationValue.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = /** @type {string} */ (jspb.Message.getField(message, 1)); if (f != null) { @@ -1572,7 +1572,7 @@ proto.PAnnotationValue.serializeBinaryToWriter = function(message, writer) { writer.writeMessage( 9, f, - proto.PIntStringValue.serializeBinaryToWriter + proto.v1.PIntStringValue.serializeBinaryToWriter ); } f = message.getStringstringvalue(); @@ -1580,7 +1580,7 @@ proto.PAnnotationValue.serializeBinaryToWriter = function(message, writer) { writer.writeMessage( 10, f, - proto.PStringStringValue.serializeBinaryToWriter + proto.v1.PStringStringValue.serializeBinaryToWriter ); } f = message.getIntstringstringvalue(); @@ -1588,7 +1588,7 @@ proto.PAnnotationValue.serializeBinaryToWriter = function(message, writer) { writer.writeMessage( 11, f, - proto.PIntStringStringValue.serializeBinaryToWriter + proto.v1.PIntStringStringValue.serializeBinaryToWriter ); } f = message.getLongintintbytebytestringvalue(); @@ -1596,7 +1596,7 @@ proto.PAnnotationValue.serializeBinaryToWriter = function(message, writer) { writer.writeMessage( 12, f, - proto.PLongIntIntByteByteStringValue.serializeBinaryToWriter + proto.v1.PLongIntIntByteByteStringValue.serializeBinaryToWriter ); } f = message.getIntbooleanintbooleanvalue(); @@ -1604,7 +1604,7 @@ proto.PAnnotationValue.serializeBinaryToWriter = function(message, writer) { writer.writeMessage( 13, f, - proto.PIntBooleanIntBooleanValue.serializeBinaryToWriter + proto.v1.PIntBooleanIntBooleanValue.serializeBinaryToWriter ); } }; @@ -1614,26 +1614,26 @@ proto.PAnnotationValue.serializeBinaryToWriter = function(message, writer) { * optional string stringValue = 1; * @return {string} */ -proto.PAnnotationValue.prototype.getStringvalue = function() { +proto.v1.PAnnotationValue.prototype.getStringvalue = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.setStringvalue = function(value) { - return jspb.Message.setOneofField(this, 1, proto.PAnnotationValue.oneofGroups_[0], value); +proto.v1.PAnnotationValue.prototype.setStringvalue = function(value) { + return jspb.Message.setOneofField(this, 1, proto.v1.PAnnotationValue.oneofGroups_[0], value); }; /** * Clears the field making it undefined. - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.clearStringvalue = function() { - return jspb.Message.setOneofField(this, 1, proto.PAnnotationValue.oneofGroups_[0], undefined); +proto.v1.PAnnotationValue.prototype.clearStringvalue = function() { + return jspb.Message.setOneofField(this, 1, proto.v1.PAnnotationValue.oneofGroups_[0], undefined); }; @@ -1641,7 +1641,7 @@ proto.PAnnotationValue.prototype.clearStringvalue = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PAnnotationValue.prototype.hasStringvalue = function() { +proto.v1.PAnnotationValue.prototype.hasStringvalue = function() { return jspb.Message.getField(this, 1) != null; }; @@ -1650,26 +1650,26 @@ proto.PAnnotationValue.prototype.hasStringvalue = function() { * optional bool boolValue = 2; * @return {boolean} */ -proto.PAnnotationValue.prototype.getBoolvalue = function() { +proto.v1.PAnnotationValue.prototype.getBoolvalue = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** * @param {boolean} value - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.setBoolvalue = function(value) { - return jspb.Message.setOneofField(this, 2, proto.PAnnotationValue.oneofGroups_[0], value); +proto.v1.PAnnotationValue.prototype.setBoolvalue = function(value) { + return jspb.Message.setOneofField(this, 2, proto.v1.PAnnotationValue.oneofGroups_[0], value); }; /** * Clears the field making it undefined. - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.clearBoolvalue = function() { - return jspb.Message.setOneofField(this, 2, proto.PAnnotationValue.oneofGroups_[0], undefined); +proto.v1.PAnnotationValue.prototype.clearBoolvalue = function() { + return jspb.Message.setOneofField(this, 2, proto.v1.PAnnotationValue.oneofGroups_[0], undefined); }; @@ -1677,7 +1677,7 @@ proto.PAnnotationValue.prototype.clearBoolvalue = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PAnnotationValue.prototype.hasBoolvalue = function() { +proto.v1.PAnnotationValue.prototype.hasBoolvalue = function() { return jspb.Message.getField(this, 2) != null; }; @@ -1686,26 +1686,26 @@ proto.PAnnotationValue.prototype.hasBoolvalue = function() { * optional int32 intValue = 3; * @return {number} */ -proto.PAnnotationValue.prototype.getIntvalue = function() { +proto.v1.PAnnotationValue.prototype.getIntvalue = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** * @param {number} value - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.setIntvalue = function(value) { - return jspb.Message.setOneofField(this, 3, proto.PAnnotationValue.oneofGroups_[0], value); +proto.v1.PAnnotationValue.prototype.setIntvalue = function(value) { + return jspb.Message.setOneofField(this, 3, proto.v1.PAnnotationValue.oneofGroups_[0], value); }; /** * Clears the field making it undefined. - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.clearIntvalue = function() { - return jspb.Message.setOneofField(this, 3, proto.PAnnotationValue.oneofGroups_[0], undefined); +proto.v1.PAnnotationValue.prototype.clearIntvalue = function() { + return jspb.Message.setOneofField(this, 3, proto.v1.PAnnotationValue.oneofGroups_[0], undefined); }; @@ -1713,7 +1713,7 @@ proto.PAnnotationValue.prototype.clearIntvalue = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PAnnotationValue.prototype.hasIntvalue = function() { +proto.v1.PAnnotationValue.prototype.hasIntvalue = function() { return jspb.Message.getField(this, 3) != null; }; @@ -1722,26 +1722,26 @@ proto.PAnnotationValue.prototype.hasIntvalue = function() { * optional int64 longValue = 4; * @return {number} */ -proto.PAnnotationValue.prototype.getLongvalue = function() { +proto.v1.PAnnotationValue.prototype.getLongvalue = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); }; /** * @param {number} value - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.setLongvalue = function(value) { - return jspb.Message.setOneofField(this, 4, proto.PAnnotationValue.oneofGroups_[0], value); +proto.v1.PAnnotationValue.prototype.setLongvalue = function(value) { + return jspb.Message.setOneofField(this, 4, proto.v1.PAnnotationValue.oneofGroups_[0], value); }; /** * Clears the field making it undefined. - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.clearLongvalue = function() { - return jspb.Message.setOneofField(this, 4, proto.PAnnotationValue.oneofGroups_[0], undefined); +proto.v1.PAnnotationValue.prototype.clearLongvalue = function() { + return jspb.Message.setOneofField(this, 4, proto.v1.PAnnotationValue.oneofGroups_[0], undefined); }; @@ -1749,7 +1749,7 @@ proto.PAnnotationValue.prototype.clearLongvalue = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PAnnotationValue.prototype.hasLongvalue = function() { +proto.v1.PAnnotationValue.prototype.hasLongvalue = function() { return jspb.Message.getField(this, 4) != null; }; @@ -1758,26 +1758,26 @@ proto.PAnnotationValue.prototype.hasLongvalue = function() { * optional sint32 shortValue = 5; * @return {number} */ -proto.PAnnotationValue.prototype.getShortvalue = function() { +proto.v1.PAnnotationValue.prototype.getShortvalue = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); }; /** * @param {number} value - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.setShortvalue = function(value) { - return jspb.Message.setOneofField(this, 5, proto.PAnnotationValue.oneofGroups_[0], value); +proto.v1.PAnnotationValue.prototype.setShortvalue = function(value) { + return jspb.Message.setOneofField(this, 5, proto.v1.PAnnotationValue.oneofGroups_[0], value); }; /** * Clears the field making it undefined. - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.clearShortvalue = function() { - return jspb.Message.setOneofField(this, 5, proto.PAnnotationValue.oneofGroups_[0], undefined); +proto.v1.PAnnotationValue.prototype.clearShortvalue = function() { + return jspb.Message.setOneofField(this, 5, proto.v1.PAnnotationValue.oneofGroups_[0], undefined); }; @@ -1785,7 +1785,7 @@ proto.PAnnotationValue.prototype.clearShortvalue = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PAnnotationValue.prototype.hasShortvalue = function() { +proto.v1.PAnnotationValue.prototype.hasShortvalue = function() { return jspb.Message.getField(this, 5) != null; }; @@ -1794,26 +1794,26 @@ proto.PAnnotationValue.prototype.hasShortvalue = function() { * optional double doubleValue = 6; * @return {number} */ -proto.PAnnotationValue.prototype.getDoublevalue = function() { +proto.v1.PAnnotationValue.prototype.getDoublevalue = function() { return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 6, 0.0)); }; /** * @param {number} value - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.setDoublevalue = function(value) { - return jspb.Message.setOneofField(this, 6, proto.PAnnotationValue.oneofGroups_[0], value); +proto.v1.PAnnotationValue.prototype.setDoublevalue = function(value) { + return jspb.Message.setOneofField(this, 6, proto.v1.PAnnotationValue.oneofGroups_[0], value); }; /** * Clears the field making it undefined. - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.clearDoublevalue = function() { - return jspb.Message.setOneofField(this, 6, proto.PAnnotationValue.oneofGroups_[0], undefined); +proto.v1.PAnnotationValue.prototype.clearDoublevalue = function() { + return jspb.Message.setOneofField(this, 6, proto.v1.PAnnotationValue.oneofGroups_[0], undefined); }; @@ -1821,7 +1821,7 @@ proto.PAnnotationValue.prototype.clearDoublevalue = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PAnnotationValue.prototype.hasDoublevalue = function() { +proto.v1.PAnnotationValue.prototype.hasDoublevalue = function() { return jspb.Message.getField(this, 6) != null; }; @@ -1830,7 +1830,7 @@ proto.PAnnotationValue.prototype.hasDoublevalue = function() { * optional bytes binaryValue = 7; * @return {!(string|Uint8Array)} */ -proto.PAnnotationValue.prototype.getBinaryvalue = function() { +proto.v1.PAnnotationValue.prototype.getBinaryvalue = function() { return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 7, "")); }; @@ -1840,7 +1840,7 @@ proto.PAnnotationValue.prototype.getBinaryvalue = function() { * This is a type-conversion wrapper around `getBinaryvalue()` * @return {string} */ -proto.PAnnotationValue.prototype.getBinaryvalue_asB64 = function() { +proto.v1.PAnnotationValue.prototype.getBinaryvalue_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( this.getBinaryvalue())); }; @@ -1853,7 +1853,7 @@ proto.PAnnotationValue.prototype.getBinaryvalue_asB64 = function() { * This is a type-conversion wrapper around `getBinaryvalue()` * @return {!Uint8Array} */ -proto.PAnnotationValue.prototype.getBinaryvalue_asU8 = function() { +proto.v1.PAnnotationValue.prototype.getBinaryvalue_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( this.getBinaryvalue())); }; @@ -1861,19 +1861,19 @@ proto.PAnnotationValue.prototype.getBinaryvalue_asU8 = function() { /** * @param {!(string|Uint8Array)} value - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.setBinaryvalue = function(value) { - return jspb.Message.setOneofField(this, 7, proto.PAnnotationValue.oneofGroups_[0], value); +proto.v1.PAnnotationValue.prototype.setBinaryvalue = function(value) { + return jspb.Message.setOneofField(this, 7, proto.v1.PAnnotationValue.oneofGroups_[0], value); }; /** * Clears the field making it undefined. - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.clearBinaryvalue = function() { - return jspb.Message.setOneofField(this, 7, proto.PAnnotationValue.oneofGroups_[0], undefined); +proto.v1.PAnnotationValue.prototype.clearBinaryvalue = function() { + return jspb.Message.setOneofField(this, 7, proto.v1.PAnnotationValue.oneofGroups_[0], undefined); }; @@ -1881,7 +1881,7 @@ proto.PAnnotationValue.prototype.clearBinaryvalue = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PAnnotationValue.prototype.hasBinaryvalue = function() { +proto.v1.PAnnotationValue.prototype.hasBinaryvalue = function() { return jspb.Message.getField(this, 7) != null; }; @@ -1890,26 +1890,26 @@ proto.PAnnotationValue.prototype.hasBinaryvalue = function() { * optional sint32 byteValue = 8; * @return {number} */ -proto.PAnnotationValue.prototype.getBytevalue = function() { +proto.v1.PAnnotationValue.prototype.getBytevalue = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 8, 0)); }; /** * @param {number} value - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.setBytevalue = function(value) { - return jspb.Message.setOneofField(this, 8, proto.PAnnotationValue.oneofGroups_[0], value); +proto.v1.PAnnotationValue.prototype.setBytevalue = function(value) { + return jspb.Message.setOneofField(this, 8, proto.v1.PAnnotationValue.oneofGroups_[0], value); }; /** * Clears the field making it undefined. - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.clearBytevalue = function() { - return jspb.Message.setOneofField(this, 8, proto.PAnnotationValue.oneofGroups_[0], undefined); +proto.v1.PAnnotationValue.prototype.clearBytevalue = function() { + return jspb.Message.setOneofField(this, 8, proto.v1.PAnnotationValue.oneofGroups_[0], undefined); }; @@ -1917,35 +1917,35 @@ proto.PAnnotationValue.prototype.clearBytevalue = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PAnnotationValue.prototype.hasBytevalue = function() { +proto.v1.PAnnotationValue.prototype.hasBytevalue = function() { return jspb.Message.getField(this, 8) != null; }; /** * optional PIntStringValue intStringValue = 9; - * @return {?proto.PIntStringValue} + * @return {?proto.v1.PIntStringValue} */ -proto.PAnnotationValue.prototype.getIntstringvalue = function() { - return /** @type{?proto.PIntStringValue} */ ( - jspb.Message.getWrapperField(this, proto.PIntStringValue, 9)); +proto.v1.PAnnotationValue.prototype.getIntstringvalue = function() { + return /** @type{?proto.v1.PIntStringValue} */ ( + jspb.Message.getWrapperField(this, proto.v1.PIntStringValue, 9)); }; /** - * @param {?proto.PIntStringValue|undefined} value - * @return {!proto.PAnnotationValue} returns this + * @param {?proto.v1.PIntStringValue|undefined} value + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.setIntstringvalue = function(value) { - return jspb.Message.setOneofWrapperField(this, 9, proto.PAnnotationValue.oneofGroups_[0], value); +proto.v1.PAnnotationValue.prototype.setIntstringvalue = function(value) { + return jspb.Message.setOneofWrapperField(this, 9, proto.v1.PAnnotationValue.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.clearIntstringvalue = function() { +proto.v1.PAnnotationValue.prototype.clearIntstringvalue = function() { return this.setIntstringvalue(undefined); }; @@ -1954,35 +1954,35 @@ proto.PAnnotationValue.prototype.clearIntstringvalue = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PAnnotationValue.prototype.hasIntstringvalue = function() { +proto.v1.PAnnotationValue.prototype.hasIntstringvalue = function() { return jspb.Message.getField(this, 9) != null; }; /** * optional PStringStringValue stringStringValue = 10; - * @return {?proto.PStringStringValue} + * @return {?proto.v1.PStringStringValue} */ -proto.PAnnotationValue.prototype.getStringstringvalue = function() { - return /** @type{?proto.PStringStringValue} */ ( - jspb.Message.getWrapperField(this, proto.PStringStringValue, 10)); +proto.v1.PAnnotationValue.prototype.getStringstringvalue = function() { + return /** @type{?proto.v1.PStringStringValue} */ ( + jspb.Message.getWrapperField(this, proto.v1.PStringStringValue, 10)); }; /** - * @param {?proto.PStringStringValue|undefined} value - * @return {!proto.PAnnotationValue} returns this + * @param {?proto.v1.PStringStringValue|undefined} value + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.setStringstringvalue = function(value) { - return jspb.Message.setOneofWrapperField(this, 10, proto.PAnnotationValue.oneofGroups_[0], value); +proto.v1.PAnnotationValue.prototype.setStringstringvalue = function(value) { + return jspb.Message.setOneofWrapperField(this, 10, proto.v1.PAnnotationValue.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.clearStringstringvalue = function() { +proto.v1.PAnnotationValue.prototype.clearStringstringvalue = function() { return this.setStringstringvalue(undefined); }; @@ -1991,35 +1991,35 @@ proto.PAnnotationValue.prototype.clearStringstringvalue = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PAnnotationValue.prototype.hasStringstringvalue = function() { +proto.v1.PAnnotationValue.prototype.hasStringstringvalue = function() { return jspb.Message.getField(this, 10) != null; }; /** * optional PIntStringStringValue intStringStringValue = 11; - * @return {?proto.PIntStringStringValue} + * @return {?proto.v1.PIntStringStringValue} */ -proto.PAnnotationValue.prototype.getIntstringstringvalue = function() { - return /** @type{?proto.PIntStringStringValue} */ ( - jspb.Message.getWrapperField(this, proto.PIntStringStringValue, 11)); +proto.v1.PAnnotationValue.prototype.getIntstringstringvalue = function() { + return /** @type{?proto.v1.PIntStringStringValue} */ ( + jspb.Message.getWrapperField(this, proto.v1.PIntStringStringValue, 11)); }; /** - * @param {?proto.PIntStringStringValue|undefined} value - * @return {!proto.PAnnotationValue} returns this + * @param {?proto.v1.PIntStringStringValue|undefined} value + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.setIntstringstringvalue = function(value) { - return jspb.Message.setOneofWrapperField(this, 11, proto.PAnnotationValue.oneofGroups_[0], value); +proto.v1.PAnnotationValue.prototype.setIntstringstringvalue = function(value) { + return jspb.Message.setOneofWrapperField(this, 11, proto.v1.PAnnotationValue.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.clearIntstringstringvalue = function() { +proto.v1.PAnnotationValue.prototype.clearIntstringstringvalue = function() { return this.setIntstringstringvalue(undefined); }; @@ -2028,35 +2028,35 @@ proto.PAnnotationValue.prototype.clearIntstringstringvalue = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PAnnotationValue.prototype.hasIntstringstringvalue = function() { +proto.v1.PAnnotationValue.prototype.hasIntstringstringvalue = function() { return jspb.Message.getField(this, 11) != null; }; /** * optional PLongIntIntByteByteStringValue longIntIntByteByteStringValue = 12; - * @return {?proto.PLongIntIntByteByteStringValue} + * @return {?proto.v1.PLongIntIntByteByteStringValue} */ -proto.PAnnotationValue.prototype.getLongintintbytebytestringvalue = function() { - return /** @type{?proto.PLongIntIntByteByteStringValue} */ ( - jspb.Message.getWrapperField(this, proto.PLongIntIntByteByteStringValue, 12)); +proto.v1.PAnnotationValue.prototype.getLongintintbytebytestringvalue = function() { + return /** @type{?proto.v1.PLongIntIntByteByteStringValue} */ ( + jspb.Message.getWrapperField(this, proto.v1.PLongIntIntByteByteStringValue, 12)); }; /** - * @param {?proto.PLongIntIntByteByteStringValue|undefined} value - * @return {!proto.PAnnotationValue} returns this + * @param {?proto.v1.PLongIntIntByteByteStringValue|undefined} value + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.setLongintintbytebytestringvalue = function(value) { - return jspb.Message.setOneofWrapperField(this, 12, proto.PAnnotationValue.oneofGroups_[0], value); +proto.v1.PAnnotationValue.prototype.setLongintintbytebytestringvalue = function(value) { + return jspb.Message.setOneofWrapperField(this, 12, proto.v1.PAnnotationValue.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.clearLongintintbytebytestringvalue = function() { +proto.v1.PAnnotationValue.prototype.clearLongintintbytebytestringvalue = function() { return this.setLongintintbytebytestringvalue(undefined); }; @@ -2065,35 +2065,35 @@ proto.PAnnotationValue.prototype.clearLongintintbytebytestringvalue = function() * Returns whether this field is set. * @return {boolean} */ -proto.PAnnotationValue.prototype.hasLongintintbytebytestringvalue = function() { +proto.v1.PAnnotationValue.prototype.hasLongintintbytebytestringvalue = function() { return jspb.Message.getField(this, 12) != null; }; /** * optional PIntBooleanIntBooleanValue intBooleanIntBooleanValue = 13; - * @return {?proto.PIntBooleanIntBooleanValue} + * @return {?proto.v1.PIntBooleanIntBooleanValue} */ -proto.PAnnotationValue.prototype.getIntbooleanintbooleanvalue = function() { - return /** @type{?proto.PIntBooleanIntBooleanValue} */ ( - jspb.Message.getWrapperField(this, proto.PIntBooleanIntBooleanValue, 13)); +proto.v1.PAnnotationValue.prototype.getIntbooleanintbooleanvalue = function() { + return /** @type{?proto.v1.PIntBooleanIntBooleanValue} */ ( + jspb.Message.getWrapperField(this, proto.v1.PIntBooleanIntBooleanValue, 13)); }; /** - * @param {?proto.PIntBooleanIntBooleanValue|undefined} value - * @return {!proto.PAnnotationValue} returns this + * @param {?proto.v1.PIntBooleanIntBooleanValue|undefined} value + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.setIntbooleanintbooleanvalue = function(value) { - return jspb.Message.setOneofWrapperField(this, 13, proto.PAnnotationValue.oneofGroups_[0], value); +proto.v1.PAnnotationValue.prototype.setIntbooleanintbooleanvalue = function(value) { + return jspb.Message.setOneofWrapperField(this, 13, proto.v1.PAnnotationValue.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.PAnnotationValue} returns this + * @return {!proto.v1.PAnnotationValue} returns this */ -proto.PAnnotationValue.prototype.clearIntbooleanintbooleanvalue = function() { +proto.v1.PAnnotationValue.prototype.clearIntbooleanintbooleanvalue = function() { return this.setIntbooleanintbooleanvalue(undefined); }; @@ -2102,7 +2102,7 @@ proto.PAnnotationValue.prototype.clearIntbooleanintbooleanvalue = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PAnnotationValue.prototype.hasIntbooleanintbooleanvalue = function() { +proto.v1.PAnnotationValue.prototype.hasIntbooleanintbooleanvalue = function() { return jspb.Message.getField(this, 13) != null; }; @@ -2123,8 +2123,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.PAnnotation.prototype.toObject = function(opt_includeInstance) { - return proto.PAnnotation.toObject(opt_includeInstance, this); +proto.v1.PAnnotation.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PAnnotation.toObject(opt_includeInstance, this); }; @@ -2133,14 +2133,14 @@ proto.PAnnotation.prototype.toObject = function(opt_includeInstance) { * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.PAnnotation} msg The msg instance to transform. + * @param {!proto.v1.PAnnotation} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.PAnnotation.toObject = function(includeInstance, msg) { +proto.v1.PAnnotation.toObject = function(includeInstance, msg) { var f, obj = { key: jspb.Message.getFieldWithDefault(msg, 1, 0), - value: (f = msg.getValue()) && proto.PAnnotationValue.toObject(includeInstance, f) + value: (f = msg.getValue()) && proto.v1.PAnnotationValue.toObject(includeInstance, f) }; if (includeInstance) { @@ -2154,23 +2154,23 @@ proto.PAnnotation.toObject = function(includeInstance, msg) { /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PAnnotation} + * @return {!proto.v1.PAnnotation} */ -proto.PAnnotation.deserializeBinary = function(bytes) { +proto.v1.PAnnotation.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PAnnotation; - return proto.PAnnotation.deserializeBinaryFromReader(msg, reader); + var msg = new proto.v1.PAnnotation; + return proto.v1.PAnnotation.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.PAnnotation} msg The message object to deserialize into. + * @param {!proto.v1.PAnnotation} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PAnnotation} + * @return {!proto.v1.PAnnotation} */ -proto.PAnnotation.deserializeBinaryFromReader = function(msg, reader) { +proto.v1.PAnnotation.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -2182,8 +2182,8 @@ proto.PAnnotation.deserializeBinaryFromReader = function(msg, reader) { msg.setKey(value); break; case 2: - var value = new proto.PAnnotationValue; - reader.readMessage(value,proto.PAnnotationValue.deserializeBinaryFromReader); + var value = new proto.v1.PAnnotationValue; + reader.readMessage(value,proto.v1.PAnnotationValue.deserializeBinaryFromReader); msg.setValue(value); break; default: @@ -2199,9 +2199,9 @@ proto.PAnnotation.deserializeBinaryFromReader = function(msg, reader) { * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.PAnnotation.prototype.serializeBinary = function() { +proto.v1.PAnnotation.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.PAnnotation.serializeBinaryToWriter(this, writer); + proto.v1.PAnnotation.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2209,11 +2209,11 @@ proto.PAnnotation.prototype.serializeBinary = function() { /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.PAnnotation} message + * @param {!proto.v1.PAnnotation} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.PAnnotation.serializeBinaryToWriter = function(message, writer) { +proto.v1.PAnnotation.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getKey(); if (f !== 0) { @@ -2227,7 +2227,7 @@ proto.PAnnotation.serializeBinaryToWriter = function(message, writer) { writer.writeMessage( 2, f, - proto.PAnnotationValue.serializeBinaryToWriter + proto.v1.PAnnotationValue.serializeBinaryToWriter ); } }; @@ -2237,44 +2237,44 @@ proto.PAnnotation.serializeBinaryToWriter = function(message, writer) { * optional int32 key = 1; * @return {number} */ -proto.PAnnotation.prototype.getKey = function() { +proto.v1.PAnnotation.prototype.getKey = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.PAnnotation} returns this + * @return {!proto.v1.PAnnotation} returns this */ -proto.PAnnotation.prototype.setKey = function(value) { +proto.v1.PAnnotation.prototype.setKey = function(value) { return jspb.Message.setProto3IntField(this, 1, value); }; /** * optional PAnnotationValue value = 2; - * @return {?proto.PAnnotationValue} + * @return {?proto.v1.PAnnotationValue} */ -proto.PAnnotation.prototype.getValue = function() { - return /** @type{?proto.PAnnotationValue} */ ( - jspb.Message.getWrapperField(this, proto.PAnnotationValue, 2)); +proto.v1.PAnnotation.prototype.getValue = function() { + return /** @type{?proto.v1.PAnnotationValue} */ ( + jspb.Message.getWrapperField(this, proto.v1.PAnnotationValue, 2)); }; /** - * @param {?proto.PAnnotationValue|undefined} value - * @return {!proto.PAnnotation} returns this + * @param {?proto.v1.PAnnotationValue|undefined} value + * @return {!proto.v1.PAnnotation} returns this */ -proto.PAnnotation.prototype.setValue = function(value) { +proto.v1.PAnnotation.prototype.setValue = function(value) { return jspb.Message.setWrapperField(this, 2, value); }; /** * Clears the message field making it undefined. - * @return {!proto.PAnnotation} returns this + * @return {!proto.v1.PAnnotation} returns this */ -proto.PAnnotation.prototype.clearValue = function() { +proto.v1.PAnnotation.prototype.clearValue = function() { return this.setValue(undefined); }; @@ -2283,9 +2283,9 @@ proto.PAnnotation.prototype.clearValue = function() { * Returns whether this field is set. * @return {boolean} */ -proto.PAnnotation.prototype.hasValue = function() { +proto.v1.PAnnotation.prototype.hasValue = function() { return jspb.Message.getField(this, 2) != null; }; -goog.object.extend(exports, proto); +goog.object.extend(exports, proto.v1); diff --git a/lib/data/grpc/Cmd_grpc_pb.js b/lib/data/v1/Cmd_grpc_pb.js similarity index 100% rename from lib/data/grpc/Cmd_grpc_pb.js rename to lib/data/v1/Cmd_grpc_pb.js diff --git a/lib/data/grpc/Cmd_pb.js b/lib/data/v1/Cmd_pb.js similarity index 99% rename from lib/data/grpc/Cmd_pb.js rename to lib/data/v1/Cmd_pb.js index d8fafc3d..d7b9fbb5 100644 --- a/lib/data/grpc/Cmd_pb.js +++ b/lib/data/v1/Cmd_pb.js @@ -1,4 +1,4 @@ -// source: Cmd.proto +// source: v1/Cmd.proto /** * @fileoverview * @enhanceable @@ -16,8 +16,8 @@ var global = Function('return this')(); var google_protobuf_wrappers_pb = require('google-protobuf/google/protobuf/wrappers_pb.js'); goog.object.extend(proto, google_protobuf_wrappers_pb); -var ThreadDump_pb = require('./ThreadDump_pb.js'); -goog.object.extend(proto, ThreadDump_pb); +var v1_ThreadDump_pb = require('../v1/ThreadDump_pb.js'); +goog.object.extend(proto, v1_ThreadDump_pb); goog.exportSymbol('proto.v1.PCmdActiveThreadCount', null, global); goog.exportSymbol('proto.v1.PCmdActiveThreadCountRes', null, global); goog.exportSymbol('proto.v1.PCmdActiveThreadDump', null, global); @@ -2066,7 +2066,7 @@ proto.v1.PCmdActiveThreadDumpRes.toObject = function(includeInstance, msg) { var f, obj = { commonresponse: (f = msg.getCommonresponse()) && proto.v1.PCmdResponse.toObject(includeInstance, f), threaddumpList: jspb.Message.toObjectList(msg.getThreaddumpList(), - ThreadDump_pb.PActiveThreadDump.toObject, includeInstance), + v1_ThreadDump_pb.PActiveThreadDump.toObject, includeInstance), type: jspb.Message.getFieldWithDefault(msg, 3, ""), subtype: jspb.Message.getFieldWithDefault(msg, 4, ""), version: jspb.Message.getFieldWithDefault(msg, 5, "") @@ -2112,8 +2112,8 @@ proto.v1.PCmdActiveThreadDumpRes.deserializeBinaryFromReader = function(msg, rea msg.setCommonresponse(value); break; case 2: - var value = new ThreadDump_pb.PActiveThreadDump; - reader.readMessage(value,ThreadDump_pb.PActiveThreadDump.deserializeBinaryFromReader); + var value = new v1_ThreadDump_pb.PActiveThreadDump; + reader.readMessage(value,v1_ThreadDump_pb.PActiveThreadDump.deserializeBinaryFromReader); msg.addThreaddump(value); break; case 3: @@ -2170,7 +2170,7 @@ proto.v1.PCmdActiveThreadDumpRes.serializeBinaryToWriter = function(message, wri writer.writeRepeatedMessage( 2, f, - ThreadDump_pb.PActiveThreadDump.serializeBinaryToWriter + v1_ThreadDump_pb.PActiveThreadDump.serializeBinaryToWriter ); } f = message.getType(); @@ -2240,7 +2240,7 @@ proto.v1.PCmdActiveThreadDumpRes.prototype.hasCommonresponse = function() { */ proto.v1.PCmdActiveThreadDumpRes.prototype.getThreaddumpList = function() { return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, ThreadDump_pb.PActiveThreadDump, 2)); + jspb.Message.getRepeatedWrapperField(this, v1_ThreadDump_pb.PActiveThreadDump, 2)); }; @@ -2604,7 +2604,7 @@ proto.v1.PCmdActiveThreadLightDumpRes.toObject = function(includeInstance, msg) var f, obj = { commonresponse: (f = msg.getCommonresponse()) && proto.v1.PCmdResponse.toObject(includeInstance, f), threaddumpList: jspb.Message.toObjectList(msg.getThreaddumpList(), - ThreadDump_pb.PActiveThreadLightDump.toObject, includeInstance), + v1_ThreadDump_pb.PActiveThreadLightDump.toObject, includeInstance), type: jspb.Message.getFieldWithDefault(msg, 3, ""), subtype: jspb.Message.getFieldWithDefault(msg, 4, ""), version: jspb.Message.getFieldWithDefault(msg, 5, "") @@ -2650,8 +2650,8 @@ proto.v1.PCmdActiveThreadLightDumpRes.deserializeBinaryFromReader = function(msg msg.setCommonresponse(value); break; case 2: - var value = new ThreadDump_pb.PActiveThreadLightDump; - reader.readMessage(value,ThreadDump_pb.PActiveThreadLightDump.deserializeBinaryFromReader); + var value = new v1_ThreadDump_pb.PActiveThreadLightDump; + reader.readMessage(value,v1_ThreadDump_pb.PActiveThreadLightDump.deserializeBinaryFromReader); msg.addThreaddump(value); break; case 3: @@ -2708,7 +2708,7 @@ proto.v1.PCmdActiveThreadLightDumpRes.serializeBinaryToWriter = function(message writer.writeRepeatedMessage( 2, f, - ThreadDump_pb.PActiveThreadLightDump.serializeBinaryToWriter + v1_ThreadDump_pb.PActiveThreadLightDump.serializeBinaryToWriter ); } f = message.getType(); @@ -2778,7 +2778,7 @@ proto.v1.PCmdActiveThreadLightDumpRes.prototype.hasCommonresponse = function() { */ proto.v1.PCmdActiveThreadLightDumpRes.prototype.getThreaddumpList = function() { return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, ThreadDump_pb.PActiveThreadLightDump, 2)); + jspb.Message.getRepeatedWrapperField(this, v1_ThreadDump_pb.PActiveThreadLightDump, 2)); }; diff --git a/lib/data/grpc/Span_grpc_pb.js b/lib/data/v1/CustomMetric_grpc_pb.js similarity index 100% rename from lib/data/grpc/Span_grpc_pb.js rename to lib/data/v1/CustomMetric_grpc_pb.js diff --git a/lib/data/v1/CustomMetric_pb.js b/lib/data/v1/CustomMetric_pb.js new file mode 100644 index 00000000..5a9ff715 --- /dev/null +++ b/lib/data/v1/CustomMetric_pb.js @@ -0,0 +1,2314 @@ +// source: v1/CustomMetric.proto +/** + * @fileoverview + * @enhanceable + * @suppress {messageConventions} JS Compiler reports an error if a variable or + * field starts with 'MSG_' and isn't a translatable message. + * @public + */ +// GENERATED CODE -- DO NOT EDIT! +/* eslint-disable */ +// @ts-nocheck + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = Function('return this')(); + +goog.exportSymbol('proto.v1.PCustomMetric', null, global); +goog.exportSymbol('proto.v1.PCustomMetric.FieldCase', null, global); +goog.exportSymbol('proto.v1.PCustomMetricMessage', null, global); +goog.exportSymbol('proto.v1.PDoubleValue', null, global); +goog.exportSymbol('proto.v1.PDouleGaugeMetric', null, global); +goog.exportSymbol('proto.v1.PIntCountMetric', null, global); +goog.exportSymbol('proto.v1.PIntGaugeMetric', null, global); +goog.exportSymbol('proto.v1.PIntValue', null, global); +goog.exportSymbol('proto.v1.PLongCountMetric', null, global); +goog.exportSymbol('proto.v1.PLongGaugeMetric', null, global); +goog.exportSymbol('proto.v1.PLongValue', null, global); +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.v1.PCustomMetricMessage = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.v1.PCustomMetricMessage.repeatedFields_, null); +}; +goog.inherits(proto.v1.PCustomMetricMessage, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.v1.PCustomMetricMessage.displayName = 'proto.v1.PCustomMetricMessage'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.v1.PCustomMetric = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.v1.PCustomMetric.oneofGroups_); +}; +goog.inherits(proto.v1.PCustomMetric, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.v1.PCustomMetric.displayName = 'proto.v1.PCustomMetric'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.v1.PIntCountMetric = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.v1.PIntCountMetric.repeatedFields_, null); +}; +goog.inherits(proto.v1.PIntCountMetric, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.v1.PIntCountMetric.displayName = 'proto.v1.PIntCountMetric'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.v1.PLongCountMetric = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.v1.PLongCountMetric.repeatedFields_, null); +}; +goog.inherits(proto.v1.PLongCountMetric, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.v1.PLongCountMetric.displayName = 'proto.v1.PLongCountMetric'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.v1.PIntGaugeMetric = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.v1.PIntGaugeMetric.repeatedFields_, null); +}; +goog.inherits(proto.v1.PIntGaugeMetric, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.v1.PIntGaugeMetric.displayName = 'proto.v1.PIntGaugeMetric'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.v1.PLongGaugeMetric = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.v1.PLongGaugeMetric.repeatedFields_, null); +}; +goog.inherits(proto.v1.PLongGaugeMetric, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.v1.PLongGaugeMetric.displayName = 'proto.v1.PLongGaugeMetric'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.v1.PDouleGaugeMetric = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.v1.PDouleGaugeMetric.repeatedFields_, null); +}; +goog.inherits(proto.v1.PDouleGaugeMetric, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.v1.PDouleGaugeMetric.displayName = 'proto.v1.PDouleGaugeMetric'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.v1.PIntValue = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.v1.PIntValue, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.v1.PIntValue.displayName = 'proto.v1.PIntValue'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.v1.PLongValue = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.v1.PLongValue, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.v1.PLongValue.displayName = 'proto.v1.PLongValue'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.v1.PDoubleValue = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.v1.PDoubleValue, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.v1.PDoubleValue.displayName = 'proto.v1.PDoubleValue'; +} + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.v1.PCustomMetricMessage.repeatedFields_ = [1,2,3]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.v1.PCustomMetricMessage.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PCustomMetricMessage.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.v1.PCustomMetricMessage} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PCustomMetricMessage.toObject = function(includeInstance, msg) { + var f, obj = { + timestampList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f, + collectintervalList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f, + custommetricsList: jspb.Message.toObjectList(msg.getCustommetricsList(), + proto.v1.PCustomMetric.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.v1.PCustomMetricMessage} + */ +proto.v1.PCustomMetricMessage.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.v1.PCustomMetricMessage; + return proto.v1.PCustomMetricMessage.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.v1.PCustomMetricMessage} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.v1.PCustomMetricMessage} + */ +proto.v1.PCustomMetricMessage.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var values = /** @type {!Array} */ (reader.isDelimited() ? reader.readPackedInt64() : [reader.readInt64()]); + for (var i = 0; i < values.length; i++) { + msg.addTimestamp(values[i]); + } + break; + case 2: + var values = /** @type {!Array} */ (reader.isDelimited() ? reader.readPackedInt64() : [reader.readInt64()]); + for (var i = 0; i < values.length; i++) { + msg.addCollectinterval(values[i]); + } + break; + case 3: + var value = new proto.v1.PCustomMetric; + reader.readMessage(value,proto.v1.PCustomMetric.deserializeBinaryFromReader); + msg.addCustommetrics(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.v1.PCustomMetricMessage.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.v1.PCustomMetricMessage.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.v1.PCustomMetricMessage} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PCustomMetricMessage.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTimestampList(); + if (f.length > 0) { + writer.writePackedInt64( + 1, + f + ); + } + f = message.getCollectintervalList(); + if (f.length > 0) { + writer.writePackedInt64( + 2, + f + ); + } + f = message.getCustommetricsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.v1.PCustomMetric.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated int64 timestamp = 1; + * @return {!Array} + */ +proto.v1.PCustomMetricMessage.prototype.getTimestampList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * @param {!Array} value + * @return {!proto.v1.PCustomMetricMessage} returns this + */ +proto.v1.PCustomMetricMessage.prototype.setTimestampList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {number} value + * @param {number=} opt_index + * @return {!proto.v1.PCustomMetricMessage} returns this + */ +proto.v1.PCustomMetricMessage.prototype.addTimestamp = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.v1.PCustomMetricMessage} returns this + */ +proto.v1.PCustomMetricMessage.prototype.clearTimestampList = function() { + return this.setTimestampList([]); +}; + + +/** + * repeated int64 collectInterval = 2; + * @return {!Array} + */ +proto.v1.PCustomMetricMessage.prototype.getCollectintervalList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 2)); +}; + + +/** + * @param {!Array} value + * @return {!proto.v1.PCustomMetricMessage} returns this + */ +proto.v1.PCustomMetricMessage.prototype.setCollectintervalList = function(value) { + return jspb.Message.setField(this, 2, value || []); +}; + + +/** + * @param {number} value + * @param {number=} opt_index + * @return {!proto.v1.PCustomMetricMessage} returns this + */ +proto.v1.PCustomMetricMessage.prototype.addCollectinterval = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.v1.PCustomMetricMessage} returns this + */ +proto.v1.PCustomMetricMessage.prototype.clearCollectintervalList = function() { + return this.setCollectintervalList([]); +}; + + +/** + * repeated PCustomMetric customMetrics = 3; + * @return {!Array} + */ +proto.v1.PCustomMetricMessage.prototype.getCustommetricsList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.v1.PCustomMetric, 3)); +}; + + +/** + * @param {!Array} value + * @return {!proto.v1.PCustomMetricMessage} returns this +*/ +proto.v1.PCustomMetricMessage.prototype.setCustommetricsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); +}; + + +/** + * @param {!proto.v1.PCustomMetric=} opt_value + * @param {number=} opt_index + * @return {!proto.v1.PCustomMetric} + */ +proto.v1.PCustomMetricMessage.prototype.addCustommetrics = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.v1.PCustomMetric, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.v1.PCustomMetricMessage} returns this + */ +proto.v1.PCustomMetricMessage.prototype.clearCustommetricsList = function() { + return this.setCustommetricsList([]); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.v1.PCustomMetric.oneofGroups_ = [[1,2,3,4,5]]; + +/** + * @enum {number} + */ +proto.v1.PCustomMetric.FieldCase = { + FIELD_NOT_SET: 0, + INTCOUNTMETRIC: 1, + LONGCOUNTMETRIC: 2, + INTGAUGEMETRIC: 3, + LONGGAUGEMETRIC: 4, + DOUBLEGAUGEMETRIC: 5 +}; + +/** + * @return {proto.v1.PCustomMetric.FieldCase} + */ +proto.v1.PCustomMetric.prototype.getFieldCase = function() { + return /** @type {proto.v1.PCustomMetric.FieldCase} */(jspb.Message.computeOneofCase(this, proto.v1.PCustomMetric.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.v1.PCustomMetric.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PCustomMetric.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.v1.PCustomMetric} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PCustomMetric.toObject = function(includeInstance, msg) { + var f, obj = { + intcountmetric: (f = msg.getIntcountmetric()) && proto.v1.PIntCountMetric.toObject(includeInstance, f), + longcountmetric: (f = msg.getLongcountmetric()) && proto.v1.PLongCountMetric.toObject(includeInstance, f), + intgaugemetric: (f = msg.getIntgaugemetric()) && proto.v1.PIntGaugeMetric.toObject(includeInstance, f), + longgaugemetric: (f = msg.getLonggaugemetric()) && proto.v1.PLongGaugeMetric.toObject(includeInstance, f), + doublegaugemetric: (f = msg.getDoublegaugemetric()) && proto.v1.PDouleGaugeMetric.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.v1.PCustomMetric} + */ +proto.v1.PCustomMetric.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.v1.PCustomMetric; + return proto.v1.PCustomMetric.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.v1.PCustomMetric} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.v1.PCustomMetric} + */ +proto.v1.PCustomMetric.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.v1.PIntCountMetric; + reader.readMessage(value,proto.v1.PIntCountMetric.deserializeBinaryFromReader); + msg.setIntcountmetric(value); + break; + case 2: + var value = new proto.v1.PLongCountMetric; + reader.readMessage(value,proto.v1.PLongCountMetric.deserializeBinaryFromReader); + msg.setLongcountmetric(value); + break; + case 3: + var value = new proto.v1.PIntGaugeMetric; + reader.readMessage(value,proto.v1.PIntGaugeMetric.deserializeBinaryFromReader); + msg.setIntgaugemetric(value); + break; + case 4: + var value = new proto.v1.PLongGaugeMetric; + reader.readMessage(value,proto.v1.PLongGaugeMetric.deserializeBinaryFromReader); + msg.setLonggaugemetric(value); + break; + case 5: + var value = new proto.v1.PDouleGaugeMetric; + reader.readMessage(value,proto.v1.PDouleGaugeMetric.deserializeBinaryFromReader); + msg.setDoublegaugemetric(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.v1.PCustomMetric.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.v1.PCustomMetric.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.v1.PCustomMetric} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PCustomMetric.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIntcountmetric(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.v1.PIntCountMetric.serializeBinaryToWriter + ); + } + f = message.getLongcountmetric(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.v1.PLongCountMetric.serializeBinaryToWriter + ); + } + f = message.getIntgaugemetric(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.v1.PIntGaugeMetric.serializeBinaryToWriter + ); + } + f = message.getLonggaugemetric(); + if (f != null) { + writer.writeMessage( + 4, + f, + proto.v1.PLongGaugeMetric.serializeBinaryToWriter + ); + } + f = message.getDoublegaugemetric(); + if (f != null) { + writer.writeMessage( + 5, + f, + proto.v1.PDouleGaugeMetric.serializeBinaryToWriter + ); + } +}; + + +/** + * optional PIntCountMetric intCountMetric = 1; + * @return {?proto.v1.PIntCountMetric} + */ +proto.v1.PCustomMetric.prototype.getIntcountmetric = function() { + return /** @type{?proto.v1.PIntCountMetric} */ ( + jspb.Message.getWrapperField(this, proto.v1.PIntCountMetric, 1)); +}; + + +/** + * @param {?proto.v1.PIntCountMetric|undefined} value + * @return {!proto.v1.PCustomMetric} returns this +*/ +proto.v1.PCustomMetric.prototype.setIntcountmetric = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.v1.PCustomMetric.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.v1.PCustomMetric} returns this + */ +proto.v1.PCustomMetric.prototype.clearIntcountmetric = function() { + return this.setIntcountmetric(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.v1.PCustomMetric.prototype.hasIntcountmetric = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional PLongCountMetric longCountMetric = 2; + * @return {?proto.v1.PLongCountMetric} + */ +proto.v1.PCustomMetric.prototype.getLongcountmetric = function() { + return /** @type{?proto.v1.PLongCountMetric} */ ( + jspb.Message.getWrapperField(this, proto.v1.PLongCountMetric, 2)); +}; + + +/** + * @param {?proto.v1.PLongCountMetric|undefined} value + * @return {!proto.v1.PCustomMetric} returns this +*/ +proto.v1.PCustomMetric.prototype.setLongcountmetric = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.v1.PCustomMetric.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.v1.PCustomMetric} returns this + */ +proto.v1.PCustomMetric.prototype.clearLongcountmetric = function() { + return this.setLongcountmetric(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.v1.PCustomMetric.prototype.hasLongcountmetric = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional PIntGaugeMetric intGaugeMetric = 3; + * @return {?proto.v1.PIntGaugeMetric} + */ +proto.v1.PCustomMetric.prototype.getIntgaugemetric = function() { + return /** @type{?proto.v1.PIntGaugeMetric} */ ( + jspb.Message.getWrapperField(this, proto.v1.PIntGaugeMetric, 3)); +}; + + +/** + * @param {?proto.v1.PIntGaugeMetric|undefined} value + * @return {!proto.v1.PCustomMetric} returns this +*/ +proto.v1.PCustomMetric.prototype.setIntgaugemetric = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.v1.PCustomMetric.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.v1.PCustomMetric} returns this + */ +proto.v1.PCustomMetric.prototype.clearIntgaugemetric = function() { + return this.setIntgaugemetric(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.v1.PCustomMetric.prototype.hasIntgaugemetric = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional PLongGaugeMetric longGaugeMetric = 4; + * @return {?proto.v1.PLongGaugeMetric} + */ +proto.v1.PCustomMetric.prototype.getLonggaugemetric = function() { + return /** @type{?proto.v1.PLongGaugeMetric} */ ( + jspb.Message.getWrapperField(this, proto.v1.PLongGaugeMetric, 4)); +}; + + +/** + * @param {?proto.v1.PLongGaugeMetric|undefined} value + * @return {!proto.v1.PCustomMetric} returns this +*/ +proto.v1.PCustomMetric.prototype.setLonggaugemetric = function(value) { + return jspb.Message.setOneofWrapperField(this, 4, proto.v1.PCustomMetric.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.v1.PCustomMetric} returns this + */ +proto.v1.PCustomMetric.prototype.clearLonggaugemetric = function() { + return this.setLonggaugemetric(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.v1.PCustomMetric.prototype.hasLonggaugemetric = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional PDouleGaugeMetric doubleGaugeMetric = 5; + * @return {?proto.v1.PDouleGaugeMetric} + */ +proto.v1.PCustomMetric.prototype.getDoublegaugemetric = function() { + return /** @type{?proto.v1.PDouleGaugeMetric} */ ( + jspb.Message.getWrapperField(this, proto.v1.PDouleGaugeMetric, 5)); +}; + + +/** + * @param {?proto.v1.PDouleGaugeMetric|undefined} value + * @return {!proto.v1.PCustomMetric} returns this +*/ +proto.v1.PCustomMetric.prototype.setDoublegaugemetric = function(value) { + return jspb.Message.setOneofWrapperField(this, 5, proto.v1.PCustomMetric.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.v1.PCustomMetric} returns this + */ +proto.v1.PCustomMetric.prototype.clearDoublegaugemetric = function() { + return this.setDoublegaugemetric(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.v1.PCustomMetric.prototype.hasDoublegaugemetric = function() { + return jspb.Message.getField(this, 5) != null; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.v1.PIntCountMetric.repeatedFields_ = [2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.v1.PIntCountMetric.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PIntCountMetric.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.v1.PIntCountMetric} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PIntCountMetric.toObject = function(includeInstance, msg) { + var f, obj = { + name: jspb.Message.getFieldWithDefault(msg, 1, ""), + valuesList: jspb.Message.toObjectList(msg.getValuesList(), + proto.v1.PIntValue.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.v1.PIntCountMetric} + */ +proto.v1.PIntCountMetric.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.v1.PIntCountMetric; + return proto.v1.PIntCountMetric.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.v1.PIntCountMetric} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.v1.PIntCountMetric} + */ +proto.v1.PIntCountMetric.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 2: + var value = new proto.v1.PIntValue; + reader.readMessage(value,proto.v1.PIntValue.deserializeBinaryFromReader); + msg.addValues(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.v1.PIntCountMetric.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.v1.PIntCountMetric.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.v1.PIntCountMetric} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PIntCountMetric.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getValuesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + proto.v1.PIntValue.serializeBinaryToWriter + ); + } +}; + + +/** + * optional string name = 1; + * @return {string} + */ +proto.v1.PIntCountMetric.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.v1.PIntCountMetric} returns this + */ +proto.v1.PIntCountMetric.prototype.setName = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * repeated PIntValue values = 2; + * @return {!Array} + */ +proto.v1.PIntCountMetric.prototype.getValuesList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.v1.PIntValue, 2)); +}; + + +/** + * @param {!Array} value + * @return {!proto.v1.PIntCountMetric} returns this +*/ +proto.v1.PIntCountMetric.prototype.setValuesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); +}; + + +/** + * @param {!proto.v1.PIntValue=} opt_value + * @param {number=} opt_index + * @return {!proto.v1.PIntValue} + */ +proto.v1.PIntCountMetric.prototype.addValues = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.v1.PIntValue, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.v1.PIntCountMetric} returns this + */ +proto.v1.PIntCountMetric.prototype.clearValuesList = function() { + return this.setValuesList([]); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.v1.PLongCountMetric.repeatedFields_ = [2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.v1.PLongCountMetric.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PLongCountMetric.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.v1.PLongCountMetric} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PLongCountMetric.toObject = function(includeInstance, msg) { + var f, obj = { + name: jspb.Message.getFieldWithDefault(msg, 1, ""), + valuesList: jspb.Message.toObjectList(msg.getValuesList(), + proto.v1.PLongValue.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.v1.PLongCountMetric} + */ +proto.v1.PLongCountMetric.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.v1.PLongCountMetric; + return proto.v1.PLongCountMetric.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.v1.PLongCountMetric} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.v1.PLongCountMetric} + */ +proto.v1.PLongCountMetric.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 2: + var value = new proto.v1.PLongValue; + reader.readMessage(value,proto.v1.PLongValue.deserializeBinaryFromReader); + msg.addValues(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.v1.PLongCountMetric.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.v1.PLongCountMetric.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.v1.PLongCountMetric} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PLongCountMetric.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getValuesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + proto.v1.PLongValue.serializeBinaryToWriter + ); + } +}; + + +/** + * optional string name = 1; + * @return {string} + */ +proto.v1.PLongCountMetric.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.v1.PLongCountMetric} returns this + */ +proto.v1.PLongCountMetric.prototype.setName = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * repeated PLongValue values = 2; + * @return {!Array} + */ +proto.v1.PLongCountMetric.prototype.getValuesList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.v1.PLongValue, 2)); +}; + + +/** + * @param {!Array} value + * @return {!proto.v1.PLongCountMetric} returns this +*/ +proto.v1.PLongCountMetric.prototype.setValuesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); +}; + + +/** + * @param {!proto.v1.PLongValue=} opt_value + * @param {number=} opt_index + * @return {!proto.v1.PLongValue} + */ +proto.v1.PLongCountMetric.prototype.addValues = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.v1.PLongValue, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.v1.PLongCountMetric} returns this + */ +proto.v1.PLongCountMetric.prototype.clearValuesList = function() { + return this.setValuesList([]); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.v1.PIntGaugeMetric.repeatedFields_ = [2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.v1.PIntGaugeMetric.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PIntGaugeMetric.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.v1.PIntGaugeMetric} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PIntGaugeMetric.toObject = function(includeInstance, msg) { + var f, obj = { + name: jspb.Message.getFieldWithDefault(msg, 1, ""), + valuesList: jspb.Message.toObjectList(msg.getValuesList(), + proto.v1.PIntValue.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.v1.PIntGaugeMetric} + */ +proto.v1.PIntGaugeMetric.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.v1.PIntGaugeMetric; + return proto.v1.PIntGaugeMetric.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.v1.PIntGaugeMetric} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.v1.PIntGaugeMetric} + */ +proto.v1.PIntGaugeMetric.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 2: + var value = new proto.v1.PIntValue; + reader.readMessage(value,proto.v1.PIntValue.deserializeBinaryFromReader); + msg.addValues(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.v1.PIntGaugeMetric.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.v1.PIntGaugeMetric.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.v1.PIntGaugeMetric} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PIntGaugeMetric.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getValuesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + proto.v1.PIntValue.serializeBinaryToWriter + ); + } +}; + + +/** + * optional string name = 1; + * @return {string} + */ +proto.v1.PIntGaugeMetric.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.v1.PIntGaugeMetric} returns this + */ +proto.v1.PIntGaugeMetric.prototype.setName = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * repeated PIntValue values = 2; + * @return {!Array} + */ +proto.v1.PIntGaugeMetric.prototype.getValuesList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.v1.PIntValue, 2)); +}; + + +/** + * @param {!Array} value + * @return {!proto.v1.PIntGaugeMetric} returns this +*/ +proto.v1.PIntGaugeMetric.prototype.setValuesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); +}; + + +/** + * @param {!proto.v1.PIntValue=} opt_value + * @param {number=} opt_index + * @return {!proto.v1.PIntValue} + */ +proto.v1.PIntGaugeMetric.prototype.addValues = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.v1.PIntValue, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.v1.PIntGaugeMetric} returns this + */ +proto.v1.PIntGaugeMetric.prototype.clearValuesList = function() { + return this.setValuesList([]); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.v1.PLongGaugeMetric.repeatedFields_ = [2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.v1.PLongGaugeMetric.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PLongGaugeMetric.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.v1.PLongGaugeMetric} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PLongGaugeMetric.toObject = function(includeInstance, msg) { + var f, obj = { + name: jspb.Message.getFieldWithDefault(msg, 1, ""), + valuesList: jspb.Message.toObjectList(msg.getValuesList(), + proto.v1.PLongValue.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.v1.PLongGaugeMetric} + */ +proto.v1.PLongGaugeMetric.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.v1.PLongGaugeMetric; + return proto.v1.PLongGaugeMetric.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.v1.PLongGaugeMetric} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.v1.PLongGaugeMetric} + */ +proto.v1.PLongGaugeMetric.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 2: + var value = new proto.v1.PLongValue; + reader.readMessage(value,proto.v1.PLongValue.deserializeBinaryFromReader); + msg.addValues(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.v1.PLongGaugeMetric.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.v1.PLongGaugeMetric.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.v1.PLongGaugeMetric} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PLongGaugeMetric.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getValuesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + proto.v1.PLongValue.serializeBinaryToWriter + ); + } +}; + + +/** + * optional string name = 1; + * @return {string} + */ +proto.v1.PLongGaugeMetric.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.v1.PLongGaugeMetric} returns this + */ +proto.v1.PLongGaugeMetric.prototype.setName = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * repeated PLongValue values = 2; + * @return {!Array} + */ +proto.v1.PLongGaugeMetric.prototype.getValuesList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.v1.PLongValue, 2)); +}; + + +/** + * @param {!Array} value + * @return {!proto.v1.PLongGaugeMetric} returns this +*/ +proto.v1.PLongGaugeMetric.prototype.setValuesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); +}; + + +/** + * @param {!proto.v1.PLongValue=} opt_value + * @param {number=} opt_index + * @return {!proto.v1.PLongValue} + */ +proto.v1.PLongGaugeMetric.prototype.addValues = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.v1.PLongValue, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.v1.PLongGaugeMetric} returns this + */ +proto.v1.PLongGaugeMetric.prototype.clearValuesList = function() { + return this.setValuesList([]); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.v1.PDouleGaugeMetric.repeatedFields_ = [2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.v1.PDouleGaugeMetric.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PDouleGaugeMetric.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.v1.PDouleGaugeMetric} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PDouleGaugeMetric.toObject = function(includeInstance, msg) { + var f, obj = { + name: jspb.Message.getFieldWithDefault(msg, 1, ""), + valuesList: jspb.Message.toObjectList(msg.getValuesList(), + proto.v1.PDoubleValue.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.v1.PDouleGaugeMetric} + */ +proto.v1.PDouleGaugeMetric.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.v1.PDouleGaugeMetric; + return proto.v1.PDouleGaugeMetric.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.v1.PDouleGaugeMetric} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.v1.PDouleGaugeMetric} + */ +proto.v1.PDouleGaugeMetric.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 2: + var value = new proto.v1.PDoubleValue; + reader.readMessage(value,proto.v1.PDoubleValue.deserializeBinaryFromReader); + msg.addValues(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.v1.PDouleGaugeMetric.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.v1.PDouleGaugeMetric.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.v1.PDouleGaugeMetric} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PDouleGaugeMetric.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getValuesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + proto.v1.PDoubleValue.serializeBinaryToWriter + ); + } +}; + + +/** + * optional string name = 1; + * @return {string} + */ +proto.v1.PDouleGaugeMetric.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.v1.PDouleGaugeMetric} returns this + */ +proto.v1.PDouleGaugeMetric.prototype.setName = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * repeated PDoubleValue values = 2; + * @return {!Array} + */ +proto.v1.PDouleGaugeMetric.prototype.getValuesList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.v1.PDoubleValue, 2)); +}; + + +/** + * @param {!Array} value + * @return {!proto.v1.PDouleGaugeMetric} returns this +*/ +proto.v1.PDouleGaugeMetric.prototype.setValuesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); +}; + + +/** + * @param {!proto.v1.PDoubleValue=} opt_value + * @param {number=} opt_index + * @return {!proto.v1.PDoubleValue} + */ +proto.v1.PDouleGaugeMetric.prototype.addValues = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.v1.PDoubleValue, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.v1.PDouleGaugeMetric} returns this + */ +proto.v1.PDouleGaugeMetric.prototype.clearValuesList = function() { + return this.setValuesList([]); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.v1.PIntValue.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PIntValue.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.v1.PIntValue} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PIntValue.toObject = function(includeInstance, msg) { + var f, obj = { + value: jspb.Message.getFieldWithDefault(msg, 1, 0), + isnotset: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.v1.PIntValue} + */ +proto.v1.PIntValue.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.v1.PIntValue; + return proto.v1.PIntValue.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.v1.PIntValue} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.v1.PIntValue} + */ +proto.v1.PIntValue.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readInt32()); + msg.setValue(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIsnotset(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.v1.PIntValue.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.v1.PIntValue.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.v1.PIntValue} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PIntValue.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getValue(); + if (f !== 0) { + writer.writeInt32( + 1, + f + ); + } + f = message.getIsnotset(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional int32 value = 1; + * @return {number} + */ +proto.v1.PIntValue.prototype.getValue = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.v1.PIntValue} returns this + */ +proto.v1.PIntValue.prototype.setValue = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional bool isNotSet = 2; + * @return {boolean} + */ +proto.v1.PIntValue.prototype.getIsnotset = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.v1.PIntValue} returns this + */ +proto.v1.PIntValue.prototype.setIsnotset = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.v1.PLongValue.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PLongValue.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.v1.PLongValue} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PLongValue.toObject = function(includeInstance, msg) { + var f, obj = { + value: jspb.Message.getFieldWithDefault(msg, 1, 0), + isnotset: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.v1.PLongValue} + */ +proto.v1.PLongValue.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.v1.PLongValue; + return proto.v1.PLongValue.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.v1.PLongValue} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.v1.PLongValue} + */ +proto.v1.PLongValue.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readInt64()); + msg.setValue(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIsnotset(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.v1.PLongValue.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.v1.PLongValue.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.v1.PLongValue} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PLongValue.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getValue(); + if (f !== 0) { + writer.writeInt64( + 1, + f + ); + } + f = message.getIsnotset(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional int64 value = 1; + * @return {number} + */ +proto.v1.PLongValue.prototype.getValue = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.v1.PLongValue} returns this + */ +proto.v1.PLongValue.prototype.setValue = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional bool isNotSet = 2; + * @return {boolean} + */ +proto.v1.PLongValue.prototype.getIsnotset = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.v1.PLongValue} returns this + */ +proto.v1.PLongValue.prototype.setIsnotset = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.v1.PDoubleValue.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PDoubleValue.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.v1.PDoubleValue} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PDoubleValue.toObject = function(includeInstance, msg) { + var f, obj = { + value: jspb.Message.getFloatingPointFieldWithDefault(msg, 1, 0.0), + isnotset: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.v1.PDoubleValue} + */ +proto.v1.PDoubleValue.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.v1.PDoubleValue; + return proto.v1.PDoubleValue.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.v1.PDoubleValue} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.v1.PDoubleValue} + */ +proto.v1.PDoubleValue.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readDouble()); + msg.setValue(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIsnotset(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.v1.PDoubleValue.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.v1.PDoubleValue.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.v1.PDoubleValue} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PDoubleValue.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getValue(); + if (f !== 0.0) { + writer.writeDouble( + 1, + f + ); + } + f = message.getIsnotset(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional double value = 1; + * @return {number} + */ +proto.v1.PDoubleValue.prototype.getValue = function() { + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 1, 0.0)); +}; + + +/** + * @param {number} value + * @return {!proto.v1.PDoubleValue} returns this + */ +proto.v1.PDoubleValue.prototype.setValue = function(value) { + return jspb.Message.setProto3FloatField(this, 1, value); +}; + + +/** + * optional bool isNotSet = 2; + * @return {boolean} + */ +proto.v1.PDoubleValue.prototype.getIsnotset = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.v1.PDoubleValue} returns this + */ +proto.v1.PDoubleValue.prototype.setIsnotset = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +goog.object.extend(exports, proto.v1); diff --git a/lib/data/grpc/Service_grpc_pb.js b/lib/data/v1/Service_grpc_pb.js similarity index 73% rename from lib/data/grpc/Service_grpc_pb.js rename to lib/data/v1/Service_grpc_pb.js index b99b787e..cea557d7 100644 --- a/lib/data/grpc/Service_grpc_pb.js +++ b/lib/data/v1/Service_grpc_pb.js @@ -3,10 +3,9 @@ 'use strict'; var grpc = require('@grpc/grpc-js'); var google_protobuf_empty_pb = require('google-protobuf/google/protobuf/empty_pb.js'); -var Span_pb = require('./Span_pb.js'); -var Stat_pb = require('./Stat_pb.js'); -var ThreadDump_pb = require('./ThreadDump_pb.js'); -var Cmd_pb = require('./Cmd_pb.js'); +var v1_Span_pb = require('../v1/Span_pb.js'); +var v1_Stat_pb = require('../v1/Stat_pb.js'); +var v1_Cmd_pb = require('../v1/Cmd_pb.js'); function serialize_google_protobuf_Empty(arg) { if (!(arg instanceof google_protobuf_empty_pb.Empty)) { @@ -20,157 +19,157 @@ function deserialize_google_protobuf_Empty(buffer_arg) { } function serialize_v1_PAgentInfo(arg) { - if (!(arg instanceof Stat_pb.PAgentInfo)) { + if (!(arg instanceof v1_Stat_pb.PAgentInfo)) { throw new Error('Expected argument of type v1.PAgentInfo'); } return Buffer.from(arg.serializeBinary()); } function deserialize_v1_PAgentInfo(buffer_arg) { - return Stat_pb.PAgentInfo.deserializeBinary(new Uint8Array(buffer_arg)); + return v1_Stat_pb.PAgentInfo.deserializeBinary(new Uint8Array(buffer_arg)); } function serialize_v1_PApiMetaData(arg) { - if (!(arg instanceof Span_pb.PApiMetaData)) { + if (!(arg instanceof v1_Span_pb.PApiMetaData)) { throw new Error('Expected argument of type v1.PApiMetaData'); } return Buffer.from(arg.serializeBinary()); } function deserialize_v1_PApiMetaData(buffer_arg) { - return Span_pb.PApiMetaData.deserializeBinary(new Uint8Array(buffer_arg)); + return v1_Span_pb.PApiMetaData.deserializeBinary(new Uint8Array(buffer_arg)); } function serialize_v1_PCmdActiveThreadCountRes(arg) { - if (!(arg instanceof Cmd_pb.PCmdActiveThreadCountRes)) { + if (!(arg instanceof v1_Cmd_pb.PCmdActiveThreadCountRes)) { throw new Error('Expected argument of type v1.PCmdActiveThreadCountRes'); } return Buffer.from(arg.serializeBinary()); } function deserialize_v1_PCmdActiveThreadCountRes(buffer_arg) { - return Cmd_pb.PCmdActiveThreadCountRes.deserializeBinary(new Uint8Array(buffer_arg)); + return v1_Cmd_pb.PCmdActiveThreadCountRes.deserializeBinary(new Uint8Array(buffer_arg)); } function serialize_v1_PCmdActiveThreadDumpRes(arg) { - if (!(arg instanceof Cmd_pb.PCmdActiveThreadDumpRes)) { + if (!(arg instanceof v1_Cmd_pb.PCmdActiveThreadDumpRes)) { throw new Error('Expected argument of type v1.PCmdActiveThreadDumpRes'); } return Buffer.from(arg.serializeBinary()); } function deserialize_v1_PCmdActiveThreadDumpRes(buffer_arg) { - return Cmd_pb.PCmdActiveThreadDumpRes.deserializeBinary(new Uint8Array(buffer_arg)); + return v1_Cmd_pb.PCmdActiveThreadDumpRes.deserializeBinary(new Uint8Array(buffer_arg)); } function serialize_v1_PCmdActiveThreadLightDumpRes(arg) { - if (!(arg instanceof Cmd_pb.PCmdActiveThreadLightDumpRes)) { + if (!(arg instanceof v1_Cmd_pb.PCmdActiveThreadLightDumpRes)) { throw new Error('Expected argument of type v1.PCmdActiveThreadLightDumpRes'); } return Buffer.from(arg.serializeBinary()); } function deserialize_v1_PCmdActiveThreadLightDumpRes(buffer_arg) { - return Cmd_pb.PCmdActiveThreadLightDumpRes.deserializeBinary(new Uint8Array(buffer_arg)); + return v1_Cmd_pb.PCmdActiveThreadLightDumpRes.deserializeBinary(new Uint8Array(buffer_arg)); } function serialize_v1_PCmdEchoResponse(arg) { - if (!(arg instanceof Cmd_pb.PCmdEchoResponse)) { + if (!(arg instanceof v1_Cmd_pb.PCmdEchoResponse)) { throw new Error('Expected argument of type v1.PCmdEchoResponse'); } return Buffer.from(arg.serializeBinary()); } function deserialize_v1_PCmdEchoResponse(buffer_arg) { - return Cmd_pb.PCmdEchoResponse.deserializeBinary(new Uint8Array(buffer_arg)); + return v1_Cmd_pb.PCmdEchoResponse.deserializeBinary(new Uint8Array(buffer_arg)); } function serialize_v1_PCmdMessage(arg) { - if (!(arg instanceof Cmd_pb.PCmdMessage)) { + if (!(arg instanceof v1_Cmd_pb.PCmdMessage)) { throw new Error('Expected argument of type v1.PCmdMessage'); } return Buffer.from(arg.serializeBinary()); } function deserialize_v1_PCmdMessage(buffer_arg) { - return Cmd_pb.PCmdMessage.deserializeBinary(new Uint8Array(buffer_arg)); + return v1_Cmd_pb.PCmdMessage.deserializeBinary(new Uint8Array(buffer_arg)); } function serialize_v1_PCmdRequest(arg) { - if (!(arg instanceof Cmd_pb.PCmdRequest)) { + if (!(arg instanceof v1_Cmd_pb.PCmdRequest)) { throw new Error('Expected argument of type v1.PCmdRequest'); } return Buffer.from(arg.serializeBinary()); } function deserialize_v1_PCmdRequest(buffer_arg) { - return Cmd_pb.PCmdRequest.deserializeBinary(new Uint8Array(buffer_arg)); + return v1_Cmd_pb.PCmdRequest.deserializeBinary(new Uint8Array(buffer_arg)); } function serialize_v1_PPing(arg) { - if (!(arg instanceof Stat_pb.PPing)) { + if (!(arg instanceof v1_Stat_pb.PPing)) { throw new Error('Expected argument of type v1.PPing'); } return Buffer.from(arg.serializeBinary()); } function deserialize_v1_PPing(buffer_arg) { - return Stat_pb.PPing.deserializeBinary(new Uint8Array(buffer_arg)); + return v1_Stat_pb.PPing.deserializeBinary(new Uint8Array(buffer_arg)); } function serialize_v1_PResult(arg) { - if (!(arg instanceof Span_pb.PResult)) { + if (!(arg instanceof v1_Span_pb.PResult)) { throw new Error('Expected argument of type v1.PResult'); } return Buffer.from(arg.serializeBinary()); } function deserialize_v1_PResult(buffer_arg) { - return Span_pb.PResult.deserializeBinary(new Uint8Array(buffer_arg)); + return v1_Span_pb.PResult.deserializeBinary(new Uint8Array(buffer_arg)); } function serialize_v1_PSpanMessage(arg) { - if (!(arg instanceof Span_pb.PSpanMessage)) { + if (!(arg instanceof v1_Span_pb.PSpanMessage)) { throw new Error('Expected argument of type v1.PSpanMessage'); } return Buffer.from(arg.serializeBinary()); } function deserialize_v1_PSpanMessage(buffer_arg) { - return Span_pb.PSpanMessage.deserializeBinary(new Uint8Array(buffer_arg)); + return v1_Span_pb.PSpanMessage.deserializeBinary(new Uint8Array(buffer_arg)); } function serialize_v1_PSqlMetaData(arg) { - if (!(arg instanceof Span_pb.PSqlMetaData)) { + if (!(arg instanceof v1_Span_pb.PSqlMetaData)) { throw new Error('Expected argument of type v1.PSqlMetaData'); } return Buffer.from(arg.serializeBinary()); } function deserialize_v1_PSqlMetaData(buffer_arg) { - return Span_pb.PSqlMetaData.deserializeBinary(new Uint8Array(buffer_arg)); + return v1_Span_pb.PSqlMetaData.deserializeBinary(new Uint8Array(buffer_arg)); } function serialize_v1_PStatMessage(arg) { - if (!(arg instanceof Stat_pb.PStatMessage)) { + if (!(arg instanceof v1_Stat_pb.PStatMessage)) { throw new Error('Expected argument of type v1.PStatMessage'); } return Buffer.from(arg.serializeBinary()); } function deserialize_v1_PStatMessage(buffer_arg) { - return Stat_pb.PStatMessage.deserializeBinary(new Uint8Array(buffer_arg)); + return v1_Stat_pb.PStatMessage.deserializeBinary(new Uint8Array(buffer_arg)); } function serialize_v1_PStringMetaData(arg) { - if (!(arg instanceof Span_pb.PStringMetaData)) { + if (!(arg instanceof v1_Span_pb.PStringMetaData)) { throw new Error('Expected argument of type v1.PStringMetaData'); } return Buffer.from(arg.serializeBinary()); } function deserialize_v1_PStringMetaData(buffer_arg) { - return Span_pb.PStringMetaData.deserializeBinary(new Uint8Array(buffer_arg)); + return v1_Span_pb.PStringMetaData.deserializeBinary(new Uint8Array(buffer_arg)); } @@ -179,7 +178,7 @@ var SpanService = exports.SpanService = { path: '/v1.Span/SendSpan', requestStream: true, responseStream: false, - requestType: Span_pb.PSpanMessage, + requestType: v1_Span_pb.PSpanMessage, responseType: google_protobuf_empty_pb.Empty, requestSerialize: serialize_v1_PSpanMessage, requestDeserialize: deserialize_v1_PSpanMessage, @@ -194,8 +193,8 @@ var AgentService = exports.AgentService = { path: '/v1.Agent/RequestAgentInfo', requestStream: false, responseStream: false, - requestType: Stat_pb.PAgentInfo, - responseType: Span_pb.PResult, + requestType: v1_Stat_pb.PAgentInfo, + responseType: v1_Span_pb.PResult, requestSerialize: serialize_v1_PAgentInfo, requestDeserialize: deserialize_v1_PAgentInfo, responseSerialize: serialize_v1_PResult, @@ -205,8 +204,8 @@ var AgentService = exports.AgentService = { path: '/v1.Agent/PingSession', requestStream: true, responseStream: true, - requestType: Stat_pb.PPing, - responseType: Stat_pb.PPing, + requestType: v1_Stat_pb.PPing, + responseType: v1_Stat_pb.PPing, requestSerialize: serialize_v1_PPing, requestDeserialize: deserialize_v1_PPing, responseSerialize: serialize_v1_PPing, @@ -220,8 +219,8 @@ var MetadataService = exports.MetadataService = { path: '/v1.Metadata/RequestSqlMetaData', requestStream: false, responseStream: false, - requestType: Span_pb.PSqlMetaData, - responseType: Span_pb.PResult, + requestType: v1_Span_pb.PSqlMetaData, + responseType: v1_Span_pb.PResult, requestSerialize: serialize_v1_PSqlMetaData, requestDeserialize: deserialize_v1_PSqlMetaData, responseSerialize: serialize_v1_PResult, @@ -231,8 +230,8 @@ var MetadataService = exports.MetadataService = { path: '/v1.Metadata/RequestApiMetaData', requestStream: false, responseStream: false, - requestType: Span_pb.PApiMetaData, - responseType: Span_pb.PResult, + requestType: v1_Span_pb.PApiMetaData, + responseType: v1_Span_pb.PResult, requestSerialize: serialize_v1_PApiMetaData, requestDeserialize: deserialize_v1_PApiMetaData, responseSerialize: serialize_v1_PResult, @@ -242,8 +241,8 @@ var MetadataService = exports.MetadataService = { path: '/v1.Metadata/RequestStringMetaData', requestStream: false, responseStream: false, - requestType: Span_pb.PStringMetaData, - responseType: Span_pb.PResult, + requestType: v1_Span_pb.PStringMetaData, + responseType: v1_Span_pb.PResult, requestSerialize: serialize_v1_PStringMetaData, requestDeserialize: deserialize_v1_PStringMetaData, responseSerialize: serialize_v1_PResult, @@ -257,7 +256,7 @@ var StatService = exports.StatService = { path: '/v1.Stat/SendAgentStat', requestStream: true, responseStream: false, - requestType: Stat_pb.PStatMessage, + requestType: v1_Stat_pb.PStatMessage, responseType: google_protobuf_empty_pb.Empty, requestSerialize: serialize_v1_PStatMessage, requestDeserialize: deserialize_v1_PStatMessage, @@ -268,12 +267,24 @@ var StatService = exports.StatService = { exports.StatClient = grpc.makeGenericClientConstructor(StatService); var ProfilerCommandServiceService = exports.ProfilerCommandServiceService = { - handleCommand: { + // deprecated api +handleCommand: { path: '/v1.ProfilerCommandService/HandleCommand', requestStream: true, responseStream: true, - requestType: Cmd_pb.PCmdMessage, - responseType: Cmd_pb.PCmdRequest, + requestType: v1_Cmd_pb.PCmdMessage, + responseType: v1_Cmd_pb.PCmdRequest, + requestSerialize: serialize_v1_PCmdMessage, + requestDeserialize: deserialize_v1_PCmdMessage, + responseSerialize: serialize_v1_PCmdRequest, + responseDeserialize: deserialize_v1_PCmdRequest, + }, + handleCommandV2: { + path: '/v1.ProfilerCommandService/HandleCommandV2', + requestStream: true, + responseStream: true, + requestType: v1_Cmd_pb.PCmdMessage, + responseType: v1_Cmd_pb.PCmdRequest, requestSerialize: serialize_v1_PCmdMessage, requestDeserialize: deserialize_v1_PCmdMessage, responseSerialize: serialize_v1_PCmdRequest, @@ -283,7 +294,7 @@ var ProfilerCommandServiceService = exports.ProfilerCommandServiceService = { path: '/v1.ProfilerCommandService/CommandEcho', requestStream: false, responseStream: false, - requestType: Cmd_pb.PCmdEchoResponse, + requestType: v1_Cmd_pb.PCmdEchoResponse, responseType: google_protobuf_empty_pb.Empty, requestSerialize: serialize_v1_PCmdEchoResponse, requestDeserialize: deserialize_v1_PCmdEchoResponse, @@ -294,7 +305,7 @@ var ProfilerCommandServiceService = exports.ProfilerCommandServiceService = { path: '/v1.ProfilerCommandService/CommandStreamActiveThreadCount', requestStream: true, responseStream: false, - requestType: Cmd_pb.PCmdActiveThreadCountRes, + requestType: v1_Cmd_pb.PCmdActiveThreadCountRes, responseType: google_protobuf_empty_pb.Empty, requestSerialize: serialize_v1_PCmdActiveThreadCountRes, requestDeserialize: deserialize_v1_PCmdActiveThreadCountRes, @@ -305,7 +316,7 @@ var ProfilerCommandServiceService = exports.ProfilerCommandServiceService = { path: '/v1.ProfilerCommandService/CommandActiveThreadDump', requestStream: false, responseStream: false, - requestType: Cmd_pb.PCmdActiveThreadDumpRes, + requestType: v1_Cmd_pb.PCmdActiveThreadDumpRes, responseType: google_protobuf_empty_pb.Empty, requestSerialize: serialize_v1_PCmdActiveThreadDumpRes, requestDeserialize: deserialize_v1_PCmdActiveThreadDumpRes, @@ -316,7 +327,7 @@ var ProfilerCommandServiceService = exports.ProfilerCommandServiceService = { path: '/v1.ProfilerCommandService/CommandActiveThreadLightDump', requestStream: false, responseStream: false, - requestType: Cmd_pb.PCmdActiveThreadLightDumpRes, + requestType: v1_Cmd_pb.PCmdActiveThreadLightDumpRes, responseType: google_protobuf_empty_pb.Empty, requestSerialize: serialize_v1_PCmdActiveThreadLightDumpRes, requestDeserialize: deserialize_v1_PCmdActiveThreadLightDumpRes, diff --git a/lib/data/grpc/Service_pb.js b/lib/data/v1/Service_pb.js similarity index 59% rename from lib/data/grpc/Service_pb.js rename to lib/data/v1/Service_pb.js index 4065c847..277b001e 100644 --- a/lib/data/grpc/Service_pb.js +++ b/lib/data/v1/Service_pb.js @@ -1,4 +1,4 @@ -// source: Service.proto +// source: v1/Service.proto /** * @fileoverview * @enhanceable @@ -16,11 +16,9 @@ var global = Function('return this')(); var google_protobuf_empty_pb = require('google-protobuf/google/protobuf/empty_pb.js'); goog.object.extend(proto, google_protobuf_empty_pb); -var Span_pb = require('./Span_pb.js'); -goog.object.extend(proto, Span_pb); -var Stat_pb = require('./Stat_pb.js'); -goog.object.extend(proto, Stat_pb); -var ThreadDump_pb = require('./ThreadDump_pb.js'); -goog.object.extend(proto, ThreadDump_pb); -var Cmd_pb = require('./Cmd_pb.js'); -goog.object.extend(proto, Cmd_pb); +var v1_Span_pb = require('../v1/Span_pb.js'); +goog.object.extend(proto, v1_Span_pb); +var v1_Stat_pb = require('../v1/Stat_pb.js'); +goog.object.extend(proto, v1_Stat_pb); +var v1_Cmd_pb = require('../v1/Cmd_pb.js'); +goog.object.extend(proto, v1_Cmd_pb); diff --git a/lib/data/grpc/Stat_grpc_pb.js b/lib/data/v1/Span_grpc_pb.js similarity index 100% rename from lib/data/grpc/Stat_grpc_pb.js rename to lib/data/v1/Span_grpc_pb.js diff --git a/lib/data/grpc/Span_pb.js b/lib/data/v1/Span_pb.js similarity index 97% rename from lib/data/grpc/Span_pb.js rename to lib/data/v1/Span_pb.js index 5aaf98e8..1da14833 100644 --- a/lib/data/grpc/Span_pb.js +++ b/lib/data/v1/Span_pb.js @@ -1,4 +1,4 @@ -// source: Span.proto +// source: v1/Span.proto /** * @fileoverview * @enhanceable @@ -14,10 +14,8 @@ var jspb = require('google-protobuf'); var goog = jspb; var global = Function('return this')(); -var google_protobuf_empty_pb = require('google-protobuf/google/protobuf/empty_pb.js'); -goog.object.extend(proto, google_protobuf_empty_pb); -var Annotation_pb = require('./Annotation_pb.js'); -goog.object.extend(proto, Annotation_pb); +var v1_Annotation_pb = require('../v1/Annotation_pb.js'); +goog.object.extend(proto, v1_Annotation_pb); goog.exportSymbol('proto.v1.PAcceptEvent', null, global); goog.exportSymbol('proto.v1.PApiMetaData', null, global); goog.exportSymbol('proto.v1.PLocalAsyncId', null, global); @@ -605,12 +603,12 @@ proto.v1.PSpan.toObject = function(includeInstance, msg) { servicetype: jspb.Message.getFieldWithDefault(msg, 8, 0), acceptevent: (f = msg.getAcceptevent()) && proto.v1.PAcceptEvent.toObject(includeInstance, f), annotationList: jspb.Message.toObjectList(msg.getAnnotationList(), - Annotation_pb.PAnnotation.toObject, includeInstance), + v1_Annotation_pb.PAnnotation.toObject, includeInstance), flag: jspb.Message.getFieldWithDefault(msg, 11, 0), err: jspb.Message.getFieldWithDefault(msg, 12, 0), spaneventList: jspb.Message.toObjectList(msg.getSpaneventList(), proto.v1.PSpanEvent.toObject, includeInstance), - exceptioninfo: (f = msg.getExceptioninfo()) && Annotation_pb.PIntStringValue.toObject(includeInstance, f), + exceptioninfo: (f = msg.getExceptioninfo()) && v1_Annotation_pb.PIntStringValue.toObject(includeInstance, f), applicationservicetype: jspb.Message.getFieldWithDefault(msg, 15, 0), loggingtransactioninfo: jspb.Message.getFieldWithDefault(msg, 16, 0) }; @@ -688,8 +686,8 @@ proto.v1.PSpan.deserializeBinaryFromReader = function(msg, reader) { msg.setAcceptevent(value); break; case 10: - var value = new Annotation_pb.PAnnotation; - reader.readMessage(value,Annotation_pb.PAnnotation.deserializeBinaryFromReader); + var value = new v1_Annotation_pb.PAnnotation; + reader.readMessage(value,v1_Annotation_pb.PAnnotation.deserializeBinaryFromReader); msg.addAnnotation(value); break; case 11: @@ -706,8 +704,8 @@ proto.v1.PSpan.deserializeBinaryFromReader = function(msg, reader) { msg.addSpanevent(value); break; case 14: - var value = new Annotation_pb.PIntStringValue; - reader.readMessage(value,Annotation_pb.PIntStringValue.deserializeBinaryFromReader); + var value = new v1_Annotation_pb.PIntStringValue; + reader.readMessage(value,v1_Annotation_pb.PIntStringValue.deserializeBinaryFromReader); msg.setExceptioninfo(value); break; case 15: @@ -817,7 +815,7 @@ proto.v1.PSpan.serializeBinaryToWriter = function(message, writer) { writer.writeRepeatedMessage( 10, f, - Annotation_pb.PAnnotation.serializeBinaryToWriter + v1_Annotation_pb.PAnnotation.serializeBinaryToWriter ); } f = message.getFlag(); @@ -847,7 +845,7 @@ proto.v1.PSpan.serializeBinaryToWriter = function(message, writer) { writer.writeMessage( 14, f, - Annotation_pb.PIntStringValue.serializeBinaryToWriter + v1_Annotation_pb.PIntStringValue.serializeBinaryToWriter ); } f = message.getApplicationservicetype(); @@ -1069,16 +1067,16 @@ proto.v1.PSpan.prototype.hasAcceptevent = function() { /** * repeated PAnnotation annotation = 10; - * @return {!Array} + * @return {!Array} */ proto.v1.PSpan.prototype.getAnnotationList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, Annotation_pb.PAnnotation, 10)); + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, v1_Annotation_pb.PAnnotation, 10)); }; /** - * @param {!Array} value + * @param {!Array} value * @return {!proto.v1.PSpan} returns this */ proto.v1.PSpan.prototype.setAnnotationList = function(value) { @@ -1087,12 +1085,12 @@ proto.v1.PSpan.prototype.setAnnotationList = function(value) { /** - * @param {!proto.PAnnotation=} opt_value + * @param {!proto.v1.PAnnotation=} opt_value * @param {number=} opt_index - * @return {!proto.PAnnotation} + * @return {!proto.v1.PAnnotation} */ proto.v1.PSpan.prototype.addAnnotation = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 10, opt_value, proto.PAnnotation, opt_index); + return jspb.Message.addToRepeatedWrapperField(this, 10, opt_value, proto.v1.PAnnotation, opt_index); }; @@ -1181,16 +1179,16 @@ proto.v1.PSpan.prototype.clearSpaneventList = function() { /** * optional PIntStringValue exceptionInfo = 14; - * @return {?proto.PIntStringValue} + * @return {?proto.v1.PIntStringValue} */ proto.v1.PSpan.prototype.getExceptioninfo = function() { - return /** @type{?proto.PIntStringValue} */ ( - jspb.Message.getWrapperField(this, Annotation_pb.PIntStringValue, 14)); + return /** @type{?proto.v1.PIntStringValue} */ ( + jspb.Message.getWrapperField(this, v1_Annotation_pb.PIntStringValue, 14)); }; /** - * @param {?proto.PIntStringValue|undefined} value + * @param {?proto.v1.PIntStringValue|undefined} value * @return {!proto.v1.PSpan} returns this */ proto.v1.PSpan.prototype.setExceptioninfo = function(value) { @@ -2078,9 +2076,9 @@ proto.v1.PSpanEvent.toObject = function(includeInstance, msg) { endelapsed: jspb.Message.getFieldWithDefault(msg, 4, 0), servicetype: jspb.Message.getFieldWithDefault(msg, 5, 0), annotationList: jspb.Message.toObjectList(msg.getAnnotationList(), - Annotation_pb.PAnnotation.toObject, includeInstance), + v1_Annotation_pb.PAnnotation.toObject, includeInstance), apiid: jspb.Message.getFieldWithDefault(msg, 10, 0), - exceptioninfo: (f = msg.getExceptioninfo()) && Annotation_pb.PIntStringValue.toObject(includeInstance, f), + exceptioninfo: (f = msg.getExceptioninfo()) && v1_Annotation_pb.PIntStringValue.toObject(includeInstance, f), nextevent: (f = msg.getNextevent()) && proto.v1.PNextEvent.toObject(includeInstance, f), asyncevent: jspb.Message.getFieldWithDefault(msg, 13, 0) }; @@ -2140,8 +2138,8 @@ proto.v1.PSpanEvent.deserializeBinaryFromReader = function(msg, reader) { msg.setServicetype(value); break; case 6: - var value = new Annotation_pb.PAnnotation; - reader.readMessage(value,Annotation_pb.PAnnotation.deserializeBinaryFromReader); + var value = new v1_Annotation_pb.PAnnotation; + reader.readMessage(value,v1_Annotation_pb.PAnnotation.deserializeBinaryFromReader); msg.addAnnotation(value); break; case 10: @@ -2149,8 +2147,8 @@ proto.v1.PSpanEvent.deserializeBinaryFromReader = function(msg, reader) { msg.setApiid(value); break; case 11: - var value = new Annotation_pb.PIntStringValue; - reader.readMessage(value,Annotation_pb.PIntStringValue.deserializeBinaryFromReader); + var value = new v1_Annotation_pb.PIntStringValue; + reader.readMessage(value,v1_Annotation_pb.PIntStringValue.deserializeBinaryFromReader); msg.setExceptioninfo(value); break; case 12: @@ -2231,7 +2229,7 @@ proto.v1.PSpanEvent.serializeBinaryToWriter = function(message, writer) { writer.writeRepeatedMessage( 6, f, - Annotation_pb.PAnnotation.serializeBinaryToWriter + v1_Annotation_pb.PAnnotation.serializeBinaryToWriter ); } f = message.getApiid(); @@ -2246,7 +2244,7 @@ proto.v1.PSpanEvent.serializeBinaryToWriter = function(message, writer) { writer.writeMessage( 11, f, - Annotation_pb.PIntStringValue.serializeBinaryToWriter + v1_Annotation_pb.PIntStringValue.serializeBinaryToWriter ); } f = message.getNextevent(); @@ -2359,16 +2357,16 @@ proto.v1.PSpanEvent.prototype.setServicetype = function(value) { /** * repeated PAnnotation annotation = 6; - * @return {!Array} + * @return {!Array} */ proto.v1.PSpanEvent.prototype.getAnnotationList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, Annotation_pb.PAnnotation, 6)); + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, v1_Annotation_pb.PAnnotation, 6)); }; /** - * @param {!Array} value + * @param {!Array} value * @return {!proto.v1.PSpanEvent} returns this */ proto.v1.PSpanEvent.prototype.setAnnotationList = function(value) { @@ -2377,12 +2375,12 @@ proto.v1.PSpanEvent.prototype.setAnnotationList = function(value) { /** - * @param {!proto.PAnnotation=} opt_value + * @param {!proto.v1.PAnnotation=} opt_value * @param {number=} opt_index - * @return {!proto.PAnnotation} + * @return {!proto.v1.PAnnotation} */ proto.v1.PSpanEvent.prototype.addAnnotation = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 6, opt_value, proto.PAnnotation, opt_index); + return jspb.Message.addToRepeatedWrapperField(this, 6, opt_value, proto.v1.PAnnotation, opt_index); }; @@ -2415,16 +2413,16 @@ proto.v1.PSpanEvent.prototype.setApiid = function(value) { /** * optional PIntStringValue exceptionInfo = 11; - * @return {?proto.PIntStringValue} + * @return {?proto.v1.PIntStringValue} */ proto.v1.PSpanEvent.prototype.getExceptioninfo = function() { - return /** @type{?proto.PIntStringValue} */ ( - jspb.Message.getWrapperField(this, Annotation_pb.PIntStringValue, 11)); + return /** @type{?proto.v1.PIntStringValue} */ ( + jspb.Message.getWrapperField(this, v1_Annotation_pb.PIntStringValue, 11)); }; /** - * @param {?proto.PIntStringValue|undefined} value + * @param {?proto.v1.PIntStringValue|undefined} value * @return {!proto.v1.PSpanEvent} returns this */ proto.v1.PSpanEvent.prototype.setExceptioninfo = function(value) { @@ -3638,7 +3636,8 @@ proto.v1.PApiMetaData.toObject = function(includeInstance, msg) { apiid: jspb.Message.getFieldWithDefault(msg, 1, 0), apiinfo: jspb.Message.getFieldWithDefault(msg, 2, ""), line: jspb.Message.getFieldWithDefault(msg, 3, 0), - type: jspb.Message.getFieldWithDefault(msg, 4, 0) + type: jspb.Message.getFieldWithDefault(msg, 4, 0), + location: jspb.Message.getFieldWithDefault(msg, 5, "") }; if (includeInstance) { @@ -3691,6 +3690,10 @@ proto.v1.PApiMetaData.deserializeBinaryFromReader = function(msg, reader) { var value = /** @type {number} */ (reader.readInt32()); msg.setType(value); break; + case 5: + var value = /** @type {string} */ (reader.readString()); + msg.setLocation(value); + break; default: reader.skipField(); break; @@ -3748,6 +3751,13 @@ proto.v1.PApiMetaData.serializeBinaryToWriter = function(message, writer) { f ); } + f = message.getLocation(); + if (f.length > 0) { + writer.writeString( + 5, + f + ); + } }; @@ -3823,6 +3833,24 @@ proto.v1.PApiMetaData.prototype.setType = function(value) { }; +/** + * optional string location = 5; + * @return {string} + */ +proto.v1.PApiMetaData.prototype.getLocation = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * @param {string} value + * @return {!proto.v1.PApiMetaData} returns this + */ +proto.v1.PApiMetaData.prototype.setLocation = function(value) { + return jspb.Message.setProto3StringField(this, 5, value); +}; + + diff --git a/lib/data/grpc/ThreadDump_grpc_pb.js b/lib/data/v1/Stat_grpc_pb.js similarity index 100% rename from lib/data/grpc/ThreadDump_grpc_pb.js rename to lib/data/v1/Stat_grpc_pb.js diff --git a/lib/data/grpc/Stat_pb.js b/lib/data/v1/Stat_pb.js similarity index 80% rename from lib/data/grpc/Stat_pb.js rename to lib/data/v1/Stat_pb.js index 1b8ce6f0..b2466097 100644 --- a/lib/data/grpc/Stat_pb.js +++ b/lib/data/v1/Stat_pb.js @@ -1,4 +1,4 @@ -// source: Stat.proto +// source: v1/Stat.proto /** * @fileoverview * @enhanceable @@ -14,32 +14,35 @@ var jspb = require('google-protobuf'); var goog = jspb; var global = Function('return this')(); -var google_protobuf_empty_pb = require('google-protobuf/google/protobuf/empty_pb.js'); -goog.object.extend(proto, google_protobuf_empty_pb); -var ThreadDump_pb = require('./ThreadDump_pb.js'); -goog.object.extend(proto, ThreadDump_pb); +var v1_ThreadDump_pb = require('../v1/ThreadDump_pb.js'); +goog.object.extend(proto, v1_ThreadDump_pb); goog.exportSymbol('proto.v1.PActiveTrace', null, global); goog.exportSymbol('proto.v1.PActiveTraceHistogram', null, global); goog.exportSymbol('proto.v1.PAgentInfo', null, global); goog.exportSymbol('proto.v1.PAgentStat', null, global); goog.exportSymbol('proto.v1.PAgentStatBatch', null, global); +goog.exportSymbol('proto.v1.PAgentUriStat', null, global); goog.exportSymbol('proto.v1.PCpuLoad', null, global); goog.exportSymbol('proto.v1.PDataSource', null, global); goog.exportSymbol('proto.v1.PDataSourceList', null, global); goog.exportSymbol('proto.v1.PDeadlock', null, global); goog.exportSymbol('proto.v1.PDirectBuffer', null, global); +goog.exportSymbol('proto.v1.PEachUriStat', null, global); goog.exportSymbol('proto.v1.PFileDescriptor', null, global); goog.exportSymbol('proto.v1.PJvmGc', null, global); goog.exportSymbol('proto.v1.PJvmGcDetailed', null, global); goog.exportSymbol('proto.v1.PJvmGcType', null, global); goog.exportSymbol('proto.v1.PJvmInfo', null, global); +goog.exportSymbol('proto.v1.PLoadedClass', null, global); goog.exportSymbol('proto.v1.PPing', null, global); goog.exportSymbol('proto.v1.PResponseTime', null, global); goog.exportSymbol('proto.v1.PServerMetaData', null, global); goog.exportSymbol('proto.v1.PServiceInfo', null, global); goog.exportSymbol('proto.v1.PStatMessage', null, global); goog.exportSymbol('proto.v1.PStatMessage.FieldCase', null, global); +goog.exportSymbol('proto.v1.PTotalThread', null, global); goog.exportSymbol('proto.v1.PTransaction', null, global); +goog.exportSymbol('proto.v1.PUriHistogram', null, global); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -460,6 +463,111 @@ if (goog.DEBUG && !COMPILED) { */ proto.v1.PDirectBuffer.displayName = 'proto.v1.PDirectBuffer'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.v1.PTotalThread = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.v1.PTotalThread, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.v1.PTotalThread.displayName = 'proto.v1.PTotalThread'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.v1.PLoadedClass = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.v1.PLoadedClass, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.v1.PLoadedClass.displayName = 'proto.v1.PLoadedClass'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.v1.PAgentUriStat = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.v1.PAgentUriStat.repeatedFields_, null); +}; +goog.inherits(proto.v1.PAgentUriStat, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.v1.PAgentUriStat.displayName = 'proto.v1.PAgentUriStat'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.v1.PEachUriStat = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.v1.PEachUriStat, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.v1.PEachUriStat.displayName = 'proto.v1.PEachUriStat'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.v1.PUriHistogram = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.v1.PUriHistogram.repeatedFields_, null); +}; +goog.inherits(proto.v1.PUriHistogram, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.v1.PUriHistogram.displayName = 'proto.v1.PUriHistogram'; +} @@ -570,7 +678,7 @@ proto.v1.PPing.serializeBinaryToWriter = function(message, writer) { * @private {!Array>} * @const */ -proto.v1.PStatMessage.oneofGroups_ = [[1,2]]; +proto.v1.PStatMessage.oneofGroups_ = [[1,2,3]]; /** * @enum {number} @@ -578,7 +686,8 @@ proto.v1.PStatMessage.oneofGroups_ = [[1,2]]; proto.v1.PStatMessage.FieldCase = { FIELD_NOT_SET: 0, AGENTSTAT: 1, - AGENTSTATBATCH: 2 + AGENTSTATBATCH: 2, + AGENTURISTAT: 3 }; /** @@ -620,7 +729,8 @@ proto.v1.PStatMessage.prototype.toObject = function(opt_includeInstance) { proto.v1.PStatMessage.toObject = function(includeInstance, msg) { var f, obj = { agentstat: (f = msg.getAgentstat()) && proto.v1.PAgentStat.toObject(includeInstance, f), - agentstatbatch: (f = msg.getAgentstatbatch()) && proto.v1.PAgentStatBatch.toObject(includeInstance, f) + agentstatbatch: (f = msg.getAgentstatbatch()) && proto.v1.PAgentStatBatch.toObject(includeInstance, f), + agenturistat: (f = msg.getAgenturistat()) && proto.v1.PAgentUriStat.toObject(includeInstance, f) }; if (includeInstance) { @@ -667,6 +777,11 @@ proto.v1.PStatMessage.deserializeBinaryFromReader = function(msg, reader) { reader.readMessage(value,proto.v1.PAgentStatBatch.deserializeBinaryFromReader); msg.setAgentstatbatch(value); break; + case 3: + var value = new proto.v1.PAgentUriStat; + reader.readMessage(value,proto.v1.PAgentUriStat.deserializeBinaryFromReader); + msg.setAgenturistat(value); + break; default: reader.skipField(); break; @@ -712,6 +827,14 @@ proto.v1.PStatMessage.serializeBinaryToWriter = function(message, writer) { proto.v1.PAgentStatBatch.serializeBinaryToWriter ); } + f = message.getAgenturistat(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.v1.PAgentUriStat.serializeBinaryToWriter + ); + } }; @@ -789,6 +912,43 @@ proto.v1.PStatMessage.prototype.hasAgentstatbatch = function() { }; +/** + * optional PAgentUriStat agentUriStat = 3; + * @return {?proto.v1.PAgentUriStat} + */ +proto.v1.PStatMessage.prototype.getAgenturistat = function() { + return /** @type{?proto.v1.PAgentUriStat} */ ( + jspb.Message.getWrapperField(this, proto.v1.PAgentUriStat, 3)); +}; + + +/** + * @param {?proto.v1.PAgentUriStat|undefined} value + * @return {!proto.v1.PStatMessage} returns this +*/ +proto.v1.PStatMessage.prototype.setAgenturistat = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.v1.PStatMessage.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.v1.PStatMessage} returns this + */ +proto.v1.PStatMessage.prototype.clearAgenturistat = function() { + return this.setAgenturistat(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.v1.PStatMessage.prototype.hasAgenturistat = function() { + return jspb.Message.getField(this, 3) != null; +}; + + @@ -1949,7 +2109,9 @@ proto.v1.PAgentStat.toObject = function(includeInstance, msg) { deadlock: (f = msg.getDeadlock()) && proto.v1.PDeadlock.toObject(includeInstance, f), filedescriptor: (f = msg.getFiledescriptor()) && proto.v1.PFileDescriptor.toObject(includeInstance, f), directbuffer: (f = msg.getDirectbuffer()) && proto.v1.PDirectBuffer.toObject(includeInstance, f), - metadata: jspb.Message.getFieldWithDefault(msg, 12, "") + metadata: jspb.Message.getFieldWithDefault(msg, 12, ""), + totalthread: (f = msg.getTotalthread()) && proto.v1.PTotalThread.toObject(includeInstance, f), + loadedclass: (f = msg.getLoadedclass()) && proto.v1.PLoadedClass.toObject(includeInstance, f) }; if (includeInstance) { @@ -2043,6 +2205,16 @@ proto.v1.PAgentStat.deserializeBinaryFromReader = function(msg, reader) { var value = /** @type {string} */ (reader.readString()); msg.setMetadata(value); break; + case 13: + var value = new proto.v1.PTotalThread; + reader.readMessage(value,proto.v1.PTotalThread.deserializeBinaryFromReader); + msg.setTotalthread(value); + break; + case 14: + var value = new proto.v1.PLoadedClass; + reader.readMessage(value,proto.v1.PLoadedClass.deserializeBinaryFromReader); + msg.setLoadedclass(value); + break; default: reader.skipField(); break; @@ -2165,6 +2337,22 @@ proto.v1.PAgentStat.serializeBinaryToWriter = function(message, writer) { f ); } + f = message.getTotalthread(); + if (f != null) { + writer.writeMessage( + 13, + f, + proto.v1.PTotalThread.serializeBinaryToWriter + ); + } + f = message.getLoadedclass(); + if (f != null) { + writer.writeMessage( + 14, + f, + proto.v1.PLoadedClass.serializeBinaryToWriter + ); + } }; @@ -2555,6 +2743,80 @@ proto.v1.PAgentStat.prototype.setMetadata = function(value) { }; +/** + * optional PTotalThread totalThread = 13; + * @return {?proto.v1.PTotalThread} + */ +proto.v1.PAgentStat.prototype.getTotalthread = function() { + return /** @type{?proto.v1.PTotalThread} */ ( + jspb.Message.getWrapperField(this, proto.v1.PTotalThread, 13)); +}; + + +/** + * @param {?proto.v1.PTotalThread|undefined} value + * @return {!proto.v1.PAgentStat} returns this +*/ +proto.v1.PAgentStat.prototype.setTotalthread = function(value) { + return jspb.Message.setWrapperField(this, 13, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.v1.PAgentStat} returns this + */ +proto.v1.PAgentStat.prototype.clearTotalthread = function() { + return this.setTotalthread(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.v1.PAgentStat.prototype.hasTotalthread = function() { + return jspb.Message.getField(this, 13) != null; +}; + + +/** + * optional PLoadedClass loadedClass = 14; + * @return {?proto.v1.PLoadedClass} + */ +proto.v1.PAgentStat.prototype.getLoadedclass = function() { + return /** @type{?proto.v1.PLoadedClass} */ ( + jspb.Message.getWrapperField(this, proto.v1.PLoadedClass, 14)); +}; + + +/** + * @param {?proto.v1.PLoadedClass|undefined} value + * @return {!proto.v1.PAgentStat} returns this +*/ +proto.v1.PAgentStat.prototype.setLoadedclass = function(value) { + return jspb.Message.setWrapperField(this, 14, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.v1.PAgentStat} returns this + */ +proto.v1.PAgentStat.prototype.clearLoadedclass = function() { + return this.setLoadedclass(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.v1.PAgentStat.prototype.hasLoadedclass = function() { + return jspb.Message.getField(this, 14) != null; +}; + + /** * List of repeated fields within this message type. @@ -4996,7 +5258,7 @@ proto.v1.PDeadlock.toObject = function(includeInstance, msg) { var f, obj = { count: jspb.Message.getFieldWithDefault(msg, 1, 0), threaddumpList: jspb.Message.toObjectList(msg.getThreaddumpList(), - ThreadDump_pb.PThreadDump.toObject, includeInstance) + v1_ThreadDump_pb.PThreadDump.toObject, includeInstance) }; if (includeInstance) { @@ -5038,8 +5300,8 @@ proto.v1.PDeadlock.deserializeBinaryFromReader = function(msg, reader) { msg.setCount(value); break; case 2: - var value = new ThreadDump_pb.PThreadDump; - reader.readMessage(value,ThreadDump_pb.PThreadDump.deserializeBinaryFromReader); + var value = new v1_ThreadDump_pb.PThreadDump; + reader.readMessage(value,v1_ThreadDump_pb.PThreadDump.deserializeBinaryFromReader); msg.addThreaddump(value); break; default: @@ -5083,7 +5345,7 @@ proto.v1.PDeadlock.serializeBinaryToWriter = function(message, writer) { writer.writeRepeatedMessage( 2, f, - ThreadDump_pb.PThreadDump.serializeBinaryToWriter + v1_ThreadDump_pb.PThreadDump.serializeBinaryToWriter ); } }; @@ -5113,7 +5375,7 @@ proto.v1.PDeadlock.prototype.setCount = function(value) { */ proto.v1.PDeadlock.prototype.getThreaddumpList = function() { return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, ThreadDump_pb.PThreadDump, 2)); + jspb.Message.getRepeatedWrapperField(this, v1_ThreadDump_pb.PThreadDump, 2)); }; @@ -5365,6 +5627,996 @@ proto.v1.PDirectBuffer.prototype.setMappedmemoryused = function(value) { }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.v1.PTotalThread.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PTotalThread.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.v1.PTotalThread} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PTotalThread.toObject = function(includeInstance, msg) { + var f, obj = { + totalthreadcount: jspb.Message.getFieldWithDefault(msg, 1, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.v1.PTotalThread} + */ +proto.v1.PTotalThread.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.v1.PTotalThread; + return proto.v1.PTotalThread.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.v1.PTotalThread} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.v1.PTotalThread} + */ +proto.v1.PTotalThread.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readInt64()); + msg.setTotalthreadcount(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.v1.PTotalThread.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.v1.PTotalThread.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.v1.PTotalThread} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PTotalThread.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTotalthreadcount(); + if (f !== 0) { + writer.writeInt64( + 1, + f + ); + } +}; + + +/** + * optional int64 totalThreadCount = 1; + * @return {number} + */ +proto.v1.PTotalThread.prototype.getTotalthreadcount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.v1.PTotalThread} returns this + */ +proto.v1.PTotalThread.prototype.setTotalthreadcount = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.v1.PLoadedClass.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PLoadedClass.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.v1.PLoadedClass} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PLoadedClass.toObject = function(includeInstance, msg) { + var f, obj = { + loadedclasscount: jspb.Message.getFieldWithDefault(msg, 1, 0), + unloadedclasscount: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.v1.PLoadedClass} + */ +proto.v1.PLoadedClass.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.v1.PLoadedClass; + return proto.v1.PLoadedClass.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.v1.PLoadedClass} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.v1.PLoadedClass} + */ +proto.v1.PLoadedClass.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readInt64()); + msg.setLoadedclasscount(value); + break; + case 2: + var value = /** @type {number} */ (reader.readInt64()); + msg.setUnloadedclasscount(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.v1.PLoadedClass.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.v1.PLoadedClass.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.v1.PLoadedClass} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PLoadedClass.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getLoadedclasscount(); + if (f !== 0) { + writer.writeInt64( + 1, + f + ); + } + f = message.getUnloadedclasscount(); + if (f !== 0) { + writer.writeInt64( + 2, + f + ); + } +}; + + +/** + * optional int64 loadedClassCount = 1; + * @return {number} + */ +proto.v1.PLoadedClass.prototype.getLoadedclasscount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.v1.PLoadedClass} returns this + */ +proto.v1.PLoadedClass.prototype.setLoadedclasscount = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional int64 unloadedClassCount = 2; + * @return {number} + */ +proto.v1.PLoadedClass.prototype.getUnloadedclasscount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.v1.PLoadedClass} returns this + */ +proto.v1.PLoadedClass.prototype.setUnloadedclasscount = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.v1.PAgentUriStat.repeatedFields_ = [3]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.v1.PAgentUriStat.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PAgentUriStat.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.v1.PAgentUriStat} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PAgentUriStat.toObject = function(includeInstance, msg) { + var f, obj = { + timestamp: jspb.Message.getFieldWithDefault(msg, 1, 0), + bucketversion: jspb.Message.getFieldWithDefault(msg, 2, 0), + eachuristatList: jspb.Message.toObjectList(msg.getEachuristatList(), + proto.v1.PEachUriStat.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.v1.PAgentUriStat} + */ +proto.v1.PAgentUriStat.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.v1.PAgentUriStat; + return proto.v1.PAgentUriStat.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.v1.PAgentUriStat} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.v1.PAgentUriStat} + */ +proto.v1.PAgentUriStat.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readInt64()); + msg.setTimestamp(value); + break; + case 2: + var value = /** @type {number} */ (reader.readInt32()); + msg.setBucketversion(value); + break; + case 3: + var value = new proto.v1.PEachUriStat; + reader.readMessage(value,proto.v1.PEachUriStat.deserializeBinaryFromReader); + msg.addEachuristat(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.v1.PAgentUriStat.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.v1.PAgentUriStat.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.v1.PAgentUriStat} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PAgentUriStat.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTimestamp(); + if (f !== 0) { + writer.writeInt64( + 1, + f + ); + } + f = message.getBucketversion(); + if (f !== 0) { + writer.writeInt32( + 2, + f + ); + } + f = message.getEachuristatList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.v1.PEachUriStat.serializeBinaryToWriter + ); + } +}; + + +/** + * optional int64 timestamp = 1; + * @return {number} + */ +proto.v1.PAgentUriStat.prototype.getTimestamp = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.v1.PAgentUriStat} returns this + */ +proto.v1.PAgentUriStat.prototype.setTimestamp = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional int32 bucketVersion = 2; + * @return {number} + */ +proto.v1.PAgentUriStat.prototype.getBucketversion = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.v1.PAgentUriStat} returns this + */ +proto.v1.PAgentUriStat.prototype.setBucketversion = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * repeated PEachUriStat eachUriStat = 3; + * @return {!Array} + */ +proto.v1.PAgentUriStat.prototype.getEachuristatList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.v1.PEachUriStat, 3)); +}; + + +/** + * @param {!Array} value + * @return {!proto.v1.PAgentUriStat} returns this +*/ +proto.v1.PAgentUriStat.prototype.setEachuristatList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); +}; + + +/** + * @param {!proto.v1.PEachUriStat=} opt_value + * @param {number=} opt_index + * @return {!proto.v1.PEachUriStat} + */ +proto.v1.PAgentUriStat.prototype.addEachuristat = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.v1.PEachUriStat, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.v1.PAgentUriStat} returns this + */ +proto.v1.PAgentUriStat.prototype.clearEachuristatList = function() { + return this.setEachuristatList([]); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.v1.PEachUriStat.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PEachUriStat.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.v1.PEachUriStat} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PEachUriStat.toObject = function(includeInstance, msg) { + var f, obj = { + uri: jspb.Message.getFieldWithDefault(msg, 1, ""), + totalhistogram: (f = msg.getTotalhistogram()) && proto.v1.PUriHistogram.toObject(includeInstance, f), + failedhistogram: (f = msg.getFailedhistogram()) && proto.v1.PUriHistogram.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.v1.PEachUriStat} + */ +proto.v1.PEachUriStat.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.v1.PEachUriStat; + return proto.v1.PEachUriStat.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.v1.PEachUriStat} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.v1.PEachUriStat} + */ +proto.v1.PEachUriStat.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setUri(value); + break; + case 2: + var value = new proto.v1.PUriHistogram; + reader.readMessage(value,proto.v1.PUriHistogram.deserializeBinaryFromReader); + msg.setTotalhistogram(value); + break; + case 3: + var value = new proto.v1.PUriHistogram; + reader.readMessage(value,proto.v1.PUriHistogram.deserializeBinaryFromReader); + msg.setFailedhistogram(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.v1.PEachUriStat.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.v1.PEachUriStat.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.v1.PEachUriStat} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PEachUriStat.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getUri(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getTotalhistogram(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.v1.PUriHistogram.serializeBinaryToWriter + ); + } + f = message.getFailedhistogram(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.v1.PUriHistogram.serializeBinaryToWriter + ); + } +}; + + +/** + * optional string uri = 1; + * @return {string} + */ +proto.v1.PEachUriStat.prototype.getUri = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.v1.PEachUriStat} returns this + */ +proto.v1.PEachUriStat.prototype.setUri = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional PUriHistogram totalHistogram = 2; + * @return {?proto.v1.PUriHistogram} + */ +proto.v1.PEachUriStat.prototype.getTotalhistogram = function() { + return /** @type{?proto.v1.PUriHistogram} */ ( + jspb.Message.getWrapperField(this, proto.v1.PUriHistogram, 2)); +}; + + +/** + * @param {?proto.v1.PUriHistogram|undefined} value + * @return {!proto.v1.PEachUriStat} returns this +*/ +proto.v1.PEachUriStat.prototype.setTotalhistogram = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.v1.PEachUriStat} returns this + */ +proto.v1.PEachUriStat.prototype.clearTotalhistogram = function() { + return this.setTotalhistogram(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.v1.PEachUriStat.prototype.hasTotalhistogram = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional PUriHistogram failedHistogram = 3; + * @return {?proto.v1.PUriHistogram} + */ +proto.v1.PEachUriStat.prototype.getFailedhistogram = function() { + return /** @type{?proto.v1.PUriHistogram} */ ( + jspb.Message.getWrapperField(this, proto.v1.PUriHistogram, 3)); +}; + + +/** + * @param {?proto.v1.PUriHistogram|undefined} value + * @return {!proto.v1.PEachUriStat} returns this +*/ +proto.v1.PEachUriStat.prototype.setFailedhistogram = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.v1.PEachUriStat} returns this + */ +proto.v1.PEachUriStat.prototype.clearFailedhistogram = function() { + return this.setFailedhistogram(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.v1.PEachUriStat.prototype.hasFailedhistogram = function() { + return jspb.Message.getField(this, 3) != null; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.v1.PUriHistogram.repeatedFields_ = [4]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.v1.PUriHistogram.prototype.toObject = function(opt_includeInstance) { + return proto.v1.PUriHistogram.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.v1.PUriHistogram} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PUriHistogram.toObject = function(includeInstance, msg) { + var f, obj = { + count: jspb.Message.getFieldWithDefault(msg, 1, 0), + avg: jspb.Message.getFloatingPointFieldWithDefault(msg, 2, 0.0), + max: jspb.Message.getFieldWithDefault(msg, 3, 0), + histogramList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.v1.PUriHistogram} + */ +proto.v1.PUriHistogram.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.v1.PUriHistogram; + return proto.v1.PUriHistogram.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.v1.PUriHistogram} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.v1.PUriHistogram} + */ +proto.v1.PUriHistogram.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readInt32()); + msg.setCount(value); + break; + case 2: + var value = /** @type {number} */ (reader.readDouble()); + msg.setAvg(value); + break; + case 3: + var value = /** @type {number} */ (reader.readInt64()); + msg.setMax(value); + break; + case 4: + var values = /** @type {!Array} */ (reader.isDelimited() ? reader.readPackedInt32() : [reader.readInt32()]); + for (var i = 0; i < values.length; i++) { + msg.addHistogram(values[i]); + } + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.v1.PUriHistogram.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.v1.PUriHistogram.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.v1.PUriHistogram} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.v1.PUriHistogram.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getCount(); + if (f !== 0) { + writer.writeInt32( + 1, + f + ); + } + f = message.getAvg(); + if (f !== 0.0) { + writer.writeDouble( + 2, + f + ); + } + f = message.getMax(); + if (f !== 0) { + writer.writeInt64( + 3, + f + ); + } + f = message.getHistogramList(); + if (f.length > 0) { + writer.writePackedInt32( + 4, + f + ); + } +}; + + +/** + * optional int32 count = 1; + * @return {number} + */ +proto.v1.PUriHistogram.prototype.getCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.v1.PUriHistogram} returns this + */ +proto.v1.PUriHistogram.prototype.setCount = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional double avg = 2; + * @return {number} + */ +proto.v1.PUriHistogram.prototype.getAvg = function() { + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 2, 0.0)); +}; + + +/** + * @param {number} value + * @return {!proto.v1.PUriHistogram} returns this + */ +proto.v1.PUriHistogram.prototype.setAvg = function(value) { + return jspb.Message.setProto3FloatField(this, 2, value); +}; + + +/** + * optional int64 max = 3; + * @return {number} + */ +proto.v1.PUriHistogram.prototype.getMax = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.v1.PUriHistogram} returns this + */ +proto.v1.PUriHistogram.prototype.setMax = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + + +/** + * repeated int32 histogram = 4; + * @return {!Array} + */ +proto.v1.PUriHistogram.prototype.getHistogramList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 4)); +}; + + +/** + * @param {!Array} value + * @return {!proto.v1.PUriHistogram} returns this + */ +proto.v1.PUriHistogram.prototype.setHistogramList = function(value) { + return jspb.Message.setField(this, 4, value || []); +}; + + +/** + * @param {number} value + * @param {number=} opt_index + * @return {!proto.v1.PUriHistogram} returns this + */ +proto.v1.PUriHistogram.prototype.addHistogram = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.v1.PUriHistogram} returns this + */ +proto.v1.PUriHistogram.prototype.clearHistogramList = function() { + return this.setHistogramList([]); +}; + + /** * @enum {number} */ diff --git a/lib/data/v1/ThreadDump_grpc_pb.js b/lib/data/v1/ThreadDump_grpc_pb.js new file mode 100644 index 00000000..97b3a246 --- /dev/null +++ b/lib/data/v1/ThreadDump_grpc_pb.js @@ -0,0 +1 @@ +// GENERATED CODE -- NO SERVICES IN PROTO \ No newline at end of file diff --git a/lib/data/grpc/ThreadDump_pb.js b/lib/data/v1/ThreadDump_pb.js similarity index 99% rename from lib/data/grpc/ThreadDump_pb.js rename to lib/data/v1/ThreadDump_pb.js index 11d570df..8fa5b353 100644 --- a/lib/data/grpc/ThreadDump_pb.js +++ b/lib/data/v1/ThreadDump_pb.js @@ -1,4 +1,4 @@ -// source: ThreadDump.proto +// source: v1/ThreadDump.proto /** * @fileoverview * @enhanceable @@ -14,10 +14,6 @@ var jspb = require('google-protobuf'); var goog = jspb; var global = Function('return this')(); -var google_protobuf_empty_pb = require('google-protobuf/google/protobuf/empty_pb.js'); -goog.object.extend(proto, google_protobuf_empty_pb); -var google_protobuf_wrappers_pb = require('google-protobuf/google/protobuf/wrappers_pb.js'); -goog.object.extend(proto, google_protobuf_wrappers_pb); goog.exportSymbol('proto.v1.PActiveThreadDump', null, global); goog.exportSymbol('proto.v1.PActiveThreadLightDump', null, global); goog.exportSymbol('proto.v1.PMonitorInfo', null, global); diff --git a/lib/instrumentation/call-stack.js b/lib/instrumentation/call-stack.js new file mode 100644 index 00000000..6b4302c2 --- /dev/null +++ b/lib/instrumentation/call-stack.js @@ -0,0 +1,76 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const callSite = (callbackIndex) => { + const callStack = {} + Error.captureStackTrace(callStack, callSite) + + const stack = stringStackOfCallStack(callStack, callbackIndex) + const namedGroup = captureNamedGroup(stack) + + const returnedValue = {} + if (namedGroup) { + returnedValue.fileName = namedGroup.fileName + + if (typeof namedGroup.location === 'string') { + returnedValue.location = `${namedGroup.location}${namedGroup.fileName}` + } else { + returnedValue.location = `${namedGroup.fileName}` + } + + const lineNumber = makeLineNumber(namedGroup) + if (typeof lineNumber === 'number') { + returnedValue.lineNumber = lineNumber + } + } + return returnedValue +} + +const captureNamedGroup = (stack) => { + const locationMatches = [locationFileNameLineNumber, fileNameOfStack] + for (const match of locationMatches) { + var locationGroup = match(stack) + if (locationGroup && locationGroup.groups) { + break + } + } + + if (!locationGroup || !locationGroup.groups) { + return + } + return locationGroup.groups +} + +const locationFileNameLineNumber = (stack) => { + return stack.match(/ \((?.+\/)(?[^:/]+):(?[0-9]+):(?[0-9]+)\)$/) +} + +const fileNameOfStack = (stack) => { + return stack.match(/ \((?)\)$/) +} + +const stringStackOfCallStack = (callstack, index) => { + const stacks = callstack.stack.split(/\n */) + + if (typeof index !== 'number' || stacks.length < index + 1) { + return + } + + return stacks[index] +} + +const makeLineNumber = (namedGroups) => { + if (!namedGroups.lineNumber || typeof namedGroups.lineNumber !== 'string') { + return + } + return parseInt(namedGroups.lineNumber) +} + +module.exports = { + callSite +} \ No newline at end of file diff --git a/lib/instrumentation/context/annotation/annotations.js b/lib/instrumentation/context/annotation/annotations.js new file mode 100644 index 00000000..ac13cb7c --- /dev/null +++ b/lib/instrumentation/context/annotation/annotations.js @@ -0,0 +1,42 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const BooleanAnnotation = require("./boolean-annotation") +const DataTypeAnnotation = require("./data-type-annotation") +const NullAnnotation = require("./null-annotation") +const IntAnnotation = require("./int-annotation") +const ObjectAnnotation = require("./object-annotation") +const StringAnnotation = require("./string-annotation") + +class Annotations { + static of(key, value) { + if (value === undefined || value === null) { + return new NullAnnotation(key) + } + + if (typeof value === 'string') { + return new StringAnnotation(key, value) + } + + if (typeof value === 'object' && typeof value.pAnnotationValue === 'function') { + return new DataTypeAnnotation(key, value) + } + + if (typeof value === 'number') { + return new IntAnnotation(key, value) + } + + if (typeof value === 'boolean') { + return new BooleanAnnotation(key, value) + } + + return new ObjectAnnotation(key, value) + } +} + +module.exports = Annotations \ No newline at end of file diff --git a/lib/instrumentation/context/annotation/boolean-annotation.js b/lib/instrumentation/context/annotation/boolean-annotation.js new file mode 100644 index 00000000..ad7826bb --- /dev/null +++ b/lib/instrumentation/context/annotation/boolean-annotation.js @@ -0,0 +1,36 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const annotationMessages = require('../../../data/v1/Annotation_pb.js') + +class BooleanAnnotation { + constructor(key, value) { + this.key = key + this.value = value + } + + getKey() { + return this.key + } + + getValue() { + return this.value + } + + toString() { + return `BooleanAnnotation{${this.key}=${this.value}}` + } + + pAnnotation() { + const pAnnotation = new annotationMessages.PAnnotation() + pAnnotation.setKey(this.key) + return pAnnotation + } +} + +module.exports = BooleanAnnotation \ No newline at end of file diff --git a/lib/instrumentation/context/annotation/data-type-annotation.js b/lib/instrumentation/context/annotation/data-type-annotation.js new file mode 100644 index 00000000..dc11dba5 --- /dev/null +++ b/lib/instrumentation/context/annotation/data-type-annotation.js @@ -0,0 +1,43 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const annotationMessages = require('../../../data/v1/Annotation_pb.js') + +class DataTypeAnnotation { + constructor(key, value) { + this.key = key + this.value = value + } + + getKey() { + return this.key + } + + getValue() { + return this.value + } + + toString() { + return `DataTypeAnnotation{${this.key}=${this.value}}` + } + + pAnnotation() { + const pAnnotation = new annotationMessages.PAnnotation() + pAnnotation.setKey(this.key) + + if (typeof this.value === 'object' && typeof this.value.pAnnotationValue === 'function') { + const annotationValue = this.value.pAnnotationValue() + if (annotationValue) { + pAnnotation.setValue(annotationValue) + } + } + return pAnnotation + } +} + +module.exports = DataTypeAnnotation \ No newline at end of file diff --git a/lib/instrumentation/context/annotation/int-annotation.js b/lib/instrumentation/context/annotation/int-annotation.js new file mode 100644 index 00000000..420d31ed --- /dev/null +++ b/lib/instrumentation/context/annotation/int-annotation.js @@ -0,0 +1,40 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const annotationMessages = require('../../../data/v1/Annotation_pb.js') + +class IntAnnotation { + constructor(key, value) { + this.key = key + this.value = value + } + + getKey() { + return this.key + } + + getValue() { + return this.value + } + + toString() { + return `IntAnnotation{ ${this.key}=${this.value} }` + } + + pAnnotation() { + const pAnnotation = new annotationMessages.PAnnotation() + pAnnotation.setKey(this.key) + + const pAnnotationValue = new annotationMessages.PAnnotationValue() + pAnnotationValue.setIntvalue(this.value) + pAnnotation.setValue(pAnnotationValue) + return pAnnotation + } +} + +module.exports = IntAnnotation \ No newline at end of file diff --git a/lib/instrumentation/context/annotation/int-string-string-value.js b/lib/instrumentation/context/annotation/int-string-string-value.js new file mode 100644 index 00000000..22c3f6fa --- /dev/null +++ b/lib/instrumentation/context/annotation/int-string-string-value.js @@ -0,0 +1,54 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const annotationMessages = require('../../../data/v1/Annotation_pb.js') +const wrappers = require('google-protobuf/google/protobuf/wrappers_pb') + +// ref: IntStringStringValue.java in pinpoint +class IntStringStringValue { + constructor(intValue, stringValue1, stringValue2) { + this.intValue = intValue + this.stringValue1 = stringValue1 + this.stringValue2 = stringValue2 + } + + getIntValue() { + return this.intValue + } + + getStringValue1() { + return this.stringValue1 + } + + getStringValue2() { + return this.stringValue2 + } + + toString() { + return `IntStringStringValue{intValue=${this.intValue}, stringValue1='${this.stringValue1}', stringValue2='${this.stringValue2}'}` + } + + pAnnotationValue() { + const pIntStringStringAnnotationValue = new annotationMessages.PIntStringStringValue() + pIntStringStringAnnotationValue.setIntvalue(this.intValue) + + const stringValue1 = new wrappers.StringValue() + stringValue1.setValue(this.stringValue1) + pIntStringStringAnnotationValue.setStringvalue1(stringValue1) + + const stringValue2 = new wrappers.StringValue() + stringValue2.setValue(this.stringValue2) + pIntStringStringAnnotationValue.setStringvalue2(stringValue2) + + const pAnnotationValue = new annotationMessages.PAnnotationValue() + pAnnotationValue.setIntstringstringvalue(pIntStringStringAnnotationValue) + return pAnnotationValue + } +} + +module.exports = IntStringStringValue \ No newline at end of file diff --git a/lib/instrumentation/context/annotation/int-string-value.js b/lib/instrumentation/context/annotation/int-string-value.js new file mode 100644 index 00000000..793efa50 --- /dev/null +++ b/lib/instrumentation/context/annotation/int-string-value.js @@ -0,0 +1,44 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const annotationMessages = require('../../../data/v1/Annotation_pb.js') +const wrappers = require('google-protobuf/google/protobuf/wrappers_pb') + +class IntStringValue { + constructor(intValue, stringValue) { + this.intValue = intValue + this.stringValue = stringValue + } + + getIntValue() { + return this.intValue + } + + getStringValue() { + return this.stringValue + } + + toString() { + return `IntStringValue{intValue=${this.intValue}, stringValue='${this.stringValue}'}` + } + + pAnnotationValue() { + const pIntAnnotationValue = new annotationMessages.PIntStringValue() + pIntAnnotationValue.setIntvalue(this.intValue) + + const stringValue = new wrappers.StringValue() + stringValue.setValue(this.stringValue) + pIntAnnotationValue.setStringvalue(stringValue) + + const pAnnotationValue = new annotationMessages.PAnnotationValue() + pAnnotationValue.setIntstringvalue(pIntAnnotationValue) + return pAnnotationValue + } +} + +module.exports = IntStringValue \ No newline at end of file diff --git a/lib/instrumentation/context/annotation/null-annotation.js b/lib/instrumentation/context/annotation/null-annotation.js new file mode 100644 index 00000000..cc6767fb --- /dev/null +++ b/lib/instrumentation/context/annotation/null-annotation.js @@ -0,0 +1,34 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const annotationMessages = require('../../../data/v1/Annotation_pb.js') +class NullAnnotation { + constructor(key) { + this.key = key + } + + getKey() { + return this.key + } + + getValue() { + return null + } + + toString() { + return `NullAnnotation{ ${this.key} }` + } + + pAnnotation() { + const pAnnotation = new annotationMessages.PAnnotation() + pAnnotation.setKey(this.key) + return pAnnotation + } +} + +module.exports = NullAnnotation \ No newline at end of file diff --git a/lib/instrumentation/context/annotation/object-annotation.js b/lib/instrumentation/context/annotation/object-annotation.js new file mode 100644 index 00000000..310faa0f --- /dev/null +++ b/lib/instrumentation/context/annotation/object-annotation.js @@ -0,0 +1,40 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const annotationMessages = require('../../../data/v1/Annotation_pb.js') + +class ObjectAnnotation { + constructor(key, value) { + this.key = key + this.value = value.toString() + } + + getKey() { + return this.key + } + + getValue() { + return this.value + } + + toString() { + return `ObjectAnnotation{${this.key}=${this.value}}` + } + + pAnnotation() { + const pAnnotation = new annotationMessages.PAnnotation() + pAnnotation.setKey(this.key) + + const pAnnotationValue = new annotationMessages.PAnnotationValue() + pAnnotationValue.setStringvalue(this.value) + pAnnotation.setValue(pAnnotationValue) + return pAnnotation + } +} + +module.exports = ObjectAnnotation \ No newline at end of file diff --git a/lib/instrumentation/context/annotation/string-annotation.js b/lib/instrumentation/context/annotation/string-annotation.js new file mode 100644 index 00000000..88b1b7df --- /dev/null +++ b/lib/instrumentation/context/annotation/string-annotation.js @@ -0,0 +1,40 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const annotationMessages = require('../../../data/v1/Annotation_pb.js') + +class StringAnnotation { + constructor(key, value) { + this.key = key + this.value = value + } + + getKey() { + return this.key + } + + getValue() { + return this.value + } + + toString() { + return `StringAnnotation{${this.key}=${this.value}}` + } + + pAnnotation() { + const pAnnotation = new annotationMessages.PAnnotation() + pAnnotation.setKey(this.key) + + const pAnnotationValue = new annotationMessages.PAnnotationValue() + pAnnotationValue.setStringvalue(this.value) + pAnnotation.setValue(pAnnotationValue) + return pAnnotation + } +} + +module.exports = StringAnnotation \ No newline at end of file diff --git a/lib/instrumentation/context/annotation/string-string-value.js b/lib/instrumentation/context/annotation/string-string-value.js new file mode 100644 index 00000000..3bc6b58a --- /dev/null +++ b/lib/instrumentation/context/annotation/string-string-value.js @@ -0,0 +1,51 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const annotationMessages = require('../../../data/v1/Annotation_pb.js') +const wrappers = require('google-protobuf/google/protobuf/wrappers_pb') + +class StringStringValue { + constructor(stringValue1, stringValue2) { + this.stringValue1 = stringValue1 + this.stringValue2 = stringValue2 + } + + getStringValue1() { + return this.stringValue1 + } + + getStringValue2() { + return this.stringValue2 + } + + isDataType() { + return true + } + + toString() { + return `StringStringValue{stringValue1='${this.stringValue1}', stringValue2='${this.stringValue2}'}` + } + + pAnnotationValue() { + const pStringStringAnnotationValue = new annotationMessages.PStringStringValue() + + const stringValue1 = new wrappers.StringValue() + stringValue1.setValue(this.stringValue1) + pStringStringAnnotationValue.setStringvalue1(stringValue1) + + const stringValue2 = new wrappers.StringValue() + stringValue2.setValue(this.stringValue2) + pStringStringAnnotationValue.setStringvalue2(stringValue2) + + const pAnnotationValue = new annotationMessages.PAnnotationValue() + pAnnotationValue.setStringstringvalue(pStringStringAnnotationValue) + return pAnnotationValue + } +} + +module.exports = StringStringValue \ No newline at end of file diff --git a/lib/instrumentation/context/span-builder.js b/lib/instrumentation/context/span-builder.js new file mode 100644 index 00000000..cd29d424 --- /dev/null +++ b/lib/instrumentation/context/span-builder.js @@ -0,0 +1,56 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +class SpanBuilder { + constructor(traceId, agentId, applicationName, applicationServiceType, agentStartTime, serviceType, host, parentApplicationName, parentApplicationType) { + this.traceId = traceId + this.agentId = agentId + this.applicationName = applicationName + this.agentStartTime = agentStartTime + this.serviceType = serviceType + this.spanId = traceId.spanId + this.parentSpanId = traceId.parentSpanId + this.startTime = Date.now() + this.elapsedTime = 0 + this.rpc = null + this.endPoint = null + this.remoteAddr = null + this.annotations = [] + this.flag = traceId.flag + this.err = null + this.spanEventList = [] + this.apiId = null + this.exceptionInfo = null + this.applicationServiceType = applicationServiceType + this.loggingTransactionInfo = null + this.version = 1 + this.acceptorHost = host + this.parentApplicationName = parentApplicationName + this.parentApplicationType = parentApplicationType + } + + static valueOf(span) { + const builder = new SpanBuilder(span.traceId, span.agentId, span.applicationName, span.applicationServiceType, span.agentStartTime, span.serviceType, span.acceptorHost, span.parentApplicationName, span.parentApplicationType) + builder.spanId = span.spanId + builder.parentSpanId = span.parentSpanId + builder.startTime = span.startTime + builder.elapsedTime = span.elapsedTime + builder.rpc = span.rpc + builder.endPoint = span.endPoint + builder.remoteAddr = span.remoteAddr + builder.annotations = span.annotations + builder.flag = span.flag + builder.err = span.err + builder.spanEventList = span.spanEventList + builder.apiId = span.apiId + builder.exceptionInfo = span.exceptionInfo + builder.loggingTransactionInfo = span.loggingTransactionInfo + builder.version = span.version + return builder + } +} + +module.exports = SpanBuilder \ No newline at end of file diff --git a/lib/instrumentation/http-shared.js b/lib/instrumentation/http-shared.js index f5277c0a..a3a19709 100644 --- a/lib/instrumentation/http-shared.js +++ b/lib/instrumentation/http-shared.js @@ -10,13 +10,11 @@ const endOfStream = require('end-of-stream') const url = require('url') const log = require('../utils/logger') const IdGenerator = require('../context/id-generator') -const AsyncIdAccessor = require('../context/async-id-accessor') -const DefaultAnnotationKey = require('../constant/annotation-key').DefaultAnnotationKey - +const annotationKey = require('../constant/annotation-key') const RequestHeaderUtils = require('../instrumentation/request-header-utils') -const GeneralMethodDescriptor = require('../constant/method-descriptor').GeneralMethodDescriptor - const AntPathMatcher = require('../utils/ant-path-matcher') +const defaultPredefinedMethodDescriptorRegistry = require('../constant/default-predefined-method-descriptor-registry') +const ServiceType = require('../context/service-type') let pathMatcher const getPathMatcher = () => { @@ -43,7 +41,10 @@ exports.instrumentRequest = function (agent, moduleName) { const trace = agent.createTraceObject(requestData) if (trace && trace.canSampled()) { recordRequest(trace.spanRecorder, requestData) - trace.spanRecorder.recordApi(GeneralMethodDescriptor.SERVER_REQUEST) + trace.spanRecorder.recordApi(defaultPredefinedMethodDescriptorRegistry.nodeServerMethodDescriptor) + if (requestData && typeof requestData.searchParams === 'string') { + trace.spanRecorder.recordAttribute(annotationKey.HTTP_PARAM, requestData.searchParams) + } } endOfStream(res, function (err) { @@ -52,7 +53,7 @@ exports.instrumentRequest = function (agent, moduleName) { } if (!err) { if (trace && trace.canSampled()) { - trace.spanRecorder.recordAttribute(DefaultAnnotationKey.HTTP_STATUS_CODE, this.statusCode) + trace.spanRecorder.recordAttribute(annotationKey.HTTP_STATUS_CODE, this.statusCode) return agent.completeTraceObject(trace) } } @@ -64,7 +65,7 @@ exports.instrumentRequest = function (agent, moduleName) { const result = end.apply(this, arguments) if (trace && trace.canSampled()) { if (this.statusCode) { - trace.spanRecorder.recordAttribute(DefaultAnnotationKey.HTTP_STATUS_CODE, this.statusCode) + trace.spanRecorder.recordAttribute(annotationKey.HTTP_STATUS_CODE, this.statusCode) } return agent.completeTraceObject(trace) } @@ -77,7 +78,6 @@ exports.instrumentRequest = function (agent, moduleName) { } } } -const ServiceTypeCode = require('../constant/service-type').ServiceTypeCode exports.traceOutgoingRequest = function (agent, moduleName) { return function (original) { @@ -99,30 +99,23 @@ exports.traceOutgoingRequest = function (agent, moduleName) { return req } - let spanEventRecorder - let asyncId - - // If request object has an asyncId, use request object's one - if (arguments && arguments[0] && AsyncIdAccessor.getAsyncId(arguments[0])) { - asyncId = AsyncIdAccessor.getAsyncId(arguments[0]); - } else { - spanEventRecorder = trace.traceBlockBegin(); - spanEventRecorder.recordServiceType(ServiceTypeCode.ASYNC_HTTP_CLIENT_INTERNAL) - spanEventRecorder.recordApiDesc('http.request') - asyncId = spanEventRecorder.recordNextAsyncId() - trace.traceBlockEnd(spanEventRecorder); - } + const spanEventRecorder = trace.traceBlockBegin() + spanEventRecorder.recordServiceType(ServiceType.asyncHttpClientInternal) + spanEventRecorder.recordApiDesc('http.request') + const asyncId = spanEventRecorder.recordNextAsyncId() + trace.traceBlockEnd(spanEventRecorder) + + const asyncTrace = trace.newAsyncTraceWithId(asyncId) + const asyncEventRecorder = asyncTrace.traceAsyncBegin() + asyncEventRecorder.recordServiceType(ServiceType.asyncHttpClient) + asyncEventRecorder.recordApiDesc(req.method) + const httpURL = req._headers.host + url.parse(req.path).pathname - + asyncEventRecorder.recordAttribute(annotationKey.HTTP_URL, httpURL) + const destinationId = req._headers.host const nextSpanId = IdGenerator.next RequestHeaderUtils.write(req, agent, nextSpanId, destinationId) - - const asyncTrace = trace.newAsyncTraceWithId(asyncId) - const asyncEventRecorder = asyncTrace.traceAsyncBegin() - asyncEventRecorder.recordServiceType(ServiceTypeCode.ASYNC_HTTP_CLIENT) - asyncEventRecorder.recordApiDesc(req.method) - asyncEventRecorder.recordHTTPURL(httpURL) asyncEventRecorder.recordNextSpanId(nextSpanId) asyncEventRecorder.recordDestinationId(destinationId) @@ -131,7 +124,7 @@ exports.traceOutgoingRequest = function (agent, moduleName) { return req function onresponse(res) { - log.debug('intercepted http.ClientcRequest response event %o', {id: httpURL}) + log.debug('intercepted http.ClientcRequest response event %o', { id: httpURL }) // Inspired by: // https://github.com/nodejs/node/blob/9623ce572a02632b7596452e079bba066db3a429/lib/events.js#L258-L274 if (res.prependListener) { @@ -151,9 +144,9 @@ exports.traceOutgoingRequest = function (agent, moduleName) { } function onEnd() { - log.debug('intercepted http.IncomingMessage end event %o', {id: httpURL}) + log.debug('intercepted http.IncomingMessage end event %o', { id: httpURL }) if (asyncTrace) { - asyncEventRecorder.recordAttribute(DefaultAnnotationKey.HTTP_STATUS_CODE, this.statusCode) + asyncEventRecorder.recordAttribute(annotationKey.HTTP_STATUS_CODE, this.statusCode) asyncTrace.traceAsyncEnd(asyncEventRecorder) } } diff --git a/lib/instrumentation/instrument-method.js b/lib/instrumentation/instrument-method.js new file mode 100644 index 00000000..07f45118 --- /dev/null +++ b/lib/instrumentation/instrument-method.js @@ -0,0 +1,133 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const shimmer = require('shimmer') +const apiMetaService = require('../context/api-meta-service') +const IdGenerator = require('../context/id-generator') +const { callSite } = require('./call-stack') +const instrumented = Symbol('Pinpoint_instrumented') + +// ref: SpanEventSimpleAroundInterceptorForPlugin.java +class InstrumentMethod { + constructor(target, method, traceContext) { + this.target = target + this.method = method + this.traceContext = traceContext + } + + static make(target, method, traceContext) { + return new InstrumentMethod(target, method, traceContext) + } + + addScopedInterceptor(interceptor) { + if (!this.target) { + return + } + + if (!this.method || typeof this.method !== 'string' || !this.target[this.method] || typeof this.target[this.method] !== 'function' || this.target[this.method][instrumented]) { + return + } + + const traceContext = this.traceContext + const target = this.target + const methodDescriptorBuilder = interceptor.methodDescriptorBuilder + shimmer.wrap(this.target, this.method, function (original) { + const wrapped = function () { + const location = callSite(2) + methodDescriptorBuilder.setLocation(location.location) + methodDescriptorBuilder.setLineNumber(location.lineNumber) + methodDescriptorBuilder.setFileName(location.fileName) + const methodDescriptor = apiMetaService.cacheApiWithBuilder(methodDescriptorBuilder) + + if (typeof interceptor.prepareBeforeTrace === 'function') { + interceptor.prepareBeforeTrace(target, arguments) + } + + const trace = traceContext.currentTraceObject() + let recorder + if (trace) { + recorder = trace.traceBlockBegin() + + if (interceptor.serviceType) { + recorder.recordServiceType(interceptor.serviceType) + } + + if (methodDescriptor) { + recorder.recordApi(methodDescriptor) + } + if (typeof interceptor.doInBeforeTrace === 'function') { + interceptor.doInBeforeTrace(recorder, target, arguments) + } + } + + if (arguments.length > 0 && typeof interceptor.callbackIndexOf === 'function' && typeof interceptor.callbackIndexOf(arguments) === 'number') { + const callbackIndex = interceptor.callbackIndexOf(arguments) + const callback = arguments[callbackIndex] + arguments[callbackIndex] = function () { + if (typeof interceptor.prepareBeforeAsyncTrace === 'function') { + interceptor.prepareBeforeAsyncTrace(target, arguments) + } + + let asyncTrace + let asyncEventRecorder + if (trace) { + asyncTrace = trace.newAsyncTrace(recorder) + asyncEventRecorder = asyncTrace.traceAsyncBegin() + const nextSpanId = IdGenerator.next + asyncEventRecorder.recordNextSpanId(nextSpanId) + + if (interceptor.serviceType) { + asyncEventRecorder.recordServiceType(interceptor.serviceType) + } + + if (methodDescriptor) { + asyncEventRecorder.recordApi(methodDescriptor) + } + + if (typeof interceptor.doInBeforeAsyncTrace === 'function') { + interceptor.doInBeforeAsyncTrace(asyncEventRecorder, target, arguments) + } + } + const returnedValue = callback.apply(this, arguments) + + if (asyncTrace) { + if (typeof interceptor.prepareAfterAsyncTrace === 'function') { + interceptor.prepareAfterAsyncTrace(target, arguments, returnedValue) + } + + if (asyncEventRecorder && typeof interceptor.doInAfterAsyncTrace === 'function') { + interceptor.doInAfterAsyncTrace(asyncEventRecorder, target, arguments, returnedValue) + } + asyncTrace.traceAsyncEnd(asyncEventRecorder) + } + return returnedValue + } + } + + var returned = original.apply(this, arguments) + + if (typeof interceptor.prepareAfterTrace === 'function') { + interceptor.prepareAfterTrace(target, arguments, returned) + } + + if (recorder && typeof interceptor.doInAfterTrace === 'function') { + interceptor.doInAfterTrace(recorder, target, arguments, returned) + } + + if (trace && recorder) { + trace.traceBlockEnd(recorder) + } + return returned + } + wrapped[instrumented] = true + return wrapped + }) + } +} + +module.exports = InstrumentMethod \ No newline at end of file diff --git a/lib/instrumentation/method-descriptor2.js b/lib/instrumentation/method-descriptor2.js new file mode 100644 index 00000000..c72bf116 --- /dev/null +++ b/lib/instrumentation/method-descriptor2.js @@ -0,0 +1,58 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +// https://v8.dev/docs/stack-trace-api#appendix%3A-stack-trace-format +class MethodDescriptor2 { + constructor(functionName) { + this.functionName = functionName + } + + getMethodName() { + return this.methodName + } + + getClassName() { + return this.className + } + + getParameterTypes() { + return + } + + getParameterVariableName() { + return this.parameterVariableNames + } + + getParameterDescriptor() { + return + } + + getLineNumber() { + return this.lineNumber + } + + getFullName() { + return this.fullName + } + + getApiId() { + return this.apiId + } + + getApiDescriptor() { + return this.apiDescriptor + } + + getType() { + return this.type + } + + getLocation() { + return this.location + } +} + +module.exports = MethodDescriptor2 \ No newline at end of file diff --git a/lib/instrumentation/module-hook.js b/lib/instrumentation/module-hook.js index 848aab4f..ba641989 100644 --- a/lib/instrumentation/module-hook.js +++ b/lib/instrumentation/module-hook.js @@ -15,13 +15,11 @@ const MODULES = [ 'express', 'http', 'https', - // 'koa', 'koa-router', 'redis', 'ioredis', - 'elasticsearch', - 'request', - // 'bluebird', + 'mysql', + 'mysql2', ] class ModuleHook { @@ -66,8 +64,8 @@ class ModuleHook { } catch (error) { log.error('error occurred', error) } - } - + } + if (!version) { version = process.versions.node } diff --git a/lib/instrumentation/module/bluebird.js b/lib/instrumentation/module/bluebird.js index ded6b7d9..d3452450 100644 --- a/lib/instrumentation/module/bluebird.js +++ b/lib/instrumentation/module/bluebird.js @@ -8,7 +8,7 @@ const semver = require('semver') const shimmer = require('shimmer') -const ServiceTypeCode = require('../../constant/service-type').ServiceTypeCode +const ServiceType = require('../../context/service-type') const log = require('../../utils/logger') const BLUEBIRD_FNS = ['_then', '_addCallbacks'] @@ -76,7 +76,7 @@ module.exports = function (agent, version, bluebird) { let spanEventRecorder = null if (trace) { spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.bluebird) + spanEventRecorder.recordServiceType(ServiceType.bluebird) spanEventRecorder.recordApiDesc(`bluebird`) } const result = original.apply(this, arguments) diff --git a/lib/instrumentation/module/elasticsearch.js b/lib/instrumentation/module/elasticsearch.js deleted file mode 100644 index 5bfd0401..00000000 --- a/lib/instrumentation/module/elasticsearch.js +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Pinpoint Node.js Agent - * Copyright 2020-present NAVER Corp. - * Apache License v2.0 - */ - -'use strict' - -const shimmer = require('shimmer') -const ServiceTypeCode = require('../../constant/service-type').ServiceTypeCode -const log = require('../../utils/logger') -const ValueType = require('../../constant/valued-type').ValuedType -const EventAnnotationKey = require('../../constant/annotation-key').EventAnnotationKey -const convertUtils = require('../../utils/convert-utils') - -const searchRegexp = /_search$/ - -module.exports = function (agent, version, elasticsearch) { - - shimmer.wrap(elasticsearch.Transport && elasticsearch.Transport.prototype, 'request', wrapRequest) - - return elasticsearch - - function wrapRequest(original) { - return function wrappedRequest (params, cb) { - const trace = agent.traceContext.currentTraceObject() - const method = params && params.method - const path = params && params.path - const query = params && params.query - let spanEventRecorder - - log.debug('intercepted call to elasticsearch.Transport.prototype.request %o', { method: method, path: path }) - - if (trace && method && path) { - - spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.elasticsearch) - spanEventRecorder.recordApiDesc( `Elasticsearch: ${method} ${path}`) - - if (query && searchRegexp.test(path)) { - // FIXME. Collection annotation key not defined - spanEventRecorder.recordApiArguments( - EventAnnotationKey.MONGO_JSON_DATA, - convertUtils.convertStringStringValue(query), - ValueType.stringStringValue) - } - - if (typeof cb === 'function') { - const args = Array.prototype.slice.call(arguments) - args[1] = function () { - let result - try { - result = cb.apply(this, arguments) - } catch (e) { - spanEventRecorder.recordException(e, true) - e.record = true - throw e - } finally { - if (trace) { - trace.traceBlockEnd(spanEventRecorder) - } - } - return result - } - return original.apply(this, arguments) - } else { - const p = original.apply(this, arguments) - p.then().catch((e) => { - if (!e._pinpointCheck) { - e._pinpointCheck = true - spanEventRecorder.recordException(e, true) - } - throw e - }).finally(() =>{ - if (trace) { - trace.traceBlockEnd(spanEventRecorder) - } - }) - return p - } - } else { - log.debug('could not instrument elasticsearch request') - return original.apply(this, arguments) - } - } - } -} diff --git a/lib/instrumentation/module/express.js b/lib/instrumentation/module/express.js index bdf2d37d..460a4690 100644 --- a/lib/instrumentation/module/express.js +++ b/lib/instrumentation/module/express.js @@ -6,17 +6,31 @@ 'use strict' +const util = require('util') const shimmer = require('shimmer') -const ServiceTypeCode = require('../../constant/service-type').ServiceTypeCode +const ServiceType = require('../../context/service-type') const log = require('../../utils/logger') const MethodDescriptor = require('../../context/method-descriptor') const apiMetaService = require('../../context/api-meta-service') const StringUtils = require('../../utils/string-utils') -const SpanEventRecorder = require('../../context/span-event-recorder') +const { makeMethodDescriptorBuilder } = require('../../context/make-method-descriptor-builder') +const ExpressMethodDescriptorBuilder = require('../../context/express-method-descriptor-builder') +const semver = require('semver') -const patchedLayerSet = new Set() +const layerPatchedSymbol = Symbol('PinpointLayerPatched') +const errorReportedSymbol = Symbol('PinpointErrorReported') +// https://github.com/elastic/apm-agent-nodejs/blob/master/lib/instrumentation/modules/express.js module.exports = function (agent, version, express) { + try { + if (!semver.satisfies(version, '^4.0.0')) { + log.warn(`express version ${version} not supported.`) + return express + } + } catch (error) { + log.error('Invalid Version error') + return express + } const MODULE_NAME = 'express' const methodNames = ['GET', 'POST', 'PUT', 'HEAD', 'DELETE', 'OPTIONS', 'PATCH', 'ALL'] @@ -27,113 +41,145 @@ module.exports = function (agent, version, express) { apiMetaService.cacheApi(descriptor) descMap[objectName + methodName] = descriptor return descMap - }, {}); + }, {}) function getMethodDescriptor(objectPath, methodName, httpMethod) { const method = objectPath === 'route' ? httpMethod : methodName return methodDescriptorMap[objectPath + method] } - function getDescriptionText(objectPath, methodName, httpMethod) { + function getDescriptionText(objectPath, methodName) { return MODULE_NAME + '.' + objectPath + '.' + (methodName ? StringUtils.encodeMethodName(methodName) : 'AnonymousFunction') } - // shimmer.wrap(express.application, 'use', function (original) { - // return function () { - // log.info('>> [Express] express.application.use ', this.stack) - // return original.apply(this, arguments) - // } - // }) - shimmer.wrap(express.Router, 'use', function (original) { return function () { const result = original.apply(this, arguments) const fn = arguments && arguments[1] if (fn && fn.name !== 'router' && this.stack && this.stack.length) { - // log.debug('>> [Express] express.Router.use ', this.stack[this.stack.length - 1]) const layer = this.stack[this.stack.length - 1] - doPatchLayer(layer, 'middleware', layer.name) + patchLayer(layer, 'middleware', layer.name, fn.length) } return result } }) shimmer.wrap(express.Router, 'route', function (original) { - return function () { - const result = original.apply(this, arguments) + return function route() { + const route = original.apply(this, arguments) if (this.stack && this.stack.length) { - // log.debug('>> [Express] express.Router.route ', this.stack[this.stack.length - 1]) const layer = this.stack[this.stack.length - 1] - doPatchLayer(layer, 'route', layer.name) + patchLayer(layer, 'route', layer.name) } - return result + return route } }) - function doPatchLayer(layer, moduleName, methodName) { - shimmer.wrap(layer, 'handle', function (original) { - return (original.length === 4) - ? recordErrorHandle(original, moduleName, methodName) - : recordHandle(original, moduleName, methodName) - }) - } - - function recordHandle(original, moduleName, methodName) { - return function (req, res, next) { - // log.debug('recordHandle start', getMethodDescriptor(moduleName, methodName, req.method)) - const trace = agent.traceContext.currentTraceObject() - let spanEventRecorder = null - if (trace) { - spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.express) - const methodDescriptor = getMethodDescriptor(moduleName, methodName, req.method) - if (methodDescriptor) { - spanEventRecorder.recordApi(getMethodDescriptor(moduleName, methodName, req.method)) + function patchLayer(layer, objectName, layerName, handlerArgumentsLength) { + if (!layer[layerPatchedSymbol]) { + layer[layerPatchedSymbol] = true + + const appAllbuilder = ExpressMethodDescriptorBuilder.make(makeMethodDescriptorBuilder(MODULE_NAME, indexOfRoute(objectName), indexOfHandle(objectName)), objectName, layerName, handlerArgumentsLength) + const appAllMethodDescriptor = apiMetaService.cacheApiWithBuilder(appAllbuilder) + shimmer.wrap(layer, 'handle', function (origin) { + let handle + if (origin.length !== 4) { + handle = function (req, res, next) { + const trace = agent.traceContext.currentTraceObject() + if (!trace) { + return origin.apply(this, arguments) + } + + const spanEventRecorder = trace.traceBlockBegin() + spanEventRecorder.recordServiceType(ServiceType.express) + const methodDescriptor = appAllMethodDescriptor || getMethodDescriptor(objectName, layerName, req.method) + if (methodDescriptor) { + spanEventRecorder.recordApi(methodDescriptor) + } else { + spanEventRecorder.recordApiDesc(getDescriptionText(objectName, layerName)) + } + + // https://github.com/elastic/apm-agent-nodejs/issues/443#issuecomment-455352070 + if (!layer.route && typeof next === 'function') { + arguments[2] = function () { + trace.traceBlockEnd(spanEventRecorder) + return next.apply(this, arguments) + } + } + const result = origin.apply(this, arguments) + trace.traceBlockEnd(spanEventRecorder) + return result + } } else { - spanEventRecorder.recordApiDesc(getDescriptionText(moduleName, methodName, req.method)) + handle = function (err, req, res, next) { + const trace = agent.traceContext.currentTraceObject() + let spanEventRecorder = null + if (shouldReport(err, trace)) { + spanEventRecorder = trace.traceBlockBegin() + spanEventRecorder.recordServiceType(ServiceType.express) + spanEventRecorder.recordException(err, true) + const methodDescriptor = appAllMethodDescriptor || getMethodDescriptor(objectName, layerName, req.method) + if (methodDescriptor) { + spanEventRecorder.recordApi(methodDescriptor) + } else { + spanEventRecorder.recordApiDesc(getDescriptionText(objectName, layerName, req.method)) + } + } + const result = origin.apply(this, arguments) + if (trace) { + trace.traceBlockEnd(spanEventRecorder) + } + return result + } } - } - const result = original.apply(this, arguments) - if (trace) { - trace.traceBlockEnd(spanEventRecorder) - } - // log.debug('recordHandle end', getMethodDescriptor(moduleName, methodName, req.method)) - return result + + // https://github.com/elastic/apm-agent-nodejs/issues/1067 + for (const prop in origin) { + if (Object.prototype.hasOwnProperty.call(origin, prop)) { + handle[prop] = origin[prop] + } + } + + return handle + }) } } - function recordErrorHandle(original, moduleName, methodName) { - return function (err, req, res, next) { - log.debug('recordErrorHandle start', getMethodDescriptor(moduleName, methodName, req.method)) - const trace = agent.traceContext.currentTraceObject() - let spanEventRecorder = null - - if (err && trace) { - spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.express) - spanEventRecorder.recordException(err, true) - const methodDescriptor = getMethodDescriptor(moduleName, methodName, req.method) - if (methodDescriptor) { - spanEventRecorder.recordApi(getMethodDescriptor(moduleName, methodName, req.method)) - } else { - spanEventRecorder.recordApiDesc(getDescriptionText(moduleName, methodName, req.method)) - } - } - const result = original.apply(this, arguments) - if (trace) { - trace.traceBlockEnd(spanEventRecorder) - } - log.debug('recordErrorHandle end', getMethodDescriptor(moduleName, methodName, req.method)) - return result + function shouldReport(error, trace) { + if (!trace) { + return false } + if (typeof error === 'string') { + return true + } + if (isError(error) && !error[errorReportedSymbol]) { + error[errorReportedSymbol] = true + return true + } + return false } - function resolveApiName(moduleName, httpMethod) { - if (moduleName === 'route') { - return moduleName + httpMethod + function isError(error) { + if (!util.types) { + return util.isError(error) } - return moduleName + return util.types.isNativeError(error) } + function indexOfRoute(objectName) { + if (objectName == 'route') { + return 3 + } else { + return 2 + } + } + + function indexOfHandle(objectName) { + if (objectName == 'route') { + return 4 + } else { + return 6 + } + } return express } diff --git a/lib/instrumentation/module/ioredis.js b/lib/instrumentation/module/ioredis.js index 01deb17d..2f321860 100644 --- a/lib/instrumentation/module/ioredis.js +++ b/lib/instrumentation/module/ioredis.js @@ -8,7 +8,7 @@ const semver = require('semver') const shimmer = require('shimmer') -const ServiceTypeCode = require('../../constant/service-type').ServiceTypeCode +const ServiceType = require('../../context/service-type') const log = require('../../utils/logger') const IdGenerator = require('../../context/id-generator') const { addressStringOf } = require('../../utils/convert-utils') @@ -60,7 +60,7 @@ module.exports = function (agent, version, ioredis) { if (command && trace) { spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.ASYNC_HTTP_CLIENT_INTERNAL) + spanEventRecorder.recordServiceType(ServiceType.asyncHttpClientInternal) spanEventRecorder.recordApiDesc('redis.'+ String(command.name).toUpperCase()+'.call' ) spanEventRecorder.recordDestinationId('Redis') if (this.connector && this.connector.options) { @@ -72,7 +72,7 @@ module.exports = function (agent, version, ioredis) { asyncTrace = trace.newAsyncTrace(spanEventRecorder) const nextSpanId = IdGenerator.next const asyncEventRecorder = asyncTrace.traceAsyncBegin() - asyncEventRecorder.recordServiceType(ServiceTypeCode.redis) + asyncEventRecorder.recordServiceType(ServiceType.redis) asyncEventRecorder.recordApiDesc('redis.'+ String(command.name).toUpperCase()+'.end') asyncEventRecorder.recordNextSpanId(nextSpanId) asyncEventRecorder.recordDestinationId('Redis') diff --git a/lib/instrumentation/module/koa-route.js b/lib/instrumentation/module/koa-route.js deleted file mode 100644 index 6ac00c61..00000000 --- a/lib/instrumentation/module/koa-route.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Pinpoint Node.js Agent - * Copyright 2020-present NAVER Corp. - * Apache License v2.0 - */ - -'use strict' - -const shimmer = require('shimmer') -const ServiceTypeCode = require('../../constant/service-type').ServiceTypeCode -const methods = require('methods') - -module.exports = function(agent, version, route) { - // todo. route 쓸지 검토 - methods.forEach(function (method) { - shimmer.wrap(route, method, function (shimmer, methodFn) { - return function () { - const trace = agent.traceContext.currentTraceObject() - let spanEventRecorder - if (trace) { - spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.koa) - spanEventRecorder.recordApi('koa.route.get') - } - const result = methodFn.apply(route, arguments) - if (trace) { - trace.traceBlockEnd(spanEventRecorder) - } - - return result - } - }) - }) - - return route -} diff --git a/lib/instrumentation/module/koa-router.js b/lib/instrumentation/module/koa-router.js index b164daec..4729234b 100644 --- a/lib/instrumentation/module/koa-router.js +++ b/lib/instrumentation/module/koa-router.js @@ -8,68 +8,67 @@ const semver = require('semver') const shimmer = require('shimmer') -const ServiceTypeCode = require('../../constant/service-type').ServiceTypeCode +const ServiceType = require('../../context/service-type') const log = require('../../utils/logger') -const MethodDescriptor = require('../../context/method-descriptor') +const layerPatchedSymbol = Symbol('PinpointKoaLayerPatched') +const { makeMethodDescriptorBuilder } = require('../../context/make-method-descriptor-builder') +const KoaMethodDescriptorBuilder = require('../../context/koa-method-descriptor-builder') const apiMetaService = require('../../context/api-meta-service') -module.exports = function(agent, version, router) { +module.exports = function (agent, version, router) { if (!semver.satisfies(version, '>=5.2.0 <8')) { log.debug('koa-router version %s not supported - aborting...', version) return router } - const methodDescriptorMap = new Map() + shimmer.wrap(router.prototype, 'register', function (original) { + return function (path, methods, middleware, opts) { + const layer = original.apply(this, arguments) - const MODULE_NAME = 'koa' - const OBJECT_NAME = 'router' + if (layer[layerPatchedSymbol]) { + return layer + } - function getMethodDescriptor (methodName) { - return methodDescriptorMap.get(methodName)|| setMethodDescriptor(methodName) - } + layer[layerPatchedSymbol] = true - function setMethodDescriptor(methodName) { - const descriptor = MethodDescriptor.create(MODULE_NAME, OBJECT_NAME, methodName) - apiMetaService.cacheApi(descriptor) - methodDescriptorMap.set(methodName, descriptor) - return descriptor - } + if (!Array.isArray(layer.stack) || layer.stack.length < 1) { + return layer + } - shimmer.wrap(router.prototype, 'register', function(original) { - return function (path, methods, middleware, opts) { - const layer = original.apply(this, arguments) - if (layer.stack) { - layer.stack.forEach((fn, index) => { - if (typeof fn === 'function') { - let result - layer.stack[index] = async function(ctx, next) { - const name = fn.name || 'AnonymousFunction' - const trace = agent.traceContext.currentTraceObject() - let spanEventRecorder = null - try { - if (trace) { - spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.koa) - spanEventRecorder.recordApiDesc(`koa.router.${ctx.method.toLocaleLowerCase()} [${name}]`) - } - result = await fn.apply(this, arguments) - } catch (e) { - if (!e._pinpointCheck) { - e._pinpointCheck = true - spanEventRecorder.recordServiceType(ServiceTypeCode.koa) - spanEventRecorder.recordApiDesc(`koa.router.${ctx.method.toLocaleLowerCase()} [${name}]`) - spanEventRecorder.recordException(e, true) - } - throw e - } finally { - if (trace) { - trace.traceBlockEnd(spanEventRecorder) - } - } - return result - } + const handlerIndex = layer.stack.length - 1 + const fn = layer.stack[handlerIndex] + if (typeof fn !== 'function') { + return layer + } + + const builder = KoaMethodDescriptorBuilder.make(makeMethodDescriptorBuilder('koa', 2, 3)) + const methodDescriptor = apiMetaService.cacheApiWithBuilder(builder) + layer.stack[handlerIndex] = async function (ctx, next) { + const name = fn.name || 'AnonymousFunction' + const trace = agent.traceContext.currentTraceObject() + let spanEventRecorder = null + let result + try { + if (trace) { + spanEventRecorder = trace.traceBlockBegin() + spanEventRecorder.recordServiceType(ServiceType.koa) + recordAPI(methodDescriptor, path, spanEventRecorder, ctx, name) + } + result = await fn.apply(this, arguments) + } catch (e) { + if (!e._pinpointCheck) { + e._pinpointCheck = true + spanEventRecorder.recordServiceType(ServiceType.koa) + recordAPI(methodDescriptor, path, spanEventRecorder, ctx, name) + spanEventRecorder.recordException(e, true) + } + throw e + } finally { + if (trace) { + trace.traceBlockEnd(spanEventRecorder) } - }) + } + return result } return layer } @@ -77,3 +76,14 @@ module.exports = function(agent, version, router) { return router } + +function recordAPI(methodDescriptor, path, spanEventRecorder, ctx, name) { + if (methodDescriptor && typeof path === 'string') { + spanEventRecorder.recordApiWithParameters(methodDescriptor, [path]) + } else if (methodDescriptor) { + spanEventRecorder.recordApi(methodDescriptor) + } else { + spanEventRecorder.recordApiDesc(`koa.router.${ctx.method.toLocaleLowerCase()} [${name}]`) + } +} + diff --git a/lib/instrumentation/module/koa.js b/lib/instrumentation/module/koa.js index 18c3a3e2..8dfa1105 100644 --- a/lib/instrumentation/module/koa.js +++ b/lib/instrumentation/module/koa.js @@ -6,99 +6,6 @@ 'use strict' -const semver = require('semver') -const shimmer = require('shimmer') -const ServiceTypeCode = require('../../constant/service-type').ServiceTypeCode -const log = require('../../utils/logger') - -module.exports = function(agent, version, koa) { - - // todo. emit 체크 - shimmer.wrap(koa.prototype, 'emit', function(original) { - return function (evt, err, ctx) { - const trace = agent.traceContext.currentTraceObject() - let spanEventRecorder = null - if (evt === 'error' & ctx) { - spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.koa) - spanEventRecorder.recordApiDesc('koa') - spanEventRecorder.recordException(err, true) - trace.traceBlockEnd(spanEventRecorder) - return original.apply(this, arguments) - } - if (trace) { - spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.koa) - spanEventRecorder.recordApiDesc('koa') // Todo. check this - } - const result = original.apply(this, arguments) - if (trace) { - trace.traceBlockEnd(spanEventRecorder) - } - return result - } - }) - shimmer.wrap(koa.prototype, 'use', function(original) { - return function wrapMiddleware(middleware) { - if (typeof middleware === 'function') { - const cb = arguments[0] - const name = middleware.name || 'AnonymousFunction' - // todo. 기본로직을 제외 하는 방법 검토할 것 - // if (cb.toString().trim().match(/^async/)) {} - arguments[0] = async function(ctx, next) { - let result - const trace = agent.traceContext.currentTraceObject() - let spanEventRecorder = null - try { - if (trace) { - spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.koa) - spanEventRecorder.recordApiDesc(`middleware [${name}]`) - } - result = await cb.apply(this, arguments) - } catch (e) { - if (!e._pinpointCheck) { - e._pinpointCheck = true - spanEventRecorder.recordServiceType(ServiceTypeCode.koa) - spanEventRecorder.recordApiDesc(`middleware [${name}]`) - spanEventRecorder.recordException(e, true) - } - throw e - } finally { - if (trace) { - trace.traceBlockEnd(spanEventRecorder) - } - } - return result - } - - } - return original.apply(this, arguments) - } - }) - // Test 3. createContext - // shimmer.wrap(koa.prototype, 'createContext', function(original) { - // return function wrapCreateContext(req, res) { - // const result = original.apply(this, arguments) - // - // shimmer.wrap(result, 'onerror', function(ori) { - // return function (err) { - // const trace = agent.traceContext.currentTraceObject() - // if (trace) { - // const spanEventRecorder = trace.traceBlockBegin() - // spanEventRecorder.recordServiceType(ServiceTypeCode.express) - // spanEventRecorder.recordApiDesc('tes') - // spanEventRecorder.recordException(err, true) - // trace.traceBlockEnd(spanEventRecorder) - // } - // return ori.apply(this, arguments) - // } - // }) - // - // - // - // return result - // } - // }) +module.exports = function (agent, version, koa) { return koa } diff --git a/lib/instrumentation/module/mongodb-core.js b/lib/instrumentation/module/mongodb-core.js index bb8c3d9e..ce935aef 100644 --- a/lib/instrumentation/module/mongodb-core.js +++ b/lib/instrumentation/module/mongodb-core.js @@ -8,12 +8,12 @@ const semver = require('semver') const shimmer = require('shimmer') -const ServiceTypeCode = require('../../constant/service-type').ServiceTypeCode +const ServiceType = require('../../context/service-type') const log = require('../../utils/logger') const ValueType = require('../../constant/valued-type').ValuedType -const EventAnnotationKey = require('../../constant/annotation-key').EventAnnotationKey const convertUtils = require('../../utils/convert-utils') const IdGenerator = require('../../context/id-generator') +const mongoJSONData = require('./mongodb/mongo-json-data-annotation-key') const SERVER_FNS = ['insert', 'update', 'remove', 'auth'] const CURSOR_FNS_FIRST = ['next', '_getmore'] @@ -59,16 +59,16 @@ module.exports = function(agent, version, mongodb) { else type = 'command' spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.ASYNC_HTTP_CLIENT_INTERNAL) + spanEventRecorder.recordServiceType(ServiceType.asyncHttpClientInternal) spanEventRecorder.recordApiDesc('mongodb.'+ String(type).toUpperCase()+'.call' ) trace.traceBlockEnd(spanEventRecorder) asyncTrace = trace.newAsyncTrace(spanEventRecorder) const nextSpanId = IdGenerator.next asyncEventRecorder = asyncTrace.traceAsyncBegin() - asyncEventRecorder.recordServiceType(ServiceTypeCode.mongodb) + asyncEventRecorder.recordServiceType(ServiceType.mongodb) asyncEventRecorder.recordApiDesc(`mongodb.${type} [${ns}]`) - asyncEventRecorder.recordApiArguments(EventAnnotationKey.MONGO_JSON_DATA, + asyncEventRecorder.recordApiArguments(mongoJSONData, convertUtils.convertStringStringValue(cmd), ValueType.stringStringValue) asyncEventRecorder.recordNextSpanId(nextSpanId) @@ -101,16 +101,16 @@ module.exports = function(agent, version, mongodb) { cb = arguments[index] if (typeof cb === 'function') { spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.ASYNC_HTTP_CLIENT_INTERNAL) + spanEventRecorder.recordServiceType(ServiceType.asyncHttpClientInternal) spanEventRecorder.recordApiDesc('mongodb.'+ String(name).toUpperCase()+'.call' ) trace.traceBlockEnd(spanEventRecorder) asyncTrace = trace.newAsyncTrace(spanEventRecorder) const nextSpanId = IdGenerator.next asyncEventRecorder = asyncTrace.traceAsyncBegin() - asyncEventRecorder.recordServiceType(ServiceTypeCode.mongodb) + asyncEventRecorder.recordServiceType(ServiceType.mongodb) asyncEventRecorder.recordApiDesc(`mongodb.${name} [${ns}]`) - asyncEventRecorder.recordApiArguments(EventAnnotationKey.MONGO_JSON_DATA, + asyncEventRecorder.recordApiArguments(mongoJSONData, convertUtils.convertStringStringValue(cmd), ValueType.stringStringValue) asyncEventRecorder.recordNextSpanId(nextSpanId) @@ -145,16 +145,16 @@ module.exports = function(agent, version, mongodb) { if (typeof cb === 'function') { if ( name !== 'next' || !this[firstTrace]) { spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.ASYNC_HTTP_CLIENT_INTERNAL) + spanEventRecorder.recordServiceType(ServiceType.asyncHttpClientInternal) spanEventRecorder.recordApiDesc('mongodb.'+ String(id).toUpperCase()+'.call' ) trace.traceBlockEnd(spanEventRecorder) asyncTrace = trace.newAsyncTrace(spanEventRecorder) const nextSpanId = IdGenerator.next asyncEventRecorder = asyncTrace.traceAsyncBegin() - asyncEventRecorder.recordServiceType(ServiceTypeCode.mongodb) + asyncEventRecorder.recordServiceType(ServiceType.mongodb) asyncEventRecorder.recordApiDesc(`mongodb.${id} [${this.ns}]`) - asyncEventRecorder.recordApiArguments(EventAnnotationKey.MONGO_JSON_DATA, + asyncEventRecorder.recordApiArguments(mongoJSONData, convertUtils.convertStringStringValue(this.cmd.query), ValueType.stringStringValue) asyncEventRecorder.recordNextSpanId(nextSpanId) diff --git a/lib/instrumentation/module/mongodb/mongo-json-data-annotation-key.js b/lib/instrumentation/module/mongodb/mongo-json-data-annotation-key.js new file mode 100644 index 00000000..d23071ee --- /dev/null +++ b/lib/instrumentation/module/mongodb/mongo-json-data-annotation-key.js @@ -0,0 +1,11 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const AnnotationKey = require("../../../context/annotation-key") + +module.exports = new AnnotationKey(150, 'MONGO-JSON-Data') \ No newline at end of file diff --git a/lib/instrumentation/module/mysql.js b/lib/instrumentation/module/mysql.js index c76d66f9..7108c841 100644 --- a/lib/instrumentation/module/mysql.js +++ b/lib/instrumentation/module/mysql.js @@ -7,167 +7,27 @@ 'use strict' const semver = require('semver') -const shimmer = require('shimmer') -const ServiceTypeCode = require('../../constant/service-type').ServiceTypeCode const log = require('../../utils/logger') +const InstrumentMethod = require('../instrument-method') +const MySQLCreateConnectionInterceptor = require('./mysql/mysql-create-connection-interceptor') +const MySQLCreatePoolInterceptor = require('./mysql/mysql-create-pool-interceptor') +const MySQLCreatePoolClusterInterceptor = require('./mysql/mysql-create-pool-cluster-interceptor') // https://github.com/elastic/apm-agent-nodejs/blob/master/lib/instrumentation/modules/mysql.js -module.exports = function(agent, version, mysql) { +module.exports = function (agent, version, mysql) { if (!semver.satisfies(version, '^2.0.0')) { log.debug('mysql version %s not supported - aborting...', version) return mysql } log.debug('shimming mysql.createPool') - shimmer.wrap(mysql, 'createPool', wrapCreatePool) + InstrumentMethod.make(mysql, 'createPool', agent.traceContext).addScopedInterceptor(new MySQLCreatePoolInterceptor(agent.traceContext)) log.debug('shimming mysql.createPoolCluster') - shimmer.wrap(mysql, 'createPoolCluster', wrapCreatePoolCluster) + InstrumentMethod.make(mysql, 'createPoolCluster', agent.traceContext).addScopedInterceptor(new MySQLCreatePoolClusterInterceptor(agent.traceContext)) log.debug('shimming mysql.createConnection') - shimmer.wrap(mysql, 'createConnection', wrapCreateConnection) + InstrumentMethod.make(mysql, 'createConnection', agent.traceContext).addScopedInterceptor(new MySQLCreateConnectionInterceptor(agent.traceContext)) return mysql - - - function wrapCreateConnection (original) { - return function wrappedCreateConnection () { - const connection = original.apply(this, arguments) - - wrapQueryable(connection, 'connection', agent) - - return connection - } - } - - function wrapCreatePool (original) { - return function wrappedCreatePool () { - const pool = original.apply(this, arguments) - - log.debug('shimming mysql pool.getConnection') - shimmer.wrap(pool, 'getConnection', wrapGetConnection) - - return pool - } - } - - function wrapCreatePoolCluster (original) { - return function wrappedCreatePoolCluster () { - const cluster = original.apply(this, arguments) - - log.debug('shimming mysql cluster.of') - shimmer.wrap(cluster, 'of', function wrapOf (original) { - return function wrappedOf () { - const ofCluster = original.apply(this, arguments) - - log.debug('shimming mysql cluster of.getConnection') - shimmer.wrap(ofCluster, 'getConnection', wrapGetConnection) - - return ofCluster - } - }) - return cluster - } - } - - function wrapGetConnection (original) { - return function wrappedGetConnection () { - const cb = arguments[0] - - if (typeof cb === 'function') { - arguments[0] = function bindFunction() { - return function wrapedCallback (err, connection) { - // eslint-disable-line handle-callback-err - if (connection) wrapQueryable(connection, 'getConnection() > connection', agent) - return cb.apply(this, arguments) - } - } - } - return original.apply(this, arguments) - } - } - - function wrapQueryable (obj, objType, agent) { - log.debug('shimming mysql %s.query', objType) - shimmer.wrap(obj, 'query', wrapQuery) - - function wrapQuery (original) { - return function wrappedQuery (sql, values, cb) { - let hasCallback = false - let sqlStr - - const trace = agent.traceContext.currentTraceObject() - let spanEventRecorder, asyncEventRecorder, asyncTrace - - if (trace) { - spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.ASYNC_HTTP_CLIENT_INTERNAL) - spanEventRecorder.recordApiDesc('mysql.'+ String(sql).toUpperCase()+'.call' ) - trace.traceBlockEnd(spanEventRecorder) - - switch (typeof sql) { - case 'string': - sqlStr = sql - break - case 'object': - if (typeof sql._callback === 'function') { - sql._callback = wrapCallback(sql._callback) - } - sqlStr = sql.sql - break - case 'function': - arguments[0] = wrapCallback(sql) - break - } - - const nextSpanId = IdGenerator.next - asyncTrace = trace.newAsyncTrace(spanEventRecorder) - asyncEventRecorder = asyncTrace.traceAsyncBegin() - asyncEventRecorder.recordServiceType(ServiceTypeCode.mysql) - asyncEventRecorder.recordApiDesc(`mysql.${objType}.query `) - asyncEventRecorder.recordNextSpanId(nextSpanId) - - if (sqlStr) { // TODO. this point - asyncEventRecorder.recordApiArguments(EventAnnotationKey.MONGO_JSON_DATA, - convertUtils.convertStringStringValue(sqlStr), ValueType.stringStringValue) - } - - if (typeof values === 'function') { - arguments[1] = wrapCallback(values) - } else if (typeof cb === 'function') { - arguments[2] = wrapCallback(cb) - } - } - - const result = original.apply(this, arguments) - - if (asyncTrace && result && !hasCallback) { - shimmer.wrap(result, 'emit', function (original) { - return function (event) { - switch (event) { - case 'error': - case 'end': - asyncTrace.traceAsyncEnd(asyncEventRecorder) - } - return original.apply(this, arguments) - } - }) - } - - return result - - function wrapCallback (cb) { - hasCallback = true - return function wrappedCallback () { - if (trace) { - trace.traceAsyncEnd(asyncEventRecorder) - } - return cb.apply(this, arguments) - } - } - } - } -} - - } diff --git a/lib/instrumentation/module/mysql/mysql-cluster-of-interceptor.js b/lib/instrumentation/module/mysql/mysql-cluster-of-interceptor.js new file mode 100644 index 00000000..957b117e --- /dev/null +++ b/lib/instrumentation/module/mysql/mysql-cluster-of-interceptor.js @@ -0,0 +1,31 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const MethodDescriptorBuilder2 = require('../../../context/method-descriptor-builder2') +const InstrumentMethod = require('../../instrument-method') +const MySQLGetConnectionInterceptor = require('./mysql-get-connection-interceptor') + +class MySQLClusterOfInterceptor { + constructor(traceContext) { + this.traceContext = traceContext + this.methodDescriptorBuilder = new MethodDescriptorBuilder2('of') + } + + doInBeforeTrace(recorder, target, args) { + recorder.recordServiceType(require('./mysql-service-type')) + } + + prepareAfterTrace(target, args, poolNamespace) { + if (!poolNamespace) { + return + } + InstrumentMethod.make(poolNamespace, 'getConnection', this.traceContext).addScopedInterceptor(new MySQLGetConnectionInterceptor(this.traceContext)) + } +} + +module.exports = MySQLClusterOfInterceptor \ No newline at end of file diff --git a/lib/instrumentation/module/mysql/mysql-connection-interceptor.js b/lib/instrumentation/module/mysql/mysql-connection-interceptor.js new file mode 100644 index 00000000..e83d15cb --- /dev/null +++ b/lib/instrumentation/module/mysql/mysql-connection-interceptor.js @@ -0,0 +1,39 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const serviceType = require('./mysql-service-type') +const MethodDescriptorBuilder2 = require('../../../context/method-descriptor-builder2') +class MySQLConnectionConnectInterceptor { + constructor() { + this.methodDescriptorBuilder = new MethodDescriptorBuilder2('connect') + this.methodDescriptorBuilder.setClassName('Connection') + this.methodDescriptorBuilder.setParameterVariableNames('connectionUri') + } + + doInBeforeTrace(recorder, target, args) { + recorder.recordServiceType(serviceType) + } + + doInBeforeAsyncTrace(asyncEventRecorder, target, args) { + asyncEventRecorder.recordServiceType(serviceType) + } + + callbackIndexOf(args) { + if (args.length > 1 && typeof args[1] === 'function') { + return 1 + } + + if (typeof args[0] !== 'function') { + return + } + + return 0 + } +} + +module.exports = MySQLConnectionConnectInterceptor \ No newline at end of file diff --git a/lib/instrumentation/module/mysql/mysql-create-connection-interceptor.js b/lib/instrumentation/module/mysql/mysql-create-connection-interceptor.js new file mode 100644 index 00000000..b2ce5ccb --- /dev/null +++ b/lib/instrumentation/module/mysql/mysql-create-connection-interceptor.js @@ -0,0 +1,37 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const serviceType = require('./mysql-service-type') +const InstrumentMethod = require('../../instrument-method') +const MySQLConnectionInterceptor = require('./mysql-connection-interceptor') +const MethodDescriptorBuilder2 = require('../../../context/method-descriptor-builder2') +const MySQLStatementExecuteQueryInterceptor = require('./mysql-statement-execute-query-interceptor') +const databaseInfoSymbol = require('./mysql-database-information-symbol') +const MySQLDatabaseInformationContext = require('./mysql-database-information-context') + +class MySQLCreateConnectionInterceptor { + constructor(traceContext) { + this.traceContext = traceContext + this.methodDescriptorBuilder = new MethodDescriptorBuilder2('createConnection') + this.methodDescriptorBuilder.setParameterVariableNames('connectionUri') + } + + doInBeforeTrace(recorder, target, args) { + recorder.recordServiceType(serviceType) + } + + doInAfterTrace(recorder, target, args, returned) { + if (returned) { + returned[databaseInfoSymbol] = MySQLDatabaseInformationContext.recordAndReturnDatabaseInfo(recorder, target, args) + InstrumentMethod.make(returned, 'connect', this.traceContext).addScopedInterceptor(new MySQLConnectionInterceptor()) + InstrumentMethod.make(returned, 'query', this.traceContext).addScopedInterceptor(new MySQLStatementExecuteQueryInterceptor('Connection')) + } + } +} + +module.exports = MySQLCreateConnectionInterceptor \ No newline at end of file diff --git a/lib/instrumentation/module/mysql/mysql-create-pool-cluster-interceptor.js b/lib/instrumentation/module/mysql/mysql-create-pool-cluster-interceptor.js new file mode 100644 index 00000000..bf86694b --- /dev/null +++ b/lib/instrumentation/module/mysql/mysql-create-pool-cluster-interceptor.js @@ -0,0 +1,31 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const MethodDescriptorBuilder2 = require('../../../context/method-descriptor-builder2') +const InstrumentMethod = require('../../instrument-method') +const MySQLClusterOfInterceptor = require('./mysql-cluster-of-interceptor') + +class MySQLCreatePoolClusterInterceptor { + constructor(traceContext) { + this.traceContext = traceContext + this.methodDescriptorBuilder = new MethodDescriptorBuilder2('createPoolCluster') + } + + doInBeforeTrace(recorder) { + recorder.recordServiceType(require('./mysql-service-type')) + } + + prepareAfterTrace(target, args, poolCluster) { + if (!poolCluster) { + return + } + InstrumentMethod.make(poolCluster, 'of', this.traceContext).addScopedInterceptor(new MySQLClusterOfInterceptor(this.traceContext)) + } +} + +module.exports = MySQLCreatePoolClusterInterceptor \ No newline at end of file diff --git a/lib/instrumentation/module/mysql/mysql-create-pool-interceptor.js b/lib/instrumentation/module/mysql/mysql-create-pool-interceptor.js new file mode 100644 index 00000000..6ab2f330 --- /dev/null +++ b/lib/instrumentation/module/mysql/mysql-create-pool-interceptor.js @@ -0,0 +1,40 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const serviceType = require('./mysql-service-type') +const InstrumentMethod = require('../../instrument-method') +const MethodDescriptorBuilder2 = require("../../../context/method-descriptor-builder2") +const databaseInfoSymbol = require('./mysql-database-information-symbol') +const MySQLGetConnectionInterceptor = require('./mysql-get-connection-interceptor') +const MySQLDatabaseInformationContext = require('./mysql-database-information-context') +const MySQLStatementExecuteQueryInterceptor = require('./mysql-statement-execute-query-interceptor') + +class MySQLCreatePoolInterceptor { + constructor(traceContext) { + this.traceContext = traceContext + this.methodDescriptorBuilder = new MethodDescriptorBuilder2('createPool') + } + + doInBeforeTrace(recorder, target, args) { + recorder.recordServiceType(serviceType) + } + + prepareAfterTrace(target, args, pool) { + if (pool) { + InstrumentMethod.make(pool, 'getConnection', this.traceContext).addScopedInterceptor(new MySQLGetConnectionInterceptor(this.traceContext)) + } + } + + doInAfterTrace(recorder, target, args, returned) { + if (returned) { + returned[databaseInfoSymbol] = MySQLDatabaseInformationContext.recordAndReturnDatabaseInfo(recorder, target, args) + } + } +} + +module.exports = MySQLCreatePoolInterceptor \ No newline at end of file diff --git a/lib/instrumentation/module/mysql/mysql-database-information-context.js b/lib/instrumentation/module/mysql/mysql-database-information-context.js new file mode 100644 index 00000000..5066dd42 --- /dev/null +++ b/lib/instrumentation/module/mysql/mysql-database-information-context.js @@ -0,0 +1,24 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const databaseInfoSymbol = require('./mysql-database-information-symbol') + +class MySQLDatabaseInformationContext { + static recordAndReturnDatabaseInfo(recorder, target, args) { + const databaseInfo = args[0] + if (databaseInfo && databaseInfo.host && typeof databaseInfo.host === 'string') { + recorder.recordEndPoint(databaseInfo.host) + } + if (databaseInfo && databaseInfo.database && typeof databaseInfo.database === 'string') { + recorder.recordDestinationId(databaseInfo.database) + } + return databaseInfo + } +} + +module.exports = MySQLDatabaseInformationContext \ No newline at end of file diff --git a/lib/instrumentation/module/mysql/mysql-database-information-symbol.js b/lib/instrumentation/module/mysql/mysql-database-information-symbol.js new file mode 100644 index 00000000..63c131fc --- /dev/null +++ b/lib/instrumentation/module/mysql/mysql-database-information-symbol.js @@ -0,0 +1,9 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +module.exports = Symbol('Pinpoint DatabaseInfo Symbol') \ No newline at end of file diff --git a/lib/instrumentation/module/mysql/mysql-execute-query-service-type.js b/lib/instrumentation/module/mysql/mysql-execute-query-service-type.js new file mode 100644 index 00000000..c42ee519 --- /dev/null +++ b/lib/instrumentation/module/mysql/mysql-execute-query-service-type.js @@ -0,0 +1,12 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const ServiceType = require('../../../context/service-type') +const { ServiceTypeProperty } = require('../../../constant/service-type') + +module.exports = new ServiceType(2101, "MYSQL_EXECUTE_QUERY", ServiceTypeProperty.TERMINAL, ServiceTypeProperty.RECORD_STATISTICS, ServiceTypeProperty.INCLUDE_DESTINATION_ID) \ No newline at end of file diff --git a/lib/instrumentation/module/mysql/mysql-get-connection-interceptor.js b/lib/instrumentation/module/mysql/mysql-get-connection-interceptor.js new file mode 100644 index 00000000..42d4713a --- /dev/null +++ b/lib/instrumentation/module/mysql/mysql-get-connection-interceptor.js @@ -0,0 +1,51 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const serviceType = require('./mysql-service-type') +const MethodDescriptorBuilder2 = require("../../../context/method-descriptor-builder2") +const databaseInfoSymbol = require('./mysql-database-information-symbol') +const InstrumentMethod = require('../../instrument-method') +const MySQLStatementExecuteQueryInterceptor = require('./mysql-statement-execute-query-interceptor') + +class MySQLGetConnectionInterceptor { + constructor(traceContext) { + this.traceContext = traceContext + this.methodDescriptorBuilder = new MethodDescriptorBuilder2('getConnection') + .setClassName('Pool') + this.serviceType = serviceType + } + + doInBeforeTrace(recorder, target) { + if (target[databaseInfoSymbol]) { + const databaseInfo = target[databaseInfoSymbol] + recorder.recordEndPoint(databaseInfo.host) + recorder.recordDestinationId(databaseInfo.database) + } + } + + prepareBeforeAsyncTrace(target, args) { + if (args.length > 1 && args[1]) { + const connection = args[1] + InstrumentMethod.make(connection, 'query', this.traceContext).addScopedInterceptor(new MySQLStatementExecuteQueryInterceptor('PoolConnection')) + } + } + + callbackIndexOf(args) { + if (args.length > 1 && typeof args[1] === 'function') { + return 1 + } + + if (typeof args[0] !== 'function') { + return + } + + return 0 + } +} + +module.exports = MySQLGetConnectionInterceptor \ No newline at end of file diff --git a/lib/instrumentation/module/mysql/mysql-service-type.js b/lib/instrumentation/module/mysql/mysql-service-type.js new file mode 100644 index 00000000..8eb33f51 --- /dev/null +++ b/lib/instrumentation/module/mysql/mysql-service-type.js @@ -0,0 +1,12 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const ServiceType = require('../../../context/service-type') +const { ServiceTypeProperty } = require('../../../constant/service-type') + +module.exports = new ServiceType(2100, "MYSQL", ServiceTypeProperty.TERMINAL, ServiceTypeProperty.INCLUDE_DESTINATION_ID) \ No newline at end of file diff --git a/lib/instrumentation/module/mysql/mysql-statement-execute-query-interceptor.js b/lib/instrumentation/module/mysql/mysql-statement-execute-query-interceptor.js new file mode 100644 index 00000000..70a50bcd --- /dev/null +++ b/lib/instrumentation/module/mysql/mysql-statement-execute-query-interceptor.js @@ -0,0 +1,62 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const serviceType = require('./mysql-execute-query-service-type') +const MethodDescriptorBuilder2 = require('../../../context/method-descriptor-builder2') +const databaseInfoSymbol = require('./mysql-database-information-symbol') + +class MySQLStatementExecuteQueryInterceptor { + constructor(className) { + this.methodDescriptorBuilder = new MethodDescriptorBuilder2('query') + this.methodDescriptorBuilder.setClassName(className) + this.serviceType = serviceType + } + + doInBeforeTrace(recorder, target, args) { + const sqlArguments = Array.from(args) + + if (target[databaseInfoSymbol] && typeof target[databaseInfoSymbol].host === 'string') { + recorder.recordEndPoint(target[databaseInfoSymbol].host) + } + + if (target[databaseInfoSymbol] && typeof target[databaseInfoSymbol].database === 'string') { + recorder.recordDestinationId(target[databaseInfoSymbol].database) + } + + if (sqlArguments.length > 0) { + const sql = sqlArguments[0] + if (this.hasBindVariables(sqlArguments)) { + const bindString = sqlArguments.slice(1).slice(0, -1).join(', ') + recorder.recordSqlInfo(sql, bindString) + } else { + recorder.recordSqlInfo(sql) + } + } + } + + hasBindVariables(args) { + return args.length > 2 + } + + callbackIndexOf(args) { + let functionIndex = -1 + for (let index = 0; index < args.length; index++) { + if (typeof args[index] === 'function') { + functionIndex = index + } + + } + if (functionIndex < 0) { + return + } + + return functionIndex + } +} + +module.exports = MySQLStatementExecuteQueryInterceptor \ No newline at end of file diff --git a/lib/instrumentation/module/mysql2.js b/lib/instrumentation/module/mysql2.js index 89aa2099..358ac6c6 100644 --- a/lib/instrumentation/module/mysql2.js +++ b/lib/instrumentation/module/mysql2.js @@ -7,100 +7,26 @@ 'use strict' const semver = require('semver') -const shimmer = require('shimmer') -const ServiceTypeCode = require('../../constant/service-type').ServiceTypeCode const log = require('../../utils/logger') +const InstrumentMethod = require('../instrument-method') +const MySQLCreatePoolInterceptor = require('./mysql/mysql-create-pool-interceptor') +const MySQLCreatePoolClusterInterceptor = require('./mysql/mysql-create-pool-cluster-interceptor') +const MySQLCreateConnectionInterceptor = require('./mysql/mysql-create-connection-interceptor') -module.exports = function (agent, version, mysql2) { - - if (!semver.satisfies(version, '^1.0.0')) { +module.exports = function (agent, version, mysql) { + if (!semver.satisfies(version, '>=1 <4')) { log.debug('mysql2 version %s not supported - aborting...', version) - return mysql2 + return mysql } - shimmer.massWrap(mysql2.Connection.prototype, ['query', 'execute'], wrapQuery) - - return mysql2 - - function wrapQuery(original) { - return function wrappedQuery(sql, values, cb) { - let hasCallback = false - let sqlStr - - const trace = agent.traceContext.currentTraceObject() - let spanEventRecorder, asyncEventRecorder, asyncTrace - - if (trace) { - spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType( - ServiceTypeCode.ASYNC_HTTP_CLIENT_INTERNAL) - spanEventRecorder.recordApiDesc('mysql2.call') - trace.traceBlockEnd(spanEventRecorder) - - switch (typeof sql) { - case 'string': - sqlStr = sql - break - case 'object': - if (typeof sql.onResult === 'function') { - sql.onResult = wrapCallback(sql.onResult) - } - sqlStr = sql.sql - break - case 'function': - arguments[0] = wrapCallback(sql) - break - } - - const nextSpanId = IdGenerator.next - asyncTrace = trace.newAsyncTrace(spanEventRecorder) - asyncEventRecorder = trace.traceAsyncBegin() - asyncEventRecorder.recordServiceType(ServiceTypeCode.mysql) - asyncEventRecorder.recordApiDesc(`mysql.${objType}.query `) - asyncEventRecorder.recordNextSpanId(nextSpanId) + log.debug('shimming mysql.createPool') + InstrumentMethod.make(mysql, 'createPool', agent.traceContext).addScopedInterceptor(new MySQLCreatePoolInterceptor(agent.traceContext)) - if (trace && sqlStr) { // TODO. this point - asyncEventRecorder.recordApiArguments( - EventAnnotationKey.MONGO_JSON_DATA, - convertUtils.convertStringStringValue(sqlStr), - ValueType.stringStringValue) - } + log.debug('shimming mysql.createPoolCluster') + InstrumentMethod.make(mysql, 'createPoolCluster', agent.traceContext).addScopedInterceptor(new MySQLCreatePoolClusterInterceptor(agent.traceContext)) - if (typeof values === 'function') { - arguments[1] = wrapCallback(values) - } else if (typeof cb === 'function') { - arguments[2] = wrapCallback(cb) - } - - const result = original.apply(this, arguments) - - if (result && !hasCallback) { - if (asyncTrace) { - shimmer.wrap(result, 'emit', function (original) { - return function (event) { - switch (event) { - case 'error': - case 'close': - case 'end': - asyncTrace.traceAsyncEnd(asyncEventRecorder) - } - return original.apply(this, arguments) - } - }) - } - } - } - - return result - - function wrapCallback(cb) { - hasCallback = true - return trace ? wrappedCallback : cb - - function wrappedCallback() { - trace.traceAsyncEnd(asyncEventRecorder) - return cb.apply(this, arguments) - } - } - } - } + log.debug('shimming mysql.createConnection') + InstrumentMethod.make(mysql, 'createConnection', agent.traceContext).addScopedInterceptor(new MySQLCreateConnectionInterceptor(agent.traceContext)) + + return mysql +} \ No newline at end of file diff --git a/lib/instrumentation/module/redis.js b/lib/instrumentation/module/redis.js index 73d0e8ce..c66c5d13 100644 --- a/lib/instrumentation/module/redis.js +++ b/lib/instrumentation/module/redis.js @@ -8,7 +8,7 @@ const semver = require('semver') const shimmer = require('shimmer') -const ServiceTypeCode = require('../../constant/service-type').ServiceTypeCode +const ServiceType = require('../../context/service-type') const log = require('../../utils/logger') const IdGenerator = require('../../context/id-generator') const { addressStringOf } = require('../../utils/convert-utils') @@ -47,7 +47,7 @@ module.exports = function (agent, version, redis) { if (!isPinpointCallbackWrapper && trace) { const command = commandObj && commandObj.command const spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.redis) + spanEventRecorder.recordServiceType(ServiceType.redis) spanEventRecorder.recordApiDesc('redis.'+ String(command).toLowerCase() + '.call') spanEventRecorder.recordDestinationId('Redis') if (this.connection_options) { @@ -58,7 +58,7 @@ module.exports = function (agent, version, redis) { const asyncTrace = trace.newAsyncTrace(spanEventRecorder) const nextSpanId = IdGenerator.next const asyncEventRecorder = asyncTrace.traceAsyncBegin() - asyncEventRecorder.recordServiceType(ServiceTypeCode.redis) + asyncEventRecorder.recordServiceType(ServiceType.redis) asyncEventRecorder.recordApiDesc('redis.'+ String(command).toLowerCase() + '.end') asyncEventRecorder.recordNextSpanId(nextSpanId) asyncEventRecorder.recordDestinationId('Redis') diff --git a/lib/instrumentation/module/request.js b/lib/instrumentation/module/request.js deleted file mode 100644 index 4c2d2af5..00000000 --- a/lib/instrumentation/module/request.js +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Pinpoint Node.js Agent - * Copyright 2020-present NAVER Corp. - * Apache License v2.0 - */ - -'use strict' - -const shimmer = require('shimmer') -const ServiceTypeCode = require('../../constant/service-type').ServiceTypeCode -const AsyncIdAccessor = require('../../context/async-id-accessor') - -module.exports = function(agent, version, request) { - - shimmer.wrap(request, 'get', function (original) { - return function () { - - const trace = agent.traceContext.currentTraceObject() - let spanEventRecorder = null - if (trace) { - spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.ASYNC_HTTP_CLIENT_INTERNAL) - spanEventRecorder.recordApiDesc('request.get') - } - const result = original.apply(this, arguments) - if (trace) { - - let asyncId = spanEventRecorder.recordNextAsyncId() - AsyncIdAccessor.setAsyncId(result, asyncId) - - trace.traceBlockEnd(spanEventRecorder) - } - - - return result - } - }) - - shimmer.wrap(request, 'post', function (original) { - return function () { - - const trace = agent.traceContext.currentTraceObject() - let spanEventRecorder = null - if (trace) { - spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.ASYNC_HTTP_CLIENT_INTERNAL) - spanEventRecorder.recordApiDesc('request.post') - } - const result = original.apply(this, arguments) - if (trace) { - - let asyncId = spanEventRecorder.recordNextAsyncId() - AsyncIdAccessor.setAsyncId(result, asyncId) - - trace.traceBlockEnd(spanEventRecorder) - } - - - return result - } - }) - - return request -} - diff --git a/lib/instrumentation/request-header-utils.js b/lib/instrumentation/request-header-utils.js index 01af850e..8df1ebec 100644 --- a/lib/instrumentation/request-header-utils.js +++ b/lib/instrumentation/request-header-utils.js @@ -15,14 +15,25 @@ const TransactionId = require('../context/transaction-id') const samplingFlag = require('../sampler/sampling-flag') class RequestHeaderUtils { - static read (request) { + static read(request) { if (!request) { return null } let requestData = new RequestData() - const parsedUrl = url.parse(request.url) - requestData.rpcName = parsedUrl ? parsedUrl.pathname : '' + + // https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost + // url.parse throw error + try { + const parsedUrl = url.parse(request.url) + requestData.rpcName = parsedUrl ? parsedUrl.pathname : '' + const query = parsedUrl.query + if (query && query.length > 0) { + requestData.searchParams = query + } + } catch (error) { + log.error(error) + } requestData.endPoint = this.getHeader(request, 'host') const remoteAddress = this.getHeader(request, 'x-forwarded-for') || request.connection.remoteAddress if (remoteAddress) { @@ -35,19 +46,19 @@ class RequestHeaderUtils { return requestData } - static readPinpointHeader (request, requestData) { + static readPinpointHeader(request, requestData) { requestData.transactionId = TransactionId.toTransactionId(this.getHeader(request, PinpointHeader.HTTP_TRACE_ID)) if (requestData.transactionId) { - const spanId = this.getHeader(request, PinpointHeader.HTTP_SPAN_ID); + const spanId = this.getHeader(request, PinpointHeader.HTTP_SPAN_ID) if (spanId) { requestData.spanId = spanId } - const parentSpanId = this.getHeader(request, PinpointHeader.HTTP_PARENT_SPAN_ID); + const parentSpanId = this.getHeader(request, PinpointHeader.HTTP_PARENT_SPAN_ID) if (parentSpanId) { requestData.parentSpanId = parentSpanId } - + requestData.parentApplicationName = this.getHeader(request, PinpointHeader.HTTP_PARENT_APPLICATION_NAME) requestData.parentApplicationType = Number(this.getHeader(request, PinpointHeader.HTTP_PARENT_APPLICATION_TYPE)) requestData.flags = Number(this.getHeader(request, PinpointHeader.HTTP_FLAGS)) @@ -58,7 +69,7 @@ class RequestHeaderUtils { return requestData } - static getHeader (request, name) { + static getHeader(request, name) { if (request.getHeader) { return request.getHeader(name.toLowerCase()) } @@ -69,7 +80,7 @@ class RequestHeaderUtils { this.setHeader(request, PinpointHeader.HTTP_SAMPLED, samplingFlag.samplingRateFalse()) } - static write (request, agent, nextSpanId, host) { + static write(request, agent, nextSpanId, host) { if (!agent) { return } @@ -88,7 +99,7 @@ class RequestHeaderUtils { return request } - static setHeader (request, name, value) { + static setHeader(request, name, value) { if (request.setHeader) { request.setHeader(name, value) } else { diff --git a/lib/instrumentation/scope/default-interceptor-scope-invocation.js b/lib/instrumentation/scope/default-interceptor-scope-invocation.js new file mode 100644 index 00000000..9cf88e9f --- /dev/null +++ b/lib/instrumentation/scope/default-interceptor-scope-invocation.js @@ -0,0 +1,59 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +// DefaultInterceptorScopeInvocation.java in Java Agent +class DefaultInterceptorScopeInvocation { + constructor(name) { + this.name = name + this.depth = 0 + this.skippedBoundary = 0 + } + + tryEnter(policy) { + if (policy.isAlways()) { + this.depth++ + return true + } + + if (policy.isBoundary()) { + if (this.isActive()) { + this.skippedBoundary++ + return false + } else { + this.depth++ + return true + } + } + + return false + } + + isActive() { + return this.depth > 0 + } + + leave(policy) { + if (policy.isAlways()) { + this.depth-- + return + } + + if (policy.isBoundary()) { + if (this.isActive()) { + this.depth-- + return + } else { + this.skippedBoundary-- + return + } + } + } + +} + +module.exports = DefaultInterceptorScopeInvocation \ No newline at end of file diff --git a/lib/instrumentation/scope/execution-policy.js b/lib/instrumentation/scope/execution-policy.js new file mode 100644 index 00000000..ec3b484b --- /dev/null +++ b/lib/instrumentation/scope/execution-policy.js @@ -0,0 +1,32 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +// ExecutionPolicy.java in Java Agent +class ExecutionPolicy { + static ALWAYS = new ExecutionPolicy('ALWAYS') + static BOUNDARY = new ExecutionPolicy('BOUNDARY') + static INTERNAL = new ExecutionPolicy('INTERNAL') + + constructor(name) { + this.name = name + } + + isAlways() { + return this === ExecutionPolicy.ALWAYS + } + + isBoundary() { + return this === ExecutionPolicy.BOUNDARY + } + + isInternal() { + return this === ExecutionPolicy.INTERNAL + } +} + +module.exports = ExecutionPolicy \ No newline at end of file diff --git a/lib/instrumentation/sql/normalized-sql.js b/lib/instrumentation/sql/normalized-sql.js new file mode 100644 index 00000000..d7b44430 --- /dev/null +++ b/lib/instrumentation/sql/normalized-sql.js @@ -0,0 +1,26 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +class NormalizedSql { + static nullObject = new NormalizedSql('', '') + + constructor(normalizedSql, parseParameter) { + this.normalizedSql = normalizedSql + this.parseParameter = parseParameter + } + + getNormalizedSql() { + return this.normalizedSql + } + + getParseParameter() { + return this.parseParameter + } +} + +module.exports = NormalizedSql \ No newline at end of file diff --git a/lib/instrumentation/sql/parsing-result.js b/lib/instrumentation/sql/parsing-result.js new file mode 100644 index 00000000..4bd72684 --- /dev/null +++ b/lib/instrumentation/sql/parsing-result.js @@ -0,0 +1,30 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +class ParsingResult { + constructor(sqlId, originalSql, normalizedSql) { + this.sqlId = sqlId + this.originalSql = originalSql + this.sql = normalizedSql + } + + getId() { + return this.sqlId + } + + getSql() { + return this.sql.getNormalizedSql() + } + + getOutput() { + return this.sql.getParseParameter() + } + + toString() { + return `ParsingResult{sqlId=${this.sqlId}, sql=${this.getSql()}, output=${this.getOutput()}}` + } +} +module.exports = ParsingResult \ No newline at end of file diff --git a/lib/instrumentation/sql/sql-metadata-service.js b/lib/instrumentation/sql/sql-metadata-service.js new file mode 100644 index 00000000..7313d6c7 --- /dev/null +++ b/lib/instrumentation/sql/sql-metadata-service.js @@ -0,0 +1,51 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +const { sqlMetaDataCacheKeyGenerator } = require('../../context/sequence-generators') +const SimpleCache = require('../../utils/simple-cache') +const SqlParser = require('./sql-parser') +const ParsingResult = require('./parsing-result') +const SqlMetaData = require('../../client/sql-meta-data') +const { join } = require('../../client/data-sender-factory') + +class SqlMetaDataService { + constructor() { + this.cache = new SimpleCache(1024) + join(this) + } + + set dataSender(dataSender) { + this._dataSender = dataSender + } + + get dataSender() { + return this._dataSender + } + + cacheSql(sql) { + if (!sql) { + return + } + + const normalizedSql = SqlParser.normalizedSql(sql) + const cachedValue = this.cache.get(normalizedSql.getNormalizedSql()) + if (cachedValue === null) { + const parsingResult = new ParsingResult(sqlMetaDataCacheKeyGenerator.next, sql, normalizedSql) + this.cache.put(normalizedSql.getNormalizedSql(), parsingResult) + this.send(new SqlMetaData(parsingResult)) + return parsingResult + } + return cachedValue + } + + send(sqlMetaData) { + if (this.dataSender && typeof this.dataSender.send === 'function') { + this.dataSender.send(sqlMetaData) + } + } +} + +module.exports = new SqlMetaDataService() \ No newline at end of file diff --git a/lib/instrumentation/sql/sql-parser.js b/lib/instrumentation/sql/sql-parser.js new file mode 100644 index 00000000..4663e549 --- /dev/null +++ b/lib/instrumentation/sql/sql-parser.js @@ -0,0 +1,273 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const NormalizedSql = require("./normalized-sql") + +// ref: DefaultSqlParser.java +class SqlParser { + static separator = ',' + static symbolReplace = '$' + static numberReplace = '#' + static nextTokenNotExist = -1 + static normalizedSqlBuffer = 32 + + static normalizedSql(sql) { + if (!sql) { + return NormalizedSql.nullObject; + } + + let change = false + let normalized = '' + + let parsedParameter = new ParsedParameter() + + let replaceIndex = 0 + let numberTokenStartEnable = true + + for (let i = 0; i < sql.length; i++) { + const ch = sql.charAt(i) + switch (ch) { + case '/': + const lookAhead1Char = lookAhead1(sql, i) + if (lookAhead1Char === '*') { + normalized += '/*' + i += 2 + for (; i < sql.length; i++) { + const stateCh = sql.charAt(i) + if (stateCh === '*') { + const lookAhead1Char = lookAhead1(sql, i) + if (lookAhead1Char === '/') { + normalized += '*/' + i++ + break + } + } + normalized += stateCh + } + break + } else if (lookAhead1Char === '/') { + normalized += '//' + i += 2 + i = readLine(sql, normalized, i) + break + } else { + numberTokenStartEnable = true + normalized += ch + break + } + case '-': + // single line comment state + if (lookAhead1(sql, i) == '-') { + normalized += '--' + i += 2 + i = readLine(sql, normalized, i) + break + } else { + numberTokenStartEnable = true + normalized += ch + break + } + // SYMBOL + case '\'': + // empty symbol + if (lookAhead1(sql, i) === '\'') { + normalized += '\'\'' + i++ + break + } else { + change = true + normalized += '\'' + i++ + parsedParameter.appendOutputSeparator() + for (; i < sql.length; i++) { + const stateCh = sql.charAt(i) + if (stateCh === '\'') { + if (lookAhead1(sql, i) === '\'') { + i++ + parsedParameter.appendOutputParam('\'') + continue + } else { + normalized += replaceIndex++ + normalized += SqlParser.symbolReplace + normalized += '\'' + break + } + } + parsedParameter.appendSeparatorCheckOutputParam(stateCh) + } + break + } + // number start check + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (numberTokenStartEnable) { + change = true + normalized += replaceIndex++ + normalized += SqlParser.numberReplace + parsedParameter.appendOutputSeparator() + parsedParameter.appendOutputParam(ch) + i++ + tokenEnd: + for (; i < sql.length; i++) { + const ch = sql.charAt(i) + switch (ch) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '.': + case 'E': + case 'e': + parsedParameter.appendOutputParam(ch) + break + default: + i-- + break tokenEnd + } + } + break + } else { + normalized += ch + break + } + case ' ': + case '\t': + case '\r': + case '\n': + numberTokenStartEnable = true + normalized += ch + break + // http://msdn.microsoft.com/en-us/library/ms174986.aspx + case '*': + case '+': + case '%': + case '=': + case '<': + case '>': + case '&': + case '|': + case '^': + case '~': + case '!': + numberTokenStartEnable = true + normalized += ch + break + + case '(': + case ')': + case ',': + case ';': + numberTokenStartEnable = true + normalized += ch + break + + case '.': + case '_': + case '@': // Assignment Operator + case ':': // Oracle's bind variable is possible with :bindvalue + numberTokenStartEnable = false + normalized += ch + break + + default: + if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') { + numberTokenStartEnable = false + } else { + numberTokenStartEnable = true + } + normalized += ch + break + } + } + + if (!change) { + return new NormalizedSql(sql, '') + } + + let parsedParameterString + if (parsedParameter.length > 0) { + parsedParameterString = parsedParameter.toString() + } else { + parsedParameterString = '' + } + + return new NormalizedSql(normalized, parsedParameterString) + } +} + +function lookAhead1(sql, index) { + index++ + if (index < sql.length) { + return sql.charAt(index) + } else { + return SqlParser.nextTokenNotExist + } +} + +function readLine(sql, normalized, index) { + for (; index < sql.length; index++) { + const ch = sql.charAt(index) + normalized += ch + if (ch === '\n') { + break + } + } + return index +} + +class ParsedParameter { + constructor() { + this.buffer = new Array(SqlParser.normalizedSqlBuffer) + this.bufferIndex = 0 + } + + get length() { + return this.bufferIndex + } + + appendOutputSeparator() { + if (this.bufferIndex <= 0) { + return + } + this.buffer[this.bufferIndex++] = SqlParser.separator + } + + appendOutputParam(ch) { + this.buffer[this.bufferIndex++] = ch + } + + appendSeparatorCheckOutputParam(ch) { + if (ch === ',') { + this.buffer[this.bufferIndex++] = ',' + this.buffer[this.bufferIndex++] = ',' // double comma + } else { + this.buffer[this.bufferIndex++] = ch + } + } + + + toString() { + return this.buffer.slice(0, this.bufferIndex).join('') + } +} + +module.exports = SqlParser \ No newline at end of file diff --git a/lib/sampler/sampler.js b/lib/sampler/sampler.js index d3b1d5b0..1a7d3338 100644 --- a/lib/sampler/sampler.js +++ b/lib/sampler/sampler.js @@ -6,7 +6,7 @@ 'use strict' -const SequenceGenerator = require('../context/sequence-generator').SequenceGenerator +const SequenceGenerator = require('../context/sequence-generator') const MAX_NORMALIZED_VALUE = 100000000 diff --git a/lib/supports.js b/lib/supports.js new file mode 100644 index 00000000..e3b5a440 --- /dev/null +++ b/lib/supports.js @@ -0,0 +1,40 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2022-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const Logger = require('./utils/log/logger2') + +let log = undefined +module.exports = { + getLog: function () { + if (log) { + return log + } + + if (!log) { + log = new Logger.NoneBuilder({ + output: console, + debug: function (message) { + this.output.debug(message) + }, + info: function (message) { + this.output.info(message) + }, + warn: function (message) { + this.output.warn(message) + }, + error: function (message) { + this.output.error(message) + } + }).build() + } + return log + }, + setLog: function(logger) { + log = logger + } +} \ No newline at end of file diff --git a/lib/utils/log/log-level-logger.js b/lib/utils/log/log-level-logger.js new file mode 100644 index 00000000..206995e9 --- /dev/null +++ b/lib/utils/log/log-level-logger.js @@ -0,0 +1,31 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2022-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const defaultLog = require('loglevel').getLogger('pinpoint-console-logger') +const Logger = require('./logger2') + +module.exports = { + makeLogLevelLog: function (logLevel) { + defaultLog.setLevel(Logger.logTypeNameOf(logLevel)) + return Logger.makeBuilder(logLevel, { + log: defaultLog, + debug: function (message) { + this.log.debug(message) + }, + info: function (message) { + this.log.info(message) + }, + warn: function (message) { + this.log.warn(message) + }, + error: function (message) { + this.log.error(message) + } + }).build() + } +} \ No newline at end of file diff --git a/lib/utils/log/logger-output-adaptor.js b/lib/utils/log/logger-output-adaptor.js new file mode 100644 index 00000000..24ba9122 --- /dev/null +++ b/lib/utils/log/logger-output-adaptor.js @@ -0,0 +1,63 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2022-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +class LoggerOutputAdaptor { + constructor(output) { + this.output = output + } + + get console() { + return console + } + + debug(message) { + if (!this.output || typeof this.output.debug != 'function') { + if (typeof this.output.error === 'function') { + this.output.error("The Adaptor doesn't has the debug function.") + } else { + this.console.error("The Adaptor doesn't has the debug function.") + } + return + } + this.output.debug(message) + } + + info(message) { + if (!this.output || typeof this.output.info != 'function') { + if (typeof this.output.error === 'function') { + this.output.error("The Adaptor doesn't has the info function.") + } else { + this.console.error("The Adaptor doesn't has the info function.") + } + return + } + this.output.info(message) + } + + warn(message) { + if (!this.output || typeof this.output.warn != 'function') { + if (typeof this.output.error === 'function') { + this.output.error("The Adaptor doesn't has the warn function.") + } else { + this.console.error("The Adaptor doesn't has the warn function.") + } + return + } + this.output.warn(message) + } + + error(message) { + if (!this.output || typeof this.output.error != 'function') { + this.console.error("The Adaptor doesn't has the error function.") + return + } + this.output.error(message) + } +} + +module.exports = LoggerOutputAdaptor \ No newline at end of file diff --git a/lib/utils/log/logger2.js b/lib/utils/log/logger2.js new file mode 100644 index 00000000..f9c7c798 --- /dev/null +++ b/lib/utils/log/logger2.js @@ -0,0 +1,132 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2020-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const LoggerOutputAdaptor = require('./logger-output-adaptor') + +class Logger { + + constructor(type, adaptor) { + this.type = type + this.adaptor = new LoggerOutputAdaptor(adaptor) + } + + static get DebugBuilder() { + return Logger.Builder(LogType.debug) + } + + static Builder(type) { + return class Builder { + constructor(adaptor) { + this.type = type + this.adaptor = adaptor + } + + build() { + return new Logger(this.type, this.adaptor) + } + } + } + + static get InfoBuilder() { + return Logger.Builder(LogType.info) + } + + static get WarnBuilder() { + return Logger.Builder(LogType.warn) + } + + static get ErrorBuilder() { + return Logger.Builder(LogType.error) + } + + static get NoneBuilder() { + return Logger.Builder(LogType.noneConfig) + } + + static makeBuilder(logType, adaptor) { + return new (Logger.Builder(LogType.valueOf(logType)))(adaptor) + } + + static logTypeNameOf(logType) { + return LogType.valueOf(logType).name + } + + debug(message) { + this.adaptor.debug(message) + } + + isDebug() { + return this.type.isDebug() + } + + info(message) { + this.adaptor.info(message) + } + + isInfo() { + return this.type.isInfo() + } + + warn(message) { + this.adaptor.warn(message) + } + + error(message) { + this.adaptor.error(message) + } +} + +class LogType { + + static get debug() { + return new LogType('DEBUG') + } + + static get info() { + return new LogType('INFO') + } + + static get warn() { + return new LogType('WARN') + } + + static get error() { + return new LogType('ERROR') + } + + static get noneConfig() { + return new LogType('NONE') + } + + static valueOf(name) { + if (name.toUpperCase) { + name = name.toUpperCase() + } + const type = [this.debug, this.info, this.warn, this.error].find(element => element.name === name) + if (!type) { + return this.noneConfig + } + + return type + } + + constructor(name) { + this.name = name + } + + isDebug() { + return this.name === LogType.debug.name + } + + isInfo() { + return this.name === LogType.info.name + } +} + + +module.exports = Logger diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..6bb10901 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,13469 @@ +{ + "name": "pinpoint-node-agent", + "version": "0.9.0-next.2", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "pinpoint-node-agent", + "version": "0.9.0-next.2", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.2.3", + "end-of-stream": "^1.4.1", + "google-protobuf": "^3.13.0", + "int64-buffer": "^0.99.1007", + "internal-ip": "^3.0.1", + "loglevel": "^1.6.1", + "methods": "^1.1.2", + "require-in-the-middle": "^5.0.3", + "semver": "^7.5.3", + "shimmer": "^1.2.0" + }, + "devDependencies": { + "@types/semver": "^7.3.13", + "@types/shimmer": "^1.0.2", + "axios": "^0.21.1", + "eslint": "^8.43.0", + "eslint-config-prettier": "^3.6.0", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-prettier": "^5.0.0", + "express": "^4.16.4", + "install": "^0.13.0", + "ioredis": "^4.3.0", + "ioredis-mock": "^4.19.0", + "koa": "^2.6.1", + "koa-bodyparser": "^4.2.1", + "koa-router": "^7.4.0", + "lodash": "^4.17.20", + "mongoose": "^5.4.3", + "mysql": "^2.18.1", + "mysql2": "^3.6.0", + "nyc": "^15.1.0", + "redis": "^3.1.2", + "redis-mock": "^0.49.0", + "rimraf": "^2.6.2", + "tape": "^4.9.1", + "testcontainers": "^9.10.1", + "typescript": "^4.8.3" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz", + "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz", + "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.1", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.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.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.19.0", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz", + "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.19.1", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", + "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", + "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", + "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", + "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.19.1", + "@babel/types": "^7.19.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@balena/dockerignore": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", + "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==", + "dev": true + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/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 + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.7.1.tgz", + "integrity": "sha512-GVtMU4oh/TeKkWGzXUEsyZtyvSUIT1z49RtGH1UnEGeL+sLuxKl8QH3KZTlSB329R1sWJmesm5hQ5CxXdYH9dg==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.3.tgz", + "integrity": "sha512-5dAvoZwna2Py3Ef96Ux9jIkp3iZ62TUsV00p3wVBPNX5K178UbNi8Q7gQVqwXT1Yq9RejIGG9G2IPEo93T6RcA==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@types/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-IctHreBuWE5dvBDz/0WeKtyVKVRs4h75IblxOACL92wU66v+HGAfEYAOyXkOFphvRJMhuXdI9huDXpX0FC6lCw==", + "dev": true, + "dependencies": { + "@types/readdir-glob": "*" + } + }, + "node_modules/@types/bson": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", + "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/docker-modem": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.2.tgz", + "integrity": "sha512-qC7prjoEYR2QEe6SmCVfB1x3rfcQtUr1n4x89+3e0wSTMQ/KYCyf+/RAA9n2tllkkNc6//JMUZePdFRiGIWfaQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/ssh2": "*" + } + }, + "node_modules/@types/dockerode": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.19.tgz", + "integrity": "sha512-7CC5yIpQi+bHXwDK43b/deYXteP3Lem9gdocVVHJPSRJJLMfbiOchQV3rDmAPkMw+n3GIVj7m1six3JW+VcwwA==", + "dev": true, + "dependencies": { + "@types/docker-modem": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/mongodb": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", + "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", + "dev": true, + "dependencies": { + "@types/bson": "*", + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "18.16.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz", + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==" + }, + "node_modules/@types/readdir-glob": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-ImM6TmoF8bgOwvehGviEj3tRdRBbQujr1N+0ypaln/GWjaerOB26jb93vsRHmdMtvVQZQebOlqt2HROark87mQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "node_modules/@types/shimmer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.2.tgz", + "integrity": "sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg==", + "dev": true + }, + "node_modules/@types/ssh2": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.11.13.tgz", + "integrity": "sha512-08WbG68HvQ2YVi74n2iSUnYHYpUdFc/s2IsI0BHBdJwaqYJpWlVv9elL0tYShTv60yr0ObdxJR5NrCRiGJ/0CQ==", + "dev": true, + "dependencies": { + "@types/node": "^18.11.18" + } + }, + "node_modules/@types/ssh2-streams": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@types/ssh2-streams/-/ssh2-streams-0.1.9.tgz", + "integrity": "sha512-I2J9jKqfmvXLR5GomDiCoHrEJ58hAOmFrekfFqmCFd+A6gaEStvWnPykoWUwld1PNg4G5ag1LwdA+Lz1doRJqg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "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, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dev": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver/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/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "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, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "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": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" + } + }, + "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 + }, + "node_modules/async-lock": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.0.tgz", + "integrity": "sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dev": true, + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/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, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buildcheck": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz", + "integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "dev": true, + "dependencies": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "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, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001410", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001410.tgz", + "integrity": "sha512-QoblBnuE+rG0lc3Ur9ltP5q47lbguipa/ncNMyyGuqPk44FxbScWAeEO+k5fSQ8WekdAK4mWqNs1rADDAiN5xQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "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, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", + "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/co-body": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", + "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "dev": true, + "dependencies": { + "inflation": "^2.0.0", + "qs": "^6.5.2", + "raw-body": "^2.3.3", + "type-is": "^1.6.16" + } + }, + "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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dev": true, + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/compress-commons/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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/convert-source-map/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 + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "dev": true, + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cpu-features": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz", + "integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "buildcheck": "0.0.3", + "nan": "^2.15.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/crc32-stream/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/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, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-browser/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", + "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", + "os": [ + "android", + "darwin", + "freebsd", + "linux", + "openbsd", + "sunos", + "win32" + ], + "dependencies": { + "execa": "^0.10.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", + "dev": true + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/docker-compose": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-0.24.1.tgz", + "integrity": "sha512-CVphzCi0Hmw/0CHlAzgiwhLsJjFRqnvpBYMYbf63bz6MON69ElgrfrgQTmgPtEjbifjgaptu3+Gea62vI+9jiA==", + "dev": true, + "dependencies": { + "yaml": "^2.2.2" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/docker-modem": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.8.tgz", + "integrity": "sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "readable-stream": "^3.5.0", + "split-ca": "^1.0.1", + "ssh2": "^1.11.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/docker-modem/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/dockerode": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-3.3.5.tgz", + "integrity": "sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==", + "dev": true, + "dependencies": { + "@balena/dockerignore": "^1.0.2", + "docker-modem": "^3.0.0", + "tar-fs": "~2.0.1" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/dockerode/node_modules/tar-fs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", + "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotignore": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", + "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + }, + "bin": { + "ignored": "bin/ignored" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.258", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.258.tgz", + "integrity": "sha512-vutF4q0dTUXoAFI7Vbtdwen/BJVwPgj8GRg/SElOodfH7VTX+svUe62A5BG41QRQGk5HsZPB0M++KH1lAlOt0A==", + "dev": true + }, + "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==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-abstract": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.3.tgz", + "integrity": "sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "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 + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "node_modules/es6-set": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.6.tgz", + "integrity": "sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "es6-iterator": "~2.0.3", + "es6-symbol": "^3.1.3", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-set/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-3.6.0.tgz", + "integrity": "sha512-ixJ4U3uTLXwJts4rmSVW/lMXjlGwCijhBJHk8iVqKKSifeI0qgFEfWl8L63isfc8Od7EiBALF6BX3jKLluf/jQ==", + "dev": true, + "dependencies": { + "get-stdin": "^6.0.0" + }, + "bin": { + "eslint-config-prettier-check": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=3.14.1" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/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/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/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/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/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/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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/eslint/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/eslint/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 + }, + "node_modules/eslint/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/eslint/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/eslint/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/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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/eslint/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/espree": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/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==", + "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" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/express": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/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, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, + "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/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fengari": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/fengari/-/fengari-0.1.4.tgz", + "integrity": "sha512-6ujqUuiIYmcgkGz8MGAdERU57EIluGGPSUgGPTsco657EHa+srq0S3/YUl/r9kx1+D+d4rGfYObd+m8K22gB1g==", + "dev": true, + "dependencies": { + "readline-sync": "^1.4.9", + "sprintf-js": "^1.1.1", + "tmp": "^0.0.33" + } + }, + "node_modules/fengari-interop": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/fengari-interop/-/fengari-interop-0.1.3.tgz", + "integrity": "sha512-EtZ+oTu3kEwVJnoymFPBVLIbQcCoy9uWCVnMA6h3M/RqHkUBsLYp29+RRHf9rKr6GwjubWREU1O7RretFIXjHw==", + "dev": true, + "peerDependencies": { + "fengari": "^0.1.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "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, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/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, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "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, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/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/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "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, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "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, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/google-protobuf": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.0.tgz", + "integrity": "sha512-byR7MBTK4tZ5PZEb+u5ZTzpt4SfrTxv5682MjPlHN16XeqgZE2/8HOIWeiXe8JKnT9OVbtBGhbq8mtvkK8cd5g==" + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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 + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/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/hasha/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "dev": true, + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-assert/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "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, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "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/install": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", + "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/int64-buffer": { + "version": "0.99.1007", + "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-0.99.1007.tgz", + "integrity": "sha512-XDBEu44oSTqlvCSiOZ/0FoUkpWu/vwjJLGSKDabNISPQNZ5wub1FodGHBljRsrR0IXRPq7SslshZYMuA55CgTQ==", + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/internal-ip": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", + "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", + "os": [ + "android", + "darwin", + "freebsd", + "linux", + "openbsd", + "sunos", + "win32" + ], + "dependencies": { + "default-gateway": "^2.6.0", + "ipaddr.js": "^1.5.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ioredis": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.28.5.tgz", + "integrity": "sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==", + "dev": true, + "dependencies": { + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.1", + "denque": "^1.1.0", + "lodash.defaults": "^4.2.0", + "lodash.flatten": "^4.4.0", + "lodash.isarguments": "^3.1.0", + "p-map": "^2.1.0", + "redis-commands": "1.7.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/ioredis-mock": { + "version": "4.21.8", + "resolved": "https://registry.npmjs.org/ioredis-mock/-/ioredis-mock-4.21.8.tgz", + "integrity": "sha512-Rq0ibesBtIunSkjKXtzRXpM+i3nLAmukPaRPYowlD1hYC6/JsBlFdKuFb8svQSNpWzm5NpT8BE2iyR3puf6YMg==", + "dev": true, + "dependencies": { + "array-from": "^2.1.1", + "es6-map": "^0.1.5", + "es6-set": "^0.1.5", + "fengari": "^0.1.4", + "fengari-interop": "^0.1.2", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "object-assign": "^4.1.1", + "standard-as-callback": "^2.0.1" + }, + "engines": { + "node": ">=0.10.16" + }, + "peerDependencies": { + "ioredis": "4.x" + } + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/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, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "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-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, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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.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/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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 + }, + "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, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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 + }, + "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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", + "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kareem": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", + "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==", + "dev": true + }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dev": true, + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.4.tgz", + "integrity": "sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g==", + "dev": true, + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, + "node_modules/koa-bodyparser": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", + "integrity": "sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==", + "dev": true, + "dependencies": { + "co-body": "^6.0.0", + "copy-to": "^2.0.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", + "dev": true + }, + "node_modules/koa-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", + "dev": true, + "dependencies": { + "co": "^4.6.0", + "koa-compose": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/koa-router": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-7.4.0.tgz", + "integrity": "sha512-IWhaDXeAnfDBEpWS6hkGdZ1ablgr6Q6pGdXCyK38RbzuH4LkUOpPqPw+3f8l8aTDrQmBQ7xJc0bs2yV4dzcO+g==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "http-errors": "^1.3.1", + "koa-compose": "^3.0.0", + "methods": "^1.0.1", + "path-to-regexp": "^1.1.1", + "urijs": "^1.19.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/koa-router/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/koa-router/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa-router/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa-router/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/koa-router/node_modules/koa-compose": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", + "integrity": "sha512-8gen2cvKHIZ35eDEik5WOo8zbVp9t4cP8p4hW4uE55waxolLRexKKrqfCpwhGVppnB40jWeF8bZeTVg99eZgPw==", + "dev": true, + "dependencies": { + "any-promise": "^1.1.0" + } + }, + "node_modules/koa-router/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/koa-router/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true + }, + "node_modules/loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "dev": true, + "optional": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "engines": { + "node": ">= 0.6" + } + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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 + }, + "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/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, + "node_modules/mongodb": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", + "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", + "dev": true, + "dependencies": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + }, + "peerDependenciesMeta": { + "aws4": { + "optional": true + }, + "bson-ext": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "mongodb-extjson": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb/node_modules/optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "dev": true, + "dependencies": { + "require-at": "^1.0.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mongoose": { + "version": "5.13.20", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.20.tgz", + "integrity": "sha512-TjGFa/XnJYt+wLmn8y9ssjyO2OhBMeEBtOHb9iJM16EWu2Du6L1Q6zSiEK2ziyYQM8agb4tumNIQFzqbxId7MA==", + "dev": true, + "dependencies": { + "@types/bson": "1.x || 4.0.x", + "@types/mongodb": "^3.5.27", + "bson": "^1.1.4", + "kareem": "2.3.2", + "mongodb": "3.7.4", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.8.4", + "mquery": "3.2.5", + "ms": "2.1.2", + "optional-require": "1.0.x", + "regexp-clone": "1.0.0", + "safe-buffer": "5.2.1", + "sift": "13.5.2", + "sliced": "1.0.1" + }, + "engines": { + "node": ">=4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==", + "dev": true, + "peerDependencies": { + "mongoose": "*" + } + }, + "node_modules/mpath": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", + "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", + "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", + "dev": true, + "dependencies": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/mquery/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/mquery/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 + }, + "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==" + }, + "node_modules/mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "dev": true, + "dependencies": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mysql/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 + }, + "node_modules/mysql2": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.0.tgz", + "integrity": "sha512-EWUGAhv6SphezurlfI2Fpt0uJEWLmirrtQR7SkbTHFC+4/mJBrPiSzHESHKAWKG7ALVD6xaG/NBjjd1DGJGQQQ==", + "dev": true, + "dependencies": { + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru-cache": "^8.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/mysql2/node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/mysql2/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mysql2/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "dev": true + }, + "node_modules/mysql2/node_modules/lru-cache": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", + "dev": true, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/mysql2/node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/nan": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "dev": true, + "optional": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "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, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/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/nyc/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/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/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/nyc/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/nyc/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, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/nyc/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/nyc/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, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/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 + }, + "node_modules/nyc/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, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/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" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", + "dev": true + }, + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optional-require": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", + "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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, + "engines": { + "node": ">=6" + } + }, + "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, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "dev": true, + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "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, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "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, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/properties-reader": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/properties-reader/-/properties-reader-2.2.0.tgz", + "integrity": "sha512-CgVcr8MwGoBKK24r9TwHfZkLLaNFHQ6y4wgT9w/XzdpacOOi5ciH4hcuLechSDAwXsfrGQtI2JTutY2djOx2Ow==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz", + "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "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/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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/readable-stream/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 + }, + "node_modules/readdir-glob": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", + "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==", + "dev": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readline-sync": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/redis": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", + "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", + "dev": true, + "dependencies": { + "denque": "^1.5.0", + "redis-commands": "^1.7.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-redis" + } + }, + "node_modules/redis-commands": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", + "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==", + "dev": true + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-mock": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/redis-mock/-/redis-mock-0.49.0.tgz", + "integrity": "sha512-FW/cLZvF1PAVN/PYIwXf1vQRoJCyYCwUMtq8BXRwrvb9LNNAT4RKXM02Qlt6qSkC/98hmHlU2EGoQoxVy3E2lA==", + "dev": true + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dev": true, + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", + "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=6" + } + }, + "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 + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resumer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", + "integrity": "sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w==", + "dev": true, + "dependencies": { + "through": "~2.3.4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/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/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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 + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "dev": true, + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/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, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/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/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "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/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/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", + "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==", + "dev": true + }, + "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/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "dev": true, + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "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, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/split-ca": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", + "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==", + "dev": true + }, + "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 + }, + "node_modules/sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ssh-remote-port-forward": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ssh-remote-port-forward/-/ssh-remote-port-forward-1.0.4.tgz", + "integrity": "sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==", + "dev": true, + "dependencies": { + "@types/ssh2": "^0.5.48", + "ssh2": "^1.4.0" + } + }, + "node_modules/ssh-remote-port-forward/node_modules/@types/ssh2": { + "version": "0.5.52", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-0.5.52.tgz", + "integrity": "sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/ssh2-streams": "*" + } + }, + "node_modules/ssh2": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz", + "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "asn1": "^0.2.4", + "bcrypt-pbkdf": "^1.0.2" + }, + "engines": { + "node": ">=10.16.0" + }, + "optionalDependencies": { + "cpu-features": "~0.0.4", + "nan": "^2.16.0" + } + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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/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 + }, + "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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tape": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/tape/-/tape-4.16.1.tgz", + "integrity": "sha512-U4DWOikL5gBYUrlzx+J0oaRedm2vKLFbtA/+BRAXboGWpXO7bMP8ddxlq3Cse2bvXFQ0jZMOj6kk3546mvCdFg==", + "dev": true, + "dependencies": { + "call-bind": "~1.0.2", + "deep-equal": "~1.1.1", + "defined": "~1.0.0", + "dotignore": "~0.1.2", + "for-each": "~0.3.3", + "glob": "~7.2.3", + "has": "~1.0.3", + "inherits": "~2.0.4", + "is-regex": "~1.1.4", + "minimist": "~1.2.6", + "object-inspect": "~1.12.2", + "resolve": "~1.22.1", + "resumer": "~0.0.0", + "string.prototype.trim": "~1.2.6", + "through": "~2.3.8" + }, + "bin": { + "tape": "bin/tape" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tape/node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/tar-stream/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/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, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/testcontainers": { + "version": "9.10.1", + "resolved": "https://registry.npmjs.org/testcontainers/-/testcontainers-9.10.1.tgz", + "integrity": "sha512-+kTLawnZCiSWTL2Iljx+CtYbWIPzfTe8KiouFbTvJ8lAYN5esAj+bT2AKWcixotV4ddKCAbL6ESn35J0jvFCNg==", + "dev": true, + "dependencies": { + "@balena/dockerignore": "^1.0.2", + "@types/archiver": "^5.3.2", + "@types/dockerode": "^3.3.19", + "archiver": "^5.3.1", + "async-lock": "^1.4.0", + "byline": "^5.0.0", + "debug": "^4.3.4", + "docker-compose": "^0.24.1", + "dockerode": "^3.3.5", + "get-port": "^5.1.1", + "node-fetch": "^2.6.12", + "properties-reader": "^2.2.0", + "ssh-remote-port-forward": "^1.0.4", + "tar-fs": "^2.1.1", + "tmp": "^0.2.1" + }, + "engines": { + "node": ">= 10.16" + } + }, + "node_modules/testcontainers/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/testcontainers/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "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": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "dev": true + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "dev": true, + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "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/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz", + "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/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==", + "dependencies": { + "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==", + "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==" + }, + "node_modules/wrap-ansi/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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ylru": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz", + "integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dev": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/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" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/compat-data": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz", + "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==", + "dev": true + }, + "@babel/core": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz", + "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.1", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", + "dev": true, + "requires": { + "@babel/types": "^7.19.0", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz", + "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.19.1", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", + "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", + "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", + "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==", + "dev": true + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + } + } + }, + "@babel/traverse": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", + "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.19.1", + "@babel/types": "^7.19.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "@balena/dockerignore": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", + "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==", + "dev": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "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 + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "dev": true + }, + "@grpc/grpc-js": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.7.1.tgz", + "integrity": "sha512-GVtMU4oh/TeKkWGzXUEsyZtyvSUIT1z49RtGH1UnEGeL+sLuxKl8QH3KZTlSB329R1sWJmesm5hQ5CxXdYH9dg==", + "requires": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.3.tgz", + "integrity": "sha512-5dAvoZwna2Py3Ef96Ux9jIkp3iZ62TUsV00p3wVBPNX5K178UbNi8Q7gQVqwXT1Yq9RejIGG9G2IPEo93T6RcA==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + } + }, + "@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "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 + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "@types/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-IctHreBuWE5dvBDz/0WeKtyVKVRs4h75IblxOACL92wU66v+HGAfEYAOyXkOFphvRJMhuXdI9huDXpX0FC6lCw==", + "dev": true, + "requires": { + "@types/readdir-glob": "*" + } + }, + "@types/bson": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", + "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/docker-modem": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.2.tgz", + "integrity": "sha512-qC7prjoEYR2QEe6SmCVfB1x3rfcQtUr1n4x89+3e0wSTMQ/KYCyf+/RAA9n2tllkkNc6//JMUZePdFRiGIWfaQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/ssh2": "*" + } + }, + "@types/dockerode": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.19.tgz", + "integrity": "sha512-7CC5yIpQi+bHXwDK43b/deYXteP3Lem9gdocVVHJPSRJJLMfbiOchQV3rDmAPkMw+n3GIVj7m1six3JW+VcwwA==", + "dev": true, + "requires": { + "@types/docker-modem": "*", + "@types/node": "*" + } + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "@types/mongodb": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", + "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", + "dev": true, + "requires": { + "@types/bson": "*", + "@types/node": "*" + } + }, + "@types/node": { + "version": "18.16.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz", + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==" + }, + "@types/readdir-glob": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-ImM6TmoF8bgOwvehGviEj3tRdRBbQujr1N+0ypaln/GWjaerOB26jb93vsRHmdMtvVQZQebOlqt2HROark87mQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "@types/shimmer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.2.tgz", + "integrity": "sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg==", + "dev": true + }, + "@types/ssh2": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.11.13.tgz", + "integrity": "sha512-08WbG68HvQ2YVi74n2iSUnYHYpUdFc/s2IsI0BHBdJwaqYJpWlVv9elL0tYShTv60yr0ObdxJR5NrCRiGJ/0CQ==", + "dev": true, + "requires": { + "@types/node": "^18.11.18" + } + }, + "@types/ssh2-streams": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@types/ssh2-streams/-/ssh2-streams-0.1.9.tgz", + "integrity": "sha512-I2J9jKqfmvXLR5GomDiCoHrEJ58hAOmFrekfFqmCFd+A6gaEStvWnPykoWUwld1PNg4G5ag1LwdA+Lz1doRJqg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "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": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "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": { + "default-require-extensions": "^3.0.0" + } + }, + "archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.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" + } + } + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "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": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + } + } + }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", + "dev": true + }, + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "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, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "async-lock": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.0.tgz", + "integrity": "sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==", + "dev": true + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true + }, + "bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "dev": true + }, + "bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "requires": { + "big-integer": "^1.6.44" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "dev": true + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, + "buildcheck": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz", + "integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==", + "dev": true, + "optional": true + }, + "bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "requires": { + "run-applescript": "^5.0.0" + } + }, + "byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", + "dev": true + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "dev": true, + "requires": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + } + }, + "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": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001410", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001410.tgz", + "integrity": "sha512-QoblBnuE+rG0lc3Ur9ltP5q47lbguipa/ncNMyyGuqPk44FxbScWAeEO+k5fSQ8WekdAK4mWqNs1rADDAiN5xQ==", + "dev": true + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "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 + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.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==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "cluster-key-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", + "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "co-body": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", + "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "dev": true, + "requires": { + "inflation": "^2.0.0", + "qs": "^6.5.2", + "raw-body": "^2.3.3", + "type-is": "^1.6.16" + } + }, + "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": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.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" + } + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "dev": true, + "requires": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + } + }, + "copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cpu-features": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz", + "integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==", + "dev": true, + "optional": true, + "requires": { + "buildcheck": "0.0.3", + "nan": "^2.15.0" + } + }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true + }, + "crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dev": true, + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.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" + } + } + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "requires": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "dependencies": { + "execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + } + } + }, + "default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "requires": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + } + }, + "default-gateway": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", + "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", + "requires": { + "execa": "^0.10.0", + "ip-regex": "^2.1.0" + } + }, + "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": { + "strip-bom": "^4.0.0" + } + }, + "define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true + }, + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "docker-compose": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-0.24.1.tgz", + "integrity": "sha512-CVphzCi0Hmw/0CHlAzgiwhLsJjFRqnvpBYMYbf63bz6MON69ElgrfrgQTmgPtEjbifjgaptu3+Gea62vI+9jiA==", + "dev": true, + "requires": { + "yaml": "^2.2.2" + } + }, + "docker-modem": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.8.tgz", + "integrity": "sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "readable-stream": "^3.5.0", + "split-ca": "^1.0.1", + "ssh2": "^1.11.0" + }, + "dependencies": { + "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, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "dockerode": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-3.3.5.tgz", + "integrity": "sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==", + "dev": true, + "requires": { + "@balena/dockerignore": "^1.0.2", + "docker-modem": "^3.0.0", + "tar-fs": "~2.0.1" + }, + "dependencies": { + "tar-fs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", + "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + } + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dotignore": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", + "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.258", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.258.tgz", + "integrity": "sha512-vutF4q0dTUXoAFI7Vbtdwen/BJVwPgj8GRg/SElOodfH7VTX+svUe62A5BG41QRQGk5HsZPB0M++KH1lAlOt0A==", + "dev": true + }, + "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==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "es-abstract": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.3.tgz", + "integrity": "sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "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 + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.6.tgz", + "integrity": "sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "es6-iterator": "~2.0.3", + "es6-symbol": "^3.1.3", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + } + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.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 + }, + "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" + } + }, + "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 + }, + "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 + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "eslint-config-prettier": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-3.6.0.tgz", + "integrity": "sha512-ixJ4U3uTLXwJts4rmSVW/lMXjlGwCijhBJHk8iVqKKSifeI0qgFEfWl8L63isfc8Od7EiBALF6BX3jKLluf/jQ==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + }, + "dependencies": { + "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" + } + } + } + }, + "eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "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" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "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" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "eslint-plugin-prettier": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + } + }, + "eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true + }, + "espree": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "express": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + } + } + }, + "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 + }, + "fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fengari": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/fengari/-/fengari-0.1.4.tgz", + "integrity": "sha512-6ujqUuiIYmcgkGz8MGAdERU57EIluGGPSUgGPTsco657EHa+srq0S3/YUl/r9kx1+D+d4rGfYObd+m8K22gB1g==", + "dev": true, + "requires": { + "readline-sync": "^1.4.9", + "sprintf-js": "^1.1.1", + "tmp": "^0.0.33" + } + }, + "fengari-interop": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/fengari-interop/-/fengari-interop-0.1.3.tgz", + "integrity": "sha512-EtZ+oTu3kEwVJnoymFPBVLIbQcCoy9uWCVnMA6h3M/RqHkUBsLYp29+RRHf9rKr6GwjubWREU1O7RretFIXjHw==", + "dev": true, + "requires": {} + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "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": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "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": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "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" + } + } + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true + }, + "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": { + "is-callable": "^1.1.3" + } + }, + "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": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "requires": { + "is-property": "^1.0.2" + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true + }, + "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 + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==" + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "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" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "google-protobuf": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.0.tgz", + "integrity": "sha512-byR7MBTK4tZ5PZEb+u5ZTzpt4SfrTxv5682MjPlHN16XeqgZE2/8HOIWeiXe8JKnT9OVbtBGhbq8mtvkK8cd5g==" + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "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 + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "dependencies": { + "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 + }, + "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 + } + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "dev": true, + "requires": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + } + } + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "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 + }, + "inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "install": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", + "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", + "dev": true + }, + "int64-buffer": { + "version": "0.99.1007", + "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-0.99.1007.tgz", + "integrity": "sha512-XDBEu44oSTqlvCSiOZ/0FoUkpWu/vwjJLGSKDabNISPQNZ5wub1FodGHBljRsrR0IXRPq7SslshZYMuA55CgTQ==" + }, + "internal-ip": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", + "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", + "requires": { + "default-gateway": "^2.6.0", + "ipaddr.js": "^1.5.2" + } + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "ioredis": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.28.5.tgz", + "integrity": "sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==", + "dev": true, + "requires": { + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.1", + "denque": "^1.1.0", + "lodash.defaults": "^4.2.0", + "lodash.flatten": "^4.4.0", + "lodash.isarguments": "^3.1.0", + "p-map": "^2.1.0", + "redis-commands": "1.7.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + } + }, + "ioredis-mock": { + "version": "4.21.8", + "resolved": "https://registry.npmjs.org/ioredis-mock/-/ioredis-mock-4.21.8.tgz", + "integrity": "sha512-Rq0ibesBtIunSkjKXtzRXpM+i3nLAmukPaRPYowlD1hYC6/JsBlFdKuFb8svQSNpWzm5NpT8BE2iyR3puf6YMg==", + "dev": true, + "requires": { + "array-from": "^2.1.1", + "es6-map": "^0.1.5", + "es6-set": "^0.1.5", + "fengari": "^0.1.4", + "fengari-interop": "^0.1.2", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "object-assign": "^4.1.1", + "standard-as-callback": "^2.0.1" + } + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "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==" + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "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": { + "is-extglob": "^2.1.1" + } + }, + "is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "requires": { + "is-docker": "^3.0.0" + } + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "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 + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + }, + "dependencies": { + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + } + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "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": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "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": { + "aggregate-error": "^3.0.0" + } + }, + "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" + } + } + } + }, + "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": { + "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.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" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-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": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json5": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", + "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", + "dev": true + }, + "kareem": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", + "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==", + "dev": true + }, + "keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dev": true, + "requires": { + "tsscmp": "1.0.6" + } + }, + "koa": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.4.tgz", + "integrity": "sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g==", + "dev": true, + "requires": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "dependencies": { + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + } + } + }, + "koa-bodyparser": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", + "integrity": "sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==", + "dev": true, + "requires": { + "co-body": "^6.0.0", + "copy-to": "^2.0.1" + } + }, + "koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", + "dev": true + }, + "koa-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", + "dev": true, + "requires": { + "co": "^4.6.0", + "koa-compose": "^4.1.0" + } + }, + "koa-router": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-7.4.0.tgz", + "integrity": "sha512-IWhaDXeAnfDBEpWS6hkGdZ1ablgr6Q6pGdXCyK38RbzuH4LkUOpPqPw+3f8l8aTDrQmBQ7xJc0bs2yV4dzcO+g==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "http-errors": "^1.3.1", + "koa-compose": "^3.0.0", + "methods": "^1.0.1", + "path-to-regexp": "^1.1.1", + "urijs": "^1.19.0" + }, + "dependencies": { + "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" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "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 + }, + "koa-compose": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", + "integrity": "sha512-8gen2cvKHIZ35eDEik5WOo8zbVp9t4cP8p4hW4uE55waxolLRexKKrqfCpwhGVppnB40jWeF8bZeTVg99eZgPw==", + "dev": true, + "requires": { + "any-promise": "^1.1.0" + } + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + } + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "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": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true + }, + "loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==" + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "dev": true, + "optional": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "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": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, + "mongodb": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", + "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", + "dev": true, + "requires": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + }, + "dependencies": { + "optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "dev": true, + "requires": { + "require-at": "^1.0.6" + } + } + } + }, + "mongoose": { + "version": "5.13.20", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.20.tgz", + "integrity": "sha512-TjGFa/XnJYt+wLmn8y9ssjyO2OhBMeEBtOHb9iJM16EWu2Du6L1Q6zSiEK2ziyYQM8agb4tumNIQFzqbxId7MA==", + "dev": true, + "requires": { + "@types/bson": "1.x || 4.0.x", + "@types/mongodb": "^3.5.27", + "bson": "^1.1.4", + "kareem": "2.3.2", + "mongodb": "3.7.4", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.8.4", + "mquery": "3.2.5", + "ms": "2.1.2", + "optional-require": "1.0.x", + "regexp-clone": "1.0.0", + "safe-buffer": "5.2.1", + "sift": "13.5.2", + "sliced": "1.0.1" + } + }, + "mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==", + "dev": true, + "requires": {} + }, + "mpath": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", + "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==", + "dev": true + }, + "mquery": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", + "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "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 + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "dev": true, + "requires": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "mysql2": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.0.tgz", + "integrity": "sha512-EWUGAhv6SphezurlfI2Fpt0uJEWLmirrtQR7SkbTHFC+4/mJBrPiSzHESHKAWKG7ALVD6xaG/NBjjd1DGJGQQQ==", + "dev": true, + "requires": { + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru-cache": "^8.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "dependencies": { + "denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "dev": true + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "dev": true + }, + "lru-cache": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", + "dev": true + }, + "sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "dev": true + } + } + }, + "named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "dev": true, + "requires": { + "lru-cache": "^7.14.1" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + } + } + }, + "nan": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "dev": true, + "optional": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "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": { + "process-on-spawn": "^1.0.0" + } + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "requires": { + "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" + } + } + }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "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.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" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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 + }, + "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": { + "aggregate-error": "^3.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" + } + }, + "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" + } + }, + "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": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "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": { + "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": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", + "dev": true + }, + "open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "requires": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + } + }, + "optional-require": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", + "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==", + "dev": true + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "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": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "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 + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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": { + "find-up": "^4.0.0" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "dev": true, + "peer": true + }, + "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": { + "fast-diff": "^1.1.2" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "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": { + "fromentries": "^1.2.0" + } + }, + "properties-reader": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/properties-reader/-/properties-reader-2.2.0.tgz", + "integrity": "sha512-CgVcr8MwGoBKK24r9TwHfZkLLaNFHQ6y4wgT9w/XzdpacOOi5ciH4hcuLechSDAwXsfrGQtI2JTutY2djOx2Ow==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4" + } + }, + "protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "dependencies": { + "long": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz", + "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==" + } + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "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": { + "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 + } + } + }, + "readdir-glob": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", + "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==", + "dev": true, + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "readline-sync": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "dev": true + }, + "redis": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", + "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", + "dev": true, + "requires": { + "denque": "^1.5.0", + "redis-commands": "^1.7.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0" + } + }, + "redis-commands": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", + "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==", + "dev": true + }, + "redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "dev": true + }, + "redis-mock": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/redis-mock/-/redis-mock-0.49.0.tgz", + "integrity": "sha512-FW/cLZvF1PAVN/PYIwXf1vQRoJCyYCwUMtq8BXRwrvb9LNNAT4RKXM02Qlt6qSkC/98hmHlU2EGoQoxVy3E2lA==", + "dev": true + }, + "redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dev": true, + "requires": { + "redis-errors": "^1.0.0" + } + }, + "regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + } + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "require-in-the-middle": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", + "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", + "requires": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + } + }, + "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 + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resumer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", + "integrity": "sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w==", + "dev": true, + "requires": { + "through": "~2.3.4" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + }, + "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "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 + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + } + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "dev": true, + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "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 + } + } + }, + "seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==", + "dev": true + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "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 + }, + "shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sift": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", + "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==", + "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 + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "dev": true, + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "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": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "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" + } + } + } + }, + "split-ca": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", + "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==", + "dev": true + }, + "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 + }, + "sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "dev": true + }, + "ssh-remote-port-forward": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ssh-remote-port-forward/-/ssh-remote-port-forward-1.0.4.tgz", + "integrity": "sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==", + "dev": true, + "requires": { + "@types/ssh2": "^0.5.48", + "ssh2": "^1.4.0" + }, + "dependencies": { + "@types/ssh2": { + "version": "0.5.52", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-0.5.52.tgz", + "integrity": "sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/ssh2-streams": "*" + } + } + } + }, + "ssh2": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz", + "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==", + "dev": true, + "requires": { + "asn1": "^0.2.4", + "bcrypt-pbkdf": "^1.0.2", + "cpu-features": "~0.0.4", + "nan": "^2.16.0" + } + }, + "standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, + "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" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "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==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "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 + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==" + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "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 + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "requires": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + } + }, + "tape": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/tape/-/tape-4.16.1.tgz", + "integrity": "sha512-U4DWOikL5gBYUrlzx+J0oaRedm2vKLFbtA/+BRAXboGWpXO7bMP8ddxlq3Cse2bvXFQ0jZMOj6kk3546mvCdFg==", + "dev": true, + "requires": { + "call-bind": "~1.0.2", + "deep-equal": "~1.1.1", + "defined": "~1.0.0", + "dotignore": "~0.1.2", + "for-each": "~0.3.3", + "glob": "~7.2.3", + "has": "~1.0.3", + "inherits": "~2.0.4", + "is-regex": "~1.1.4", + "minimist": "~1.2.6", + "object-inspect": "~1.12.2", + "resolve": "~1.22.1", + "resumer": "~0.0.0", + "string.prototype.trim": "~1.2.6", + "through": "~2.3.8" + }, + "dependencies": { + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + } + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "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": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "testcontainers": { + "version": "9.10.1", + "resolved": "https://registry.npmjs.org/testcontainers/-/testcontainers-9.10.1.tgz", + "integrity": "sha512-+kTLawnZCiSWTL2Iljx+CtYbWIPzfTe8KiouFbTvJ8lAYN5esAj+bT2AKWcixotV4ddKCAbL6ESn35J0jvFCNg==", + "dev": true, + "requires": { + "@balena/dockerignore": "^1.0.2", + "@types/archiver": "^5.3.2", + "@types/dockerode": "^3.3.19", + "archiver": "^5.3.1", + "async-lock": "^1.4.0", + "byline": "^5.0.0", + "debug": "^4.3.4", + "docker-compose": "^0.24.1", + "dockerode": "^3.3.5", + "get-port": "^5.1.1", + "node-fetch": "^2.6.12", + "properties-reader": "^2.2.0", + "ssh-remote-port-forward": "^1.0.4", + "tar-fs": "^2.1.1", + "tmp": "^0.2.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" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "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": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + } + } + }, + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "dev": true + }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "dev": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "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": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "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" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "which-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz", + "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "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==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + }, + "ylru": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz", + "integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.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" + } + } + } + } + } +} diff --git a/package.json b/package.json index 5e4e94a3..bcda4f01 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,9 @@ { "name": "pinpoint-node-agent", - "version": "0.8.4-next.1", + "version": "0.9.0-next.2", "main": "index.js", + "types": "index.d.ts", + "type": "commonjs", "scripts": { "test": "tape ./test/**/*.test.js", "lint": "eslint -f checkstyle ./lib > checkstyle-result.xml;exit 0", @@ -16,12 +18,6 @@ "Yongseok Kang (https://github.com/feelform)" ], "license": "Apache-2.0", - "licenses": [ - { - "type": "Apache-2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - ], "bugs": { "url": "https://github.com/pinpoint-apm/pinpoint-node-agent/issues" }, @@ -67,10 +63,13 @@ "shimmer": "^1.2.0" }, "devDependencies": { + "@types/semver": "^7.3.13", + "@types/shimmer": "^1.0.2", "axios": "^0.21.1", "eslint": "^8.43.0", - "eslint-config-prettier": "^3.1.0", + "eslint-config-prettier": "^3.6.0", "eslint-plugin-import": "^2.25.2", + "eslint-plugin-prettier": "^5.0.0", "express": "^4.16.4", "install": "^0.13.0", "ioredis": "^4.3.0", @@ -80,17 +79,14 @@ "koa-router": "^7.4.0", "lodash": "^4.17.20", "mongoose": "^5.4.3", + "mysql": "^2.18.1", + "mysql2": "^3.6.0", "nyc": "^15.1.0", "redis": "^3.1.2", "redis-mock": "^0.49.0", "rimraf": "^2.6.2", "tape": "^4.9.1", - "testcontainers": "^2.8.0" - }, - "resolutions": { - "semver": "^7.5.3" - }, - "volta": { - "node": "16.20.1" + "testcontainers": "^9.10.1", + "typescript": "^4.8.3" } } diff --git a/test/agent.test.js b/test/agent.test.js index 78954fbe..7b1040b0 100644 --- a/test/agent.test.js +++ b/test/agent.test.js @@ -14,5 +14,5 @@ test('Should initialize agent', function (t) { const agent = require('./support/agent-singleton-mock') t.ok(agent) - t.equal(agent.pinpointClient.agentInfo.agentVersion, '0.8.4-next.1', 'agent version from package.json') + t.equal(agent.pinpointClient.agentInfo.agentVersion, '0.9.0-next.2', 'agent version from package.json') }) diff --git a/test/agent/env-config.test.js b/test/agent/env-config.test.js index 1548238f..be54fa01 100644 --- a/test/agent/env-config.test.js +++ b/test/agent/env-config.test.js @@ -7,6 +7,10 @@ const test = require('tape') const config = require('../../lib/config') +function isRunGithubAction() { + return config.isContainerEnvironment() +} + test('should return the string value when the env value is string type', function(t) { config.clear() @@ -95,11 +99,13 @@ test('should return the false value when the env value is boolean type', functio process.env['PINPOINT_SAMPLING'] = "false" process.env['PINPOINT_ENABLE'] = "false" process.env['PINPOINT_CONTAINER'] = "false" - + const given = config.getConfig() t.equal(given.sampling, false, 'given PINPOINT_SAMPLING env, should equal config') t.equal(given.enable, false, 'given PINPOINT_ENABLE env, should equal config') - t.equal(given.container, false, 'given PINPOINT_CONTAINER env, should equal config') + if (!isRunGithubAction()) { + t.equal(given.container, false, 'given PINPOINT_CONTAINER env, should equal config') + } delete process.env.PINPOINT_SAMPLING delete process.env.PINPOINT_ENABLE @@ -133,7 +139,9 @@ test('should not exist in the process.env property when you do not set an enviro t.equal(given.sampling, true, 'No set PINPOINT_SAMPLING env, should equal default config') t.equal(given.enable, true, 'No set PINPOINT_ENABLE env, should equal default config') - t.equal(given.container, false, 'No set PINPOINT_CONTAINER env, should equal default config') + if (!isRunGithubAction()) { + t.equal(given.container, false, 'No set PINPOINT_CONTAINER env, should equal default config') + } t.equal(given.serviceType, 1400, 'No set PINPOINT_SERVICE_TYPE env, should equal default config') t.equal(given.collectorTcpPort, 9991, 'No set PINPOINT_COLLECTOR_TCP_PORT env, should equal default config') @@ -169,10 +177,11 @@ test(`detect container`, (t) => { test(`detect container2`, (t) => { config.clear() - const given = config.getConfig() - - t.plan(1) - t.equal(given.container, false, 'container detect') + if (!isRunGithubAction()) { + const given = config.getConfig() + t.equal(given.container, false, 'container detect') + } delete process.env.KUBERNETES_SERVICE_HOST + t.end() }) \ No newline at end of file diff --git a/test/client/data-sender.test.js b/test/client/data-sender.test.js index 2398fbad..e97cd646 100644 --- a/test/client/data-sender.test.js +++ b/test/client/data-sender.test.js @@ -15,7 +15,7 @@ const dataSender = dataSenderMock() const AgentInfo = require('../../lib/data/dto/agent-info') const agentInfo = AgentInfo.create(fixture.config, Date.now()) const MethodDescriptor = require('../../lib/context/method-descriptor') -const MethodType = require('../../lib/constant/method-type').MethodType +const MethodType = require('../../lib/constant/method-type') const ApiMetaInfo = require('../../lib/data/dto/api-meta-info') const StringMetaInfo = require('../../lib/data/dto/string-meta-info') @@ -44,7 +44,7 @@ test('Should send api meta info', function (t) { const apiMetaInfo = ApiMetaInfo.create(methodDescriptor) dataSender.send(apiMetaInfo) - t.equal(dataSender.mockAPIMetaInfo, apiMetaInfo, "span is equal in datasender") + t.equal(dataSender.mockAPIMetaInfos[0], apiMetaInfo, "span is equal in datasender") }) test('Should send string meta info', function (t) { diff --git a/test/client/grpc-data-sender-bidirectional-stream.test.js b/test/client/grpc-data-sender-bidirectional-stream.test.js index 12ae5000..962081a7 100644 --- a/test/client/grpc-data-sender-bidirectional-stream.test.js +++ b/test/client/grpc-data-sender-bidirectional-stream.test.js @@ -6,7 +6,7 @@ const test = require('tape') -const services = require('../../lib/data/grpc/Service_grpc_pb') +const services = require('../../lib/data/v1/Service_grpc_pb') const { log } = require('../test-helper') const GrpcDataSender = require('../../lib/client/grpc-data-sender') const GrpcServer = require('./grpc-server') @@ -221,6 +221,9 @@ test.skip('when ping stream write throw a error, gRPC bidirectional stream Ping end: function () { this.writable = false currentStream.end() + }, + once: function (eventName, cb) { + currentStream.once(eventName, cb) } } this.grpcDataSender.sendPing() @@ -293,68 +296,4 @@ function pingSessionServer(call) { }) } -let actualsPingSessionServer - - -function pingSession2(call) { - call.on('data', (ping) => { - actualsPingSession.serverDataCount++ - call.write(ping) - }) - call.on('end', () => { - actualsPingSession.serverEndCount++ - call.end() - }) -} - -test.skip('ping ERR_STREAM_WRITE_AFTER_END', (t) => { - actualsPingSession = { - serverDataCount: 0, - serverEndCount: 0 - } - const callCount = 20 - t.plan(1) - - const server = new GrpcServer() - server.addService(services.AgentService, { - pingSession: pingSession2 - }) - server.addService(services.StatService, { - sendAgentStat: pingSessionServer - }) - server.addService(services.SpanService, { - sendSpan: pingSessionServer - }) - - server.startup((port) => { - this.grpcDataSender = new GrpcDataSender('localhost', port, port, port, { - 'agentid': '12121212', - 'applicationname': 'applicationName', - 'starttime': Date.now() - }) - - let callOrder = 0 - const originData = this.grpcDataSender.pingStream.grpcStream.stream.listeners('data')[0] - this.grpcDataSender.pingStream.grpcStream.stream.removeListener('data', originData) - this.grpcDataSender.pingStream.grpcStream.stream.on('data', (data) => { - callOrder++ - originData(data) - }) - - for (let index = 0; index < callCount + 1; index++) { - _.delay(() => { - if (index == callCount - 8) { - this.grpcDataSender.pingStream.grpcStream.end() - process.nextTick(() => { - t.true(true, `actualsPingSession.serverDataCount: ${actualsPingSession.serverDataCount}, on('data') count : ${callOrder}`) - server.tryShutdown(() => { - t.end() - }) - }) - } else { - this.grpcDataSender.sendPing() - } - }, _.random(10, 150)) - } - }) -}) \ No newline at end of file +let actualsPingSessionServer \ No newline at end of file diff --git a/test/client/grpc-data-sender-client-side-stream.test.js b/test/client/grpc-data-sender-client-side-stream.test.js index 9648a811..17309c6c 100644 --- a/test/client/grpc-data-sender-client-side-stream.test.js +++ b/test/client/grpc-data-sender-client-side-stream.test.js @@ -5,7 +5,7 @@ */ const test = require('tape') -const services = require('../../lib/data/grpc/Service_grpc_pb') +const services = require('../../lib/data/v1/Service_grpc_pb') const { Empty } = require('google-protobuf/google/protobuf/empty_pb') const { log } = require('../test-helper') const GrpcDataSender = require('../../lib/client/grpc-data-sender') @@ -274,7 +274,7 @@ test('gRPC client side stream reconnect test', (t) => { t.deepEqual(actuals.data, {}, 'actuals data') t.false(actuals.ended, 'client side stream lives') - given.deadline = given.deadline - (5 * 60 * 1000 + 100) + given.deadline = given.deadline - (10 * 60 * 1000 + 100) const fistDeadline = given.deadline given.write({ order: 2 }) t.deepEqual(actuals.data, { order: 2 }, 'actuals data is order: 2') @@ -509,6 +509,7 @@ test('stream deadline test', (t) => { } } }) + t.equal(given.grpcStreamDeadline, 600 * 1000, 'default dealine times') given.setDeadlineMinutes(6) diff --git a/test/client/grpc-data-sender.test.js b/test/client/grpc-data-sender.test.js index d71874ab..ee7106e8 100644 --- a/test/client/grpc-data-sender.test.js +++ b/test/client/grpc-data-sender.test.js @@ -7,9 +7,7 @@ const test = require('tape') const Annotation = require('../../lib/context/annotation') -const { - DefaultAnnotationKey -} = require('../../lib/constant/annotation-key') +const annotationKey = require('../../lib/constant/annotation-key') const AsyncId = require('../../lib/context/async-id') const SpanChunk = require('../../lib/context/span-chunk') const Span = require('../../lib/context/span') @@ -18,53 +16,53 @@ const MockgRPCDataSender = require('./mock-grpc-data-sender') test('Should send span ', function (t) { const expectedSpan = { - "traceId": { - "transactionId": { - "agentId": "express-node-sample-id", - "agentStartTime": 1592572771026, - "sequence": 5 + 'traceId': { + 'transactionId': { + 'agentId': 'express-node-sample-id', + 'agentStartTime': 1592572771026, + 'sequence': 5 }, - "spanId": 2894367178713953, - "parentSpanId": -1, - "flag": 0 + 'spanId': 2894367178713953, + 'parentSpanId': -1, + 'flag': 0 }, - "agentId": "express-node-sample-id", - "applicationName": "express-node-sample-name", - "agentStartTime": 1592572771026, - "serviceType": 1400, - "spanId": 2894367178713953, - "parentSpanId": -1, - "transactionId": { - "type": "Buffer", - "data": [0, 44, 101, 120, 112, 114, 101, 115, 115, 45, 110, 111, 100, 101, 45, 115, 97, 109, 112, 108, 101, 45, 105, 100, 210, 245, 239, 229, 172, 46, 5] + 'agentId': 'express-node-sample-id', + 'applicationName': 'express-node-sample-name', + 'agentStartTime': 1592572771026, + 'serviceType': 1400, + 'spanId': 2894367178713953, + 'parentSpanId': -1, + 'transactionId': { + 'type': 'Buffer', + 'data': [0, 44, 101, 120, 112, 114, 101, 115, 115, 45, 110, 111, 100, 101, 45, 115, 97, 109, 112, 108, 101, 45, 105, 100, 210, 245, 239, 229, 172, 46, 5] }, - "startTime": 1592574173350, - "elapsedTime": 28644, - "rpc": "/", - "endPoint": "localhost:3000", - "remoteAddr": "::1", - "annotations": [], - "flag": 0, - "err": 1, - "spanEventList": null, - "apiId": 1, - "exceptionInfo": null, - "applicationServiceType": 1400, - "loggingTransactionInfo": null, - "version": 1 + 'startTime': 1592574173350, + 'elapsedTime': 28644, + 'rpc': '/', + 'endPoint': 'localhost:3000', + 'remoteAddr': '::1', + 'annotations': [], + 'flag': 0, + 'err': 1, + 'spanEventList': null, + 'apiId': 1, + 'exceptionInfo': null, + 'applicationServiceType': 1400, + 'loggingTransactionInfo': null, + 'version': 1 } const span = Object.assign(new Span({ spanId: 2894367178713953, parentSpanId: -1, transactionId: { - "agentId": "express-node-sample-id", - "agentStartTime": 1592574173350, - "sequence": 0 + 'agentId': 'express-node-sample-id', + 'agentStartTime': 1592574173350, + 'sequence': 0 } }, { - agentId: "express-node-sample-id", - applicationName: "express-node-sample-name", + agentId: 'express-node-sample-id', + applicationName: 'express-node-sample-name', agentStartTime: 1592574173350 }), expectedSpan) @@ -113,7 +111,7 @@ test('Should send span ', function (t) { pAnnotations.forEach(annotation => { t.equal(annotation.getKey(), 12, 'annotation key') const pAnnotationValue = annotation.getValue() - t.equal(pAnnotationValue.getStringvalue(), "http.request", 'annotation string value') + t.equal(pAnnotationValue.getStringvalue(), 'http.request', 'annotation string value') }) }) @@ -128,83 +126,83 @@ const grpcDataSender = new MockgRPCDataSender('', 0, 0, 0, {agentId: 'agent', ap test('sendSpanChunk redis.SET.end', function (t) { let expectedSpanChunk = { - "agentId": "express-node-sample-id", - "applicationName": "express-node-sample-name", - "agentStartTime": 1592872080170, - "serviceType": 1400, - "spanId": 7056897257955935, - "parentSpanId": -1, - "transactionId": { - "type": "Buffer", - "data": [0, 44, 101, 120, 112, 114, 101, 115, 115, 45, 110, 111, 100, 101, 45, 115, 97, 109, 112, 108, 101, 45, 105, 100, 170, 166, 204, 244, 173, 46, 0] + 'agentId': 'express-node-sample-id', + 'applicationName': 'express-node-sample-name', + 'agentStartTime': 1592872080170, + 'serviceType': 1400, + 'spanId': 7056897257955935, + 'parentSpanId': -1, + 'transactionId': { + 'type': 'Buffer', + 'data': [0, 44, 101, 120, 112, 114, 101, 115, 115, 45, 110, 111, 100, 101, 45, 115, 97, 109, 112, 108, 101, 45, 105, 100, 170, 166, 204, 244, 173, 46, 0] }, - "transactionIdObject": { - "agentId": "express-node-sample-id", - "agentStartTime": 1592872080170, - "sequence": 0 + 'transactionIdObject': { + 'agentId': 'express-node-sample-id', + 'agentStartTime': 1592872080170, + 'sequence': 0 }, - "spanEventList": [Object.assign(new SpanEvent({ + 'spanEventList': [Object.assign(new SpanEvent({ spanId: 7056897257955935, - endPoint: "localhost:6379" + endPoint: 'localhost:6379' }, 0), { - "spanId": 7056897257955935, - "sequence": 0, - "startTime": 1592872091543, - "elapsedTime": 0, - "startElapsed": 14, - "serviceType": 100, - "endPoint": null, - "annotations": [], - "depth": 1, - "nextSpanId": -1, - "destinationId": null, - "apiId": 1, - "exceptionInfo": null, - "asyncId": null, - "nextAsyncId": null, - "asyncSequence": null, - "dummyId": null, - "nextDummyId": null + 'spanId': 7056897257955935, + 'sequence': 0, + 'startTime': 1592872091543, + 'elapsedTime': 0, + 'startElapsed': 14, + 'serviceType': 100, + 'endPoint': null, + 'annotations': [], + 'depth': 1, + 'nextSpanId': -1, + 'destinationId': null, + 'apiId': 1, + 'exceptionInfo': null, + 'asyncId': null, + 'nextAsyncId': null, + 'asyncSequence': null, + 'dummyId': null, + 'nextDummyId': null }), Object.assign(new SpanEvent({ spanId: 7056897257955935, - endPoint: "localhost:6379" + endPoint: 'localhost:6379' }, 1), { - "spanId": 7056897257955935, - "sequence": 1, - "startTime": 1592872091543, - "elapsedTime": 2, - "startElapsed": 7, - "serviceType": 8200, - "endPoint": "localhost:6379", - "annotations": [new Annotation(DefaultAnnotationKey.API, "redis.SET.end")], - "depth": 2, - "nextSpanId": 1508182809976945, - "destinationId": "Redis", - "apiId": 0, - "exceptionInfo": null, - "asyncId": null, - "nextAsyncId": null, - "asyncSequence": null, - "dummyId": null, - "nextDummyId": null + 'spanId': 7056897257955935, + 'sequence': 1, + 'startTime': 1592872091543, + 'elapsedTime': 2, + 'startElapsed': 7, + 'serviceType': 8200, + 'endPoint': 'localhost:6379', + 'annotations': [Annotations.of(annotationKey.API.getCode(), 'redis.SET.end')], + 'depth': 2, + 'nextSpanId': 1508182809976945, + 'destinationId': 'Redis', + 'apiId': 0, + 'exceptionInfo': null, + 'asyncId': null, + 'nextAsyncId': null, + 'asyncSequence': null, + 'dummyId': null, + 'nextDummyId': null }) ], - "endPoint": null, - "applicationServiceType": 1400, - "localAsyncId": new AsyncId(1) + 'endPoint': null, + 'applicationServiceType': 1400, + 'localAsyncId': new AsyncId(1) } const spanChunk = Object.assign(new SpanChunk({ spanId: 2894367178713953, parentSpanId: -1, transactionId: { - "agentId": "express-node-sample-id", - "agentStartTime": 1592872080170, - "sequence": 0 + 'agentId': 'express-node-sample-id', + 'agentStartTime': 1592872080170, + 'sequence': 0 } }, { - agentId: "express-node-sample-id", - applicationName: "express-node-sample-name", + agentId: 'express-node-sample-id', + applicationName: 'express-node-sample-name', agentStartTime: 1592872080170 }), expectedSpanChunk) @@ -249,7 +247,7 @@ test('sendSpanChunk redis.SET.end', function (t) { pAnnotations.forEach(annotation => { t.equal(annotation.getKey(), 12, 'annotation key') const pAnnotationValue = annotation.getValue() - t.equal(pAnnotationValue.getStringvalue(), "redis.SET.end", 'annotation string value') + t.equal(pAnnotationValue.getStringvalue(), 'redis.SET.end', 'annotation string value') }) } }) @@ -257,81 +255,81 @@ test('sendSpanChunk redis.SET.end', function (t) { test('sendSpanChunk redis.GET.end', (t) => { let expectedSpanChunk = { - "agentId": "express-node-sample-id", - "applicationName": "express-node-sample-name", - "agentStartTime": 1592872080170, - "serviceType": 1400, - "spanId": 7056897257955935, - "parentSpanId": -1, - "transactionId": { - "type": "Buffer", - "data": [0, 44, 101, 120, 112, 114, 101, 115, 115, 45, 110, 111, 100, 101, 45, 115, 97, 109, 112, 108, 101, 45, 105, 100, 170, 166, 204, 244, 173, 46, 0] + 'agentId': 'express-node-sample-id', + 'applicationName': 'express-node-sample-name', + 'agentStartTime': 1592872080170, + 'serviceType': 1400, + 'spanId': 7056897257955935, + 'parentSpanId': -1, + 'transactionId': { + 'type': 'Buffer', + 'data': [0, 44, 101, 120, 112, 114, 101, 115, 115, 45, 110, 111, 100, 101, 45, 115, 97, 109, 112, 108, 101, 45, 105, 100, 170, 166, 204, 244, 173, 46, 0] }, - "transactionIdObject": { - "agentId": "express-node-sample-id", - "agentStartTime": 1592872080170, - "sequence": 0 + 'transactionIdObject': { + 'agentId': 'express-node-sample-id', + 'agentStartTime': 1592872080170, + 'sequence': 0 }, - "spanEventList": [Object.assign(new SpanEvent({ + 'spanEventList': [Object.assign(new SpanEvent({ spanId: 7056897257955935, - endPoint: "localhost:6379" + endPoint: 'localhost:6379' }, 0), { - "spanId": 7056897257955935, - "sequence": 0, - "startTime": 1592872091543, - "elapsedTime": 0, - "startElapsed": 14, - "serviceType": 100, - "endPoint": null, - "annotations": [], - "depth": 1, - "nextSpanId": -1, - "destinationId": null, - "apiId": 1, - "exceptionInfo": null, - "asyncId": null, - "nextAsyncId": null, - "asyncSequence": null, - "dummyId": null, - "nextDummyId": null + 'spanId': 7056897257955935, + 'sequence': 0, + 'startTime': 1592872091543, + 'elapsedTime': 0, + 'startElapsed': 14, + 'serviceType': 100, + 'endPoint': null, + 'annotations': [], + 'depth': 1, + 'nextSpanId': -1, + 'destinationId': null, + 'apiId': 1, + 'exceptionInfo': null, + 'asyncId': null, + 'nextAsyncId': null, + 'asyncSequence': null, + 'dummyId': null, + 'nextDummyId': null }), { - "spanId": 7056897257955935, - "sequence": 1, - "startTime": 1592872091543, - "elapsedTime": 0, - "startElapsed": 7, - "serviceType": 8200, - "endPoint": "localhost:6379", - "annotations": [new Annotation(DefaultAnnotationKey.API, "redis.GET.end")], - "depth": 2, - "nextSpanId": 6277978728741477, - "destinationId": "Redis", - "apiId": 0, - "exceptionInfo": null, - "asyncId": null, - "nextAsyncId": null, - "asyncSequence": null, - "dummyId": null, - "nextDummyId": null + 'spanId': 7056897257955935, + 'sequence': 1, + 'startTime': 1592872091543, + 'elapsedTime': 0, + 'startElapsed': 7, + 'serviceType': 8200, + 'endPoint': 'localhost:6379', + 'annotations': [Annotations.of(annotationKey.API.getCode(), 'redis.GET.end')], + 'depth': 2, + 'nextSpanId': 6277978728741477, + 'destinationId': 'Redis', + 'apiId': 0, + 'exceptionInfo': null, + 'asyncId': null, + 'nextAsyncId': null, + 'asyncSequence': null, + 'dummyId': null, + 'nextDummyId': null } ], - "endPoint": null, - "applicationServiceType": 1400, - "localAsyncId": new AsyncId(2) + 'endPoint': null, + 'applicationServiceType': 1400, + 'localAsyncId': new AsyncId(2) } const spanChunk = Object.assign(new SpanChunk({ spanId: 7056897257955935, parentSpanId: -1, transactionId: { - "agentId": "express-node-sample-id", - "agentStartTime": 1592872080170, - "sequence": 0 + 'agentId': 'express-node-sample-id', + 'agentStartTime': 1592872080170, + 'sequence': 0 } }, { - agentId: "express-node-sample-id", - applicationName: "express-node-sample-name", + agentId: 'express-node-sample-id', + applicationName: 'express-node-sample-name', agentStartTime: 1592872080170 }), expectedSpanChunk) grpcDataSender.sendSpanChunk(spanChunk) @@ -368,7 +366,7 @@ test('sendSpanChunk redis.GET.end', (t) => { pAnnotations.forEach(annotation => { t.equal(annotation.getKey(), 12, 'annotation key') const pAnnotationValue = annotation.getValue() - t.equal(pAnnotationValue.getStringvalue(), "redis.GET.end", 'annotation string value') + t.equal(pAnnotationValue.getStringvalue(), 'redis.GET.end', 'annotation string value') }) } }) @@ -376,261 +374,261 @@ test('sendSpanChunk redis.GET.end', (t) => { test('sendSpan', (t) => { let expectedSpanChunk = { - "traceId": { - "transactionId": { - "agentId": "express-node-sample-id", - "agentStartTime": 1592872080170, - "sequence": 0 + 'traceId': { + 'transactionId': { + 'agentId': 'express-node-sample-id', + 'agentStartTime': 1592872080170, + 'sequence': 0 }, - "spanId": 7056897257955935, - "parentSpanId": -1, - "flag": 0 + 'spanId': 7056897257955935, + 'parentSpanId': -1, + 'flag': 0 }, - "agentId": "express-node-sample-id", - "applicationName": "express-node-sample-name", - "agentStartTime": 1592872080170, - "serviceType": 1400, - "spanId": 7056897257955935, - "parentSpanId": -1, - "transactionId": { - "type": "Buffer", - "data": [0, 44, 101, 120, 112, 114, 101, 115, 115, 45, 110, 111, 100, 101, 45, 115, 97, 109, 112, 108, 101, 45, 105, 100, 170, 166, 204, 244, 173, 46, 0] + 'agentId': 'express-node-sample-id', + 'applicationName': 'express-node-sample-name', + 'agentStartTime': 1592872080170, + 'serviceType': 1400, + 'spanId': 7056897257955935, + 'parentSpanId': -1, + 'transactionId': { + 'type': 'Buffer', + 'data': [0, 44, 101, 120, 112, 114, 101, 115, 115, 45, 110, 111, 100, 101, 45, 115, 97, 109, 112, 108, 101, 45, 105, 100, 170, 166, 204, 244, 173, 46, 0] }, - "startTime": 1592872091536, - "elapsedTime": 412, - "rpc": "/", - "endPoint": "localhost:3000", - "remoteAddr": "::1", - "annotations": [], - "flag": 0, - "err": null, - "spanEventList": [ + 'startTime': 1592872091536, + 'elapsedTime': 412, + 'rpc': '/', + 'endPoint': 'localhost:3000', + 'remoteAddr': '::1', + 'annotations': [], + 'flag': 0, + 'err': null, + 'spanEventList': [ Object.assign(new SpanEvent({ spanId: 7056897257955935, - endPoint: "localhost:3000" + endPoint: 'localhost:3000' }, 4), { - "spanId": 7056897257955935, - "sequence": 4, - "startTime": 1592872091540, - "elapsedTime": 1, - "startElapsed": 4, - "serviceType": 6600, - "endPoint": "localhost:3000", - "annotations": [new Annotation(DefaultAnnotationKey.API, "express.middleware.serveStatic")], - "depth": 5, - "nextSpanId": -1, - "destinationId": "localhost:3000", - "apiId": 0, - "exceptionInfo": null, - "asyncId": null, - "nextAsyncId": null, - "asyncSequence": null, - "dummyId": null, - "nextDummyId": null + 'spanId': 7056897257955935, + 'sequence': 4, + 'startTime': 1592872091540, + 'elapsedTime': 1, + 'startElapsed': 4, + 'serviceType': 6600, + 'endPoint': 'localhost:3000', + 'annotations': [Annotations.of(annotationKey.API.getCode(), 'express.middleware.serveStatic')], + 'depth': 5, + 'nextSpanId': -1, + 'destinationId': 'localhost:3000', + 'apiId': 0, + 'exceptionInfo': null, + 'asyncId': null, + 'nextAsyncId': null, + 'asyncSequence': null, + 'dummyId': null, + 'nextDummyId': null }), Object.assign(new SpanEvent({ spanId: 7056897257955935, - endPoint: "localhost:3000" + endPoint: 'localhost:3000' }, 3), { - "spanId": 7056897257955935, - "sequence": 3, - "startTime": 1592872091540, - "elapsedTime": 1, - "startElapsed": 4, - "serviceType": 6600, - "endPoint": "localhost:3000", - "annotations": [new Annotation(DefaultAnnotationKey.API, "express.middleware.cookieParser")], - "depth": 4, - "nextSpanId": -1, - "destinationId": "localhost:3000", - "apiId": 0, - "exceptionInfo": null, - "asyncId": null, - "nextAsyncId": null, - "asyncSequence": null, - "dummyId": null, - "nextDummyId": null + 'spanId': 7056897257955935, + 'sequence': 3, + 'startTime': 1592872091540, + 'elapsedTime': 1, + 'startElapsed': 4, + 'serviceType': 6600, + 'endPoint': 'localhost:3000', + 'annotations': [Annotations.of(annotationKey.API.getCode(), 'express.middleware.cookieParser')], + 'depth': 4, + 'nextSpanId': -1, + 'destinationId': 'localhost:3000', + 'apiId': 0, + 'exceptionInfo': null, + 'asyncId': null, + 'nextAsyncId': null, + 'asyncSequence': null, + 'dummyId': null, + 'nextDummyId': null }), Object.assign(new SpanEvent({ spanId: 7056897257955935, - endPoint: "localhost:3000" + endPoint: 'localhost:3000' }, 2), { - "spanId": 7056897257955935, - "sequence": 2, - "startTime": 1592872091540, - "elapsedTime": 1, - "startElapsed": 4, - "serviceType": 6600, - "endPoint": "localhost:3000", - "annotations": [new Annotation(DefaultAnnotationKey.API, "express.middleware.urlencodedParser")], - "depth": 3, - "nextSpanId": -1, - "destinationId": "localhost:3000", - "apiId": 0, - "exceptionInfo": null, - "asyncId": null, - "nextAsyncId": null, - "asyncSequence": null, - "dummyId": null, - "nextDummyId": null + 'spanId': 7056897257955935, + 'sequence': 2, + 'startTime': 1592872091540, + 'elapsedTime': 1, + 'startElapsed': 4, + 'serviceType': 6600, + 'endPoint': 'localhost:3000', + 'annotations': [Annotations.of(annotationKey.API.getCode(), 'express.middleware.urlencodedParser')], + 'depth': 3, + 'nextSpanId': -1, + 'destinationId': 'localhost:3000', + 'apiId': 0, + 'exceptionInfo': null, + 'asyncId': null, + 'nextAsyncId': null, + 'asyncSequence': null, + 'dummyId': null, + 'nextDummyId': null }), Object.assign(new SpanEvent({ spanId: 7056897257955935, - endPoint: "localhost:3000" + endPoint: 'localhost:3000' }, 1), { - "spanId": 7056897257955935, - "sequence": 1, - "startTime": 1592872091540, - "elapsedTime": 1, - "startElapsed": 4, - "serviceType": 6600, - "endPoint": "localhost:3000", - "annotations": [new Annotation(DefaultAnnotationKey.API, "express.middleware.jsonParser")], - "depth": 2, - "nextSpanId": -1, - "destinationId": "localhost:3000", - "apiId": 0, - "exceptionInfo": null, - "asyncId": null, - "nextAsyncId": null, - "asyncSequence": null, - "dummyId": null, - "nextDummyId": null + 'spanId': 7056897257955935, + 'sequence': 1, + 'startTime': 1592872091540, + 'elapsedTime': 1, + 'startElapsed': 4, + 'serviceType': 6600, + 'endPoint': 'localhost:3000', + 'annotations': [Annotations.of(annotationKey.API.getCode(), 'express.middleware.jsonParser')], + 'depth': 2, + 'nextSpanId': -1, + 'destinationId': 'localhost:3000', + 'apiId': 0, + 'exceptionInfo': null, + 'asyncId': null, + 'nextAsyncId': null, + 'asyncSequence': null, + 'dummyId': null, + 'nextDummyId': null }), Object.assign(new SpanEvent({ spanId: 7056897257955935, - endPoint: "localhost:3000" + endPoint: 'localhost:3000' }, 0), { - "spanId": 7056897257955935, - "sequence": 0, - "startTime": 1592872091539, - "elapsedTime": 2, - "startElapsed": 3, - "serviceType": 6600, - "endPoint": "localhost:3000", - "annotations": [new Annotation(DefaultAnnotationKey.API, "express.middleware.logger")], - "depth": 1, - "nextSpanId": -1, - "destinationId": "localhost:3000", - "apiId": 0, - "exceptionInfo": null, - "asyncId": null, - "nextAsyncId": null, - "asyncSequence": null, - "dummyId": null, - "nextDummyId": null + 'spanId': 7056897257955935, + 'sequence': 0, + 'startTime': 1592872091539, + 'elapsedTime': 2, + 'startElapsed': 3, + 'serviceType': 6600, + 'endPoint': 'localhost:3000', + 'annotations': [Annotations.of(annotationKey.API.getCode(), 'express.middleware.logger')], + 'depth': 1, + 'nextSpanId': -1, + 'destinationId': 'localhost:3000', + 'apiId': 0, + 'exceptionInfo': null, + 'asyncId': null, + 'nextAsyncId': null, + 'asyncSequence': null, + 'dummyId': null, + 'nextDummyId': null }), Object.assign(new SpanEvent({ spanId: 7056897257955935, - endPoint: "localhost:3000" + endPoint: 'localhost:3000' }, 6), { - "spanId": 7056897257955935, - "sequence": 6, - "startTime": 1592872091543, - "elapsedTime": 0, - "startElapsed": 7, - "serviceType": 9057, - "endPoint": "localhost:6379", - "annotations": [new Annotation(DefaultAnnotationKey.API, "redis.SET.call")], - "depth": 2, - "nextSpanId": -1, - "destinationId": "Redis", - "apiId": 0, - "exceptionInfo": null, - "asyncId": null, - "nextAsyncId": 1, - "asyncSequence": null, - "dummyId": null, - "nextDummyId": null + 'spanId': 7056897257955935, + 'sequence': 6, + 'startTime': 1592872091543, + 'elapsedTime': 0, + 'startElapsed': 7, + 'serviceType': 9057, + 'endPoint': 'localhost:6379', + 'annotations': [Annotations.of(annotationKey.API.getCode(), 'redis.SET.call')], + 'depth': 2, + 'nextSpanId': -1, + 'destinationId': 'Redis', + 'apiId': 0, + 'exceptionInfo': null, + 'asyncId': null, + 'nextAsyncId': 1, + 'asyncSequence': null, + 'dummyId': null, + 'nextDummyId': null }), Object.assign(new SpanEvent({ spanId: 7056897257955935, - endPoint: "localhost:3000" + endPoint: 'localhost:3000' }, 7), { - "spanId": 7056897257955935, - "sequence": 7, - "startTime": 1592872091543, - "elapsedTime": 0, - "startElapsed": 7, - "serviceType": 9057, - "endPoint": "localhost:6379", - "annotations": [new Annotation(DefaultAnnotationKey.API, "redis.GET.call")], - "depth": 2, - "nextSpanId": -1, - "destinationId": "Redis", - "apiId": 0, - "exceptionInfo": null, - "asyncId": null, - "nextAsyncId": 2, - "asyncSequence": null, - "dummyId": null, - "nextDummyId": null + 'spanId': 7056897257955935, + 'sequence': 7, + 'startTime': 1592872091543, + 'elapsedTime': 0, + 'startElapsed': 7, + 'serviceType': 9057, + 'endPoint': 'localhost:6379', + 'annotations': [Annotations.of(annotationKey.API.getCode(), 'redis.GET.call')], + 'depth': 2, + 'nextSpanId': -1, + 'destinationId': 'Redis', + 'apiId': 0, + 'exceptionInfo': null, + 'asyncId': null, + 'nextAsyncId': 2, + 'asyncSequence': null, + 'dummyId': null, + 'nextDummyId': null }), Object.assign(new SpanEvent({ spanId: 7056897257955935, - endPoint: "localhost:3000" + endPoint: 'localhost:3000' }, 5), { - "spanId": 7056897257955935, - "sequence": 5, - "startTime": 1592872091542, - "elapsedTime": 3, - "startElapsed": 6, - "serviceType": 6600, - "endPoint": "localhost:3000", - "annotations": [], - "depth": 1, - "nextSpanId": -1, - "destinationId": "localhost:3000", - "apiId": 2, - "exceptionInfo": null, - "asyncId": null, - "nextAsyncId": null, - "asyncSequence": null, - "dummyId": null, - "nextDummyId": null + 'spanId': 7056897257955935, + 'sequence': 5, + 'startTime': 1592872091542, + 'elapsedTime': 3, + 'startElapsed': 6, + 'serviceType': 6600, + 'endPoint': 'localhost:3000', + 'annotations': [], + 'depth': 1, + 'nextSpanId': -1, + 'destinationId': 'localhost:3000', + 'apiId': 2, + 'exceptionInfo': null, + 'asyncId': null, + 'nextAsyncId': null, + 'asyncSequence': null, + 'dummyId': null, + 'nextDummyId': null }), Object.assign(new SpanEvent({ spanId: 7056897257955935, - endPoint: "localhost:3000" + endPoint: 'localhost:3000' }, 8), { - "spanId": 7056897257955935, - "sequence": 8, - "startTime": 1592872091558, - "elapsedTime": 0, - "startElapsed": 22, - "serviceType": 9057, - "endPoint": "localhost:3000", - "annotations": [new Annotation(DefaultAnnotationKey.API, "http.request")], - "depth": 1, - "nextSpanId": -1, - "destinationId": "localhost:3000", - "apiId": 0, - "exceptionInfo": null, - "asyncId": null, - "nextAsyncId": 3, - "asyncSequence": null, - "dummyId": null, - "nextDummyId": null + 'spanId': 7056897257955935, + 'sequence': 8, + 'startTime': 1592872091558, + 'elapsedTime': 0, + 'startElapsed': 22, + 'serviceType': 9057, + 'endPoint': 'localhost:3000', + 'annotations': [Annotations.of(annotationKey.API.getCode(), 'http.request')], + 'depth': 1, + 'nextSpanId': -1, + 'destinationId': 'localhost:3000', + 'apiId': 0, + 'exceptionInfo': null, + 'asyncId': null, + 'nextAsyncId': 3, + 'asyncSequence': null, + 'dummyId': null, + 'nextDummyId': null }) ], - "apiId": 1, - "exceptionInfo": null, - "applicationServiceType": 1400, - "loggingTransactionInfo": null, - "version": 1 + 'apiId': 1, + 'exceptionInfo': null, + 'applicationServiceType': 1400, + 'loggingTransactionInfo': null, + 'version': 1 } const span = Object.assign(new Span({ spanId: 2894367178713953, parentSpanId: -1, transactionId: { - "agentId": "express-node-sample-id", - "agentStartTime": 1592872080170, - "sequence": 5 + 'agentId': 'express-node-sample-id', + 'agentStartTime': 1592872080170, + 'sequence': 5 } }, { - agentId: "express-node-sample-id", - applicationName: "express-node-sample-name", + agentId: 'express-node-sample-id', + applicationName: 'express-node-sample-name', agentStartTime: 1592872080170 }), expectedSpanChunk) grpcDataSender.sendSpan(span) @@ -680,6 +678,7 @@ test('sendSpan', (t) => { }) const CommandType = require('../../lib/constant/commaned-type') +const Annotations = require('../../lib/instrumentation/context/annotation/annotations') test.skip('sendHandshake', (t) => { let expectedParams = { supportCommandList: [CommandType.ECHO, CommandType.ACTIVE_THREAD_COUNT, CommandType.ACTIVE_THREAD_COUNT_RESPONSE], @@ -706,30 +705,30 @@ test.skip('sendHandshake', (t) => { test('sendStat', (t) => { let expectedStat = { - "agentId": "express-node-sample-id", - "agentStartTime": 1593058531421, - "timestamp": 1593058537472, - "collectInterval": 1000, - "memory": { - "heapUsed": 37042600, - "heapTotal": 62197760 + 'agentId': 'express-node-sample-id', + 'agentStartTime': 1593058531421, + 'timestamp': 1593058537472, + 'collectInterval': 1000, + 'memory': { + 'heapUsed': 37042600, + 'heapTotal': 62197760 }, - "cpu": { - "user": 0.0003919068831319893, - "system": 0 + 'cpu': { + 'user': 0.0003919068831319893, + 'system': 0 }, - "activeTrace": { - "schema": { - "typeCode": 2, - "fast": 1000, - "normal": 3000, - "slow": 5000 + 'activeTrace': { + 'schema': { + 'typeCode': 2, + 'fast': 1000, + 'normal': 3000, + 'slow': 5000 }, - "typeCode": 2, - "fastCount": 0, - "normalCount": 0, - "slowCount": 0, - "verySlowCount": 0 + 'typeCode': 2, + 'fastCount': 0, + 'normalCount': 0, + 'slowCount': 0, + 'verySlowCount': 0 } } grpcDataSender.sendStat(expectedStat) diff --git a/test/client/grpc-stream-deadline.test.js b/test/client/grpc-stream-deadline.test.js index b4695801..7664297b 100644 --- a/test/client/grpc-stream-deadline.test.js +++ b/test/client/grpc-stream-deadline.test.js @@ -7,7 +7,7 @@ const test = require('tape') const grpc = require('@grpc/grpc-js') -const services = require('../../lib/data/grpc/Service_grpc_pb') +const services = require('../../lib/data/v1/Service_grpc_pb') const dataConvertor = require('../../lib/data/grpc-data-convertor') const { Empty } = require('google-protobuf/google/protobuf/empty_pb') const { log } = require('../test-helper') @@ -16,7 +16,7 @@ var _ = require('lodash') const GrpcServer = require('./grpc-server') const GrpcDataSender = require('../../lib/client/grpc-data-sender') -const spanMessages = require('../../lib/data/grpc/Span_pb') +const spanMessages = require('../../lib/data/v1/Span_pb') let statClient let endAction diff --git a/test/client/grpc-stream.test.js b/test/client/grpc-stream.test.js index 6429ca9f..667520d5 100644 --- a/test/client/grpc-stream.test.js +++ b/test/client/grpc-stream.test.js @@ -7,7 +7,7 @@ const test = require('tape') const grpc = require('@grpc/grpc-js') -const services = require('../../lib/data/grpc/Service_grpc_pb') +const services = require('../../lib/data/v1/Service_grpc_pb') const dataConvertor = require('../../lib/data/grpc-data-convertor') const { Empty } = require('google-protobuf/google/protobuf/empty_pb') const { log } = require('../test-helper') @@ -56,8 +56,6 @@ function callStat(t) { t.true(response, 'response is true') } }) - // t.equal(call.call.nextCall.call.filterStack.filters.length, 4, `Filter is (4) [CallCredentialsFilter, DeadlineFilter, MaxMessageSizeFilter, CompressionFilter]`) - // t.equal(call.call.nextCall.call.options.deadline, Infinity, 'deadline default is Infinity') t.true(typeof call.call.nextCall.call.channel.subchannelPool.pool[`dns:localhost:${actualPort}`] === 'undefined', 'subchannel pool no related to call.write') for (let index = 0; index < messageCount; index++) { @@ -74,14 +72,6 @@ function callStat(t) { } }) call.write(pStatMessage, () => { - if (index == 0) { - // t.true(call.call.nextCall.call.pendingWrite, "1st message is pendingWrite") - t.equal(call.call.nextCall.call.channel.subchannelPool.pool[`dns:localhost:${actualPort}`].length, 2, 'subchannel pool no related to call.write') - } else if (index == 1) { - t.equal(call.call.nextCall.call.channel.subchannelPool.pool[`dns:localhost:${actualPort}`].length, 2, `subchannel count`) - } else if (index == 10) { - t.equal(call.call.nextCall.call.channel.subchannelPool.pool[`dns:localhost:${actualPort}`].length, 2, 'subchannel pool no related to call.write') - } }) } call.end() diff --git a/test/client/grpc-unary-rpc.test.js b/test/client/grpc-unary-rpc.test.js index ed9227b2..460b21ee 100644 --- a/test/client/grpc-unary-rpc.test.js +++ b/test/client/grpc-unary-rpc.test.js @@ -6,18 +6,20 @@ const test = require('tape') -const services = require('../../lib/data/grpc/Service_grpc_pb') +const services = require('../../lib/data/v1/Service_grpc_pb') var _ = require('lodash') const GrpcServer = require('./grpc-server') -const spanMessages = require('../../lib/data/grpc/Span_pb') +const spanMessages = require('../../lib/data/v1/Span_pb') const dataSenderFactory = require('../../lib/client/data-sender-factory') const AgentInfo = require('../../lib/data/dto/agent-info') const ApiMetaInfo = require('../../lib/data/dto/api-meta-info') const StringMetaInfo = require('../../lib/data/dto/string-meta-info') const DataSender = require('../../lib/client/data-sender') const GrpcDataSender = require('../../lib/client/grpc-data-sender') +const MethodDescriptorBuilder2 = require('../../lib/context/method-descriptor-builder2') +const MethodType = require('../../lib/constant/method-type') class MockGrpcDataSender extends GrpcDataSender { initializeSpanStream() { @@ -183,6 +185,71 @@ test('sendApiMetaInfo retry', (t) => { }) }) +test('sendApiMetaInfo lineNumber and location', (t) => { + const server = new GrpcServer() + server.addService(services.MetadataService, { + requestApiMetaData: requestApiMetaData + }) + server.startup((port) => { + const agentInfo = Object.assign(new AgentInfo({ + agentId: '12121212', + applicationName: 'applicationName', + agentStartTime: Date.now() + }), { + ip: '1' + }) + + const apiMetaInfo = ApiMetaInfo.create(new MethodDescriptorBuilder2() + .setApiId(12121212) + .setClassName('Router') + .setMethodName('get') + .setType(1400) + .setLineNumber(481) + .setLocation('node_modules/express/lib/application.js') + .build() + ) + + this.dataSender = dataSenderFactory.create({ + collectorIp: 'localhost', + collectorTcpPort: port, + collectorStatPort: port, + collectorSpanPort: port, + enabledDataSending: true + }, agentInfo) + + let callbackTimes = 0 + const callback = (error, response) => { + callbackTimes++ + t.false(error, 'error is undefined') + t.true(response, 'response') + t.equal(callbackTimes, 1, 'callback only once called') + t.equal(requestTimes, 1, 'requestes one time') + + tryShutdown() + } + const origin = this.dataSender.dataSender.requestApiMetaData.request + let requestTimes = 0 + this.dataSender.dataSender.requestApiMetaData.request = (data, _, timesOfRetry = 1) => { + requestTimes++ + t.equal(data.getApiid(), 12121212, 'apiId') + t.equal(data.getApiinfo(), 'Router.get', 'Apiinfo') + t.equal(data.getType(), 1400, 'type') + t.equal(data.getLine(), 481, 'line') + t.equal(data.getLocation(), 'node_modules/express/lib/application.js', 'location') + origin.call(this.dataSender.dataSender.requestApiMetaData, data, callback, timesOfRetry) + } + this.dataSender.send(apiMetaInfo) + + tryShutdown = () => { + setTimeout(() => { + server.tryShutdown(() => { + t.end() + }) + }, 0) + } + }) +}) + // https://github.com/agreatfool/grpc_tools_node_protoc_ts/blob/v5.0.0/examples/src/grpcjs/server.ts function requestStringMetaData(call, callback) { const result = new spanMessages.PResult() @@ -254,6 +321,7 @@ test('sendStringMetaInfo retry', (t) => { }) }) + // https://github.com/agreatfool/grpc_tools_node_protoc_ts/blob/v5.0.0/examples/src/grpcjs/server.ts function requestAgentInfo2(call, callback) { const result = new spanMessages.PResult() diff --git a/test/client/mock-grpc-data-sender.js b/test/client/mock-grpc-data-sender.js index cffe0bda..0c974946 100644 --- a/test/client/mock-grpc-data-sender.js +++ b/test/client/mock-grpc-data-sender.js @@ -24,10 +24,14 @@ class MockgRPCDataSender extends GrpcDataSender { }, requestStringMetaData: function (pStringMetaData) { self.actualStringMetaData = pStringMetaData + }, + requestSqlMetaData: function (pSqlMetaData) { + self.actualSqlMetaData = pSqlMetaData } } this.requestApiMetaData = new GrpcUnaryRPC('requestApiMetaData', this.metadataClient, this.metadataClient.requestApiMetaData, 0, 0) this.requestStringMetaData = new GrpcUnaryRPC('requestStringMetaData', this.metadataClient, this.metadataClient.requestStringMetaData, 0, 0) + this.requestSqlMetaData = new GrpcUnaryRPC('requestSqlMetaData', this.metadataClient, this.metadataClient.requestSqlMetaData, 0, 0) } initializeSpanStream() { diff --git a/test/context/callstack.test.js b/test/context/callstack.test.js index 6352168b..0c2575d7 100644 --- a/test/context/callstack.test.js +++ b/test/context/callstack.test.js @@ -7,42 +7,44 @@ const test = require('tape') const agent = require('../support/agent-singleton-mock') const axios = require('axios') +const apiMetaService = require('../../lib/context/api-meta-service') +const MethodDescriptorBuilder = require('../../lib/context/method-descriptor-builder') +const { ServiceTypeCode } = require('../../lib/constant/service-type') +const express = require('express') +const defaultPredefinedMethodDescriptorRegistry = require('../../lib/constant/default-predefined-method-descriptor-registry') -test(`span and spanEvent call stack`, async (t) => { +test.skip(`span and spanEvent call stack`, async (t) => { agent.bindHttp() t.plan(11) const trace = agent.createTraceObject() - t.equal(trace.callStack.length, 0, "callstack is 0") - t.equal(agent.traceContext.currentTraceObject(), trace, "current trace is current asyncId trace object") + t.equal(trace.callStack.length, 0, 'callstack is 0') + t.equal(agent.traceContext.currentTraceObject(), trace, 'current trace is current asyncId trace object') - axios.get(`https://naver.com`) + axios.get(`https://github.com`) .then(function (response) { t.true(response.status == 200) - t.equal(agent.traceContext.currentTraceObject(), trace, "current trace is current asyncId trace object") - t.equal(agent.dataSender.mockSpanChunk.spanEventList.length, 2, "spanEventList length") - t.equal(agent.dataSender.mockSpanChunk.spanEventList[1].annotations[0].key, 12, "APIDesc key") - t.equal(agent.dataSender.mockSpanChunk.spanEventList[1].annotations[0].value.stringValue, "GET", "APIDesc stringValue") - t.equal(agent.dataSender.mockSpanChunk.spanEventList[1].annotations[1].key, 40, "HTTP.URL key") - t.equal(agent.dataSender.mockSpanChunk.spanEventList[1].annotations[1].value.stringValue, 'www.naver.com/', "HTTP.URL stringValue") - t.equal(agent.dataSender.mockSpanChunk.spanEventList[1].annotations[2].key, 46, "HTTP.status.code") - t.equal(agent.dataSender.mockSpanChunk.spanEventList[1].annotations[2].value.intValue, 200, "HTTP.status.code stringValue") + t.equal(agent.traceContext.currentTraceObject(), trace, 'current trace is current asyncId trace object') + t.equal(agent.dataSender.mockSpanChunks[0].spanEventList.length, 2, 'spanEventList length') + t.equal(agent.dataSender.mockSpanChunks[0].spanEventList[1].annotations[0].key, 12, 'APIDesc key') + t.equal(agent.dataSender.mockSpanChunks[0].spanEventList[1].annotations[0].value, 'GET', 'APIDesc stringValue') + t.equal(agent.dataSender.mockSpanChunks[0].spanEventList[1].annotations[1].key, 40, 'HTTP.URL key') + t.equal(agent.dataSender.mockSpanChunks[0].spanEventList[1].annotations[1].value, 'github.com/', 'HTTP.URL stringValue') + t.equal(agent.dataSender.mockSpanChunks[0].spanEventList[1].annotations[2].key, 46, 'HTTP.status.code') + t.equal(agent.dataSender.mockSpanChunks[0].spanEventList[1].annotations[2].value, 200, 'HTTP.status.code stringValue') agent.completeTraceObject(trace) }) }) -const express = require('express') const TEST_ENV = { host: 'localhost', port: 5006, } const getServerUrl = (path) => `http://${TEST_ENV.host}:${TEST_ENV.port}${path}` -test.skip(`fix express call stack depth`, async (t) => { +test(`fix express call stack depth`, async (t) => { agent.bindHttp() - t.plan(9) - const app = new express() const path = `/` @@ -53,24 +55,61 @@ test.skip(`fix express call stack depth`, async (t) => { const router1 = express.Router() router1.get(path, async (req, res) => { - const result = await axios.get(`https://naver.com`) + const result = await axios.get(`https://www.naver.com`) t.equal(result.status, 200) res.send('ok router1') }) - app.use('/router1', router1) - + const server = app.listen(TEST_ENV.port, async function () { const result1 = await axios.get(getServerUrl(`/router1${path}`)) t.ok(result1.status, 200) - t.equal(agent.dataSender.mockSpan.spanEventList.length, 4, `span has 3 spanevents`) - t.equal(agent.dataSender.mockSpan.spanEventList[2].annotations[0].value.stringValue, "express.middleware.jsonParser", "first spanevent json parser") - t.equal(agent.dataSender.mockSpan.spanEventList[2].depth, 1, "express.middleware.jsonParser depth is one") - t.equal(agent.dataSender.mockSpan.spanEventList[1].annotations[0].value.stringValue, 'express.middleware.urlencodedParser', "url encoding") - t.equal(agent.dataSender.mockSpan.spanEventList[1].depth, 2, "express.middleware.urlencodedParser depth is one") - t.equal(agent.dataSender.mockSpan.spanEventList[0].sequence, 2, "express get") - t.equal(agent.dataSender.mockSpan.spanEventList[0].depth, 3, "express get depth is one") + t.ok(result1.data, 'ok router1') + + t.equal(agent.dataSender.mockSpan.spanEventList.length, 4, `span has 6 span events`) + t.equal(agent.dataSender.mockSpan.apiId, defaultPredefinedMethodDescriptorRegistry.nodeServerMethodDescriptor.getApiId(), 'nodeServerMethodDescriptor apiId') + + let actualBuilder = new MethodDescriptorBuilder('express', 'use') + .setParameterDescriptor('(jsonParser)') + .setLineNumber(51) + .setFileName('callstack.test.js') + let actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + let actualSpanEvent = agent.dataSender.mockSpan.spanEventList[0] + t.equal(actualSpanEvent.apiId, actualMethodDescriptor.apiId, 'use(jsonParser) apiId') + t.equal(actualMethodDescriptor.fullName, 'express.use(jsonParser)', 'use(jsonParser) fullName') + t.equal(actualSpanEvent.sequence, 0, 'use(jsonParser) sequence') + t.equal(actualSpanEvent.depth, 1, 'use(jsonParser) depth') + t.equal(actualSpanEvent.serviceType, ServiceTypeCode.express, 'use(jsonParser) serviceType') + + actualBuilder = new MethodDescriptorBuilder('express', 'use') + .setParameterDescriptor('(urlencodedParser)') + .setLineNumber(52) + .setFileName('callstack.test.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + actualSpanEvent = agent.dataSender.mockSpan.spanEventList[1] + t.equal(actualSpanEvent.apiId, actualMethodDescriptor.apiId, 'use(urlencodedParser) apiId') + t.equal(actualMethodDescriptor.fullName, 'express.use(urlencodedParser)', 'use(urlencodedParser) fullName') + t.equal(actualSpanEvent.sequence, 1, 'use(urlencodedParser) sequence') + t.equal(actualSpanEvent.depth, 1, 'use(urlencodedParser) depth') + t.equal(actualSpanEvent.serviceType, ServiceTypeCode.express, 'use(urlencodedParser) serviceType') + + actualSpanEvent = agent.dataSender.mockSpan.spanEventList[2] + t.equal(actualSpanEvent.apiId, 0, 'await axios.get(`https://naver.com`) apiId') + t.equal(actualSpanEvent.sequence, 3, 'await axios.get(`https://naver.com`) sequence') + t.equal(actualSpanEvent.depth, 2, 'await axios.get(`https://naver.com`) depth') + t.equal(actualSpanEvent.serviceType, ServiceTypeCode.ASYNC_HTTP_CLIENT_INTERNAL, 'await axios.get(`https://naver.com`) serviceType') + t.equal(actualSpanEvent.nextAsyncId, 1, 'await axios.get(`https://naver.com`) nextAsyncId') + let actualAnnotation = actualSpanEvent.annotations[0] + t.equal(actualAnnotation.key, 12, 'await axios.get(`https://naver.com`) spanevent annotation key') + t.equal(actualAnnotation.value, 'http.request', 'await axios.get(`https://naver.com`) spanevent annotation value') + + t.equal(agent.dataSender.mockSpanChunks.length, 1, 'await axios.get(`https://naver.com`) spanchunk is 1') + let actualSpanChunk = agent.dataSender.mockSpanChunks[0] + t.equal(actualSpanChunk.agentId, agent.dataSender.mockSpan.agentId, 'await axios.get(`https://naver.com`) spanchunk agentId') + t.equal(actualSpanChunk.localAsyncId.asyncId, 1, 'await axios.get(`https://naver.com`) spanchunk localAsyncId.asyncId') + t.equal(actualSpanChunk.localAsyncId.sequence, 0, 'await axios.get(`https://naver.com`) spanchunk localAsyncId.sequence') + t.end() server.close() }) }) \ No newline at end of file diff --git a/test/context/make-method-descriptor-builder.test.js b/test/context/make-method-descriptor-builder.test.js new file mode 100644 index 00000000..5b1aa2e0 --- /dev/null +++ b/test/context/make-method-descriptor-builder.test.js @@ -0,0 +1,126 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2020-present NAVER Corp. + * Apache License v2.0 + */ + +const test = require('tape') +const { captureNamedGroup } = require('../../lib/context/make-method-descriptor-builder') +const MethodDescriptorBuilder = require('../../lib/context/method-descriptor-builder') +const KoaMethodDescriptorBuilder = require('../../lib/context/koa-method-descriptor-builder') +const ExpressMethodDescriptorBuilder = require('../../lib/context/express-method-descriptor-builder') + +const actualCallStack = `Error +at patchLayer (/Users/test/workspace/pinpoint/pinpoint-node-agent/lib/instrumentation/module/express.js:83:65) +at Function.route (/Users/test/workspace/pinpoint/pinpoint-node-agent/lib/instrumentation/module/express.js:73:9) +at Function.app. [as get] (/Users/test/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/application.js:481:30) +at /Users/test/workspace/pinpoint/pinpoint-node-agent/test/utils/ant-path-matcher.test.js:206:13 +at new Promise () +at outgoingRequest (/Users/test/workspace/pinpoint/pinpoint-node-agent/test/utils/ant-path-matcher.test.js:194:12) +at Test. (/Users/test/workspace/pinpoint/pinpoint-node-agent/test/utils/ant-path-matcher.test.js:181:11) +at Test.bound [as _cb] (/Users/test/workspace/pinpoint/pinpoint-node-agent/node_modules/tape/lib/test.js:80:32) +at Test.run (/Users/test/workspace/pinpoint/pinpoint-node-agent/node_modules/tape/lib/test.js:96:10) +at Test.bound [as run] (/Users/test/workspace/pinpoint/pinpoint-node-agent/node_modules/tape/lib/test.js:80:32) +at Immediate.next [as _onImmediate] (/Users/test/workspace/pinpoint/pinpoint-node-agent/node_modules/tape/lib/results.js:83:19) +at processImmediate (internal/timers.js:456:21)` + +test('express makeMethodDescriptorBuilder', (t) => { + let actual = captureNamedGroup('at new functionName (internal/modules/cjs/loader.js:699:10)') + t.equal(actual.type, undefined, 'className') + t.equal(actual.fileName, 'loader.js', 'fileName') + t.equal(actual.functionName, 'FunctionName') + t.equal(actual.lineNumber, '699', 'lineNumber') + t.equal(actual.location, 'internal/modules/cjs/') + + let actualMethodDescriptor = MethodDescriptorBuilder.make(undefined, actual).build() + t.equal(actualMethodDescriptor.getApiDescriptor(), 'FunctionName()') + + actual = captureNamedGroup('at Object.Module._extensions..js (internal/modules/cjs/loader.js:699:10)') + t.equal(actual.type, 'Object', 'className') + t.equal(actual.fileName, 'loader.js', 'fileName') + t.equal(actual.functionName, 'Module._extensions..js') + t.equal(actual.lineNumber, '699', 'lineNumber') + t.equal(actual.location, 'internal/modules/cjs/') + + actualMethodDescriptor = MethodDescriptorBuilder.make(undefined, actual).build() + t.equal(actualMethodDescriptor.getApiDescriptor(), 'Object.Module._extensions..js()') + + actual = captureNamedGroup('at async functionName (internal/modules/cjs/loader.js:699:10)') + t.equal(actual.type, undefined, 'className') + t.equal(actual.fileName, 'loader.js', 'fileName') + t.equal(actual.functionName, 'FunctionName') + t.equal(actual.lineNumber, '699', 'lineNumber') + t.equal(actual.location, 'internal/modules/cjs/') + + actualMethodDescriptor = MethodDescriptorBuilder.make(undefined, actual).build() + t.equal(actualMethodDescriptor.getApiDescriptor(), 'FunctionName()') + + const stacks = actualCallStack.split(/\r?\n/) + actual = captureNamedGroup(stacks[3]) //at Function.app. [as get] (/Users/test/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/application.js:481:30) + t.equal(actual.type, 'Function', 'className') + t.equal(actual.fileName, 'application.js', 'fileName') + t.equal(actual.functionName, 'app.', 'functionName') + t.equal(actual.lineNumber, '481', 'lineNumber') + t.true(actual.location.endsWith('express/lib/'), 'location') + t.equal(actual.methodName, 'get', 'methodName') + + const methodDescriptor = ExpressMethodDescriptorBuilder.make(MethodDescriptorBuilder.make('express', actual)).build() + t.equal(methodDescriptor.apiDescriptor, 'express.Function.app.get(path, callback)', 'apiDescriptor') + t.equal(methodDescriptor.className, 'Function', 'className') + t.equal(methodDescriptor.fullName, 'express.app.get(path, callback)', 'fileName') + t.equal(methodDescriptor.lineNumber, 481, 'lineNumber') + t.true(methodDescriptor.location.endsWith('express/lib/application.js'), 'location') + t.equal(methodDescriptor.methodName, 'get', 'methodName') + t.equal(methodDescriptor.objectPath, 'app.get', 'objectPath') + + t.end() +}) + +test('express makeMethodDescriptorBuilder exception case', (t) => { + const stacks = actualCallStack.split(/\r?\n/) + let actual = captureNamedGroup(stacks[5]) //at new Promise () + t.equal(actual.type, undefined, 'className') + t.equal(actual.fileName, '', 'fileName') + t.equal(actual.functionName, 'Promise') + t.equal(actual.lineNumber, undefined, 'lineNumber') + t.equal(actual.location, undefined, 'location') + t.equal(actual.functionName, 'Promise', 'fullname') + + let actualMethodDescriptor = MethodDescriptorBuilder.make(undefined, actual).build() + t.equal(actualMethodDescriptor.getLineNumber(), undefined, 'lineNumber actualMethodDescriptor') + t.equal(actualMethodDescriptor.getLocation(), '', 'location actualMethodDescriptor') + t.end() +}) + +const actualKoaCallStack = `Error +at Router.register (/Users/test/workspace/pinpoint/pinpoint-node-agent/lib/instrumentation/module/koa-router.js:44:55) +at Router. [as get] (/Users/test/workspace/pinpoint/pinpoint-node-agent/node_modules/koa-router/lib/router.js:202:10) +at Test. (/Users/test/workspace/pinpoint/pinpoint-node-agent/test/instrumentation/module/koa.test.js:31:10) +at Test.bound [as _cb] (/Users/test/workspace/pinpoint/pinpoint-node-agent/node_modules/tape/lib/test.js:80:32) +at Test.run (/Users/test/workspace/pinpoint/pinpoint-node-agent/node_modules/tape/lib/test.js:96:10) +at Test.bound [as run] (/Users/test/workspace/pinpoint/pinpoint-node-agent/node_modules/tape/lib/test.js:80:32) +at Immediate.next [as _onImmediate] (/Users/test/workspace/pinpoint/pinpoint-node-agent/node_modules/tape/lib/results.js:83:19) +at processImmediate (internal/timers.js:464:21) +at process.callbackTrampoline (internal/async_hooks.js:130:17)` + +test('koa makeMethodDescriptorBuilder', (t) => { + const stacks = actualKoaCallStack.split(/\r?\n/) + let actual = captureNamedGroup(stacks[2]) //at Router. [as get] (/Users/test/workspace/pinpoint/pinpoint-node-agent/node_modules/koa-router/lib/router.js:202:10) + t.equal(actual.type, 'Router', 'className') + t.equal(actual.fileName, 'router.js', 'fileName') + t.equal(actual.functionName, '', 'functionName') + t.equal(actual.lineNumber, '202', 'lineNumber') + t.true(actual.location.endsWith('koa-router/lib/'), 'location') + t.equal(actual.methodName, 'get', 'methodName') + + const methodDescriptor = KoaMethodDescriptorBuilder.make(MethodDescriptorBuilder.make('koa', actual)).build() + t.equal(methodDescriptor.apiDescriptor, 'koa.Router.get(ctx, next)', 'apiDescriptor') + t.equal(methodDescriptor.className, 'Router', 'className') + t.equal(methodDescriptor.fullName, 'koa.get(ctx, next)', 'fullName') + t.equal(methodDescriptor.lineNumber, 202, 'lineNumber') + t.true(methodDescriptor.location.endsWith('koa-router/lib/router.js'), 'location') + t.equal(methodDescriptor.methodName, 'get', 'methodName') + t.equal(methodDescriptor.objectPath, 'get', 'objectPath') + + t.end() +}) \ No newline at end of file diff --git a/test/context/method-descriptor-builder.test.js b/test/context/method-descriptor-builder.test.js new file mode 100644 index 00000000..32321435 --- /dev/null +++ b/test/context/method-descriptor-builder.test.js @@ -0,0 +1,51 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2020-present NAVER Corp. + * Apache License v2.0 + */ + +const test = require('tape') + +const MethodDescriptorBuilder = require('../../lib/context/method-descriptor-builder') +test('express callstack', (t) => { + const regex = /at (?\w+(?=\.))?\.?(?[^\s]+)(?: \[as (?\w+)\])? \(.+\/(?[^:/]+):(?[0-9]+):(?[0-9]+)\)$/ + + let stack = 'at Function.app. [as get] (/Users/feelform/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/application.js:481:30)' + let captureGroups = stack.match(regex) + if (!captureGroups || !captureGroups.groups) { + return + } + let actual = MethodDescriptorBuilder.make('express', captureGroups.groups) + t.equal(actual.methodName, 'get', 'methodName') + t.equal(actual.functionName, 'app.get', 'functionName') + t.equal(actual.className, 'Function', 'className') + t.equal(actual.lineNumber, 481, 'lineNumber') + t.equal(actual.getCacheId(), 'express.app.get():481:application.js', `cache ID check`) + + let actualMethodDescriptor = actual.build() + t.equal(actualMethodDescriptor.getModuleName(), 'express', 'MethodDescriptor moduleName') + t.equal(actualMethodDescriptor.getFunctionName(), 'app.get', 'MethodDescriptor functionName') + t.equal(actualMethodDescriptor.getMethodName(), 'get', 'MethodDescriptor methodName') + t.equal(actualMethodDescriptor.getClassName(), 'Function', 'MethodDescriptor methodName') + t.equal(actualMethodDescriptor.getLineNumber(), 481, 'MethodDescriptor lineNumber') + + stack = 'at Test. (/Users/feelform/workspace/pinpoint/pinpoint-node-agent/test/instrumentation/module/express.test.js:42:7)' + captureGroups = stack.match(regex) + actual = MethodDescriptorBuilder.make('express', captureGroups.groups) + t.equal(actual.methodName, '', 'methodName') + t.equal(actual.functionName, '', 'functionName') + t.equal(actual.getFunctionName(), '', 'functionName') + t.equal(actual.className, 'Test', 'className') + t.equal(actual.getClassName(), 'Test', 'className') + t.equal(actual.lineNumber, 42, 'lineNumber') + + stack = 'at Test.bound [as _cb] (/Users/feelform/workspace/pinpoint/pinpoint-node-agent/node_modules/tape/lib/test.js:80:32)' + captureGroups = stack.match(regex) + actual = MethodDescriptorBuilder.make('express', captureGroups.groups) + t.equal(actual.methodName, '_cb', 'methodName') + t.equal(actual.functionName, 'bound', 'functionName') + t.equal(actual.className, 'Test', 'className') + t.equal(actual.lineNumber, 80, 'lineNumber') + + t.end() +}) \ No newline at end of file diff --git a/test/context/service-type.test.js b/test/context/service-type.test.js index dc182693..be3b8812 100644 --- a/test/context/service-type.test.js +++ b/test/context/service-type.test.js @@ -5,17 +5,15 @@ */ const test = require('tape') -const { log, fixture, util } = require('../test-helper') const serviceTypeConstant = require('../../lib/constant/service-type') const ServiceTypeProperty = serviceTypeConstant.ServiceTypeProperty - const ServiceType = require('../../lib/context/service-type') test('Should create with properties', function (t) { t.plan(3) - const serviceType = new ServiceType(123, ServiceTypeProperty.TERMINAL, ServiceTypeProperty.RECORD_STATISTICS) + const serviceType = new ServiceType(123, test, ServiceTypeProperty.TERMINAL, ServiceTypeProperty.RECORD_STATISTICS) t.equal(serviceType.terminal, true) t.equal(serviceType.recordStatistics, true) diff --git a/test/context/span-event-recorder.test.js b/test/context/span-event-recorder.test.js index 40e69417..250dbbb7 100644 --- a/test/context/span-event-recorder.test.js +++ b/test/context/span-event-recorder.test.js @@ -14,9 +14,9 @@ const { const Span = require('../../lib/context/span') const SpanEvent = require('../../lib/context/span-event') const SpanEventRecorder = require('../../lib/context/span-event-recorder') - -const ServiceTypeCode = require('../../lib/constant/service-type').ServiceTypeCode -const GeneralMethodDescriptor = require('../../lib/constant/method-descriptor').GeneralMethodDescriptor +const ServiceType = require('../../lib/context/service-type') +const agent = require('../support/agent-singleton-mock') +const defaultPredefinedMethodDescriptorRegistry = require('../../lib/constant/default-predefined-method-descriptor-registry') test('Should create span event recorder', async function (t) { t.plan(2) @@ -24,8 +24,8 @@ test('Should create span event recorder', async function (t) { const span = new Span(fixture.getTraceId(), fixture.getAgentInfo()) const spanEvent = new SpanEvent(span.spanId, 0) const spanEventRecorder = new SpanEventRecorder(spanEvent, span) - spanEventRecorder.recordServiceType(ServiceTypeCode.express) - spanEventRecorder.recordApi(GeneralMethodDescriptor.SERVER_REQUEST) + spanEventRecorder.recordServiceType(ServiceType.express) + spanEventRecorder.recordApi(defaultPredefinedMethodDescriptorRegistry.nodeServerMethodDescriptor) t.ok(spanEventRecorder.spanEvent) spanEventRecorder.spanEvent.startTime = Date.now() @@ -34,7 +34,6 @@ test('Should create span event recorder', async function (t) { t.ok(spanEventRecorder.spanEvent.endElapsed > 0) }) -const agent = require('../support/agent-singleton-mock') test.skip(`spanevent with async_hooks`, async function (t) { agent.bindHttp() @@ -42,7 +41,7 @@ test.skip(`spanevent with async_hooks`, async function (t) { const trace = agent.createTraceObject() trace.startSpanEvent(new SpanEventRecorder.builder() - .setServiceType(ServiceTypeCode.redis) + .setServiceType(ServiceType.redis) .setApiDesc('redis.get.call') .setDestinationId('destinationId') .setEndPointIP('127.0.0.1') diff --git a/test/context/span-recorder.test.js b/test/context/span-recorder.test.js index 59537764..900532ce 100644 --- a/test/context/span-recorder.test.js +++ b/test/context/span-recorder.test.js @@ -9,16 +9,15 @@ const { log, fixture, util } = require('../test-helper') const Span = require('../../lib/context/span') const SpanRecorder = require('../../lib/context/span-recorder') - -const ServiceTypeCode = require('../../lib/constant/service-type').ServiceTypeCode +const defaultPredefinedMethodDescriptorRegistry = require('../../lib/constant/default-predefined-method-descriptor-registry') +const ServiceType = require('../../lib/context/service-type') const ServiceTypeProperty = require('../../lib/constant/service-type').ServiceTypeProperty -const GeneralMethodDescriptor = require('../../lib/constant/method-descriptor').GeneralMethodDescriptor test('Should create span recorder', async function (t) { const span = new Span(fixture.getTraceId(), fixture.getAgentInfo()) const spanRecorder = new SpanRecorder(span) - spanRecorder.recordServiceType(ServiceTypeCode.express, ServiceTypeProperty.TERMINAL, ServiceTypeProperty.RECORD_STATISTICS) - spanRecorder.recordApi(GeneralMethodDescriptor.SERVER_REQUEST) + spanRecorder.recordServiceType(ServiceType.express, ServiceTypeProperty.TERMINAL, ServiceTypeProperty.RECORD_STATISTICS) + spanRecorder.recordApi(defaultPredefinedMethodDescriptorRegistry.nodeServerMethodDescriptor) spanRecorder.recordRpc('/test/url') t.ok(spanRecorder.span) diff --git a/test/context/trace-context.test.js b/test/context/trace-context.test.js index f62e4ea8..e450fdb2 100644 --- a/test/context/trace-context.test.js +++ b/test/context/trace-context.test.js @@ -5,13 +5,13 @@ */ const test = require('tape') -const { log, fixture, util } = require('../test-helper') +const { fixture, util } = require('../test-helper') -const ServiceTypeCode = require('../../lib/constant/service-type').ServiceTypeCode +const ServiceType = require('../../lib/context/service-type') const TraceContext = require('../../lib/context/trace-context') -const GeneralMethodDescriptor = require('../../lib/constant/method-descriptor').GeneralMethodDescriptor const dataSenderMock = require('../support/data-sender-mock') const RequestHeaderUtils = require('../../lib/instrumentation/request-header-utils') +const defaultPredefinedMethodDescriptorRegistry = require('../../lib/constant/default-predefined-method-descriptor-registry') test('Should create continued trace and add span info', function (t) { t.plan(2) @@ -24,10 +24,10 @@ test('Should create continued trace and add span info', function (t) { t.equal(traceContext.currentTraceObject().traceId.transactionId.toString(), transactionId.toString()) - trace.spanRecorder.recordServiceType(ServiceTypeCode.express) - trace.spanRecorder.recordApi(GeneralMethodDescriptor.SERVER_REQUEST) + trace.spanRecorder.recordServiceType(ServiceType.express) + trace.spanRecorder.recordApi(defaultPredefinedMethodDescriptorRegistry.nodeServerMethodDescriptor) - t.equal(traceContext.currentTraceObject().span.serviceType, ServiceTypeCode.express) + t.equal(traceContext.currentTraceObject().span.serviceType, ServiceType.express) traceContext.completeTraceObject(trace) }) @@ -38,12 +38,12 @@ test('Should begin/end trace block asynchronously', async function (t) { const traceContext = TraceContext.init(fixture.getAgentInfo(), dataSenderMock()) const startedTrace = traceContext.newTraceObject(true) const spanRecorder = startedTrace.spanRecorder - spanRecorder.recordServiceType(ServiceTypeCode.express) + spanRecorder.recordServiceType(ServiceType.express) const currentTrace = traceContext.currentTraceObject() const spanEventRecorder = currentTrace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.express) - spanEventRecorder.recordApi(GeneralMethodDescriptor.SERVER_REQUEST) + spanEventRecorder.recordServiceType(ServiceType.express) + spanEventRecorder.recordApi(defaultPredefinedMethodDescriptorRegistry.nodeServerMethodDescriptor) t.equal(traceContext.currentTraceObject().callStack.length, 1) diff --git a/test/context/trace.test.js b/test/context/trace.test.js index 7431af7e..9b12d5cb 100644 --- a/test/context/trace.test.js +++ b/test/context/trace.test.js @@ -6,7 +6,7 @@ const test = require('tape') const { log, fixture, util } = require('../test-helper') -const ServiceTypeCode = require('../../lib/constant/service-type').ServiceTypeCode +const ServiceType = require('../../lib/context/service-type') const Trace = require('../../lib/context/trace') test('Should begin/end trace block', async function (t) { @@ -16,7 +16,7 @@ test('Should begin/end trace block', async function (t) { const agentInfo = fixture.getAgentInfo() const trace = new Trace(traceId, agentInfo) const spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.express) + spanEventRecorder.recordServiceType(ServiceType.express) t.equal(trace.sequence, 1) diff --git a/test/context/transaction-id.test.js b/test/context/transaction-id.test.js index 3f34bf6c..d8654ccc 100644 --- a/test/context/transaction-id.test.js +++ b/test/context/transaction-id.test.js @@ -7,7 +7,7 @@ const test = require('tape') const { log, fixture, util } = require('../test-helper') -const transactionIdGenerator = require('../../lib/context/sequence-generator').transactionIdGenerator +const transactionIdGenerator = require('../../lib/context/sequence-generators').transactionIdGenerator const TransactionId = require('../../lib/context/transaction-id') test('Should create with sequence number', function (t) { diff --git a/test/fixtures/db/innodb-cluster/docker-compose.yml b/test/fixtures/db/innodb-cluster/docker-compose.yml new file mode 100644 index 00000000..31e498fb --- /dev/null +++ b/test/fixtures/db/innodb-cluster/docker-compose.yml @@ -0,0 +1,23 @@ +version: '3' +services: + mysql-server-1: + env_file: + - mysql-server.env + image: mysql:8.0.34 + ports: + - "3301:3306" + command: ["mysqld","--server_id=1","--binlog_checksum=NONE","--gtid_mode=ON","--enforce_gtid_consistency=ON","--log_bin","--log_slave_updates=ON","--master_info_repository=TABLE","--relay_log_info_repository=TABLE","--transaction_write_set_extraction=XXHASH64","--user=mysql","--skip-host-cache","--skip-name-resolve", "--default_authentication_plugin=mysql_native_password"] + mysql-server-2: + env_file: + - mysql-server.env + image: mysql:8.0.34 + command: ["mysqld","--server_id=2","--binlog_checksum=NONE","--gtid_mode=ON","--enforce_gtid_consistency=ON","--log_bin","--log_slave_updates=ON","--master_info_repository=TABLE","--relay_log_info_repository=TABLE","--transaction_write_set_extraction=XXHASH64","--user=mysql","--skip-host-cache","--skip-name-resolve", "--default_authentication_plugin=mysql_native_password"] + ports: + - "3302:3306" + mysql-server-3: + env_file: + - mysql-server.env + image: mysql:8.0.34 + command: ["mysqld","--server_id=3","--binlog_checksum=NONE","--gtid_mode=ON","--enforce_gtid_consistency=ON","--log_bin","--log_slave_updates=ON","--master_info_repository=TABLE","--relay_log_info_repository=TABLE","--transaction_write_set_extraction=XXHASH64","--user=mysql","--skip-host-cache","--skip-name-resolve", "--default_authentication_plugin=mysql_native_password"] + ports: + - "3303:3306" \ No newline at end of file diff --git a/test/fixtures/db/innodb-cluster/mysql-router.env b/test/fixtures/db/innodb-cluster/mysql-router.env new file mode 100644 index 00000000..5dbffb4c --- /dev/null +++ b/test/fixtures/db/innodb-cluster/mysql-router.env @@ -0,0 +1,5 @@ +MYSQL_USER=root +MYSQL_HOST=mysql-server-1 +MYSQL_PORT=3306 +MYSQL_PASSWORD=mysql +MYSQL_INNODB_NUM_MEMBERS=3 \ No newline at end of file diff --git a/test/fixtures/db/innodb-cluster/mysql-server.env b/test/fixtures/db/innodb-cluster/mysql-server.env new file mode 100644 index 00000000..a3691cd4 --- /dev/null +++ b/test/fixtures/db/innodb-cluster/mysql-server.env @@ -0,0 +1,2 @@ +MYSQL_ROOT_PASSWORD=mysql +MYSQL_ROOT_HOST=% \ No newline at end of file diff --git a/test/fixtures/db/mysql.sql b/test/fixtures/db/mysql.sql new file mode 100755 index 00000000..c8600789 --- /dev/null +++ b/test/fixtures/db/mysql.sql @@ -0,0 +1,10 @@ +CREATE TABLE member +( + id varchar(11) not null primary key, + name varchar(20) not null, + joined date null +); + +INSERT INTO member(id, name, joined) +VALUES ('a', 'name1', '2023-01-18'), + ('b', 'name2', '2022-07-27'); \ No newline at end of file diff --git a/test/instrumentation/fix-async-call-stack.test.js b/test/instrumentation/fix-async-call-stack.test.js index 3d2eaeea..f226b6e1 100644 --- a/test/instrumentation/fix-async-call-stack.test.js +++ b/test/instrumentation/fix-async-call-stack.test.js @@ -6,10 +6,10 @@ const test = require('tape') const agent = require('../support/agent-singleton-mock') -const { GenericContainer } = require("testcontainers") +const { GenericContainer } = require('testcontainers') test(`fix redis call stack depth`, async (t) => { - const container = await new GenericContainer("redis") + const container = await new GenericContainer('redis') .withExposedPorts(6379) .start() @@ -17,18 +17,18 @@ test(`fix redis call stack depth`, async (t) => { t.plan(2) - const trace = agent.createTraceObject() + agent.createTraceObject() const redis = require('redis') const client = redis.createClient( container.getMappedPort(6379), - container.getContainerIpAddress(), + container.getHost(), ) - client.set("key", "value", async function (error) { - t.true(error == null, "error is null") + client.set('key', 'value', async function (error) { + t.true(error == null, 'error is null') const trace = agent.traceContext.currentTraceObject() - t.equal(trace.callStack.length, 0, "callStack is 0") + t.equal(trace.callStack.length, 0, 'callStack is 0') client.quit() agent.completeTraceObject(trace) diff --git a/test/instrumentation/module/express.test.js b/test/instrumentation/module/express.test.js index f1e21f50..65584ce5 100644 --- a/test/instrumentation/module/express.test.js +++ b/test/instrumentation/module/express.test.js @@ -7,11 +7,13 @@ const test = require('tape') const axios = require('axios') -const { log, fixture, util, enableDataSending } = require('../../test-helper') - +const { log, util } = require('../../test-helper') const agent = require('../../support/agent-singleton-mock') - const express = require('express') +const annotationKey = require('../../../lib/constant/annotation-key') +const apiMetaService = require('../../../lib/context/api-meta-service') +const MethodDescriptorBuilder = require('../../../lib/context/method-descriptor-builder') +const semver = require('semver') const TEST_ENV = { host: 'localhost', @@ -25,35 +27,230 @@ test(`${testName1} Should record request in basic route`, function (t) { const testName = testName1 - t.plan(3) - - const PATH = '/'+testName + const PATH = '/' + testName const app = new express() app.get(PATH, async (req, res) => { - Math.random() - await util.sleep(3000) res.send('ok get') + + agent.callbackTraceClose((trace) => { + t.equal(trace.span.annotations[0].key, annotationKey.HTTP_PARAM.code, 'HTTP param key match') + t.equal(trace.span.annotations[0].value, 'api=test&test1=test', 'HTTP param value match') + t.equal(trace.span.annotations[1].key, annotationKey.HTTP_STATUS_CODE.code, 'HTTP status code') + t.equal(trace.span.annotations[1].value, 200, 'response status is 200') + + let actualBuilder = new MethodDescriptorBuilder('express', 'get') + .setParameterDescriptor('(path, callback)') + .setLineNumber(33) + .setFileName('express.test.js') + const actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + let spanEvent = trace.span.spanEventList[0] + t.equal(actualMethodDescriptor.apiId, spanEvent.apiId, 'apiId') + t.true(actualMethodDescriptor.apiDescriptor.startsWith('express.app.get(path, callback)'), 'apiDescriptor') + t.equal(actualMethodDescriptor.className, 'app', 'className') + t.equal(actualMethodDescriptor.fullName, 'express.get(path, callback)', 'fullName') + t.equal(actualMethodDescriptor.lineNumber, 33, 'lineNumber') + t.equal(actualMethodDescriptor.methodName, 'get', 'methodName') + t.equal(actualMethodDescriptor.moduleName, 'express', 'moduleName') + t.equal(actualMethodDescriptor.objectPath, 'get', 'objectPath') + t.true(actualMethodDescriptor.location.length > 0, 'location') + }) }) + + app.post(PATH, (req, res) => { res.send('ok post') + + agent.callbackTraceClose((trace) => { + t.equal(trace.span.annotations[0].key, annotationKey.HTTP_STATUS_CODE.code, '/express1 HTTP STATUS CODE in annotation zero') + t.equal(trace.span.annotations[0].value, 200, '/express1 HTTP STATUS CODE value in annotation zero') + + let actualBuilder = new MethodDescriptorBuilder('express', 'post') + .setParameterDescriptor('(path, callback)') + .setLineNumber(61) + .setFileName('express.test.js') + const actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + let spanEvent = trace.span.spanEventList[0] + t.equal(actualMethodDescriptor.apiId, spanEvent.apiId, 'apiId') + t.true(actualMethodDescriptor.apiDescriptor.startsWith('express.app.post(path, callback)'), 'apiDescriptor') + t.equal(actualMethodDescriptor.className, 'app', 'className') + t.equal(actualMethodDescriptor.fullName, 'express.post(path, callback)', 'fullName') + t.equal(actualMethodDescriptor.lineNumber, 61, 'lineNumber') + t.equal(actualMethodDescriptor.methodName, 'post', 'methodName') + t.equal(actualMethodDescriptor.moduleName, 'express', 'moduleName') + t.equal(actualMethodDescriptor.objectPath, 'post', 'objectPath') + t.true(actualMethodDescriptor.location.endsWith('express.test.js'), 'location') + }) + }) + + app.get('/express2', async (req, res) => { + res.send('ok get') + + agent.callbackTraceClose((trace) => { + let actualBuilder = new MethodDescriptorBuilder('express', 'get') + .setParameterDescriptor('(path, callback)') + .setLineNumber(86) + .setFileName('express.test.js') + const actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + let spanEvent = trace.span.spanEventList[0] + t.equal(actualMethodDescriptor.apiId, spanEvent.apiId, 'apiId') + t.true(actualMethodDescriptor.apiDescriptor.startsWith('express.app.get(path, callback)'), 'apiDescriptor') + t.equal(actualMethodDescriptor.className, 'app', 'className') + t.equal(actualMethodDescriptor.fullName, 'express.get(path, callback)', 'fullName') + t.equal(actualMethodDescriptor.lineNumber, 86, 'lineNumber') + t.equal(actualMethodDescriptor.methodName, 'get', 'methodName') + t.equal(actualMethodDescriptor.moduleName, 'express', 'moduleName') + t.equal(actualMethodDescriptor.objectPath, 'get', 'objectPath') + t.true(actualMethodDescriptor.location.endsWith('express.test.js'), 'location') + }) + }) + + let errorOrder = 0 + let pathSymbol + + const express3Symbol = Symbol('express3') + app.get('/express3', (req, res, next) => { + errorOrder++ + pathSymbol = express3Symbol + throw new Error('error case') + }) + + const express4Symbol = Symbol('express4') + app.get('/express4', (req, res, next) => { + errorOrder++ + pathSymbol = express4Symbol + next(new Error('error case')) + }) + + app.use(function (err, req, res, next) { + if (pathSymbol == express3Symbol) { + t.equal(errorOrder, 1, 'express3 error order') + } + if (pathSymbol === express4Symbol) { + t.equal(errorOrder, 2, 'express4 error order') + } + + agent.callbackTraceClose((trace) => { + if (errorOrder == 1) { + throwHandleTest(trace, t) + } else if (errorOrder == 2) { + nextErrorHandleTest(trace, t) + } + }) + + res.status(500).send('Something broke!') }) const server = app.listen(TEST_ENV.port, async function () { - const result1 = await axios.get(getServerUrl(PATH)) - t.ok(result1.status, 200) + const result1 = await axios.get(getServerUrl(PATH) + '?api=test&test1=test') + t.equal(result1.status, 200) const result2 = await axios.post(getServerUrl(PATH)) - t.ok(result2.status, 200) + t.equal(result2.status, 200) - const traceMap = agent.traceContext.getAllTraceObject() - log.info(traceMap.size) - t.ok(traceMap.size > 0) + const result3 = await axios.get(getServerUrl('/express2')) + t.equal(result3.status, 200) + try { + await axios.get(getServerUrl('/express3')) + } catch (error) { + t.equal(error.response.status, 500) + } + + try { + await axios.get(getServerUrl('/express4')) + } catch (error) { + t.equal(error.response.status, 500, 'axios.get(getServerUrl(/express4))') + } + + t.end() server.close() }) }) +function throwHandleTest(trace, t) { + t.equal(trace.span.annotations[0].key, annotationKey.HTTP_STATUS_CODE.getCode(), '/express3 HTTP_STATUS_CODE annotationKey matching') + t.equal(trace.span.annotations[0].value, 500, '/express3 HTTP_STATUS_CODE value matching') + + let actualBuilder = new MethodDescriptorBuilder('express', 'get') + .setParameterDescriptor('(path, callback)') + .setLineNumber(112) + .setFileName('express.test.js') + const actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + let spanEvent = trace.span.spanEventList[1] + t.equal(actualMethodDescriptor.apiId, spanEvent.apiId, 'apiId') + t.true(actualMethodDescriptor.apiDescriptor.startsWith('express.app.get(path, callback)'), 'apiDescriptor') + t.equal(actualMethodDescriptor.className, 'app', 'className') + t.equal(actualMethodDescriptor.fullName, 'express.get(path, callback)', 'fullName') + t.equal(actualMethodDescriptor.lineNumber, 112, 'lineNumber') + t.equal(actualMethodDescriptor.methodName, 'get', 'methodName') + t.equal(actualMethodDescriptor.moduleName, 'express', 'moduleName') + t.equal(actualMethodDescriptor.objectPath, 'get', 'objectPath') + t.true(actualMethodDescriptor.location.endsWith('express.test.js'), 'location') + t.equal(spanEvent.sequence, 0, 'sequence') + t.equal(spanEvent.depth, 1, 'spanEvent.depth') + + actualBuilder = new MethodDescriptorBuilder('express', 'use') + .setParameterDescriptor('(err, req, res, next)') + .setLineNumber(125) + .setFileName('express.test.js') + const actualErrorMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + spanEvent = trace.span.spanEventList[0] + t.equal(actualErrorMethodDescriptor.apiId, spanEvent.apiId, 'apiId') + t.true(actualErrorMethodDescriptor.apiDescriptor.startsWith('express.Function.use(err, req, res, next)'), 'apiDescriptor') + t.equal(actualErrorMethodDescriptor.className, 'Function', 'className') + t.equal(actualErrorMethodDescriptor.fullName, 'express.use(err, req, res, next)', 'fullName') + t.equal(actualErrorMethodDescriptor.lineNumber, 125, 'lineNumber') + t.equal(actualErrorMethodDescriptor.methodName, 'use', 'methodName') + t.equal(actualErrorMethodDescriptor.moduleName, 'express', 'moduleName') + t.equal(actualErrorMethodDescriptor.objectPath, 'use', 'objectPath') + t.true(actualErrorMethodDescriptor.location.endsWith('express.test.js'), 'location') + t.equal(spanEvent.sequence, 1, 'sequence') + t.equal(spanEvent.depth, 2, 'spanEvent.depth') + t.equal(spanEvent.exceptionInfo.intValue, 1, 'error value') + t.true(spanEvent.exceptionInfo.stringValue.endsWith('express.test.js:115:11'), 'error case') +} + +function nextErrorHandleTest(trace, t) { + let actualBuilder = new MethodDescriptorBuilder('express', 'get') + .setParameterDescriptor('(path, callback)') + .setLineNumber(119) + .setFileName('express.test.js') + const actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + let spanEvent = trace.span.spanEventList[1] + t.equal(actualMethodDescriptor.apiId, spanEvent.apiId, 'apiId') + t.true(actualMethodDescriptor.apiDescriptor.startsWith('express.app.get(path, callback)'), 'apiDescriptor') + t.equal(actualMethodDescriptor.className, 'app', 'className') + t.equal(actualMethodDescriptor.fullName, 'express.get(path, callback)', 'fullName') + t.equal(actualMethodDescriptor.lineNumber, 119, 'lineNumber') + t.equal(actualMethodDescriptor.methodName, 'get', 'methodName') + t.equal(actualMethodDescriptor.moduleName, 'express', 'moduleName') + t.equal(actualMethodDescriptor.objectPath, 'get', 'objectPath') + t.true(actualMethodDescriptor.location.endsWith('express.test.js'), 'location') + t.equal(spanEvent.sequence, 0, 'sequence') + t.equal(spanEvent.depth, 1, 'spanEvent.depth') + + actualBuilder = new MethodDescriptorBuilder('express', 'use') + .setParameterDescriptor('(err, req, res, next)') + .setLineNumber(125) + .setFileName('express.test.js') + const actualErrorMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + spanEvent = trace.span.spanEventList[0] + t.equal(actualErrorMethodDescriptor.apiId, spanEvent.apiId, 'apiId') + t.true(actualErrorMethodDescriptor.apiDescriptor.startsWith('express.Function.use(err, req, res, next)'), 'apiDescriptor') + t.equal(actualErrorMethodDescriptor.className, 'Function', 'className') + t.equal(actualErrorMethodDescriptor.fullName, 'express.use(err, req, res, next)', 'fullName') + t.equal(actualErrorMethodDescriptor.lineNumber, 125, 'lineNumber') + t.equal(actualErrorMethodDescriptor.methodName, 'use', 'methodName') + t.equal(actualErrorMethodDescriptor.moduleName, 'express', 'moduleName') + t.equal(actualErrorMethodDescriptor.objectPath, 'use', 'objectPath') + t.true(actualErrorMethodDescriptor.location.endsWith('express.test.js'), 'location') + t.equal(spanEvent.sequence, 1, 'sequence') + t.equal(spanEvent.depth, 2, 'spanEvent.depth') + t.equal(spanEvent.exceptionInfo.intValue, 1, 'error value') + t.true(spanEvent.exceptionInfo.stringValue.endsWith('express.test.js:122:10'), 'error case') +} + const testName2 = 'express2' test(`[${testName2}] Should record request in express.Router`, function (t) { agent.bindHttp() @@ -62,7 +259,7 @@ test(`[${testName2}] Should record request in express.Router`, function (t) { t.plan(3) - const PATH = '/'+testName + const PATH = '/' + testName const app = new express() const router1 = express.Router() @@ -94,7 +291,6 @@ test(`[${testName2}] Should record request in express.Router`, function (t) { }) }) - const testName3 = 'express3' test(`${testName3} Should record request taking more than 2 sec`, function (t) { agent.bindHttp() @@ -103,13 +299,13 @@ test(`${testName3} Should record request taking more than 2 sec`, function (t) { t.plan(2) - const PATH = '/'+testName + const PATH = '/' + testName const app = new express() app.get(PATH, async (req, res) => { // slow outgoing call try { - await axios.get('http://dummy.restapiexample.com/api/v1/employees') + await axios.get('https://www.naver.com') } catch (error) { log.error(error) } @@ -128,12 +324,6 @@ test(`${testName3} Should record request taking more than 2 sec`, function (t) { }) }) -class MyError extends Error { - constructor(message) { - super(message) - this.name = 'MyError' - } -} const testName4 = 'express4' test.skip(`${testName4} Should record internal error in express.test.js`, function (t) { agent.bindHttp() @@ -153,13 +343,12 @@ test.skip(`${testName4} Should record internal error in express.test.js`, functi } catch (e) { next(e) } - res.send('hello') }) app.use((error, req, res, next) => { console.log('[app] error handler') res.json({ message: error.message }) res.status = 500 - }); + }) const server = app.listen(TEST_ENV.port, async function () { const result = await axios.get(getServerUrl(PATH)) @@ -178,8 +367,6 @@ test(`${testName5} Should record middleware`, function (t) { const testName = testName5 - t.plan(2) - const PATH = '/' + testName const app = new express() @@ -199,16 +386,70 @@ test(`${testName5} Should record middleware`, function (t) { }) app.get(PATH, (req, res) => { + agent.callbackTraceClose((trace) =>{ + let actualBuilder = new MethodDescriptorBuilder('express', 'get') + .setParameterDescriptor('(path, callback)') + .setLineNumber(388) + .setFileName('express.test.js') + const actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + let spanEvent = trace.span.spanEventList[2] + t.equal(actualMethodDescriptor.apiId, spanEvent.apiId, 'apiId') + t.true(actualMethodDescriptor.apiDescriptor.startsWith('express.app.get(path, callback)'), 'apiDescriptor') + t.equal(actualMethodDescriptor.className, 'app', 'className') + t.equal(actualMethodDescriptor.fullName, 'express.get(path, callback)', 'fullName') + t.equal(actualMethodDescriptor.lineNumber, 388, 'lineNumber') + t.equal(actualMethodDescriptor.methodName, 'get', 'methodName') + t.equal(actualMethodDescriptor.moduleName, 'express', 'moduleName') + t.equal(actualMethodDescriptor.objectPath, 'get', 'objectPath') + t.true(actualMethodDescriptor.location.endsWith('express.test.js'), 'location') + t.equal(spanEvent.sequence, 2, 'sequence') + t.equal(spanEvent.depth, 1, 'spanEvent.depth') + + actualBuilder = new MethodDescriptorBuilder('express', 'use') + .setParameterDescriptor('(req, res, next)') + .setLineNumber(378) + .setFileName('express.test.js') + const actualMiddleware1MethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + spanEvent = trace.span.spanEventList[1] + t.equal(actualMiddleware1MethodDescriptor.apiId, spanEvent.apiId, 'apiId') + t.true(actualMiddleware1MethodDescriptor.apiDescriptor.startsWith('express.Function.use(req, res, next)'), 'apiDescriptor') + t.equal(actualMiddleware1MethodDescriptor.className, 'Function', 'className') + t.equal(actualMiddleware1MethodDescriptor.fullName, 'express.use(req, res, next)', 'fullName') + t.equal(actualMiddleware1MethodDescriptor.lineNumber, 378, 'lineNumber') + t.equal(actualMiddleware1MethodDescriptor.methodName, 'use', 'methodName') + t.equal(actualMiddleware1MethodDescriptor.moduleName, 'express', 'moduleName') + t.equal(actualMiddleware1MethodDescriptor.objectPath, 'use', 'objectPath') + t.true(actualMiddleware1MethodDescriptor.location.endsWith('express.test.js'), 'location') + t.equal(spanEvent.sequence, 1, 'sequence') + t.equal(spanEvent.depth, 1, 'spanEvent.depth') + + actualBuilder = new MethodDescriptorBuilder('express', 'use') + .setParameterDescriptor('(req, res, next)') + .setLineNumber(373) + .setFileName('express.test.js') + const actualMiddleware2MethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + spanEvent = trace.span.spanEventList[0] + t.equal(actualMiddleware2MethodDescriptor.apiId, spanEvent.apiId, 'apiId') + t.true(actualMiddleware2MethodDescriptor.apiDescriptor.startsWith('express.Function.use(req, res, next)'), 'apiDescriptor') + t.equal(actualMiddleware2MethodDescriptor.className, 'Function', 'className') + t.equal(actualMiddleware2MethodDescriptor.fullName, 'express.use(req, res, next)', 'fullName') + t.equal(actualMiddleware2MethodDescriptor.lineNumber, 373, 'lineNumber') + t.equal(actualMiddleware2MethodDescriptor.methodName, 'use', 'methodName') + t.equal(actualMiddleware2MethodDescriptor.moduleName, 'express', 'moduleName') + t.equal(actualMiddleware2MethodDescriptor.objectPath, 'use', 'objectPath') + t.true(actualMiddleware2MethodDescriptor.location.endsWith('express.test.js'), 'location') + t.equal(spanEvent.sequence, 0, 'sequence') + t.equal(spanEvent.depth, 1, 'spanEvent.depth') + }) + res.send('ok router1') }) + const server = app.listen(TEST_ENV.port, async function () { const result1 = await axios.get(getServerUrl(PATH)) t.ok(result1.status, 200) - const traceMap = agent.traceContext.getAllTraceObject() - log.debug(traceMap.size) - t.ok(traceMap.size > 0) - + t.end() server.close() }) }) @@ -216,7 +457,7 @@ test(`${testName5} Should record middleware`, function (t) { const testName6 = 'express6' test(`${testName6} Should record each http method`, function (t) { agent.bindHttp() - + const testName = testName6 t.plan(6) @@ -263,4 +504,20 @@ test(`${testName6} Should record each http method`, function (t) { server.close() }) -}) \ No newline at end of file +}) + +test('semver test', (t) => { + t.false(semver.satisfies('5.0.0', '^4.0.0'), 'express version') + t.end() +}) + +test('express version check', (t) => { + const hook = require('../../../lib/instrumentation/module/express') + const expected = { name: 'module' } + let actual = hook(null, '5.0', expected) + t.equal(actual.name, 'module', 'express version 5.0 test') + + actual = hook(null, '5.0.0', expected) + t.equal(actual.name, 'module', 'express version 5.0.0 test') + t.end() +}) diff --git a/test/instrumentation/module/fix-redis.test.js b/test/instrumentation/module/fix-redis.test.js index 2035cb03..5a9eeae9 100644 --- a/test/instrumentation/module/fix-redis.test.js +++ b/test/instrumentation/module/fix-redis.test.js @@ -6,11 +6,11 @@ const test = require('tape') const agent = require('../../support/agent-singleton-mock') -const { GenericContainer } = require("testcontainers") +const { GenericContainer } = require('testcontainers') const { addressStringOf } = require('../../../lib/utils/convert-utils') test(`redis destination id`, async (t) => { - const container = await new GenericContainer("redis") + const container = await new GenericContainer('redis') .withExposedPorts(6379) .start() @@ -23,11 +23,11 @@ test(`redis destination id`, async (t) => { const client = redis.createClient( container.getMappedPort(6379), - container.getContainerIpAddress(), + container.getHost(), ) client.on("error", function (error) { - console.error(error); + console.error(error) }) client.set("key", "value", async function (error) { @@ -65,7 +65,7 @@ test("ioredis destination id", async function (t) { const port = container.getMappedPort(6379) const redis = new Redis( port, - container.getContainerIpAddress(), + container.getHost(), ) redis.on("error", function (error) { console.error(error) @@ -77,11 +77,11 @@ test("ioredis destination id", async function (t) { redis.get("key", async function (error, data) { t.equal(data, "value", "redis value validation") - t.true(agent.dataSender.mockSpanChunk.spanEventList.length > 0, "a spanEventList should has one chunk") + t.true(agent.dataSender.mockSpanChunks[0].spanEventList.length > 0, "a spanEventList should has one chunk") - const spanevent = agent.dataSender.mockSpanChunk.spanEventList[1] + const spanevent = agent.dataSender.mockSpanChunks[0].spanEventList[1] t.equal(spanevent.destinationId, "Redis", "Redis destionation ID check") - t.equal(spanevent.endPoint, `localhost:${port}`) + t.true(spanevent.endPoint.endsWith(`:${port}`), `localhost:${port}`) redis.quit() agent.completeTraceObject(trace) @@ -119,7 +119,7 @@ test(`Fix app crash without callback function https://github.com/pinpoint-apm/pi const redis = require('redis') const client = redis.createClient({ - host: container.getContainerIpAddress(), + host: container.getHost(), port: container.getMappedPort(6379), db: 3, }) @@ -127,7 +127,7 @@ test(`Fix app crash without callback function https://github.com/pinpoint-apm/pi client.select(2) client.on("error", function (error) { - console.error(error); + console.error(error) }) client.set("key", "value", async function (error) { diff --git a/test/instrumentation/module/http.test.js b/test/instrumentation/module/http.test.js index 765c98ea..5a18d63d 100644 --- a/test/instrumentation/module/http.test.js +++ b/test/instrumentation/module/http.test.js @@ -20,12 +20,11 @@ test(`outgoing request URL escape a bug`, async (t) => { .then(function (response) { t.true(response.status == 200) - t.true(agent.dataSender.mockSpanChunk.spanEventList.length == 2, `spanEventList`) + t.true(agent.dataSender.mockSpanChunks[0].spanEventList.length == 2, `spanEventList`) - const spanEvent = agent.dataSender.mockSpanChunk.spanEventList[1] - - t.equal(spanEvent.annotations[0].value.stringValue, "GET", "URL") - t.equal(spanEvent.annotations[1].value.stringValue, "www.naver.com/", "URL") + const spanEvent = agent.dataSender.mockSpanChunks[0].spanEventList[1] + t.equal(spanEvent.annotations[0].value, "GET", "URL") + t.equal(spanEvent.annotations[1].value, "naver.com/", "URL") agent.completeTraceObject(trace) }) }) \ No newline at end of file diff --git a/test/instrumentation/module/koa.test.js b/test/instrumentation/module/koa.test.js index cd02d967..67c22da1 100644 --- a/test/instrumentation/module/koa.test.js +++ b/test/instrumentation/module/koa.test.js @@ -7,13 +7,13 @@ const test = require('tape') const axios = require('axios') -const { log, fixture, util, enableDataSending } = require('../../test-helper') - - +const { log } = require('../../test-helper') const agent = require('../../support/agent-singleton-mock') - const Koa = require('koa') const Router = require('koa-router') +const annotationKey = require('../../../lib/constant/annotation-key') +const apiMetaService = require('../../../lib/context/api-meta-service') +const MethodDescriptorBuilder = require('../../../lib/context/method-descriptor-builder') const TEST_ENV = { host: 'localhost', @@ -23,16 +23,37 @@ const getServerUrl = (path) => `http://${TEST_ENV.host}:${TEST_ENV.port}${path}` const testName1 = 'koa-router1' test(`${testName1} Should record request in basic route koa.test.js`, function (t) { + agent.bindHttp() const testName = testName1 - - t.plan(3) - const PATH = `/${testName}` const app = new Koa() const router = new Router() router.get(PATH, async (ctx, next) => { ctx.body = 'ok. get' + + agent.callbackTraceClose((trace) => { + t.equal(trace.span.annotations[0].key, annotationKey.HTTP_STATUS_CODE.getCode(), 'HTTP status code') + t.equal(trace.span.annotations[0].value, 200, 'response status is 200') + + let actualBuilder = new MethodDescriptorBuilder('koa', 'get') + .setParameterDescriptor('(ctx, next)') + .setLineNumber(32) + .setFileName('koa.test.js') + const actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + let spanEvent = trace.span.spanEventList[0] + t.equal(actualMethodDescriptor.apiId, spanEvent.apiId, 'apiId') + t.equal(spanEvent.annotations[0].key, -1, 'parameter') + t.equal(spanEvent.annotations[0].value, '/koa-router1', 'parameter value matching') + t.true(actualMethodDescriptor.apiDescriptor.startsWith('koa.Router.get(ctx, next)'), 'apiDescriptor') + t.equal(actualMethodDescriptor.className, 'Router', 'className') + t.equal(actualMethodDescriptor.fullName, 'koa.get(ctx, next)', 'fullName') + t.equal(actualMethodDescriptor.lineNumber, 32, 'lineNumber') + t.equal(actualMethodDescriptor.methodName, 'get', 'methodName') + t.equal(actualMethodDescriptor.moduleName, 'koa', 'moduleName') + t.equal(actualMethodDescriptor.objectPath, 'get', 'objectPath') + t.true(actualMethodDescriptor.location.length > 0, 'location') + }) }) router.post(PATH, async (ctx, next) => { ctx.body = 'ok. post' @@ -51,6 +72,7 @@ test(`${testName1} Should record request in basic route koa.test.js`, function ( log.debug(traceMap.size) t.ok(traceMap.size > 0) + t.end() server.close() }) }) diff --git a/test/instrumentation/module/mysql.test.js b/test/instrumentation/module/mysql.test.js new file mode 100644 index 00000000..8ae6e432 --- /dev/null +++ b/test/instrumentation/module/mysql.test.js @@ -0,0 +1,513 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +const test = require('tape') +const { MySqlContainer } = require("testcontainers") +const path = require('path') +const agent = require('../../support/agent-singleton-mock') +const mysql = require('mysql') +const apiMetaService = require('../../../lib/context/api-meta-service') +const MethodDescriptorBuilder2 = require('../../../lib/context/method-descriptor-builder2') +const sqlMetadataService = require('../../../lib/instrumentation/sql/sql-metadata-service') +const annotationKey = require('../../../lib/constant/annotation-key') +const defaultPredefinedMethodDescriptorRegistry = require('../../../lib/constant/default-predefined-method-descriptor-registry') +const mysqlExecuteQueryServiceType = require('../../../lib/instrumentation/module/mysql/mysql-execute-query-service-type') +const mysqlServiceType = require('../../../lib/instrumentation/module/mysql/mysql-service-type') +const ServiceType = require('../../../lib/context/service-type') + +const fixtures = path.resolve(__dirname, '..', '..', 'fixtures', 'db') +test(`getConnection query hooking`, async (t) => { + agent.bindHttp() + const source = path.resolve(fixtures, 'mysql.sql') + const container = await new MySqlContainer() + .withCommand(['--default-authentication-plugin=mysql_native_password']) + .withEnvironment({ + 'MYSQL_DATABASE': 'test', + 'TZ': 'Asia/Seoul' + }) + .withCopyFilesToContainer([{ + source: source, + target: '/docker-entrypoint-initdb.d/mysql.sql' + }]) + .start() + + agent.createTraceObject() + const connection = mysql.createConnection({ + host: container.getHost(), + port: container.getPort(), + database: 'test', + user: container.getUsername(), + password: container.getUserPassword(), + acquireTimeout: 1000000, + }) + connection.connect(function (err) { + if (err) { + console.error('error connecting: ' + err.stack) + return + } + }) + connection.query(`SELECT * FROM member`, async function (error, results) { + if (error) throw error + t.equal(results[0].id, 'a', 'SELECT member id') + t.equal(results[0].name, 'name1', 'SELECT member name') + t.equal(results[0].joined.getDate(), new Date('2023-01-18T00:00:00+09:00').getDate(), 'SELECT member joined') + + connection.end() + await container.stop() + const trace = agent.currentTraceObject() + trace.close() + + let actualBuilder = new MethodDescriptorBuilder2('createConnection') + .setLineNumber(38) + .setFileName('mysql.test.js') + let actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + const createConnectionSpanEvent = trace.span.spanEventList[0] + t.equal(createConnectionSpanEvent.endPoint, 'localhost', 'the createConnection SpanEvent endPoint') + t.equal(createConnectionSpanEvent.destinationId, 'test', 'the createConnection SpanEvent destinationId') + t.equal(actualMethodDescriptor.apiId, createConnectionSpanEvent.apiId, 'apiId') + + actualBuilder = new MethodDescriptorBuilder2('connect') + .setClassName('Connection') + .setLineNumber(46) + .setFileName('mysql.test.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + const connectionSpanEvent = trace.span.spanEventList[1] + t.equal(connectionSpanEvent.depth, 1, 'connection spanEvent depth') + t.equal(connectionSpanEvent.sequence, 1, 'connection spanEvent sequence') + t.equal(actualMethodDescriptor.apiId, connectionSpanEvent.apiId, 'apiId') + + actualBuilder = new MethodDescriptorBuilder2('query') + .setClassName('Connection') + .setLineNumber(52) + .setFileName('mysql.test.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + const querySpanEvent = trace.span.spanEventList[2] + t.equal(querySpanEvent.depth, 1, 'query spanEvent depth') + t.equal(querySpanEvent.sequence, 2, 'query spanEvent sequence') + t.equal(actualMethodDescriptor.apiId, querySpanEvent.apiId, 'apiId') + + t.end() + }) +}) + +test(`connection with query`, async (t) => { + agent.bindHttp() + const source = path.resolve(fixtures, 'mysql.sql') + const container = await new MySqlContainer() + .withCommand(['--default-authentication-plugin=mysql_native_password']) + .withEnvironment({ + 'MYSQL_DATABASE': 'test' + }) + .withCopyFilesToContainer([{ + source: source, + target: '/docker-entrypoint-initdb.d/mysql.sql' + }]) + .start() + + const trace = agent.createTraceObject() + const connection = mysql.createConnection({ + host: container.getHost(), + port: container.getPort(), + database: 'test', + user: container.getUsername(), + password: container.getUserPassword(), + acquireTimeout: 1000000, + }) + connection.connect(function (err) { + if (err) { + console.error('error connecting: ' + err.stack) + return + } + }) + + connection.query('SELECT DATABASE() as res', async function (error, results) { + if (error) throw error + t.equal(results[0].res, 'test', 'SELECT DATABASE() as res') + }) + connection.query(`SHOW TABLES`, async function (error, results) { + if (error) throw error + t.equal(results[0].Tables_in_test, 'member', 'SHOW TABLES') + }) + + connection.query('SELECT * FROM `member` WHERE id = ?', 'a', async function (error) { + if (error) throw error + }) + + connection.query('INSERT INTO `member` (id, name, joined) VALUES (?, ?, ?)', ['c', 'cname', '2023-08-18'], async function (error, results) { + if (error) throw error + t.equal(results.affectedRows, 1, 'INSERT INTO `member` (id, name) VALUES (?, ?)') + }) + + connection.query('SELECT * FROM `member` WHERE id = ?', 'c', async function (error, results) { + if (error) throw error + + setImmediate(() => { + trace.close() + connection.end() + container.stop() + }) + + t.equal(results[0].id, 'c', 'SELECT member id') + t.equal(results[0].name, 'cname', 'SELECT member name') + t.equal(results[0].joined.getDate(), new Date('2023-08-18T00:00:00+09:00').getDate(), 'SELECT member joined') + }) + + agent.callbackTraceClose((trace) => { + let actualBuilder = new MethodDescriptorBuilder2('createConnection') + .setLineNumber(111) + .setFileName('mysql.test.js') + let actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + const createConnectionSpanEvent = trace.span.spanEventList[0] + t.equal(createConnectionSpanEvent.endPoint, 'localhost', 'the createConnection SpanEvent endPoint') + t.equal(createConnectionSpanEvent.destinationId, 'test', 'the createConnection SpanEvent destinationId') + t.equal(actualMethodDescriptor.apiId, createConnectionSpanEvent.apiId, 'apiId') + + actualBuilder = new MethodDescriptorBuilder2('connect') + .setClassName('Connection') + .setLineNumber(119) + .setFileName('mysql.test.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + const connectionSpanEvent = trace.span.spanEventList[1] + t.equal(connectionSpanEvent.depth, 1, 'connection spanEvent depth') + t.equal(connectionSpanEvent.sequence, 1, 'connection spanEvent sequence') + t.equal(actualMethodDescriptor.apiId, connectionSpanEvent.apiId, 'apiId') + + actualBuilder = new MethodDescriptorBuilder2('query') + .setClassName('Connection') + .setLineNumber(126) + .setFileName('mysql.test.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + let querySpanEvent = trace.span.spanEventList[2] + t.equal(querySpanEvent.endPoint, 'localhost', 'the createConnection SpanEvent endPoint') + t.equal(querySpanEvent.destinationId, 'test', 'the createConnection SpanEvent destinationId') + t.equal(actualMethodDescriptor.apiId, querySpanEvent.apiId, 'apiId') + + let actualParsingResult = sqlMetadataService.cacheSql('SELECT DATABASE() as res') + let actualQueryAnnotation = querySpanEvent.annotations[0] + t.equal(actualQueryAnnotation.key, annotationKey.SQL_ID.getCode(), 'the query annotation key') + t.equal(actualQueryAnnotation.value.intValue, actualParsingResult.sqlId, 'the query annotation value') + t.equal(actualParsingResult.sql.normalizedSql, 'SELECT DATABASE() as res', 'the query annotation squl normalizedSql') + + actualBuilder = new MethodDescriptorBuilder2('query') + .setClassName('Connection') + .setLineNumber(130) + .setFileName('mysql.test.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + querySpanEvent = trace.span.spanEventList[3] + t.equal(querySpanEvent.endPoint, 'localhost', 'the createConnection SpanEvent endPoint') + t.equal(querySpanEvent.destinationId, 'test', 'the createConnection SpanEvent destinationId') + t.equal(actualMethodDescriptor.apiId, querySpanEvent.apiId, 'apiId') + + actualParsingResult = sqlMetadataService.cacheSql('SHOW TABLES') + actualQueryAnnotation = querySpanEvent.annotations[0] + t.equal(actualQueryAnnotation.key, annotationKey.SQL_ID.getCode(), 'the query annotation key') + t.equal(actualQueryAnnotation.value.intValue, actualParsingResult.sqlId, 'the query annotation value') + t.equal(actualParsingResult.sql.normalizedSql, 'SHOW TABLES', 'the query annotation squl normalizedSql') + + actualBuilder = new MethodDescriptorBuilder2('query') + .setClassName('Connection') + .setLineNumber(135) + .setFileName('mysql.test.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + querySpanEvent = trace.span.spanEventList[4] + t.equal(querySpanEvent.endPoint, 'localhost', 'the createConnection SpanEvent endPoint') + t.equal(querySpanEvent.destinationId, 'test', 'the createConnection SpanEvent destinationId') + t.equal(actualMethodDescriptor.apiId, querySpanEvent.apiId, 'apiId') + + actualParsingResult = sqlMetadataService.cacheSql('SELECT * FROM `member` WHERE id = ?') + actualQueryAnnotation = querySpanEvent.annotations[0] + t.equal(actualQueryAnnotation.key, annotationKey.SQL_ID.getCode(), 'the query annotation key') + t.equal(actualQueryAnnotation.value.intValue, actualParsingResult.sqlId, 'the query annotation value') + t.equal(actualQueryAnnotation.value.stringValue1, '', 'the query annotation value stringValue1 is sql normalizedSql parsedParameters') + t.equal(actualQueryAnnotation.value.stringValue2, 'a', 'the query annotation value stringValue2 is bind value') + t.equal(actualParsingResult.sql.normalizedSql, 'SELECT * FROM `member` WHERE id = ?', 'the query annotation sql normalizedSql') + + actualBuilder = new MethodDescriptorBuilder2('query') + .setClassName('Connection') + .setLineNumber(139) + .setFileName('mysql.test.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + querySpanEvent = trace.span.spanEventList[5] + t.equal(querySpanEvent.endPoint, 'localhost', 'the createConnection SpanEvent endPoint') + t.equal(querySpanEvent.destinationId, 'test', 'the createConnection SpanEvent destinationId') + t.equal(actualMethodDescriptor.apiId, querySpanEvent.apiId, 'apiId') + + actualParsingResult = sqlMetadataService.cacheSql('INSERT INTO `member` (id, name, joined) VALUES (?, ?, ?)') + actualQueryAnnotation = querySpanEvent.annotations[0] + t.equal(actualQueryAnnotation.key, annotationKey.SQL_ID.getCode(), 'the query annotation key') + t.equal(actualQueryAnnotation.value.intValue, actualParsingResult.sqlId, 'the query annotation value') + t.equal(actualQueryAnnotation.value.stringValue1, '', 'the query annotation value stringValue1 is sql normalizedSql parsedParameters') + t.equal(actualQueryAnnotation.value.stringValue2, 'c,cname,2023-08-18', 'the query annotation value stringValue2 is bind value') + t.equal(actualParsingResult.sql.normalizedSql, 'INSERT INTO `member` (id, name, joined) VALUES (?, ?, ?)', 'the query annotation sql normalizedSql') + + t.end() + }) +}) + +test(`Connection Pool with query`, async (t) => { + agent.bindHttp() + const source = path.resolve(fixtures, 'mysql.sql') + const container = await new MySqlContainer() + .withCommand(['--default-authentication-plugin=mysql_native_password']) + .withEnvironment({ + 'MYSQL_DATABASE': 'test' + }) + .withCopyFilesToContainer([{ + source: source, + target: '/docker-entrypoint-initdb.d/mysql.sql' + }]) + .start() + + const trace = agent.createTraceObject() + const pool = mysql.createPool({ + host: container.getHost(), + port: container.getPort(), + database: 'test', + user: container.getUsername(), + password: container.getUserPassword(), + acquireTimeout: 1000000, + }) + + pool.getConnection(function (err, connection) { + if (err) throw err + connection.query('SELECT * FROM `member` where id = ?', 'a', async function (error) { + connection.release() + if (error) throw error + }) + }) + + pool.query('SELECT * FROM `member` where id = ?', 'a', async function (error, results) { + if (error) throw error + t.equal(results[0].id, 'a', 'SELECT member id') + t.equal(results[0].name, 'name1', 'SELECT member name') + t.equal(results[0].joined.getDate(), new Date('2023-01-18T00:00:00+09:00').getDate(), 'SELECT member joined') + + pool.end(async () => { + trace.close() + await container.stop() + }) + }) + + agent.callbackTraceClose((trace) => { + let actualBuilder = new MethodDescriptorBuilder2('createPool') + .setLineNumber(265) + .setFileName('mysql.test.js') + let actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + let actualSpanEvent = trace.span.spanEventList[0] + t.equal(actualMethodDescriptor.apiId, actualSpanEvent.apiId, 'apiId') + t.equal(actualSpanEvent.endPoint, 'localhost', 'createPool SpanEvent endPoint') + t.equal(actualSpanEvent.destinationId, 'test', 'createPool SpanEvent destinationId') + t.equal(actualSpanEvent.sequence, 0, 'createPool spanEvent sequence') + t.equal(actualSpanEvent.depth, 1, 'createPool spanEvent depth') + t.equal(actualSpanEvent.serviceType, mysqlServiceType.getCode(), 'createPool spanEvent serviceType') + + actualBuilder = new MethodDescriptorBuilder2('getConnection') + .setClassName('Pool') + .setLineNumber(274) + .setFileName('mysql.test.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + actualSpanEvent = trace.span.spanEventList[1] + t.equal(actualMethodDescriptor.apiId, actualSpanEvent.apiId, 'Pool.getConnection spanEvent apiId') + t.equal(actualSpanEvent.depth, 1, 'Pool.getConnection spanEvent depth') + t.equal(actualSpanEvent.sequence, 1, 'Pool.getConnection spanEvent sequence') + t.equal(actualSpanEvent.serviceType, mysqlServiceType.getCode(), 'Pool.getConnection spanEvent serviceType') + + let actualSpanChunk = trace.storage.dataSender.mockSpanChunks[0] + t.equal(actualSpanChunk.spanId, actualSpanEvent.spanId, 'spanChunk spanId') + t.equal(actualSpanChunk.transactionIdObject, trace.traceId.transactionId, 'spanChunk transactionIdObject') + t.equal(actualSpanChunk.localAsyncId.asyncId, actualSpanEvent.nextAsyncId, 'spanChunk localAsyncId.asyncId is spanEvent nextAsyncId') + t.equal(actualSpanChunk.localAsyncId.sequence, 0, 'spanChunk localAsyncId.sequence is spanEvent 0') + t.equal(actualSpanChunk.spanEventList[0].apiId, defaultPredefinedMethodDescriptorRegistry.asyncInvocationDescriptor.apiId, 'spanChunk spanEventList[0].apiId must be asyncInvocationDescriptor.apiId') + t.equal(actualSpanChunk.spanEventList[0].depth, 1, 'spanChunk spanEventList[0].depth is 1') + t.equal(actualSpanChunk.spanEventList[0].sequence, 0, 'spanChunk spanEventList[0].sequence is 0') + t.equal(actualSpanChunk.spanEventList[0].serviceType, ServiceType.async.getCode(), 'spanChunk spanEventList[0].serviceType is ServiceTypeCode.async') + t.equal(actualSpanChunk.spanEventList[1].apiId, actualSpanEvent.apiId, 'spanChunk spanEventList[1].apiId must be actualSpanEvent.apiId') + t.equal(actualSpanChunk.spanEventList[1].depth, 2, 'spanChunk spanEventList[1].depth is 2') + t.equal(actualSpanChunk.spanEventList[1].sequence, 1, 'spanChunk spanEventList[1].sequence is 1') + t.equal(actualSpanChunk.spanEventList[1].serviceType, mysqlServiceType.getCode(), 'spanChunk spanEventList[1].serviceType is null') + + actualBuilder = new MethodDescriptorBuilder2('getConnection') + .setClassName('Pool') + .setLineNumber(202) + .setFileName('Pool.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + actualSpanEvent = trace.span.spanEventList[2] + t.equal(actualMethodDescriptor.apiId, actualSpanEvent.apiId, 'Pool.getConnection spanEvent apiId on pool.query') + t.equal(actualSpanEvent.depth, 1, 'Pool.getConnection spanEvent depth on pool.query') + t.equal(actualSpanEvent.sequence, 2, 'Pool.getConnection spanEvent sequence on pool.query') + t.equal(actualSpanEvent.serviceType, mysqlServiceType.getCode(), 'Pool.getConnection spanEvent serviceType on pool.query') + + actualSpanChunk = trace.storage.dataSender.mockSpanChunks[1] + t.equal(actualSpanChunk.spanId, actualSpanEvent.spanId, 'spanChunk spanId on pool.query') + t.equal(actualSpanChunk.transactionIdObject, trace.traceId.transactionId, 'spanChunk transactionIdObject on pool.query') + t.equal(actualSpanChunk.localAsyncId.asyncId, actualSpanEvent.nextAsyncId, 'spanChunk localAsyncId.asyncId is spanEvent nextAsyncId on pool.query') + t.equal(actualSpanChunk.localAsyncId.sequence, 0, 'spanChunk localAsyncId.sequence is spanEvent 0 on pool.query') + t.equal(actualSpanChunk.spanEventList[0].apiId, defaultPredefinedMethodDescriptorRegistry.asyncInvocationDescriptor.apiId, 'spanChunk spanEventList[0].apiId must be asyncInvocationDescriptor.apiId on pool.query') + t.equal(actualSpanChunk.spanEventList[0].depth, 1, 'spanChunk spanEventList[0].depth is 1 on pool.query') + t.equal(actualSpanChunk.spanEventList[0].sequence, 0, 'spanChunk spanEventList[0].sequence is 0 on pool.query') + t.equal(actualSpanChunk.spanEventList[0].serviceType, ServiceType.async.getCode(), 'spanChunk spanEventList[0].serviceType is ServiceTypeCode.async on pool.query') + t.equal(actualSpanChunk.spanEventList[1].apiId, actualSpanEvent.apiId, 'spanChunk spanEventList[1].apiId must be actualSpanEvent.apiId on pool.query') + t.equal(actualSpanChunk.spanEventList[1].depth, 2, 'spanChunk spanEventList[1].depth is 2 on pool.query') + t.equal(actualSpanChunk.spanEventList[1].sequence, 1, 'spanChunk spanEventList[1].sequence is 1 on pool.query') + t.equal(actualSpanChunk.spanEventList[1].serviceType, mysqlServiceType.getCode(), 'spanChunk spanEventList[1].serviceType is null on pool.query') + + actualBuilder = new MethodDescriptorBuilder2('query') + .setClassName('PoolConnection') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + actualSpanEvent = trace.span.spanEventList[3] + t.equal(actualMethodDescriptor.apiId, actualSpanEvent.apiId, 'PoolConnection.query spanEvent apiId on pool.query') + t.equal(actualSpanEvent.depth, 1, 'PoolConnection.query spanEvent depth on pool.query') + t.equal(actualSpanEvent.sequence, 3, 'PoolConnection.query spanEvent sequence on pool.query') + t.equal(actualSpanEvent.serviceType, mysqlExecuteQueryServiceType.getCode(), 'PoolConnection.query spanEvent serviceType on pool.query') + + actualSpanChunk = trace.storage.dataSender.mockSpanChunks[2] + t.equal(actualSpanChunk.spanId, actualSpanEvent.spanId, 'spanChunk spanId on pool.query') + t.equal(actualSpanChunk.transactionIdObject, trace.traceId.transactionId, 'spanChunk transactionIdObject on pool.query') + t.equal(actualSpanChunk.localAsyncId.asyncId, actualSpanEvent.nextAsyncId, 'spanChunk localAsyncId.asyncId is spanEvent nextAsyncId on pool.query') + t.equal(actualSpanChunk.localAsyncId.sequence, 0, 'spanChunk localAsyncId.sequence is spanEvent 0 on pool.query') + t.equal(actualSpanChunk.spanEventList[0].apiId, defaultPredefinedMethodDescriptorRegistry.asyncInvocationDescriptor.apiId, 'spanChunk spanEventList[0].apiId must be asyncInvocationDescriptor.apiId on pool.query') + t.equal(actualSpanChunk.spanEventList[0].depth, 1, 'spanChunk spanEventList[0].depth is 1 on pool.query') + t.equal(actualSpanChunk.spanEventList[0].sequence, 0, 'spanChunk spanEventList[0].sequence is 0 on pool.query') + t.equal(actualSpanChunk.spanEventList[0].serviceType, ServiceType.async.getCode(), 'spanChunk spanEventList[0].serviceType is ServiceTypeCode.async on pool.query') + t.equal(actualSpanChunk.spanEventList[1].apiId, actualSpanEvent.apiId, 'spanChunk spanEventList[1].apiId must be actualSpanEvent.apiId on pool.query') + t.equal(actualSpanChunk.spanEventList[1].depth, 2, 'spanChunk spanEventList[1].depth is 2 on pool.query') + t.equal(actualSpanChunk.spanEventList[1].sequence, 1, 'spanChunk spanEventList[1].sequence is 1 on pool.query') + t.equal(actualSpanChunk.spanEventList[1].serviceType, mysqlExecuteQueryServiceType.getCode(), 'spanChunk spanEventList[1].serviceType is null on pool.query') + t.end() + }) +}) + +test(`Cluster with query`, async (t) => { + agent.bindHttp() + const source = path.resolve(fixtures, 'mysql.sql') + const container = await new MySqlContainer() + .withCommand(['--default-authentication-plugin=mysql_native_password']) + .withEnvironment({ + 'MYSQL_DATABASE': 'test' + }) + .withCopyFilesToContainer([{ + source: source, + target: '/docker-entrypoint-initdb.d/mysql.sql' + }]) + .start() + + const trace = agent.createTraceObject() + const poolCluster = mysql.createPoolCluster() + poolCluster.add('MASTER', { + host: container.getHost(), + port: container.getPort(), + database: 'test', + user: container.getUsername(), + password: container.getUserPassword(), + acquireTimeout: 1000000, + }) + poolCluster.add('SLAVE1', { + host: container.getHost(), + port: container.getPort(), + database: 'test', + user: container.getUsername(), + password: container.getUserPassword(), + acquireTimeout: 1000000, + }) + poolCluster.add('SLAVE2', { + host: container.getHost(), + port: container.getPort(), + database: 'test', + user: container.getUsername(), + password: container.getUserPassword(), + acquireTimeout: 1000000, + }) + + poolCluster.getConnection('MASTER', function (err, connection) { + if (err) throw err + connection.query('SELECT * FROM `member` where id = ?', 'a', async function (error, results) { + connection.release() + if (error) throw error + + t.equal(results[0].id, 'a', 'SELECT member id') + t.equal(results[0].name, 'name1', 'SELECT member name') + t.equal(results[0].joined.getDate(), new Date('2023-01-18T00:00:00+09:00').getDate(), 'SELECT member joined') + + poolCluster.end(async function () { + trace.close() + await container.stop() + }) + }) + }) + + + agent.callbackTraceClose((trace) => { + let actualBuilder = new MethodDescriptorBuilder2('createPoolCluster') + .setLineNumber(398) + .setFileName('mysql.test.js') + let actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + let actualSpanEvent = trace.span.spanEventList[0] + t.equal(actualMethodDescriptor.apiId, actualSpanEvent.apiId, 'apiId') + t.equal(actualSpanEvent.sequence, 0, 'createPoolCluster spanEvent sequence') + t.equal(actualSpanEvent.depth, 1, 'createPoolCluster spanEvent depth') + t.equal(actualSpanEvent.serviceType, mysqlServiceType.getCode(), 'createPoolCluster spanEvent serviceType') + + actualBuilder = new MethodDescriptorBuilder2('of') + .setLineNumber(142) + .setFileName('PoolCluster.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + actualSpanEvent = trace.span.spanEventList[1] + t.equal(actualMethodDescriptor.apiId, actualSpanEvent.apiId, 'PoolCluster.of spanEvent apiId in poolCluster.getConnection') + t.equal(actualSpanEvent.depth, 1, 'PoolCluster.of spanEvent depth in poolCluster.getConnection') + t.equal(actualSpanEvent.sequence, 1, 'PoolCluster.of spanEvent sequence in poolCluster.getConnection') + t.equal(actualSpanEvent.serviceType, mysqlServiceType.getCode(), 'PoolCluster.of spanEvent serviceType in poolCluster.getConnection') + + actualBuilder = new MethodDescriptorBuilder2('getConnection') + .setClassName('Pool') + .setLineNumber(145) + .setFileName('PoolCluster.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + actualSpanEvent = trace.span.spanEventList[2] + t.equal(actualMethodDescriptor.apiId, actualSpanEvent.apiId, 'Pool.getConnection spanEvent apiId in poolCluster.getConnection') + t.equal(actualSpanEvent.depth, 1, 'Pool.getConnection spanEvent depth in poolCluster.getConnection') + t.equal(actualSpanEvent.sequence, 2, 'Pool.getConnection spanEvent sequence in poolCluster.getConnection') + t.equal(actualSpanEvent.serviceType, mysqlServiceType.getCode(), 'Pool.getConnection spanEvent serviceType in poolCluster.getConnection') + + let actualSpanChunk = trace.storage.dataSender.mockSpanChunks[0] + t.equal(actualSpanChunk.spanId, actualSpanEvent.spanId, 'spanChunk spanId in poolCluster.getConnection') + t.equal(actualSpanChunk.transactionIdObject, trace.traceId.transactionId, 'spanChunk transactionIdObject in poolCluster.getConnection') + t.equal(actualSpanChunk.localAsyncId.asyncId, actualSpanEvent.nextAsyncId, 'spanChunk localAsyncId.asyncId is spanEvent nextAsyncId in poolCluster.getConnection') + t.equal(actualSpanChunk.localAsyncId.sequence, 0, 'spanChunk localAsyncId.sequence is spanEvent 0 in poolCluster.getConnection') + t.equal(actualSpanChunk.spanEventList[0].apiId, defaultPredefinedMethodDescriptorRegistry.asyncInvocationDescriptor.apiId, 'spanChunk spanEventList[0].apiId must be asyncInvocationDescriptor.apiId in poolCluster.getConnection') + t.equal(actualSpanChunk.spanEventList[0].depth, 1, 'spanChunk spanEventList[0].depth is 1 in poolCluster.getConnection') + t.equal(actualSpanChunk.spanEventList[0].sequence, 0, 'spanChunk spanEventList[0].sequence is 0 in poolCluster.getConnection') + t.equal(actualSpanChunk.spanEventList[0].serviceType, ServiceType.async.getCode(), 'spanChunk spanEventList[0].serviceType is ServiceTypeCode.async in poolCluster.getConnection') + t.equal(actualSpanChunk.spanEventList[1].apiId, actualSpanEvent.apiId, 'spanChunk spanEventList[1].apiId must be actualSpanEvent.apiId in poolCluster.getConnection') + t.equal(actualSpanChunk.spanEventList[1].depth, 2, 'spanChunk spanEventList[1].depth is 2 in poolCluster.getConnection') + t.equal(actualSpanChunk.spanEventList[1].sequence, 1, 'spanChunk spanEventList[1].sequence is 1 in poolCluster.getConnection') + t.equal(actualSpanChunk.spanEventList[1].serviceType, mysqlServiceType.getCode(), 'spanChunk spanEventList[1].serviceType is null in poolCluster.getConnection') + + actualBuilder = new MethodDescriptorBuilder2('query') + .setClassName('PoolConnection') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + actualSpanEvent = trace.span.spanEventList[3] + t.equal(actualMethodDescriptor.apiId, actualSpanEvent.apiId, 'PoolConnection.query spanEvent apiId in poolCluster.getConnection') + t.equal(actualSpanEvent.depth, 1, 'PoolConnection.query spanEvent depth in poolCluster.getConnection') + t.equal(actualSpanEvent.sequence, 3, 'PoolConnection.query spanEvent sequence in poolCluster.getConnection') + t.equal(actualSpanEvent.serviceType, mysqlExecuteQueryServiceType.getCode(), 'PoolConnection.query spanEvent serviceType in poolCluster.getConnection') + + actualSpanChunk = trace.storage.dataSender.mockSpanChunks[1] + t.equal(actualSpanChunk.spanId, actualSpanEvent.spanId, 'spanChunk spanId in poolCluster.getConnection') + t.equal(actualSpanChunk.transactionIdObject, trace.traceId.transactionId, 'spanChunk transactionIdObject in poolCluster.getConnection') + t.equal(actualSpanChunk.localAsyncId.asyncId, actualSpanEvent.nextAsyncId, 'spanChunk localAsyncId.asyncId is spanEvent nextAsyncId in poolCluster.getConnection') + t.equal(actualSpanChunk.localAsyncId.sequence, 0, 'spanChunk localAsyncId.sequence is spanEvent 0 in poolCluster.getConnection') + t.equal(actualSpanChunk.spanEventList[0].apiId, defaultPredefinedMethodDescriptorRegistry.asyncInvocationDescriptor.apiId, 'spanChunk spanEventList[0].apiId must be asyncInvocationDescriptor.apiId in poolCluster.getConnection') + t.equal(actualSpanChunk.spanEventList[0].depth, 1, 'spanChunk spanEventList[0].depth is 1 in poolCluster.getConnection') + t.equal(actualSpanChunk.spanEventList[0].sequence, 0, 'spanChunk spanEventList[0].sequence is 0 in poolCluster.getConnection') + t.equal(actualSpanChunk.spanEventList[0].serviceType, ServiceType.async.getCode(), 'spanChunk spanEventList[0].serviceType is ServiceTypeCode.async in poolCluster.getConnection') + t.equal(actualSpanChunk.spanEventList[1].apiId, actualSpanEvent.apiId, 'spanChunk spanEventList[1].apiId must be actualSpanEvent.apiId in poolCluster.getConnection') + t.equal(actualSpanChunk.spanEventList[1].depth, 2, 'spanChunk spanEventList[1].depth is 2 in poolCluster.getConnection') + t.equal(actualSpanChunk.spanEventList[1].sequence, 1, 'spanChunk spanEventList[1].sequence is 1 in poolCluster.getConnection') + t.equal(actualSpanChunk.spanEventList[1].serviceType, mysqlExecuteQueryServiceType.getCode(), 'spanChunk spanEventList[1].serviceType is null in poolCluster.getConnection') + + t.end() + }) +}) \ No newline at end of file diff --git a/test/instrumentation/module/mysql2.test.js b/test/instrumentation/module/mysql2.test.js new file mode 100644 index 00000000..5d954a96 --- /dev/null +++ b/test/instrumentation/module/mysql2.test.js @@ -0,0 +1,417 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +const test = require('tape') +const path = require('path') +const agent = require('../../support/agent-singleton-mock') +const { MySqlContainer } = require('testcontainers') +const mysql = require('mysql2') +const mysqlp = require('mysql2/promise') +const MethodDescriptorBuilder2 = require('../../../lib/context/method-descriptor-builder2') +const apiMetaService = require('../../../lib/context/api-meta-service') +const sqlMetadataService = require('../../../lib/instrumentation/sql/sql-metadata-service') +const annotationKey = require('../../../lib/constant/annotation-key') +const mysqlServiceType = require('../../../lib/instrumentation/module/mysql/mysql-service-type') +const mysqlExecuteQueryServiceType = require('../../../lib/instrumentation/module/mysql/mysql-execute-query-service-type') +const defaultPredefinedMethodDescriptorRegistry = require('../../../lib/constant/default-predefined-method-descriptor-registry') +const ServiceType = require('../../../lib/context/service-type') + +const fixtures = path.resolve(__dirname, '..', '..', 'fixtures', 'db') +test(`getConnection query hooking`, async (t) => { + agent.bindHttp() + const source = path.resolve(fixtures, 'mysql.sql') + const container = await new MySqlContainer() + .withCommand('--default-authentication-plugin=mysql_native_password') + .withEnvironment({ + 'MYSQL_DATABASE': 'test', + 'TX': 'Asia/Seoul', + }) + .withCopyFilesToContainer([{ + source: source, + target: '/docker-entrypoint-initdb.d/mysql.sql' + }]) + .start() + + const trace = agent.createTraceObject() + const connection = mysql.createConnection({ + host: container.getHost(), + port: container.getPort(3306), + database: 'test', + user: container.getUsername(), + password: container.getUserPassword(), + }) + + connection.query(`SELECT * FROM member WHERE id = ?`, 'a', function(err, results) { + if (err) throw err + + t.equal(results[0].id, 'a', 'id in SELECT query hooking') + t.equal(results[0].name, 'name1', 'name in SELECT query hooking') + t.equal(results[0].joined.toISOString().slice(0, 10), '2023-01-17', 'joined in SELECT query hooking') + }) + + connection.query(`INSERT INTO member (id, name, joined) VALUES (?, ?, ?)`, ['c', 'cname', '2023-08-18'], function(err) { + if (err) throw err + }) + + connection.query(`UPDATE member SET name = ? WHERE id = ?`, ['cname2', 'c'], function(err) { + if (err) throw err + }) + + connection.query(`DELETE FROM member WHERE id = ?`, 'c', function(err) { + if (err) throw err + + setImmediate(() => { + trace.close() + connection.end() + container.stop() + }) + }) + + agent.callbackTraceClose((trace) => { + let actualBuilder = new MethodDescriptorBuilder2('createConnection') + .setLineNumber(39) + .setFileName('mysql2.test.js') + let actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + const createConnectionSpanEvent = trace.span.spanEventList[0] + t.equal(createConnectionSpanEvent.apiId, actualMethodDescriptor.apiId, 'apiId in createConnection spanEvent') + t.equal(createConnectionSpanEvent.endPoint, 'localhost', 'endPoint in createConnection spanEvent') + t.equal(createConnectionSpanEvent.destinationId, 'test', 'destinationId in createConnection spanEvent') + + actualBuilder = new MethodDescriptorBuilder2('query') + .setClassName('Connection') + .setLineNumber(47) + .setFileName('mysql2.test.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + let querySpanEvent = trace.span.spanEventList[1] + t.equal(querySpanEvent.apiId, actualMethodDescriptor.apiId, 'apiId in query spanEvent') + t.equal(querySpanEvent.endPoint, 'localhost', 'endPoint in query spanEvent') + t.equal(querySpanEvent.destinationId, 'test', 'destinationId in query spanEvent') + + let actualParsingResult = sqlMetadataService.cacheSql('SELECT * FROM member WHERE id = ?') + let actualQueryAnnotation = querySpanEvent.annotations[0] + t.equal(actualQueryAnnotation.key, annotationKey.SQL_ID.getCode(), 'key in query annotation') + t.equal(actualQueryAnnotation.value.intValue, actualParsingResult.sqlId, 'intValue in query annotation') + t.equal(actualQueryAnnotation.value.stringValue1, '', 'stringValue1 in query annotation') + t.equal(actualQueryAnnotation.value.stringValue2, 'a', 'stringValue2 in query annotation') + t.equal(actualParsingResult.sql.normalizedSql, 'SELECT * FROM member WHERE id = ?', 'normalizedSql in query annotation') + + actualBuilder = new MethodDescriptorBuilder2('query') + .setClassName('Connection') + .setLineNumber(55) + .setFileName('mysql2.test.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + querySpanEvent = trace.span.spanEventList[2] + t.equal(querySpanEvent.apiId, actualMethodDescriptor.apiId, 'apiId in query spanEvent') + t.equal(querySpanEvent.endPoint, 'localhost', 'endPoint in query spanEvent') + t.equal(querySpanEvent.destinationId, 'test', 'destinationId in query spanEvent') + + actualParsingResult = sqlMetadataService.cacheSql('INSERT INTO member (id, name, joined) VALUES (?, ?, ?)') + actualQueryAnnotation = querySpanEvent.annotations[0] + t.equal(actualQueryAnnotation.key, annotationKey.SQL_ID.getCode(), 'key in query annotation') + t.equal(actualQueryAnnotation.value.intValue, actualParsingResult.sqlId, 'intValue in query annotation') + t.equal(actualQueryAnnotation.value.stringValue1, '', 'stringValue1 in query annotation') + t.equal(actualQueryAnnotation.value.stringValue2, 'c,cname,2023-08-18', 'stringValue2 in query annotation') + t.equal(actualParsingResult.sql.normalizedSql, 'INSERT INTO member (id, name, joined) VALUES (?, ?, ?)', 'normalizedSql in query annotation') + + actualBuilder = new MethodDescriptorBuilder2('query') + .setClassName('Connection') + .setLineNumber(59) + .setFileName('mysql2.test.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + querySpanEvent = trace.span.spanEventList[3] + t.equal(querySpanEvent.apiId, actualMethodDescriptor.apiId, 'apiId in query spanEvent') + t.equal(querySpanEvent.endPoint, 'localhost', 'endPoint in query spanEvent') + t.equal(querySpanEvent.destinationId, 'test', 'destinationId in query spanEvent') + + actualParsingResult = sqlMetadataService.cacheSql('UPDATE member SET name = ? WHERE id = ?') + actualQueryAnnotation = querySpanEvent.annotations[0] + t.equal(actualQueryAnnotation.key, annotationKey.SQL_ID.getCode(), 'key in query annotation') + t.equal(actualQueryAnnotation.value.intValue, actualParsingResult.sqlId, 'intValue in query annotation') + t.equal(actualQueryAnnotation.value.stringValue1, '', 'stringValue1 in query annotation') + t.equal(actualQueryAnnotation.value.stringValue2, 'cname2,c', 'stringValue2 in query annotation') + t.equal(actualParsingResult.sql.normalizedSql, 'UPDATE member SET name = ? WHERE id = ?', 'normalizedSql in query annotation') + + actualBuilder = new MethodDescriptorBuilder2('query') + .setClassName('Connection') + .setLineNumber(63) + .setFileName('mysql2.test.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + querySpanEvent = trace.span.spanEventList[4] + t.equal(querySpanEvent.apiId, actualMethodDescriptor.apiId, 'apiId in query spanEvent') + t.equal(querySpanEvent.endPoint, 'localhost', 'endPoint in query spanEvent') + t.equal(querySpanEvent.destinationId, 'test', 'destinationId in query spanEvent') + + actualParsingResult = sqlMetadataService.cacheSql('DELETE FROM member WHERE id = ?') + actualQueryAnnotation = querySpanEvent.annotations[0] + t.equal(actualQueryAnnotation.key, annotationKey.SQL_ID.getCode(), 'key in query annotation') + t.equal(actualQueryAnnotation.value.intValue, actualParsingResult.sqlId, 'intValue in query annotation') + t.equal(actualQueryAnnotation.value.stringValue1, '', 'stringValue1 in query annotation') + t.equal(actualQueryAnnotation.value.stringValue2, 'c', 'stringValue2 in query annotation') + t.equal(actualParsingResult.sql.normalizedSql, 'DELETE FROM member WHERE id = ?', 'normalizedSql in query annotation') + t.end() + }) +}) + +test(`getConnection promise query hooking`, async (t) => { + agent.bindHttp() + const source = path.resolve(fixtures, 'mysql.sql') + const container = await new MySqlContainer() + .withCommand('--default-authentication-plugin=mysql_native_password') + .withEnvironment({ + 'MYSQL_DATABASE': 'test', + 'TX': 'Asia/Seoul', + }) + .withCopyFilesToContainer([{ + source: source, + target: '/docker-entrypoint-initdb.d/mysql.sql' + }]) + .start() + + const trace = agent.createTraceObject() + const connection = mysql.createConnection({ + host: container.getHost(), + port: container.getPort(3306), + database: 'test', + user: container.getUsername(), + password: container.getUserPassword(), + }) + + const [rows] = await connection.promise().query(`SELECT * FROM member WHERE id = ?`, 'a') + t.equal(rows[0].id, 'a', 'id in SELECT query hooking') + t.equal(rows[0].name, 'name1', 'name in SELECT query hooking') + t.equal(rows[0].joined.toISOString().slice(0, 10), '2023-01-17', 'joined in SELECT query hooking') + + setImmediate(() => { + trace.close() + connection.end() + container.stop() + t.end() + }) + + agent.callbackTraceClose((trace) => { + let actualBuilder = new MethodDescriptorBuilder2('createConnection') + .setLineNumber(174) + .setFileName('mysql2.test.js') + let actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + const createConnectionSpanEvent = trace.span.spanEventList[0] + t.equal(createConnectionSpanEvent.apiId, actualMethodDescriptor.apiId, 'apiId in createConnection spanEvent') + t.equal(createConnectionSpanEvent.endPoint, 'localhost', 'endPoint in createConnection spanEvent') + t.equal(createConnectionSpanEvent.destinationId, 'test', 'destinationId in createConnection spanEvent') + + actualBuilder = new MethodDescriptorBuilder2('query') + .setClassName('Connection') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + let querySpanEvent = trace.span.spanEventList[1] + t.equal(querySpanEvent.apiId, actualMethodDescriptor.apiId, 'apiId in query spanEvent') + t.equal(querySpanEvent.endPoint, 'localhost', 'endPoint in query spanEvent') + t.equal(querySpanEvent.destinationId, 'test', 'destinationId in query spanEvent') + + let actualParsingResult = sqlMetadataService.cacheSql('SELECT * FROM member WHERE id = ?') + let actualQueryAnnotation = querySpanEvent.annotations[0] + t.equal(actualQueryAnnotation.key, annotationKey.SQL_ID.getCode(), 'key in query annotation') + t.equal(actualQueryAnnotation.value.intValue, actualParsingResult.sqlId, 'intValue in query annotation') + t.equal(actualQueryAnnotation.value.stringValue1, '', 'stringValue1 in query annotation') + t.equal(actualQueryAnnotation.value.stringValue2, 'a', 'stringValue2 in query annotation') + t.equal(actualParsingResult.sql.normalizedSql, 'SELECT * FROM member WHERE id = ?', 'normalizedSql in query annotation') + }) +}) + +test(`Connection Pool with query hooking`, async (t) => { + agent.bindHttp() + const source = path.resolve(fixtures, 'mysql.sql') + const container = await new MySqlContainer() + .withCommand('--default-authentication-plugin=mysql_native_password') + .withEnvironment({ + 'MYSQL_DATABASE': 'test', + 'TX': 'Asia/Seoul', + }) + .withCopyFilesToContainer([{ + source: source, + target: '/docker-entrypoint-initdb.d/mysql.sql' + }]) + .start() + + const trace = agent.createTraceObject() + const pool = mysql.createPool({ + host: container.getHost(), + port: container.getPort(), + database: 'test', + user: container.getUsername(), + password: container.getUserPassword(), + }) + const promisePool = pool.promise() + + const [rows] = await promisePool.query(`SELECT * FROM member WHERE id = ?`, 'a') + t.equal(rows[0].id, 'a', 'id in SELECT query hooking') + t.equal(rows[0].name, 'name1', 'name in SELECT query hooking') + t.equal(rows[0].joined.toISOString().slice(0, 10), '2023-01-17', 'joined in SELECT query hooking') + + setImmediate(() => { + trace.close() + pool.end() + container.stop() + t.end() + }) + + agent.callbackTraceClose((trace) => { + let actualBuilder = new MethodDescriptorBuilder2('createPool') + .setLineNumber(238) + .setFileName('mysql2.test.js') + let actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + let actualSpanEvent = trace.span.spanEventList[0] + t.equal(actualSpanEvent.apiId, actualMethodDescriptor.apiId, 'apiId in createPool spanEvent') + t.equal(actualSpanEvent.endPoint, 'localhost', 'endPoint in createPool spanEvent') + t.equal(actualSpanEvent.destinationId, 'test', 'destinationId in createPool spanEvent') + t.equal(actualSpanEvent.sequence, 0, 'sequence in createPool spanEvent') + t.equal(actualSpanEvent.depth, 1, 'depth in createPool spanEvent') + t.equal(actualSpanEvent.serviceType, mysqlServiceType.getCode(), 'serviceType in createPool spanEvent') + + actualBuilder = new MethodDescriptorBuilder2('getConnection') + .setClassName('Pool') + .setLineNumber(143) + .setFileName('pool.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + actualSpanEvent = trace.span.spanEventList[1] + t.equal(actualSpanEvent.apiId, actualMethodDescriptor.apiId, 'apiId in Pool.getConnection() spanEvent') + t.equal(actualSpanEvent.endPoint, 'localhost', 'endPoint in Pool.getConnection() spanEvent') + t.equal(actualSpanEvent.destinationId, 'test', 'destinationId in Pool.getConnection() spanEvent') + t.equal(actualSpanEvent.sequence, 1, 'sequence in Pool.getConnection() spanEvent') + t.equal(actualSpanEvent.depth, 1, 'depth in Pool.getConnection() spanEvent') + t.equal(actualSpanEvent.serviceType, mysqlServiceType.getCode(), 'serviceType in Pool.getConnection() spanEvent') + + actualBuilder = new MethodDescriptorBuilder2('query') + .setClassName('PoolConnection') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + actualSpanEvent = trace.span.spanEventList[2] + t.equal(actualSpanEvent.apiId, actualMethodDescriptor.apiId, 'apiId in PoolConnection.query() spanEvent') + t.equal(actualSpanEvent.sequence, 2, 'sequence in PoolConnection.query() spanEvent') + t.equal(actualSpanEvent.depth, 1, 'depth in PoolConnection.query() spanEvent') + t.equal(actualSpanEvent.serviceType, mysqlExecuteQueryServiceType.getCode(), 'serviceType in PoolConnection.query() spanEvent') + }) +}) + +test(`Cluster with query`, async (t) => { + agent.bindHttp() + const source = path.resolve(fixtures, 'mysql.sql') + const container = await new MySqlContainer() + .withCommand('--default-authentication-plugin=mysql_native_password') + .withEnvironment({ + 'MYSQL_DATABASE': 'test', + 'TX': 'Asia/Seoul', + }) + .withCopyFilesToContainer([{ + source: source, + target: '/docker-entrypoint-initdb.d/mysql.sql' + }]) + .start() + + const trace = agent.createTraceObject() + const poolCluster = mysqlp.createPoolCluster() + poolCluster.add('MASTER', { + host: container.getHost(), + port: container.getPort(), + database: 'test', + user: container.getUsername(), + password: container.getUserPassword(), + }) + poolCluster.add('SLAVE1', { + host: container.getHost(), + port: container.getPort(), + database: 'test', + user: container.getUsername(), + password: container.getUserPassword(), + }) + poolCluster.add('SLAVE2', { + host: container.getHost(), + port: container.getPort(), + database: 'test', + user: container.getUsername(), + password: container.getUserPassword(), + }) + const connection = await poolCluster.getConnection() + + const [results] = await connection.query(`SELECT * FROM member WHERE id = ?`, 'a') + t.equal(results[0].id, 'a', 'id in SELECT query hooking') + t.equal(results[0].name, 'name1', 'name in SELECT query hooking') + t.equal(results[0].joined.toISOString().slice(0, 10), '2023-01-17', 'joined in SELECT query hooking') + + agent.callbackTraceClose((trace) => { + let actualBuilder = new MethodDescriptorBuilder2('createPoolCluster') + .setLineNumber(545) + .setFileName('promise.js') + let actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + let actualSpanEvent = trace.span.spanEventList[0] + t.equal(actualSpanEvent.apiId, actualMethodDescriptor.apiId, 'apiId in createPoolCluster spanEvent') + t.equal(actualSpanEvent.sequence, 0, 'sequence in createPoolCluster spanEvent') + t.equal(actualSpanEvent.depth, 1, 'depth in createPoolCluster spanEvent') + t.equal(actualSpanEvent.serviceType, mysqlServiceType.getCode(), 'serviceType in createPoolCluster spanEvent') + + actualBuilder = new MethodDescriptorBuilder2('of') + .setLineNumber(169) + .setFileName('pool_cluster.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + actualSpanEvent = trace.span.spanEventList[1] + t.equal(actualSpanEvent.apiId, actualMethodDescriptor.apiId, 'apiId in PoolCluster.of() spanEvent') + t.equal(actualSpanEvent.sequence, 1, 'sequence in PoolCluster.of() spanEvent') + t.equal(actualSpanEvent.depth, 1, 'depth in PoolCluster.of() spanEvent') + t.equal(actualSpanEvent.serviceType, mysqlServiceType.getCode(), 'serviceType in PoolCluster.of() spanEvent') + + actualBuilder = new MethodDescriptorBuilder2('getConnection') + .setClassName('Pool') + .setLineNumber(177) + .setFileName('pool_cluster.js') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + actualSpanEvent = trace.span.spanEventList[2] + t.equal(actualSpanEvent.apiId, actualMethodDescriptor.apiId, 'apiId in Pool.getConnection() spanEvent') + t.equal(actualSpanEvent.sequence, 2, 'sequence in Pool.getConnection() spanEvent') + t.equal(actualSpanEvent.depth, 1, 'depth in Pool.getConnection() spanEvent') + t.equal(actualSpanEvent.serviceType, mysqlServiceType.getCode(), 'serviceType in Pool.getConnection() spanEvent') + + let actualSpanChunk = trace.storage.dataSender.mockSpanChunks[0] + t.equal(actualSpanChunk.spanId, actualSpanEvent.spanId, 'spanId in spanChunk in PoolCluster.getConnection()') + t.equal(actualSpanChunk.transactionIdObject, trace.traceId.transactionId, 'transactionIdObject in spanChunk in PoolCluster.getConnection()') + t.equal(actualSpanChunk.localAsyncId.asyncId, actualSpanEvent.nextAsyncId, 'localAsyncId asyncId in spanChunk in PoolCluster.getConnection()') + t.equal(actualSpanChunk.localAsyncId.sequence, 0, 'localAsyncId sequence in spanChunk in PoolCluster.getConnection()') + t.equal(actualSpanChunk.spanEventList[0].apiId, defaultPredefinedMethodDescriptorRegistry.asyncInvocationMethodDescriptor.apiId, 'apiId in spanChunk in PoolCluster.getConnection()') + t.equal(actualSpanChunk.spanEventList[0].sequence, 0, 'sequence in spanChunk in PoolCluster.getConnection()') + t.equal(actualSpanChunk.spanEventList[0].depth, 1, 'depth in spanChunk in PoolCluster.getConnection()') + t.equal(actualSpanChunk.spanEventList[0].serviceType, ServiceType.async.getCode(), 'serviceType in spanChunk in PoolCluster.getConnection()') + t.equal(actualSpanChunk.spanEventList[1].apiId, actualSpanEvent.apiId, 'apiId in spanChunk in PoolCluster.getConnection()') + t.equal(actualSpanChunk.spanEventList[1].sequence, 1, 'sequence in spanChunk in PoolCluster.getConnection()') + t.equal(actualSpanChunk.spanEventList[1].depth, 2, 'depth in spanChunk in PoolCluster.getConnection()') + t.equal(actualSpanChunk.spanEventList[1].serviceType, mysqlServiceType.getCode(), 'serviceType in spanChunk in PoolCluster.getConnection()') + + actualBuilder = new MethodDescriptorBuilder2('query') + .setClassName('PoolConnection') + actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) + actualSpanEvent = trace.span.spanEventList[3] + t.equal(actualSpanEvent.apiId, actualMethodDescriptor.apiId, 'apiId in PoolConnection.query() spanEvent') + t.equal(actualSpanEvent.sequence, 3, 'sequence in PoolConnection.query() spanEvent') + t.equal(actualSpanEvent.depth, 1, 'depth in PoolConnection.query() spanEvent') + t.equal(actualSpanEvent.serviceType, mysqlExecuteQueryServiceType.getCode(), 'serviceType in PoolConnection.query() spanEvent') + + actualSpanChunk = trace.storage.dataSender.mockSpanChunks[1] + t.equal(actualSpanChunk.spanId, actualSpanEvent.spanId, 'spanId in spanChunk in PoolConnection.query()') + t.equal(actualSpanChunk.transactionIdObject, trace.traceId.transactionId, 'transactionIdObject in spanChunk in PoolConnection.query()') + t.equal(actualSpanChunk.localAsyncId.asyncId, actualSpanEvent.nextAsyncId, 'localAsyncId asyncId in spanChunk in PoolConnection.query()') + t.equal(actualSpanChunk.localAsyncId.sequence, 0, 'localAsyncId sequence in spanChunk in PoolConnection.query()') + t.equal(actualSpanChunk.spanEventList[0].apiId, defaultPredefinedMethodDescriptorRegistry.asyncInvocationMethodDescriptor.apiId, 'apiId in spanChunk in PoolConnection.query()') + t.equal(actualSpanChunk.spanEventList[0].sequence, 0, 'sequence in spanChunk in PoolConnection.query()') + t.equal(actualSpanChunk.spanEventList[0].depth, 1, 'depth in spanChunk in PoolConnection.query()') + t.equal(actualSpanChunk.spanEventList[0].serviceType, ServiceType.async.getCode(), 'serviceType in spanChunk in PoolConnection.query()') + t.equal(actualSpanChunk.spanEventList[1].apiId, actualSpanEvent.apiId, 'apiId in spanChunk in PoolConnection.query()') + t.equal(actualSpanChunk.spanEventList[1].sequence, 1, 'sequence in spanChunk in PoolConnection.query()') + t.equal(actualSpanChunk.spanEventList[1].depth, 2, 'depth in spanChunk in PoolConnection.query()') + t.equal(actualSpanChunk.spanEventList[1].serviceType, mysqlExecuteQueryServiceType.getCode(), 'serviceType in spanChunk in PoolConnection.query()') + }) + + setImmediate(() => { + trace.close() + connection.release() + container.stop() + t.end() + }) +}) \ No newline at end of file diff --git a/test/instrumentation/sql/sql-parser.test.js b/test/instrumentation/sql/sql-parser.test.js new file mode 100644 index 00000000..15b112ce --- /dev/null +++ b/test/instrumentation/sql/sql-parser.test.js @@ -0,0 +1,56 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2023-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const test = require('tape') +const SqlParser = require('../../../lib/instrumentation/sql/sql-parser') + +test(`normalized`, async (t) => { + let normalizedSql = SqlParser.normalizedSql(`select * from table a = 1 and b=50 and c=? and d='11'`) + // t.equal(normalizedSql.normalizedSql, `select * from table a = 0# and b=1# and c=? and d='2$'`) + t.equal(normalizedSql.parseParameter, `1,50,11`) + + normalizedSql = SqlParser.normalizedSql(`-- comment`) + t.equal(normalizedSql.normalizedSql, `-- comment`) + + normalizedSql = SqlParser.normalizedSql(`-`) + t.equal(normalizedSql.normalizedSql, `-`) + + normalizedSql = SqlParser.normalizedSql(`select * from table a = 1 and b=50 and c=? and d='11'`) + t.equal(normalizedSql.normalizedSql, `select * from table a = 0# and b=1# and c=? and d='2$'`) + t.equal(normalizedSql.parseParameter, `1,50,11`) + + normalizedSql = SqlParser.normalizedSql(`select * from table a = -1 and b=-50 and c=? and d='-11'`) + t.equal(normalizedSql.normalizedSql, `select * from table a = -0# and b=-1# and c=? and d='2$'`) + t.equal(normalizedSql.parseParameter, `1,50,-11`) + + normalizedSql = SqlParser.normalizedSql(`select * from table a = +1 and b=+50 and c=? and d='+11'`) + t.equal(normalizedSql.normalizedSql, `select * from table a = +0# and b=+1# and c=? and d='2$'`) + t.equal(normalizedSql.parseParameter, `1,50,+11`) + + normalizedSql = SqlParser.normalizedSql(`select * from table a = 1/*test*/ and b=50/*test*/ and c=? and d='11'`) + t.equal(normalizedSql.normalizedSql, `select * from table a = 0#/*test*/ and b=1#/*test*/ and c=? and d='2$'`) + t.equal(normalizedSql.parseParameter, `1,50,11`) + + normalizedSql = SqlParser.normalizedSql(`select a.ZIPCODE,a.CITY from ZIPCODE as a`) + t.equal(normalizedSql.normalizedSql, `select a.ZIPCODE,a.CITY from ZIPCODE as a`) + t.equal(normalizedSql.parseParameter, ``) + + normalizedSql = SqlParser.normalizedSql(`select ZIPCODE,123 from ZIPCODE`) + t.equal(normalizedSql.normalizedSql, `select ZIPCODE,0# from ZIPCODE`) + t.equal(normalizedSql.parseParameter, `123`) + + normalizedSql = SqlParser.normalizedSql(`select ZIPCODE,123.123 from ZIPCODE`) + t.equal(normalizedSql.normalizedSql, `select ZIPCODE,0# from ZIPCODE`) + t.equal(normalizedSql.parseParameter, `123.123`) + + normalizedSql = SqlParser.normalizedSql(`SELECT * from table a=123 and b='abc' and c=1-3`) + t.equal(normalizedSql.normalizedSql, `SELECT * from table a=0# and b='1$' and c=2#-3#`) + t.equal(normalizedSql.parseParameter, `123,abc,1,3`) + + t.end() +}) diff --git a/test/support/agent-singleton-mock.js b/test/support/agent-singleton-mock.js index b7f30399..aa815e2a 100644 --- a/test/support/agent-singleton-mock.js +++ b/test/support/agent-singleton-mock.js @@ -17,6 +17,8 @@ const httpShared = require('../../lib/instrumentation/http-shared') const traceContext = require('../../lib/context/trace-context') const contextManager = require('../../lib/context/context-manager') const activeTrace = require('../../lib/metric/active-trace') +const apiMetaService = require('../../lib/context/api-meta-service') +const { setDataSender } = require('../../lib/client/data-sender-factory') class MockAgent extends Agent { startSchedule(agentId, agentStartTime) { @@ -31,6 +33,7 @@ class MockAgent extends Agent { bindHttp(json) { this.cleanHttp() + apiMetaService.init(dataSenderMock()) if (!json) { json = require('../pinpoint-config-test') @@ -43,7 +46,7 @@ class MockAgent extends Agent { const http = require('http') log.debug('shimming http.Server.prototype.emit function') shimmer.wrap(http && http.Server && http.Server.prototype, 'emit', httpShared.instrumentRequest(agent, 'http')) - + log.debug('shimming http.request function') shimmer.wrap(http, 'request', httpShared.traceOutgoingRequest(agent, 'http')) @@ -54,6 +57,9 @@ class MockAgent extends Agent { traceSet.add(trace) } for (const trace of traceSet) { + if (typeof trace.completed === 'function' && trace.completed()) { + continue + } this.traceContext.completeTraceObject(trace) } @@ -66,18 +72,25 @@ class MockAgent extends Agent { }) this.dataSender = dataSenderMock() + setDataSender(this.dataSender) this.traceContext = traceContext.init(this.agentInfo, this.dataSender, this.config) } - cleanHttp() { + cleanHttp() { const http = require('http') shimmer.unwrap(http && http.Server && http.Server.prototype, 'emit') shimmer.unwrap(http, 'request') } - resetAgent(callback) { - this.pinpointClient = new MockPinpointClient(this.config, this.agentInfo, this.dataSender) + callbackTraceClose(callback) { + const trace = this.traceContext.currentTraceObject() + const origin = trace.close + trace.close = () => { + origin.apply(trace, arguments) + callback(trace) + } } + } const agent = new MockAgent(fixture.config) diff --git a/test/support/data-sender-mock.js b/test/support/data-sender-mock.js index 362a010f..1c37a6f5 100644 --- a/test/support/data-sender-mock.js +++ b/test/support/data-sender-mock.js @@ -18,24 +18,29 @@ const Span = require('../../lib/context/span') const SpanChunk = require('../../lib/context/span-chunk') const DataSender = require('../../lib/client/data-sender') const MockgRPCDataSender = require('../client/mock-grpc-data-sender') +const SqlMetaData = require('../../lib/client/sql-meta-data') class MockDataSender extends DataSender { + constructor(config, dataSender) { + super(config, dataSender) + this.mockAPIMetaInfos = [] + this.mockSpanChunks = [] + } + send(data) { + super.send(data) if (data instanceof AgentInfo) { this.mockAgentInfo = data - this.dataSender.sendAgentInfo(data) } else if (data instanceof ApiMetaInfo) { - this.mockAPIMetaInfo = data - this.dataSender.sendApiMetaInfo(data) + this.mockAPIMetaInfos.push(data) } else if (data instanceof StringMetaInfo) { this.mockMetaInfo = data - this.dataSender.sendStringMetaInfo(data) } else if (data instanceof Span) { this.mockSpan = data - this.dataSender.sendSpan(data) } else if (data instanceof SpanChunk) { - this.mockSpanChunk = data - this.dataSender.sendSpanChunk(data) + this.mockSpanChunks.push(data) + } else if (data instanceof SqlMetaData) { + this.mockSqlMetaData = data } } } diff --git a/test/utils/ant-path-matcher.test.js b/test/utils/ant-path-matcher.test.js index d96f77b4..2d8cc235 100644 --- a/test/utils/ant-path-matcher.test.js +++ b/test/utils/ant-path-matcher.test.js @@ -316,7 +316,7 @@ test('map insertion order learning test', (t) => { map1.delete(1) t.equal(map1.size, 1) - iterator1 = map1[Symbol.iterator](); + iterator1 = map1[Symbol.iterator]() index = 0 for (const item of iterator1) { if (index == 0) { diff --git a/test/utils/log/logger-output-adaptor.test.js b/test/utils/log/logger-output-adaptor.test.js new file mode 100644 index 00000000..fae55f65 --- /dev/null +++ b/test/utils/log/logger-output-adaptor.test.js @@ -0,0 +1,118 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2020-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const test = require('tape') +const LoggerOutputAdaptor = require('../../../lib/utils/log/logger-output-adaptor') + +test('Adaptor method duck typing validation', (t) => { + let actual = new LoggerOutputAdaptor(Object.assign({}, { + debug: function (message) { + this.actualMessage = message + } + })) + actual.debug('message') + t.equal(actual.output.actualMessage, 'message') + + actual = new LoggerOutputAdaptor(Object.assign({}, { + info: function (message) { + this.actualMessage = message + } + })) + actual.info('message2') + t.equal(actual.output.actualMessage, 'message2') + + actual = new LoggerOutputAdaptor(Object.assign({}, { + warn: function (message) { + this.actualMessage = message + } + })) + actual.warn('message3') + t.equal(actual.output.actualMessage, 'message3') + + actual = new LoggerOutputAdaptor(Object.assign({}, { + error: function (message) { + this.actualMessage = message + } + })) + actual.error('message4') + t.equal(actual.output.actualMessage, 'message4') + + t.end() +}) + +test('error message', (t) => { + const error = { + error: function () { + } + } + let actualUnsafe = new LoggerOutputAdaptor(Object.assign({ + debug: function (message) { + this.debugMessage = message + } + }, error)) + actualUnsafe.debug('debug message') + t.equal(actualUnsafe.output.debugMessage, 'debug message', 'this.output.debug is undefined') + + actualUnsafe = new LoggerOutputAdaptor(Object.assign({ + info: function (message) { + this.infoMessage = message + } + }, error)) + actualUnsafe.info('info message') + t.equal(actualUnsafe.output.infoMessage, 'info message', 'this.output.info is undefined') + + actualUnsafe = new LoggerOutputAdaptor(Object.assign({ + warn: function (message) { + this.warnMessage = message + } + }, error)) + actualUnsafe.warn('warn message') + t.equal(actualUnsafe.output.warnMessage, 'warn message', 'this.output.warn is undefined') + + actualUnsafe = new LoggerOutputAdaptor({}) + Object.defineProperty(actualUnsafe, "console", { + get: function () { + return { + error: function (message) { + actualUnsafe.errorMessage = message + } + } + } + }) + actualUnsafe.error('message') + t.equal(actualUnsafe.errorMessage, 'The Adaptor doesn\'t has the error function.', 'Adaptor function not defined error message') + t.false(actualUnsafe.output.error, 'this.output.error is undefined') + + t.end() +}) + +test('error message without error method', (t) => { + let actual = new LoggerOutputAdaptor({}) + Object.defineProperty(actual, "console", { + get: function () { + return { + error: function (message) { + actual.errorMessage = message + } + } + } + }) + + actual.debug('debug message') + t.equal(actual.errorMessage, 'The Adaptor doesn\'t has the debug function.', 'debug console log') + + actual.info('info message') + t.equal(actual.errorMessage, 'The Adaptor doesn\'t has the info function.', 'info console message') + + actual.warn('warn message') + t.equal(actual.errorMessage, 'The Adaptor doesn\'t has the warn function.', 'warn console log') + + actual.error('error message') + t.equal(actual.errorMessage, 'The Adaptor doesn\'t has the error function.', 'error console message') + t.end() +}) \ No newline at end of file diff --git a/test/utils/log/logger.integration.test.js b/test/utils/log/logger.integration.test.js new file mode 100644 index 00000000..8ac3795c --- /dev/null +++ b/test/utils/log/logger.integration.test.js @@ -0,0 +1,57 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2022-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' +const test = require('tape') +const { getLog, setLog } = require('../../../lib/supports') +const Agent = require('../../../lib/agent') +const { clear, getConfig } = require('../../../lib/config') + +test('no config logger', (t) => { + clear() + setLog(null) + const actual = getLog() + new Agent() + t.equal(actual.adaptor.constructor.name, 'LoggerOutputAdaptor', 'log adaptor') + t.equal(actual.type.name, 'NONE', 'when first loading time, log type is NONE') + + actual.adaptor.output.output = { + debug: function (message) { + this.debugMessage = message + }, + info: function (message) { + this.infoMessage = message + }, + warn: function (message) { + this.warnMessage = message + }, + error: function (message) { + this.errorMessage = message + } + } + actual.debug('a debug message') + actual.info('a info message') + actual.warn('a warn message') + actual.error('a error message') + t.equal(actual.adaptor.output.output.debugMessage, 'a debug message', 'debug queue message') + t.equal(actual.adaptor.output.output.infoMessage, 'a info message', 'info queue message') + t.equal(actual.adaptor.output.output.warnMessage, 'a warn message', 'warn queue message') + t.equal(actual.adaptor.output.output.errorMessage, 'a error message', 'error queue message') + t.end() +}) + +test('logger full cycle', (t) => { + clear() + setLog(null) + let actual = getLog() + t.true(actual.adaptor.output.output === console, 'when no configuration loaded, logs use console output') + getConfig() + + actual = getLog() + t.equal(actual.adaptor.output.log.constructor.name, 'Logger', 'default logger use LogLevel') + t.equal(actual.adaptor.output.log.getLevel(), 3, 'configuration log level from pinpoint-node-agent.json') + t.end() +}) \ No newline at end of file diff --git a/test/utils/log/logger.test.js b/test/utils/log/logger.test.js new file mode 100644 index 00000000..fdfca3a8 --- /dev/null +++ b/test/utils/log/logger.test.js @@ -0,0 +1,75 @@ +/** + * Pinpoint Node.js Agent + * Copyright 2020-present NAVER Corp. + * Apache License v2.0 + */ + +'use strict' + +const test = require('tape') +const log = require('../../../lib/utils/logger') +const Logger = require('../../../lib/utils/log/logger2') + +test('isDebug', (t) => { + t.plan(3) + log.init() + t.equal(log.isDebug(), false, 'debug null') + + log.init("DEBUG") + t.equal(log.isDebug(), true, 'debug') + t.equal(log.isInfo(), false, 'info false') +}) + +test('isInfo', (t) => { + log.logger = null + + t.plan(3) + t.equal(log.isInfo(), false, 'info null') + + log.init("INFO") + t.equal(log.isInfo(), true, 'info') + t.equal(log.isDebug(), false, 'debug false') +}) + +test('Logger.Builder', (t) => { + const expectedAdaptor = {} + + let actual = new Logger.DebugBuilder(expectedAdaptor).build() + t.equal(actual.type.name, 'DEBUG', 'debug name match') + t.true(actual.adaptor.output === expectedAdaptor, 'adaptor member variable') + t.true(actual.isDebug(), 'Debug Log check') + + actual = new Logger.InfoBuilder(expectedAdaptor).build() + t.equal(actual.type.name, 'INFO', 'info name match') + t.true(actual.adaptor.output === expectedAdaptor, 'adaptor member variable') + t.true(actual.isInfo(), 'Info log check') + + actual = new Logger.WarnBuilder(expectedAdaptor).build() + t.equal(actual.type.name, 'WARN', 'warn name match') + t.true(actual.adaptor.output === expectedAdaptor, 'adaptor member variable') + + actual = new Logger.ErrorBuilder(expectedAdaptor).build() + t.equal(actual.type.name, 'ERROR', 'error name match') + t.true(actual.adaptor.output === expectedAdaptor, 'adaptor member variable') + + actual = new Logger.NoneBuilder(expectedAdaptor).build() + t.equal(actual.type.name, 'NONE', 'none name match') + + t.end() +}) + +test('Logger by a log level', (t) => { + let actual = Logger.makeBuilder('debug', {}).build() + t.equal(actual.type.name, 'DEBUG') + + actual = Logger.makeBuilder('info', {}).build() + t.equal(actual.type.name, 'INFO') + + actual = Logger.makeBuilder('warn', {}).build() + t.equal(actual.type.name, 'WARN') + + actual = Logger.makeBuilder('error', {}).build() + t.equal(actual.type.name, 'ERROR') + + t.end() +}) \ No newline at end of file diff --git a/test/utils/logger.test.js b/test/utils/logger.test.js deleted file mode 100644 index 5344220d..00000000 --- a/test/utils/logger.test.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Pinpoint Node.js Agent - * Copyright 2020-present NAVER Corp. - * Apache License v2.0 - */ - -'use strict' - -const test = require('tape') -const log = require('../../lib/utils/logger') - -test('isDebug', (t) => { - t.plan(3) - log.init() - t.equal(log.isDebug(), false, 'debug null') - - log.init("DEBUG") - t.equal(log.isDebug(), true, 'debug') - t.equal(log.isInfo(), false, 'info false') -}) - -test('isInfo', (t) => { - log.logger = null - - t.plan(3) - t.equal(log.isInfo(), false, 'info null') - - log.init("INFO") - t.equal(log.isInfo(), true, 'info') - t.equal(log.isDebug(), false, 'debug false') -}) \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..b592deea --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + // Tells TypeScript to read JS files, as + // normally they are ignored as source files + "allowJs": true, + // Generate d.ts files + "declaration": true, + // This compiler run should + // only output d.ts files + // "emitDeclarationOnly": true, + // Types should go into this directory. + // Removing this would place the .d.ts files + // next to the .js files + "outDir": "dist", + // go to js file when using IDE functions like + // "Go to Definition" in VSCode + "declarationMap": true + }, + // Change this to match your project + "include": [ + "lib/**/*", "index.js" + ] +} \ No newline at end of file