From 51e92eaaacd617d82211de9003305dac271ec977 Mon Sep 17 00:00:00 2001 From: gvensan Date: Fri, 22 Aug 2025 10:52:54 +0530 Subject: [PATCH 1/6] Migration from nunjucks to react-sdk for code generation Broadly, the code changes covers the following: - Efficient schema handling and class generation (for both JSON and AVRO) - Support for complex JSON and AVRO schema (inheritences, nested objects and complex schema settings) - Support for schema settings around field formats, constraints etc - Proper binder configuration (for Solace, Kafka and RabbitMQ) - Solace-specific: Queue/Topic handing in the binding configuration - Revamped integration.test with support scripts for generating code from asyncapi files in mocks and compiling the generated code, generate report - Support for all the template parameters and x-* custom overrides --- .gitignore | 5 +- README.md | 117 +- components/Application.js | 951 + components/ApplicationYml.js | 423 + components/ModelClass.js | 1072 + components/PomXml.js | 524 + components/Readme.js | 637 + filters/all.js | 1084 - hooks/post-process.js | 512 +- hooks/pre-process.js | 314 +- lib/applicationModel.js | 172 - lib/modelClass.js | 49 - lib/scsLib.js | 159 - package-lock.json | 23097 +++++----------- package.json | 92 +- partials/all-args-constructor | 30 - partials/java-class | 90 - partials/java-package | 8 - template/README.md | 6 - template/index.js | 214 + template/pom.app | 89 - template/pom.lib | 40 - template/src/main/java/$$everySchema$$.java | 8 - template/src/main/java/Application.java | 177 - template/src/main/resources/application.yml | 1 - test/__snapshots__/integration.test.js.snap | 3064 -- test/compile_output.sh | 276 + test/generate_code_for_mocks.js | 163 + test/generate_output.sh | 287 + test/integration.test.js | 700 +- .../animals-same-function-name.yaml | 2 +- test/mocks/avro-complex-test.yaml | 63 + .../dynamic-topic-same-function-name.yaml | 0 test/mocks/function-name-test.yaml | 72 + test/mocks/multivariable-topic-2.6.yaml | 79 + test/mocks/multivariable-topic.yaml | 32 +- test/mocks/no-payload-message.yaml | 34 + test/mocks/parameters-to-headers-test.yaml | 100 + test/mocks/primitive-types-test.yaml | 39 + test/mocks/schema-with-array-of-objects.yaml | 4 +- test/mocks/schemas-with-duplicate-$ids.yaml | 24 - test/mocks/simple-test.yaml | 14 + .../smarty-lighting-streetlights-check.yaml | 229 + test/mocks/solace-core-banking-v1.json | 483 + test/mocks/solace-core-banking-v2.json | 435 + .../solace-customer-facing-mobile-app-v1.json | 341 + .../solace-customer-facing-mobile-app-v2.json | 331 + .../solace-customer-fraud-prevention.json | 123 + .../solace-customer-loyalty-management.json | 392 + ...ata-product-daily-store-sales-summary.json | 218 + ...-product-real-time-customer-sentiment.json | 412 + ...-store-fulfillment-mobile-application.json | 342 + test/mocks/solace-logistics.json | 716 + .../mocks/solace-loyalty-program-manager.json | 221 + test/mocks/solace-order-management-v1.json | 576 + test/mocks/solace-order-management-v2.json | 587 + test/mocks/solace-payment-processor.json | 1 + test/mocks/solace-point-of-sale-system.json | 458 + .../solace-smart-shelf-inventory-control.json | 164 + utils/asyncApiProcessor.js | 6 + utils/avroProcessor/avroProcessor.js | 918 + utils/avroProcessor/avroSchemaModel.js | 317 + utils/avroProcessor/index.js | 516 + utils/coreProcessor.js | 1433 + utils/functionUtils.js | 1039 + utils/jsonProcessor/index.js | 1015 + utils/jsonProcessor/jsonProcessor.js | 207 + utils/jsonProcessor/jsonSchemaModel.js | 356 + utils/logger.js | 139 + utils/typeUtils.js | 303 + 70 files changed, 26226 insertions(+), 20876 deletions(-) create mode 100644 components/Application.js create mode 100644 components/ApplicationYml.js create mode 100644 components/ModelClass.js create mode 100644 components/PomXml.js create mode 100644 components/Readme.js delete mode 100644 filters/all.js delete mode 100644 lib/applicationModel.js delete mode 100644 lib/modelClass.js delete mode 100644 lib/scsLib.js delete mode 100644 partials/all-args-constructor delete mode 100644 partials/java-class delete mode 100644 partials/java-package delete mode 100644 template/README.md create mode 100644 template/index.js delete mode 100644 template/pom.app delete mode 100644 template/pom.lib delete mode 100644 template/src/main/java/$$everySchema$$.java delete mode 100644 template/src/main/java/Application.java delete mode 100644 template/src/main/resources/application.yml delete mode 100644 test/__snapshots__/integration.test.js.snap create mode 100755 test/compile_output.sh create mode 100644 test/generate_code_for_mocks.js create mode 100755 test/generate_output.sh rename test/mocks/{scs-function-name => }/animals-same-function-name.yaml (97%) create mode 100644 test/mocks/avro-complex-test.yaml rename test/mocks/{scs-function-name => }/dynamic-topic-same-function-name.yaml (100%) create mode 100644 test/mocks/function-name-test.yaml create mode 100644 test/mocks/multivariable-topic-2.6.yaml create mode 100644 test/mocks/no-payload-message.yaml create mode 100644 test/mocks/parameters-to-headers-test.yaml create mode 100644 test/mocks/primitive-types-test.yaml create mode 100644 test/mocks/simple-test.yaml create mode 100644 test/mocks/smarty-lighting-streetlights-check.yaml create mode 100644 test/mocks/solace-core-banking-v1.json create mode 100644 test/mocks/solace-core-banking-v2.json create mode 100644 test/mocks/solace-customer-facing-mobile-app-v1.json create mode 100644 test/mocks/solace-customer-facing-mobile-app-v2.json create mode 100644 test/mocks/solace-customer-fraud-prevention.json create mode 100644 test/mocks/solace-customer-loyalty-management.json create mode 100644 test/mocks/solace-data-product-daily-store-sales-summary.json create mode 100644 test/mocks/solace-data-product-real-time-customer-sentiment.json create mode 100644 test/mocks/solace-in-store-fulfillment-mobile-application.json create mode 100644 test/mocks/solace-logistics.json create mode 100644 test/mocks/solace-loyalty-program-manager.json create mode 100644 test/mocks/solace-order-management-v1.json create mode 100644 test/mocks/solace-order-management-v2.json create mode 100644 test/mocks/solace-payment-processor.json create mode 100644 test/mocks/solace-point-of-sale-system.json create mode 100644 test/mocks/solace-smart-shelf-inventory-control.json create mode 100644 utils/asyncApiProcessor.js create mode 100644 utils/avroProcessor/avroProcessor.js create mode 100644 utils/avroProcessor/avroSchemaModel.js create mode 100644 utils/avroProcessor/index.js create mode 100644 utils/coreProcessor.js create mode 100644 utils/functionUtils.js create mode 100644 utils/jsonProcessor/index.js create mode 100644 utils/jsonProcessor/jsonProcessor.js create mode 100644 utils/jsonProcessor/jsonSchemaModel.js create mode 100644 utils/logger.js create mode 100644 utils/typeUtils.js diff --git a/.gitignore b/.gitignore index 87cb2625..9181fff1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ node_modules test/temp +test/output coverage **/.DS_Store -**/.vscode \ No newline at end of file +**/.vscode +__transpiled +**/__transpiled diff --git a/README.md b/README.md index db28f620..00c16b77 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,30 @@ Note that this template ignores the 'Servers' section of AsyncAPI documents. The ## Technical requirements -- 1.9.4 =< [Generator](https://github.com/asyncapi/generator/) +- >=2.0.0 <=3.3.0 [Generator](https://github.com/asyncapi/generator/) - Generator specific [requirements](https://github.com/asyncapi/generator/#requirements) +- Java 17 or higher (required for Spring Boot 3.4.4+) +- Maven 3.6+ (for building generated projects) + +## Version Compatibility + +This template has been tested and verified with the following version combinations: + +### Recommended Version Matrix +| Component | Version | Notes | +|-----------|---------|-------| +| Spring Boot | 3.4.4+ | Required for Spring Cloud 2024.0.0 compatibility | +| Spring Cloud | 2024.0.0 | Latest stable release | +| Spring Cloud Stream | 3.1.3 | Compatible with Spring Cloud 2024.0.0 | +| Kafka Binder | 4.2.0 | Must match Spring Cloud Stream version | +| RabbitMQ Binder | 4.2.0 | Must match Spring Cloud Stream version | +| Solace Binder | 4.8.0 | Compatible with Spring Cloud 2024.0.0 | + +### Important Compatibility Notes +- **Spring Boot 2.x is not supported** with Spring Cloud 2024.0.0 +- **Spring Boot 3.1.0** may cause compatibility issues with Spring Cloud Stream 4.2.0 +- All binder versions should match the Spring Cloud Stream version for optimal compatibility +- Use Spring Boot 3.4.4 or later to avoid `NoSuchMethodError` issues ## Specification Conformance Note that this template interprets the AsyncAPI document in conformance with the [AsyncAPI Specification](https://www.asyncapi.com/docs/specifications/2.0.0/). @@ -60,14 +82,28 @@ Doing that allows you to have a clean separation between the generated code and 2. Run the Generator using the Java Spring Cloud Stream Template ``` - ag ~/AsyncApiDocument.yaml @asyncapi/java-spring-cloud-stream-template + npx @asyncapi/generator ~/AsyncApiDocument.yaml @asyncapi/java-spring-cloud-stream-template ``` 3. Run the Generator using the Java Spring Cloud Stream Template with Parameters ``` - ag -p binder=solace -p artifactId=ExampleArtifactId -p groupId=com.example -p javaPackage=com.example.foo -p solaceSpringCloudVersion=1.0.0 -p springCloudStreamVersion=Horsham.SR3 -p springCloudVersion=Hoxton.SR3 ~/AsyncApiDocument.yaml @asyncapi/java-spring-cloud-stream-template + npx @asyncapi/generator -p binder=solace -p artifactId=ExampleArtifactId -p groupId=com.example -p javaPackage=com.example.foo -p springBootVersion=3.4.4 -p springCloudVersion=2024.0.0 -p solaceSpringCloudVersion=4.8.0 ~/AsyncApiDocument.yaml @asyncapi/java-spring-cloud-stream-template ``` +**Note:** The `ag` command is deprecated. Use `npx @asyncapi/generator` instead for better compatibility with current generator versions. + +### CLI Compatibility Note + +The AsyncAPI CLI (`asyncapi` command) may use an older bundled generator version that's incompatible with this template. If you encounter version compatibility errors, use `npx @asyncapi/generator` instead: + +```bash +# ❌ May fail due to version incompatibility +asyncapi generate fromTemplate document.yaml @asyncapi/java-spring-cloud-stream-template + +# βœ… Recommended approach +npx @asyncapi/generator document.yaml @asyncapi/java-spring-cloud-stream-template +``` + ## Configuration Options Please note that none of the parameters or specification extensions is required. All parameters have defaults as documented below. @@ -92,24 +128,31 @@ Parameters can be passed to the generator using command line arguments in the fo Parameter | Extension | Default | Description ----------|-----------|---------|--- actuator | | false | If true, it adds the dependencies for spring-boot-starter-web, spring-boot-starter-actuator and micrometer-registry-prometheus. -artifactId | info.x-artifact-id | project-name | The Maven artifact id. +artifactId | info.x-artifact-id | project-name | The Maven artifact id. Alternatively you can set the specification extension info.x-artifact-id. artifactType | | application | The type of project to generate, application or library. When generating an application, the pom.xml file will contain the complete set of dependencies required to run an app, and it will contain an Application class with a main function. Otherwise the pom file will include only the dependencies required to compile a library. binder | | kafka | The name of the binder implementation, one of kafka, rabbit or solace. Default: kafka. If you need other binders to be supported, please let us know! dynamicType | | streamBridge | If you publish to a channel with parameters, i.e. a topic that can change with every message, the standard way to do this is to use StreamBridge. But some binders such as Solace can do the dynamic routing using just a message header. If you use such a binder, then you can set this value to 'header' and the generated code will set the topic on the header rather than use StreamBridge. -groupId | info.x-group-id | com.company | The Maven group id. -host | | tcp://localhost:55555 | The host connection property. Currently this only works with the Solace binder. When other binders are used this parameter is ignored. -javaPackage | info.x-java-package | | The Java package of the generated classes. If not set then the classes will be in the default package. +groupId | info.x-group-id | com.company | The Maven group id. Alternatively you can set the specification extension info.x-group-id. +host | | tcp://localhost:55554 | The host connection property. Currently this only works with the Solace binder. When other binders are used this parameter is ignored. +javaPackage | info.x-java-package | | The Java package of the generated classes. If not set then the classes will be in the default package. Alternatively you can set the specification extension info.x-java-package. msgVpn | | default | The message vpn connection property. Currently this only works with the Solace binder. When other binders are used this parameter is ignored. password | | default | The client password connection property. Currently this only works with the Solace binder. When other binders are used this parameter is ignored. parametersToHeaders | | false | If true, this will create headers on the incoming messages for each channel parameter. Currently this only works with messages originating from Solace (using the solace_destination header) and RabbitMQ (using the amqp_receivedRoutingKey header.) reactive | | false | If true, the generated functions will use the Reactive style and use the Flux class. -solaceSpringCloudVersion | info.x-solace-spring-cloud-version | 2.1.0 | The version of the solace-spring-cloud-bom dependency used when generating an application. -springBootVersion | info.x-spring-boot-version | 2.4.7 | The version of Spring Boot used when generating an application. -springCloudVersion | info.x-spring-cloud-version | 2020.0.3 | The version of the spring-cloud-dependencies BOM dependency used when generating an application. -springCloudStreamVersion | info.x-spring-cloud-stream-version | 3.1.3 | The version of the spring-cloud-stream dependency specified in the Maven file, when generating a library. When generating an application, the spring-cloud-dependencies BOM is used instead +kafkaSpringCloudVersion | info.x-kafka-spring-cloud-version | 4.2.0 | The version of the spring-cloud-stream-binder-kafka dependency used when generating an application with Kafka binder. Alternatively you can set the specification extension info.x-kafka-spring-cloud-version. +rabbitSpringCloudVersion | info.x-rabbit-spring-cloud-version | 4.2.0 | The version of the spring-cloud-stream-binder-rabbit dependency used when generating an application with RabbitMQ binder. Alternatively you can set the specification extension info.x-rabbit-spring-cloud-version. +solaceSpringCloudVersion | info.x-solace-spring-cloud-version | 4.8.0 | The version of the solace-spring-cloud-bom dependency used when generating an application. Alternatively you can set the specification extension info.x-solace-spring-cloud-version. +springBootVersion | info.x-spring-boot-version | 3.4.4 | The version of Spring Boot used when generating an application. Alternatively you can set the specification extension info.x-spring-boot-version. +springCloudVersion | info.x-spring-cloud-version | 2024.0.0 | The version of the spring-cloud-dependencies BOM dependency used when generating an application. Alternatively you can set the specification extension info.x-spring-cloud-version. +springCloudStreamVersion | info.x-spring-cloud-stream-version | 3.1.3 | The version of the spring-cloud-stream dependency specified in the Maven file, when generating a library. When generating an application, the spring-cloud-dependencies BOM is used instead. Alternatively you can set the specification extension info.x-spring-cloud-stream-version. username | | default | The client username connection property. Currently this only works with the Solace binder. When other binders are used this parameter is ignored. -view | info.x-view | client | By default, this template generates publisher code for subscribe operations and vice versa. You can switch this by setting this parameter to 'provider'. -useServers | | false | This parameter only works when the binder parameter is kafka. It takes all the urls under the server section and concatenates them to a set of brokers. +view | info.x-view | client | By default, this template generates publisher code for subscribe operations and vice versa. You can switch this by setting this parameter to 'provider'. Alternatively you can set the specification extension info.x-view. +useServers | | false | This parameter only works when the binder parameter is kafka. It takes all the urls under the server section and concatenates them to a set of brokers. Default: false. +kafkaBrokers | | localhost:9092 | Comma-separated list of Kafka broker addresses. Example: localhost:9092,localhost:9093. +rabbitHost | | localhost | RabbitMQ host address. +rabbitPort | | 5672 | RabbitMQ port number. +rabbitUsername | | guest | RabbitMQ username. +rabbitPassword | | guest | RabbitMQ password. ## Specification Extensions @@ -120,15 +163,50 @@ Extension | Parameter | Default | Description info.x-artifact-id | artifactId | project-name | The Maven artifact id. info.x-group-id | groupId | com.company | The Maven group id. info.x-java-package | javaPackage | | The Java package of the generated classes. If not set then the classes will be in the default package. -info.x-solace-spring-cloud-version | solaceSpringCloudVersion | 1.0.0 | The version of the solace-spring-cloud BOM dependency used when generating an application. -info.x-spring-boot-version | info.x-spring-boot-version | 2.2.6.RELEASE | The version of the Spring Boot used when generating an application. -info.x-spring-cloud-version | info.x-spring-cloud-version | Hoxton.SR3 | The version of the spring-cloud-dependencies BOM dependency used when generating an application. -info.x-spring-cloud-stream-version | springCloudStreamVersion | 3.0.3.RELEASE | The version of the spring-cloud-stream dependency specified in the Maven file, when generating a library. When generating an application, the spring-cloud-dependencies BOM is used instead. +info.x-kafka-spring-cloud-version | kafkaSpringCloudVersion | 4.2.0 | The version of the spring-cloud-stream-binder-kafka dependency used when generating an application with Kafka binder. +info.x-rabbit-spring-cloud-version | rabbitSpringCloudVersion | 4.2.0 | The version of the spring-cloud-stream-binder-rabbit dependency used when generating an application with RabbitMQ binder. +info.x-solace-spring-cloud-version | solaceSpringCloudVersion | 4.8.0 | The version of the solace-spring-cloud BOM dependency used when generating an application. +info.x-spring-boot-version | info.x-spring-boot-version | 3.4.4 | The version of the Spring Boot used when generating an application. +info.x-spring-cloud-version | springCloudVersion | 2024.0.0 | The version of the spring-cloud-dependencies BOM dependency used when generating an application. +info.x-spring-cloud-stream-version | springCloudStreamVersion | 3.1.3 | The version of the spring-cloud-stream dependency specified in the Maven file, when generating a library. When generating an application, the spring-cloud-dependencies BOM is used instead. info.x-view | view | client | By default, this template generates publisher code for subscribe operations and vice versa. You can switch this by setting this parameter to 'provider'. operation.x-scs-function-name | | | This specifies the base function name to use on a publish or subscribe operation. If the same name is used on one subscribe operation and one publish operation, a processor function will be generated. channel.subscription.x-scs-destination | | | This overrides the destination on an incoming binding. It can be used to specify, for example, the name of a queue to subscribe to instead of a topic. channel.subscription.x-scs-group | | | This is used to specify the group property of an incoming binding. +## Troubleshooting + +### Common Issues + +#### NoSuchMethodError with Spring Integration +If you encounter errors like: +``` +java.lang.NoSuchMethodError: org/springframework/integration/support/MessageBuilder.removeHeader +``` + +**Solution:** Ensure you're using Spring Boot 3.4.4 or later. This error occurs when using older Spring Boot versions (like 3.1.0) with Spring Cloud 2024.0.0. + +#### Version Compatibility Issues +If you experience dependency conflicts or runtime errors: + +1. **Check Spring Boot Version:** Ensure you're using Spring Boot 3.4.4+ +2. **Verify Binder Versions:** Kafka and RabbitMQ binders should use version 4.2.0 +3. **Update AsyncAPI Extensions:** Remove any `x-spring-boot-version` extensions that specify versions below 3.4.4 + +#### Generator Version Compatibility Issues +If you encounter errors like: +``` +Error: This template is not compatible with the current version of the generator (1.17.25). +This template is compatible with the following version range: >=2.0.0 <=3.3.0. +``` + +**Solution:** Use `npx @asyncapi/generator` instead of `asyncapi generate` or `ag` commands. The CLI may use an older bundled generator version that's incompatible with this template. + +#### Binder-Specific Issues +- **Kafka:** Ensure `kafkaSpringCloudVersion` is set to 4.2.0 +- **RabbitMQ:** Ensure `rabbitSpringCloudVersion` is set to 4.2.0 +- **Solace:** Ensure `solaceSpringCloudVersion` is set to 4.8.0 + ## Development This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind are welcome! @@ -144,12 +222,11 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d - + + - -

Michael Davis

πŸ’» πŸ“– πŸ‘€ πŸ’¬

Giri Venkatesan

πŸ’»

Michael Davis

πŸ’» πŸ“– πŸ‘€ πŸ’¬

Marc DiPasquale

πŸ“–

Fran MΓ©ndez

πŸ’» πŸš‡

Lukasz Gornicki

πŸš‡ πŸ’»

blzsaa

πŸ’»
diff --git a/components/Application.js b/components/Application.js new file mode 100644 index 00000000..2dead9b5 --- /dev/null +++ b/components/Application.js @@ -0,0 +1,951 @@ +const React = require('react'); +const { Text } = require('@asyncapi/generator-react-sdk'); +const { logger } = require('../utils/logger'); +const { toPascalCase } = require('../utils/typeUtils'); + +/** + * Convert channel path to method name + * Transforms channel paths to PascalCase method names + * Example: 'company/service/operation/v1/{param1}/{param2}' + * to 'CompanyServiceOperationV1Param1Param2' + */ +function toMethodName(str) { + logger.debug('Application.js: toMethodName() - Converting channel path to method name'); + if (!str) return ''; + + // Remove curly braces first + let cleaned = str.replace(/([{}])/g, ''); + + // Split by slashes to handle channel path structure + const segments = cleaned.split('/'); + + return segments.map(segment => { + if (!segment) return ''; + + // Handle version numbers (v1, v2, v3, v10, v2.1, etc.) + if (segment.toLowerCase().match(/^v\d+(\.\d+)*$/)) { + return segment.toUpperCase(); + } + + // Handle camelCase parameters (e.g., 'userId' -> 'UserId') + if (segment.match(/^[a-z]+[A-Z][A-Z]/)) { + return segment.charAt(0).toUpperCase() + segment.slice(1).replace(/([A-Z])([A-Z])/, (match, p1, p2) => { + return p1 + p2.toLowerCase(); + }); + } + + // Handle camelCase segments (e.g., 'creditCard' -> 'CreditCard') + if (segment.match(/^[a-z]+[A-Z][a-z]+/)) { + return segment.charAt(0).toUpperCase() + segment.slice(1); + } + + // For other segments, capitalize first letter, lowercase the rest + return segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase(); + }).join(''); +} + +/** + * Convert parameter name to camelCase (e.g., 'userId' -> 'userId') + */ +function toParameterName(str) { + logger.debug('Application.js: toParameterName() - Converting parameter name to camelCase'); + if (!str) return ''; + + // Remove curly braces first + let cleaned = str.replace(/([{}])/g, ''); + + // Convert to proper camelCase (e.g., 'userId' -> 'userId', 'orderID' -> 'orderId') + // Handle cases where we have consecutive uppercase letters anywhere in the string + if (cleaned.match(/[A-Z][A-Z]/)) { + // Convert consecutive uppercase letters to proper camelCase + return cleaned.replace(/([A-Z])([A-Z])/g, (match, p1, p2) => { + return p1 + p2.toLowerCase(); + }); + } + + // For simple parameters, just lowercase + return cleaned.toLowerCase(); +} + +/** + * Get proper initialization value for Java types + */ +function getInitializationValue(payloadType) { + // Handle List types + if (payloadType.startsWith('List<')) { + return 'new java.util.ArrayList<>()'; + } + + switch (payloadType) { + case 'String': + return '""'; + case 'Integer': + return '0'; + case 'Long': + return '0L'; + case 'Float': + return '0.0f'; + case 'Double': + return '0.0'; + case 'Boolean': + return 'false'; + case 'java.time.OffsetDateTime': + return 'java.time.OffsetDateTime.now()'; + case 'java.time.LocalDate': + return 'java.time.LocalDate.now()'; + case 'java.time.LocalTime': + return 'java.time.LocalTime.now()'; + case 'java.time.LocalDateTime': + return 'java.time.LocalDateTime.now()'; + case 'java.time.Instant': + return 'java.time.Instant.now()'; + case 'java.math.BigDecimal': + return 'java.math.BigDecimal.ZERO'; + case 'byte[]': + return 'new byte[0]'; + case 'Object': + return 'new Object()'; + default: + // For complex types, use constructor + return `new ${payloadType}()`; + } +} + +/** + * Application component for generating Spring Boot Application.java + * Matches the reference project output exactly + */ +function Application({ asyncapi, params, processedData }) { + logger.debug('Application.js: Application() - Generating Application.java component'); + const funcs = processedData.functions || []; + const extraIncludes = processedData.extraIncludes || []; + const imports = processedData.imports || []; + + logger.debug(`Application.js: extraIncludes (${extraIncludes.length}):`, extraIncludes); + logger.debug(`Application.js: imports (${imports.length}):`, imports); + + // Get package name + const packageName = getPackageName(params, asyncapi); + + // Filter functions by type + const consumerFunctions = funcs.filter(func => func.type === 'consumer'); + const supplierFunctions = funcs.filter(func => func.type === 'supplier'); + const functionFunctions = funcs.filter(func => func.type === 'function'); + const sendFunctions = funcs.filter(func => func.type === 'send'); + + const elements = []; + + // Package declaration + elements.push(React.createElement(Text, null, `package ${packageName};`)); + elements.push(React.createElement(Text, null, "")); + + // Build imports dynamically based on what's actually used + const usedImports = new Set(); + usedImports.add('org.springframework.boot.SpringApplication'); + usedImports.add('org.springframework.boot.autoconfigure.SpringBootApplication'); + usedImports.add('org.slf4j.Logger'); + usedImports.add('org.slf4j.LoggerFactory'); + if (consumerFunctions.length > 0) usedImports.add('java.util.function.Consumer'); + if (supplierFunctions.length > 0) usedImports.add('java.util.function.Supplier'); + if (functionFunctions.length > 0) usedImports.add('java.util.function.Function'); + if (consumerFunctions.length > 0 || supplierFunctions.length > 0 || functionFunctions.length > 0) { + usedImports.add('org.springframework.context.annotation.Bean'); + + // Only add Message import if functions actually use Message types + const usesMessageTypes = funcs.some(f => + f.publishPayload === 'Message' || + f.subscribePayload === 'Message' || + f.publishPayload === 'Message' || + f.subscribePayload === 'Message' || + (f.publishPayload && f.publishPayload.startsWith('Message<')) || + (f.subscribePayload && f.subscribePayload.startsWith('Message<')) || + f.hasEnumParameters + ); + if (usesMessageTypes) { + usedImports.add('org.springframework.messaging.Message'); + } + + // Add MessageBuilder import if we have Message payload types + if (funcs.some(f => f.publishPayload === 'Message' || f.subscribePayload === 'Message')) { + usedImports.add('org.springframework.messaging.support.MessageBuilder'); + } + } + if (sendFunctions.length > 0 || funcs.some(f => f.dynamic)) { + if (params.dynamicType === 'streamBridge') { + usedImports.add('org.springframework.beans.factory.annotation.Autowired'); + usedImports.add('org.springframework.cloud.stream.function.StreamBridge'); + } else { + // For header mode, we still need StreamBridge and Message imports + usedImports.add('org.springframework.beans.factory.annotation.Autowired'); + usedImports.add('org.springframework.cloud.stream.function.StreamBridge'); + usedImports.add('org.springframework.cloud.stream.binder.BinderHeaders'); + usedImports.add('org.springframework.messaging.Message'); + usedImports.add('org.springframework.messaging.support.MessageBuilder'); + } + } + + // Add Arrays import if we have enum validation (in send functions or consumer functions) + const hasEnumValidation = sendFunctions.some(func => + func.parameters && func.parameters.some(param => param.hasEnum) + ) || consumerFunctions.some(func => + func.parameters && func.parameters.some(param => param.hasEnum) + ); + if (hasEnumValidation) { + usedImports.add('java.util.Arrays'); + } + + // Add List import if any function uses List types + const usesListTypes = funcs.some(f => + (f.publishPayload && f.publishPayload.startsWith('List<')) || + (f.subscribePayload && f.subscribePayload.startsWith('List<')) + ); + if (usesListTypes) { + usedImports.add('java.util.List'); + } + // Only add MessageBuilder import if any function actually uses it + let needsMessageBuilder = false; + funcs.forEach(func => { + if ((func.type === 'supplier' || func.type === 'function') && func.dynamic) { + needsMessageBuilder = true; + } + }); + // Also check sendFunctions for dynamic send logic (if any in future) + // (Currently, send methods do not use MessageBuilder, so we skip) + if (needsMessageBuilder) { + usedImports.add('org.springframework.messaging.support.MessageBuilder'); + } + if (params.reactive === true || params.reactive === 'true') { + usedImports.add('reactor.core.publisher.Flux'); + } + // Add imports in the correct order (matching reference) + const importOrder = [ + 'java.util.Arrays', + 'java.util.List', + 'java.util.function.Consumer', + 'java.util.function.Supplier', + 'java.util.function.Function', + 'org.slf4j.Logger', + 'org.slf4j.LoggerFactory', + 'org.springframework.beans.factory.annotation.Autowired', + 'org.springframework.boot.SpringApplication', + 'org.springframework.boot.autoconfigure.SpringBootApplication', + 'org.springframework.cloud.stream.function.StreamBridge', + 'org.springframework.cloud.stream.binder.BinderHeaders', + 'org.springframework.context.annotation.Bean', + 'org.springframework.messaging.Message', + 'org.springframework.messaging.support.MessageBuilder', + 'reactor.core.publisher.Flux' + ]; + const addedImports = new Set(); + importOrder.forEach(importName => { + if (usedImports.has(importName) && !addedImports.has(importName)) { + elements.push(React.createElement(Text, null, `import ${importName};`)); + addedImports.add(importName); + } + }); + if (extraIncludes && extraIncludes.length > 0) { + extraIncludes.forEach(include => { + // Filter out JsonProperty import as it's not needed in Application.java + if (!include.includes('JsonProperty')) { + elements.push(React.createElement(Text, null, `import ${include};`)); + } + }); + } + // Add schema imports (for Avro namespaces, etc.) + if (imports && imports.length > 0) { + imports.forEach(importName => { + // Filter out JsonProperty import as it's not needed in Application.java + if (!importName.includes('JsonProperty') && !addedImports.has(importName)) { + elements.push(React.createElement(Text, null, `import ${importName};`)); + addedImports.add(importName); + } + }); + } + elements.push(React.createElement(Text, null, "")); + elements.push(React.createElement(Text, null, "@SpringBootApplication")); + elements.push(React.createElement(Text, null, "public class Application {")); + elements.push(React.createElement(Text, null, " private static final Logger logger = LoggerFactory.getLogger(Application.class);")); + elements.push(React.createElement(Text, null, "")); + // Add StreamBridge field for send methods or dynamic functions + if (sendFunctions.length > 0 || funcs.some(f => f.dynamic)) { + // StreamBridge is needed for both streamBridge and header modes + elements.push(React.createElement(Text, null, " @Autowired")); + elements.push(React.createElement(Text, null, " private StreamBridge streamBridge;")); + elements.push(React.createElement(Text, null, "")); + } + elements.push(React.createElement(Text, null, " public static void main(String[] args) {")); + elements.push(React.createElement(Text, null, " SpringApplication.run(Application.class);")); + elements.push(React.createElement(Text, null, " }")); + // Generate function beans + funcs.forEach(func => { + if (func.type === 'send') return; + + const payloadType = func.subscribePayload || func.publishPayload || 'Object'; + + // Add multiple message comment if present + if (func.multipleMessageComment) { + const commentLines = func.multipleMessageComment.split('\n'); + commentLines.forEach(line => { + if (line.trim()) { + elements.push(React.createElement(Text, null, ` ${line}`)); + } + }); + } + elements.push(React.createElement(Text, null, " @Bean")); + + // Generate function signature with fallback logic + let functionSignature = func.functionSignature; + if (!functionSignature) { + // Fallback: generate function signature based on type and properties + // Use correct precedence: for consumers prioritize subscribePayload, for suppliers prioritize publishPayload + const payloadType = func.type === 'consumer' + ? (func.subscribePayload || func.publishPayload || 'Object') + : (func.publishPayload || func.subscribePayload || 'Object'); + + if (func.type === 'supplier') { + if (func.dynamic && func.reactive) { + functionSignature = `public Supplier>> ${func.name}()`; + } else if (func.reactive) { + functionSignature = `public Supplier> ${func.name}()`; + } else { + functionSignature = `public Supplier<${payloadType}> ${func.name}()`; + } + } else if (func.type === 'consumer') { + if (func.reactive) { + functionSignature = `public Consumer> ${func.name}()`; + } else if (func.dynamic && func.parametersToHeaders) { + // Use Consumer> when parametersToHeaders is true and function is dynamic + functionSignature = `public Consumer> ${func.name}()`; + } else if (func.hasEnumParameters) { + // SAFE CHANGE: Use Consumer> when channel has enum parameters for better parameter access + if (payloadType === 'Message' || payloadType === 'Message') { + // FIX: Handle the case where payloadType is already Message to avoid double-wrapping + functionSignature = `public Consumer> ${func.name}()`; + } else { + functionSignature = `public Consumer> ${func.name}()`; + } + } else if (payloadType === 'Message' || payloadType === 'Message') { + // FIX: Handle the case where payloadType is already Message to avoid double-wrapping + functionSignature = `public Consumer> ${func.name}()`; + } else { + functionSignature = `public Consumer<${payloadType}> ${func.name}()`; + } + } else if (func.type === 'function') { + const inputType = func.subscribePayload || 'Object'; + const outputType = func.publishPayload || func.messageName || 'Object'; + if (func.reactive) { + functionSignature = `public Function, Flux<${outputType}>> ${func.name}()`; + } else { + functionSignature = `public Function<${inputType}, ${outputType}> ${func.name}()`; + } + } else { + functionSignature = `public Object ${func.name || 'unknownFunction'}()`; + } + } + + elements.push(React.createElement(Text, null, ` ${functionSignature} {`)); + // Function body + if (func.type === 'supplier') { + if (func.reactive) { + // Reactive supplier returns Flux + elements.push(React.createElement(Text, null, " return () -> {")); + elements.push(React.createElement(Text, null, " // Add business logic here.")); + elements.push(React.createElement(Text, null, " // Return a Flux stream")); + const payloadType = func.publishPayload || 'Object'; + if (payloadType === 'Message' || payloadType === 'Message') { + elements.push(React.createElement(Text, null, " // Create sample payload - replace with actual business logic")); + elements.push(React.createElement(Text, null, " Object payload = new Object(); // TODO: Replace with actual message payload")); + elements.push(React.createElement(Text, null, " return Flux.just(MessageBuilder.withPayload(payload).build());")); + } else { + const initValue = getInitializationValue(payloadType); + elements.push(React.createElement(Text, null, ` ${payloadType} payload = ${initValue};`)); + if (func.dynamic) { + elements.push(React.createElement(Text, null, " return Flux.just(MessageBuilder.withPayload(payload).build());")); + } else { + elements.push(React.createElement(Text, null, " return Flux.just(payload);")); + } + } + elements.push(React.createElement(Text, null, " };")); + } else { + // Non-reactive supplier + elements.push(React.createElement(Text, null, " return () -> {")); + elements.push(React.createElement(Text, null, " // Add business logic here.")); + // Create proper message with payload + const payloadType = func.publishPayload || 'Object'; + // Handle Message type specially - create a default payload object + if (payloadType === 'Message' || payloadType === 'Message') { + elements.push(React.createElement(Text, null, " // Create sample payload - replace with actual business logic")); + elements.push(React.createElement(Text, null, " Object payload = new Object(); // TODO: Replace with actual message payload")); + // For Message types, always wrap in MessageBuilder + elements.push(React.createElement(Text, null, " return MessageBuilder.withPayload(payload).build();")); + } else { + const initValue = getInitializationValue(payloadType); + elements.push(React.createElement(Text, null, ` ${payloadType} payload = ${initValue};`)); + // For specific types, return payload directly (unless dynamic) + if (func.dynamic) { + elements.push(React.createElement(Text, null, " return MessageBuilder.withPayload(payload).build();")); + } else { + elements.push(React.createElement(Text, null, " return payload;")); + } + } + elements.push(React.createElement(Text, null, " };")); + } + } else if (func.type === 'consumer') { + if (func.reactive) { + // Reactive consumer handles Flux + elements.push(React.createElement(Text, null, " return flux -> {")); + elements.push(React.createElement(Text, null, " // Add business logic here.")); + elements.push(React.createElement(Text, null, " // Process each item in the Flux stream")); + elements.push(React.createElement(Text, null, " flux.doOnNext(data -> {")); + elements.push(React.createElement(Text, null, " logger.info(data.toString());")); + elements.push(React.createElement(Text, null, " // Add your processing logic here")); + elements.push(React.createElement(Text, null, " }).subscribe();")); + elements.push(React.createElement(Text, null, " };")); + } else if (func.dynamic && func.parametersToHeaders) { + // When using Consumer>, parameter is 'message' and payload is extracted + elements.push(React.createElement(Text, null, " return message -> {")); + elements.push(React.createElement(Text, null, " // Add business logic here.")); + elements.push(React.createElement(Text, null, " // Extract payload from message")); + const payloadType = func.subscribePayload || 'Object'; + elements.push(React.createElement(Text, null, ` ${payloadType} data = message.getPayload();`)); + elements.push(React.createElement(Text, null, " // Access channel parameters from message headers if needed")); + elements.push(React.createElement(Text, null, " // Example: String param = (String) message.getHeaders().get(\"paramName\");")); + elements.push(React.createElement(Text, null, " logger.info(data.toString());")); + elements.push(React.createElement(Text, null, " };")); + } else if (func.hasEnumParameters) { + // SAFE CHANGE: Handle Message for enum parameters + elements.push(React.createElement(Text, null, " return message -> {")); + elements.push(React.createElement(Text, null, " // Extract payload from message")); + // FIX: When subscribePayload is Message, extract as Object to avoid double-wrapping + const payloadType = (func.subscribePayload === 'Message' || func.subscribePayload === 'Message') + ? 'Object' + : (func.subscribePayload || 'Object'); + elements.push(React.createElement(Text, null, ` ${payloadType} data = message.getPayload();`)); + + // Add parameter extraction and validation for enum parameters (only for Solace binder) + if (params.binder === 'solace') { + const consumerValidationCode = generateConsumerParameterValidation(func); + if (consumerValidationCode.length > 0) { + elements.push(React.createElement(Text, null, " // Extract and validate topic parameters from solace_destination header")); + elements.push(React.createElement(Text, null, " // This validation ensures topic parameters match the generated enum constants")); + elements.push(React.createElement(Text, null, " // Note: This is specific to Solace binder - solace_destination header contains the topic path")); + consumerValidationCode.forEach(line => { + elements.push(React.createElement(Text, null, ` ${line}`)); + }); + elements.push(React.createElement(Text, null, "")); + } + } + + elements.push(React.createElement(Text, null, " // Add business logic here.")); + elements.push(React.createElement(Text, null, " logger.info(data.toString());")); + elements.push(React.createElement(Text, null, " };")); + } else if (func.subscribePayload === 'Message' || func.subscribePayload === 'Message') { + // FIX: Handle the case where subscribePayload is already Message to avoid double payload extraction + elements.push(React.createElement(Text, null, " return message -> {")); + elements.push(React.createElement(Text, null, " // Extract payload from message")); + elements.push(React.createElement(Text, null, " Object data = message.getPayload();")); + elements.push(React.createElement(Text, null, " // Add business logic here.")); + elements.push(React.createElement(Text, null, " logger.info(data.toString());")); + elements.push(React.createElement(Text, null, " };")); + } else { + elements.push(React.createElement(Text, null, " return data -> {")); + elements.push(React.createElement(Text, null, " // Add business logic here.")); + elements.push(React.createElement(Text, null, " logger.info(data.toString());")); + elements.push(React.createElement(Text, null, " };")); + } + } else if (func.type === 'function') { + elements.push(React.createElement(Text, null, " return data -> {")); + elements.push(React.createElement(Text, null, " // Add business logic here.")); + elements.push(React.createElement(Text, null, " logger.info(data.toString());")); + const payloadType = func.publishPayload || 'Object'; + // Handle Message type specially - cannot instantiate directly + if (payloadType === 'Message' || payloadType === 'Message') { + elements.push(React.createElement(Text, null, " // Process input data and create response")); + elements.push(React.createElement(Text, null, " // TODO: Replace with actual business logic to generate output data")); + elements.push(React.createElement(Text, null, " Object payload = data.getPayload();")); + elements.push(React.createElement(Text, null, " return MessageBuilder.withPayload(payload).build();")); + } else { + elements.push(React.createElement(Text, null, " // Process input data and return response")); + elements.push(React.createElement(Text, null, " // TODO: Replace with actual business logic to generate output data")); + elements.push(React.createElement(Text, null, ` ${payloadType} payload = new ${payloadType}();`)); + elements.push(React.createElement(Text, null, " return payload;")); + } + elements.push(React.createElement(Text, null, " };")); + } + elements.push(React.createElement(Text, null, " }")); + }); + // Generate enum classes for channel parameters with enum definitions + const enumClasses = generateEnumClasses(processedData, asyncapi); + if (enumClasses.length > 0) { + elements.push(React.createElement(Text, null, "")); + elements.push(React.createElement(Text, null, " // Enum classes for channel parameters")); + elements.push(React.createElement(Text, null, " // These enums are generated from AsyncAPI channel parameter enum definitions")); + elements.push(React.createElement(Text, null, " // and handle various data formats (numeric, spaces, camelCase) for valid Java constants")); + enumClasses.forEach(enumClass => { + elements.push(React.createElement(Text, null, ` public static enum ${enumClass.name} {`)); + elements.push(React.createElement(Text, null, ` ${enumClass.values.join(', ')}`)); + elements.push(React.createElement(Text, null, " }")); + elements.push(React.createElement(Text, null, "")); + }); + } + + // Generate send methods if required + sendFunctions.forEach(func => { + if (func.sendMethodName) { + elements.push(React.createElement(Text, null, "")); + const payloadType = func.publishPayload || 'Object'; + elements.push(React.createElement(Text, null, ` public void ${func.sendMethodName}(`)); + elements.push(React.createElement(Text, null, ` ${payloadType} payload, ${func.channelInfo.functionParamList}`)); + elements.push(React.createElement(Text, null, " ) {")); + + // Add parameter validation for enum parameters + const validationCode = generateParameterValidation(func); + if (validationCode.length > 0) { + elements.push(React.createElement(Text, null, " // Parameter validation for enum values")); + elements.push(React.createElement(Text, null, " // This validation ensures input parameters match the generated enum constants")); + elements.push(React.createElement(Text, null, " // and handles normalization for different data formats (numeric, spaces, etc.)")); + validationCode.forEach(line => { + elements.push(React.createElement(Text, null, ` ${line}`)); + }); + elements.push(React.createElement(Text, null, "")); + } + // Replace {param} with %s in the topic string for String.format + logger.debug(`Application.js: Processing send function ${func.sendMethodName}, channelInfo:`, func.channelInfo); + if (!func.channelInfo || !func.channelInfo.publishChannel) { + logger.warn(`Application.js: Missing channelInfo or publishChannel for function ${func.sendMethodName}`); + return; + } + const topicFormat = func.channelInfo.publishChannel.replace(/\{[^}]+\}/g, '%s'); + elements.push(React.createElement(Text, null, ` String topic = String.format(\"${topicFormat}\",`)); + elements.push(React.createElement(Text, null, ` ${func.channelInfo.functionArgList});`)); + + if (params.dynamicType === 'header') { + elements.push(React.createElement(Text, null, " Message message = MessageBuilder")); + elements.push(React.createElement(Text, null, " .withPayload(payload)")); + elements.push(React.createElement(Text, null, " .setHeader(BinderHeaders.TARGET_DESTINATION, topic)")); + elements.push(React.createElement(Text, null, " .build();")); + elements.push(React.createElement(Text, null, " streamBridge.send(topic, message);")); + } else { + elements.push(React.createElement(Text, null, " streamBridge.send(topic, payload);")); + } + elements.push(React.createElement(Text, null, " }")); + } + }); + elements.push(React.createElement(Text, null, "}")); + return elements; +} + +/** + * Get package name from parameters or AsyncAPI info + */ +function getPackageName(params, asyncapi) { + logger.debug('Application.js: getPackageName() - Getting package name'); + // Check if package name is provided in parameters + if (params && params.javaPackage) { + return params.javaPackage; + } + + // Try to get from AsyncAPI info + if (asyncapi && asyncapi.info) { + const info = asyncapi.info(); + if (info && info.extensions) { + const extensions = info.extensions(); + if (extensions) { + const packageExt = extensions.get('x-java-package'); + if (packageExt && packageExt.value) { + return packageExt.value(); + } + } + } + } + + // Default package name + return 'com.company'; +} + +/** + * Check if Jackson configuration is needed for JSR310 types + */ +function needsJacksonConfiguration(processedData) { + logger.debug('Application.js: needsJacksonConfiguration() - Checking if Jackson config is needed'); + const functions = processedData.functions || []; + + // Check if any function uses JSR310 types + const jsr310Types = [ + 'java.time.LocalDate', + 'java.time.LocalTime', + 'java.time.LocalDateTime', + 'java.time.Instant', + 'java.time.OffsetDateTime', + 'java.time.Duration' + ]; + + return functions.some(func => { + const subscribePayload = func.subscribePayload; + const publishPayload = func.publishPayload; + + return jsr310Types.some(type => + subscribePayload === type || publishPayload === type + ); + }); +} + +/** + * Generate enum classes for channel parameters + * + * This function processes AsyncAPI channel parameters that have enum definitions + * and generates corresponding Java enum classes. It handles various data types + * and formats to ensure valid Java enum constants. + * + * @param {Object} processedData - The processed AsyncAPI data containing functions and parameters + * @param {Object} asyncapi - The original AsyncAPI document + * @returns {Array} Array of enum class definitions with name and values + */ +function generateEnumClasses(processedData, asyncapi) { + const enumClasses = []; + const processedEnums = new Set(); // Track processed enums to avoid duplicates + + // Process enums from generated functions (existing logic) + const functions = processedData.functions || []; + + functions.forEach(func => { + if (func.parameters && func.parameters.length > 0) { + func.parameters.forEach(param => { + if (param.hasEnum && param.enumValues && param.enumValues.length > 0) { + const enumName = toPascalCase(param.name); + + // Avoid generating duplicate enum classes for the same parameter name + if (!processedEnums.has(enumName)) { + processedEnums.add(enumName); + + // Convert enum values to valid Java identifiers + // This handles various data formats while ensuring valid Java enum constants + const validEnumValues = param.enumValues.map(value => { + if (typeof value === 'string') { + // CASE 1: Numeric values (e.g., "3487", "3490") + // Java enum constants cannot start with numbers, so prefix with "V_" + // Example: "3487" becomes "V_3487" + if (/^\d+$/.test(value)) { + return `V_${value}`; + } + + // CASE 2: Values with hyphens (e.g., "in-app", "out-of-stock") + // Convert hyphens to underscores and make uppercase for Java conventions + // Example: "in-app" becomes "IN_APP" + if (value.includes('-')) { + return value.replace(/-/g, '_'); + } + + // CASE 3: Values with spaces (e.g., "Mobile Application", "Test Data Generation") + // Convert spaces to underscores and make uppercase for Java conventions + // Example: "Mobile Application" becomes "MOBILE_APPLICATION" + if (value.includes(' ')) { + return value.replace(/\s+/g, '_'); + } + + // CASE 4: camelCase values (e.g., "customerInitiated", "onlinePaid") + // Convert to uppercase for Java enum convention + return value; + } + + // CASE 5: Non-string values (numbers, booleans, etc.) + // Convert to string representation and make uppercase + return String(value); + }); + + enumClasses.push({ + name: enumName, + values: validEnumValues + }); + } + } + }); + } + }); + + // NEW: Process enums from all channels in the original AsyncAPI document + // This ensures enums from channels that get consolidated into consumer functions are still generated + if (asyncapi && asyncapi.channels) { + const channels = asyncapi.channels(); + if (channels && typeof channels.values === 'function') { + const channelArray = Array.from(channels.values()); + + channelArray.forEach(channel => { + const channelParameters = channel.parameters(); + if (channelParameters && typeof channelParameters.values === 'function') { + const paramArray = Array.from(channelParameters.values()); + + paramArray.forEach(param => { + try { + // Check if parameter has enum values + const enumValues = getParameterEnumValues(param); + if (enumValues && enumValues.length > 0) { + const paramName = toParameterName(param.id()); + const enumName = toPascalCase(paramName); + + // Avoid generating duplicate enum classes for the same parameter name + if (!processedEnums.has(enumName)) { + processedEnums.add(enumName); + + // Convert enum values to valid Java identifiers + const validEnumValues = enumValues.map(value => { + if (typeof value === 'string') { + // CASE 1: Numeric values (e.g., "3487", "3490") + if (/^\d+$/.test(value)) { + return `V_${value}`; + } + + // CASE 2: Values with hyphens (e.g., "in-app", "out-of-stock") + if (value.includes('-')) { + return value.replace(/-/g, '_'); + } + + // CASE 3: Values with spaces (e.g., "Mobile Application", "Test Data Generation") + if (value.includes(' ')) { + return value.replace(/\s+/g, '_'); + } + + // CASE 4: camelCase values (e.g., "customerInitiated", "onlinePaid") + return value; + } + + // CASE 5: Non-string values (numbers, booleans, etc.) + return String(value); + }); + + enumClasses.push({ + name: enumName, + values: validEnumValues + }); + } + } + } catch (error) { + logger.warn(`Error processing channel parameter ${param?.id() || 'unknown'} for enum generation:`, error.message); + } + }); + } + }); + } + } + + return enumClasses; +} + +/** + * Get parameter enum values from AsyncAPI parameter object + * + * @param {Object} param - The AsyncAPI parameter object + * @returns {Array|null} Array of enum values or null if no enum + */ +function getParameterEnumValues(param) { + try { + const schema = param.schema(); + + if (schema) { + // Check if schema has enum property + if (schema.enum && typeof schema.enum === 'function') { + const enumValues = schema.enum(); + if (Array.isArray(enumValues) && enumValues.length > 0) { + return enumValues; + } + } + + // Also check _json for enum values + if (schema._json && schema._json.enum && Array.isArray(schema._json.enum)) { + return schema._json.enum; + } + } + return null; + } catch (error) { + logger.warn(`Error getting parameter enum values for ${param?.id() || 'unknown'}:`, error.message); + return null; + } +} + +/** + * Generate parameter validation code for send methods + * + * This function generates Java validation code for enum parameters in send methods. + * It handles the normalization of input values to match the generated enum constants, + * ensuring proper validation regardless of the original enum value format. + * + * @param {Object} func - The function object containing parameters with enum definitions + * @returns {Array} Array of validation code lines to be inserted into the send method + */ +function generateParameterValidation(func) { + const validationCode = []; + + if (func.parameters && func.parameters.length > 0) { + func.parameters.forEach(param => { + if (param.hasEnum && param.enumValues && param.enumValues.length > 0) { + const enumName = toPascalCase(param.name); + const paramName = param.name; + + // STEP 1: Null check validation + validationCode.push(`if (${paramName} == null) {`); + validationCode.push(` throw new IllegalArgumentException("${paramName} cannot be null");`); + validationCode.push(`}`); + + // STEP 2: Enum value validation with normalization + validationCode.push(`try {`); + + // Convert the parameter value to match enum format if needed + const hasSpaces = param.enumValues.some(value => typeof value === 'string' && value.includes(' ')); + const hasNumericValues = param.enumValues.some(value => typeof value === 'string' && /^\d+$/.test(value)); + + if (hasSpaces && hasNumericValues) { + // CASE 1: Mixed enum values (both spaces and numeric values) + // Example: ["3487", "Mobile Application", "3490", "Test Data Generation"] + validationCode.push(` String normalizedValue;`); + validationCode.push(` if (${paramName}.matches("^\\\\d+$")) {`); + validationCode.push(` // Numeric input: prefix with "V_" to match enum constant`); + validationCode.push(` // Example: "3487" -> "V_3487"`); + validationCode.push(` normalizedValue = "V_" + ${paramName};`); + validationCode.push(` } else {`); + validationCode.push(` // String input with spaces: convert to UPPER_CASE with underscores`); + validationCode.push(` // Example: "Mobile Application" -> "MOBILE_APPLICATION"`); + validationCode.push(` normalizedValue = ${paramName}.replace(" ", "_");`); + validationCode.push(` }`); + validationCode.push(` ${enumName}.valueOf(normalizedValue);`); + + } else if (hasSpaces) { + // CASE 2: Only string values with spaces + // Example: ["Mobile Application", "Test Data Generation"] + validationCode.push(` // Normalize string values: spaces -> underscores`); + validationCode.push(` // Example: "Mobile Application" -> "MOBILE_APPLICATION"`); + validationCode.push(` String normalizedValue = ${paramName}.replace(" ", "_");`); + validationCode.push(` ${enumName}.valueOf(normalizedValue);`); + + } else if (hasNumericValues) { + // CASE 3: Only numeric values + // Example: ["3487", "3490", "3555"] + validationCode.push(` // Normalize numeric values: prefix with "V_" if numeric`); + validationCode.push(` // Example: "3487" -> "V_3487", "abc" -> "abc" (unchanged)`); + validationCode.push(` String normalizedValue = ${paramName}.matches("^\\\\d+$") ? "V_" + ${paramName} : ${paramName};`); + validationCode.push(` ${enumName}.valueOf(normalizedValue);`); + + } else { + // CASE 4: Simple string values (camelCase, etc.) + // Example: ["customerInitiated", "onlinePaid"] + validationCode.push(` // Direct validation for simple string values (no normalization needed)`); + validationCode.push(` ${enumName}.valueOf(${paramName});`); + } + + // STEP 3: Error handling with helpful error message + validationCode.push(`} catch (IllegalArgumentException e) {`); + validationCode.push(` // Provide detailed error message with all valid enum values`); + validationCode.push(` throw new IllegalArgumentException("Invalid ${paramName}: " + ${paramName} + ". Valid values: " + Arrays.toString(${enumName}.values()));`); + validationCode.push(`}`); + } + }); + } + + return validationCode; +} + +/** + * Generate parameter extraction and validation code for consumer methods + * + * This function generates Java code for extracting topic parameters from the solace_destination header + * and validating them against the generated enum constants. It extracts parameters by position + * from the topic path and provides a template for developers to understand how to access and validate topic parameters. + * + * @param {Object} func - The function object containing parameters with enum definitions + * @returns {Array} Array of validation code lines to be inserted into the consumer method + */ +function generateConsumerParameterValidation(func) { + const validationCode = []; + if (func.isQueueWithSubscription) { + return validationCode; + } + + if (func.parameters && func.parameters.length > 0) { + // First, extract the solace_destination header and split the topic path + validationCode.push(`// Extract topic parameters from solace_destination header`); + validationCode.push(`Object solaceDestinationHeader = message.getHeaders().get("solace_destination");`); + validationCode.push(`String solaceDestination = solaceDestinationHeader != null ? solaceDestinationHeader.toString() : null;`); + validationCode.push(`if (solaceDestination != null) {`); + validationCode.push(` String[] topicSegments = solaceDestination.split("/");`); + validationCode.push(` logger.info("Topic segments: " + Arrays.toString(topicSegments));`); + + // Sort parameters by position to ensure correct extraction order + const sortedParams = func.parameters + .filter(param => param.hasEnum && param.enumValues && param.enumValues.length > 0) + .sort((a, b) => a.position - b.position); + + if (sortedParams.length > 0) { + validationCode.push(` // Extract enum parameters by position from topic path`); + + sortedParams.forEach(param => { + const enumName = toPascalCase(param.name); + const paramName = param.name; + const position = param.position; + + validationCode.push(` // Extract ${paramName} from position ${position} in topic path`); + validationCode.push(` if (topicSegments.length > ${position}) {`); + validationCode.push(` String ${paramName} = topicSegments[${position}];`); + validationCode.push(` try {`); + + // Convert the parameter value to match enum format if needed + const hasSpaces = param.enumValues.some(value => typeof value === 'string' && value.includes(' ')); + const hasNumericValues = param.enumValues.some(value => typeof value === 'string' && /^\d+$/.test(value)); + + if (hasSpaces && hasNumericValues) { + // CASE 1: Mixed enum values (both spaces and numeric values) + validationCode.push(` String normalizedValue;`); + validationCode.push(` if (${paramName}.matches("^\\\\d+$")) {`); + validationCode.push(` // Numeric input: prefix with "V_" to match enum constant`); + validationCode.push(` normalizedValue = "V_" + ${paramName};`); + validationCode.push(` } else {`); + validationCode.push(` // String input with spaces: convert to UPPER_CASE with underscores`); + validationCode.push(` normalizedValue = ${paramName}.replace(" ", "_");`); + validationCode.push(` }`); + validationCode.push(` ${enumName} validated${toPascalCase(paramName)} = ${enumName}.valueOf(normalizedValue);`); + validationCode.push(` logger.info("Validated ${paramName} from topic position ${position}: " + validated${toPascalCase(paramName)});`); + + } else if (hasSpaces) { + // CASE 2: Only string values with spaces + validationCode.push(` // Normalize string values: spaces -> underscores`); + validationCode.push(` String normalizedValue = ${paramName}.replace(" ", "_");`); + validationCode.push(` ${enumName} validated${toPascalCase(paramName)} = ${enumName}.valueOf(normalizedValue);`); + validationCode.push(` logger.info("Validated ${paramName} from topic position ${position}: " + validated${toPascalCase(paramName)});`); + + } else if (hasNumericValues) { + // CASE 3: Only numeric values + validationCode.push(` // Normalize numeric values: prefix with "V_" if numeric`); + validationCode.push(` String normalizedValue = ${paramName}.matches("^\\\\d+$") ? "V_" + ${paramName} : ${paramName};`); + validationCode.push(` ${enumName} validated${toPascalCase(paramName)} = ${enumName}.valueOf(normalizedValue);`); + validationCode.push(` logger.info("Validated ${paramName} from topic position ${position}: " + validated${toPascalCase(paramName)});`); + + } else { + // CASE 4: Simple string values (camelCase, etc.) + validationCode.push(` // Direct validation for simple string values (no normalization needed)`); + validationCode.push(` ${enumName} validated${toPascalCase(paramName)} = ${enumName}.valueOf(${paramName});`); + validationCode.push(` logger.info("Validated ${paramName} from topic position ${position}: " + validated${toPascalCase(paramName)});`); + } + + // Error handling + validationCode.push(` } catch (IllegalArgumentException e) {`); + validationCode.push(` logger.warn("Invalid ${paramName} at topic position ${position}: " + ${paramName} + ". Valid values: " + Arrays.toString(${enumName}.values()));`); + validationCode.push(` }`); + validationCode.push(` } else {`); + validationCode.push(` logger.warn("Topic path too short, expected ${paramName} at position ${position} but only " + topicSegments.length + " segments found");`); + validationCode.push(` }`); + }); + } + + validationCode.push(`} else {`); + validationCode.push(` logger.debug("No solace_destination found in message headers");`); + validationCode.push(`}`); + } + + return validationCode; +} + +module.exports = { + Application, + toMethodName, + toParameterName, + getPackageName, + needsJacksonConfiguration +}; diff --git a/components/ApplicationYml.js b/components/ApplicationYml.js new file mode 100644 index 00000000..31716612 --- /dev/null +++ b/components/ApplicationYml.js @@ -0,0 +1,423 @@ +const React = require('react'); +const { Text } = require('@asyncapi/generator-react-sdk'); +const { logger } = require('../utils/logger'); + +/** + * ApplicationYml component for generating Spring Boot application.yml + */ +function ApplicationYml({ asyncapi, params, processedData }) { + logger.debug('ApplicationYml.js: ApplicationYml() - Generating application.yml component'); + const funcs = processedData.functions || []; + const { + binder = 'kafka', + host, + username, + password, + msgVpn, + parametersToHeaders = false, + useServers = false, + kafkaBrokers = 'localhost:9092', + rabbitHost = 'localhost', + rabbitPort = '5672', + rabbitUsername = 'guest', + rabbitPassword = 'guest', + actuator = 'false' + } = params; + + // Include supplier, consumer, and function types in definition + const supplierFunctions = funcs.filter(func => func.type === 'supplier'); + const consumerFunctions = funcs.filter(func => func.type === 'consumer'); + const functionFunctions = funcs.filter(func => func.type === 'function'); + const allFunctions = [...supplierFunctions, ...consumerFunctions, ...functionFunctions]; + const functionNames = allFunctions.map(func => func.name); + const functionDefinition = functionNames.join(';'); + + const elements = []; + + // Check if Jackson configuration is needed + const needsJacksonConfig = needsJacksonConfiguration(processedData); + + // Add Spring Cloud Stream configuration + elements.push(React.createElement(Text, null, "spring:")); + + // Add Jackson configuration if needed + if (needsJacksonConfig) { + elements.push(React.createElement(Text, null, " jackson:")); + elements.push(React.createElement(Text, null, " serialization:")); + elements.push(React.createElement(Text, null, " write-dates-as-timestamps: false")); + elements.push(React.createElement(Text, null, " deserialization:")); + elements.push(React.createElement(Text, null, " fail-on-unknown-properties: false")); + } + + elements.push(React.createElement(Text, null, " cloud:")); + elements.push(React.createElement(Text, null, " function:")); + elements.push(React.createElement(Text, null, ` definition: ${functionDefinition || "''"}`)); + + // Add function configuration for parametersToHeaders + if (parametersToHeaders && (binder === 'solace' || binder === 'rabbit')) { + const headerMappingConfig = generateHeaderMappingConfiguration(consumerFunctions, binder); + if (headerMappingConfig && Object.keys(headerMappingConfig).length > 0) { + elements.push(React.createElement(Text, null, " configuration:")); + Object.entries(headerMappingConfig).forEach(([functionName, config]) => { + elements.push(React.createElement(Text, null, ` ${functionName}:`)); + elements.push(React.createElement(Text, null, " input-header-mapping-expression:")); + Object.entries(config['input-header-mapping-expression']).forEach(([paramName, expression]) => { + elements.push(React.createElement(Text, null, ` ${paramName}: ${expression}`)); + }); + }); + } + } + + elements.push(React.createElement(Text, null, " stream:")); + if (supplierFunctions.length + consumerFunctions.length + functionFunctions.length === 0) { + elements.push(React.createElement(Text, null, " bindings: {}")); + } else { + elements.push(React.createElement(Text, null, " bindings:")); + } + + // Add bindings for supplier functions (use -out-0) + supplierFunctions.forEach(func => { + const bindingName = `${func.name}-out-0`; + elements.push(React.createElement(Text, null, ` ${bindingName}:`)); + const destination = func.channelInfo?.publishChannel || + func.channelInfo?.channelName || + func.channelName || + (func.channelInfo?.subscribeChannel || func.channelInfo?.publishChannel) || + 'topic'; + elements.push(React.createElement(Text, null, ` destination: ${destination}`)); + // Add binder property if using Solace + if (binder === 'solace') { + elements.push(React.createElement(Text, null, ` binder: solace-binder`)); + } else if (binder === 'rabbit') { + elements.push(React.createElement(Text, null, ` binder: rabbit-binder`)); + } else if (binder === 'kafka') { + elements.push(React.createElement(Text, null, ` binder: kafka-binder`)); + } + }); + + // Add bindings for consumer functions (use -in-0) + consumerFunctions.forEach(func => { + const bindingName = `${func.name}-in-0`; + elements.push(React.createElement(Text, null, ` ${bindingName}:`)); + + // For queue-based consumers, use the topic subscription pattern + // For regular consumers, use the subscribe channel + let destination; + if (func.isQueueWithSubscription && func.topicSubscriptions && func.topicSubscriptions.length > 0) { + // Use all topic subscription patterns for queue-based consumers (comma-separated) + destination = func.topicSubscriptions.join(','); + } else { + destination = func.channelInfo?.subscribeChannel || + func.channelInfo?.channelName || + func.channelName || + (func.channelInfo?.publishChannel || func.channelInfo?.subscribeChannel) || + 'topic'; + } + + elements.push(React.createElement(Text, null, ` destination: ${destination}`)); + // Add group property only for queue-based consumer bindings + if (func.isQueueWithSubscription) { + const group = func.channelInfo && func.channelInfo.queueName + ? func.channelInfo.queueName + : func.name; + elements.push(React.createElement(Text, null, ` group: ${group}`)); + } + // Add binder property if using Solace + if (binder === 'solace') { + elements.push(React.createElement(Text, null, ` binder: solace-binder`)); + } else if (binder === 'rabbit') { + elements.push(React.createElement(Text, null, ` binder: rabbit-binder`)); + } else if (binder === 'kafka') { + elements.push(React.createElement(Text, null, ` binder: kafka-binder`)); + } + }); + + // Add bindings for function types (need both -in-0 and -out-0) + functionFunctions.forEach(func => { + // FIX: Use view-aware destination mapping for Function types + // Use the specific inputOperation and outputOperation properties set in the fix + let inputDestination, outputDestination; + + if (func.inputOperation && func.outputOperation) { + // Use the specific operation information for accurate destination mapping + // Get channel information from the operations using AsyncAPI library methods + const inputChannel = func.inputOperation.channels && func.inputOperation.channels().values ? + Array.from(func.inputOperation.channels().values())[0] : null; + const outputChannel = func.outputOperation.channels && func.outputOperation.channels().values ? + Array.from(func.outputOperation.channels().values())[0] : null; + + inputDestination = inputChannel ? inputChannel.id() : null; + outputDestination = outputChannel ? outputChannel.id() : null; + } else { + // Fallback to generic channel information + inputDestination = func.channelInfo?.subscribeChannel || + func.channelInfo?.channelName || + func.channelName || + null; + outputDestination = func.channelInfo?.publishChannel || + func.channelInfo?.channelName || + func.channelName || + null; + } + + // Validate destinations and provide meaningful error if missing + if (!inputDestination) { + logger.warn(`ApplicationYml.js: No input destination found for function ${func.name}, using function name as fallback`); + inputDestination = `${func.name}-input`; + } + if (!outputDestination) { + logger.warn(`ApplicationYml.js: No output destination found for function ${func.name}, using function name as fallback`); + outputDestination = `${func.name}-output`; + } + + // Input binding (-in-0) + const inputBindingName = `${func.name}-in-0`; + elements.push(React.createElement(Text, null, ` ${inputBindingName}:`)); + elements.push(React.createElement(Text, null, ` destination: ${inputDestination}`)); + if (binder === 'solace') { + elements.push(React.createElement(Text, null, ` binder: solace-binder`)); + } else if (binder === 'rabbit') { + elements.push(React.createElement(Text, null, ` binder: rabbit-binder`)); + } else if (binder === 'kafka') { + elements.push(React.createElement(Text, null, ` binder: kafka-binder`)); + } + + // Output binding (-out-0) + const outputBindingName = `${func.name}-out-0`; + elements.push(React.createElement(Text, null, ` ${outputBindingName}:`)); + elements.push(React.createElement(Text, null, ` destination: ${outputDestination}`)); + if (binder === 'solace') { + elements.push(React.createElement(Text, null, ` binder: solace-binder`)); + } else if (binder === 'rabbit') { + elements.push(React.createElement(Text, null, ` binder: rabbit-binder`)); + } else if (binder === 'kafka') { + elements.push(React.createElement(Text, null, ` binder: kafka-binder`)); + } + }); + + // NOTE: Removed poller config for suppliers as it causes lifecycle conflicts + // Pollers are only needed for polling suppliers (file/database), not for programmatic suppliers + + // Add solace section with bindings and environment + if (binder === 'solace') { + // Bindings for queue-based consumers + const queueConsumers = consumerFunctions.filter(f => f.channelInfo && f.channelInfo.queueName); + if (queueConsumers.length > 0) { + elements.push(React.createElement(Text, null, " solace:")); + elements.push(React.createElement(Text, null, " bindings:")); + queueConsumers.forEach(func => { + const bindingName = `${func.name}-in-0`; + elements.push(React.createElement(Text, null, ` ${bindingName}:`)); + elements.push(React.createElement(Text, null, " consumer:")); + elements.push(React.createElement(Text, null, ` queueNameExpression: '''${func.channelInfo.queueName || func.name}'''`)); + }); + } + // Add binders + elements.push( + React.createElement(Text, null, " binders:"), + React.createElement(Text, null, ` solace-binder:`), + React.createElement(Text, null, ` type: solace`) + ); + // Environment section + elements.push(React.createElement(Text, null, " environment:")); + elements.push(React.createElement(Text, null, " solace:")); + elements.push(React.createElement(Text, null, " java:")); + elements.push(React.createElement(Text, null, ` host: '${host || 'tcp://localhost:55554'}'`)); + elements.push(React.createElement(Text, null, ` msgVpn: ${msgVpn || 'default'}`)); + elements.push(React.createElement(Text, null, ` clientUsername: ${username || 'default'}`)); + elements.push(React.createElement(Text, null, ` clientPassword: ${password || 'default'}`)); + } else if (binder === 'kafka') { + // Add binders + elements.push( + React.createElement(Text, null, " binders:"), + React.createElement(Text, null, ` kafka-binder:`), + React.createElement(Text, null, ` type: kafka`) + ); + elements.push(React.createElement(Text, null, " environment:")); + elements.push(React.createElement(Text, null, " spring:")); + elements.push(React.createElement(Text, null, " cloud:")); + elements.push(React.createElement(Text, null, " stream:")); + elements.push(React.createElement(Text, null, " kafka:")); + elements.push(React.createElement(Text, null, " binder:")); + + // Use servers if useServers is true, otherwise use kafkaBrokers + let brokerList = kafkaBrokers; + if (useServers === true || useServers === 'true') { + try { + const servers = asyncapi.servers().all(); + if (servers && servers.length > 0) { + brokerList = servers.map(server => server.url()).join(','); + logger.debug(`ApplicationYml.js: Using servers for Kafka brokers: ${brokerList}`); + } else { + logger.warn('ApplicationYml.js: useServers is true but no servers found in AsyncAPI document'); + } + } catch (error) { + logger.warn(`ApplicationYml.js: Error getting servers for Kafka brokers: ${error.message}`); + } + } + + elements.push(React.createElement(Text, null, ` brokers: ${brokerList}`)); + } else if (binder === 'rabbit') { + // Add binders + elements.push( + React.createElement(Text, null, " binders:"), + React.createElement(Text, null, ` rabbit-binder:`), + React.createElement(Text, null, ` type: rabbit`) + ); + elements.push(React.createElement(Text, null, " environment:")); + elements.push(React.createElement(Text, null, " spring:")); + elements.push(React.createElement(Text, null, " rabbitmq:")); + elements.push(React.createElement(Text, null, ` host: ${rabbitHost}`)); + elements.push(React.createElement(Text, null, ` port: ${rabbitPort}`)); + elements.push(React.createElement(Text, null, ` username: ${rabbitUsername}`)); + elements.push(React.createElement(Text, null, ` password: ${rabbitPassword}`)); + } + + // Add logging configuration (matching reference) + elements.push( + React.createElement(Text, null, "logging:"), + React.createElement(Text, null, " level:"), + React.createElement(Text, null, " root: info"), + React.createElement(Text, null, " org:"), + React.createElement(Text, null, " springframework: info"), + React.createElement(Text, null, " springframework.cloud.stream: info"), + React.createElement(Text, null, " springframework.integration: info"), + React.createElement(Text, null, " com:"), + React.createElement(Text, null, " company: info") + ); + + // Add Jackson logging if Jackson config is needed + if (needsJacksonConfig) { + elements.push( + React.createElement(Text, null, " com.fasterxml.jackson: info") + ); + } + + // Add actuator configuration if enabled (matching nunjucks reference project) + if (actuator === 'true' || actuator === true) { + elements.push( + React.createElement(Text, null, "server:"), + React.createElement(Text, null, " port: 8080"), + React.createElement(Text, null, "management:"), + React.createElement(Text, null, " endpoints:"), + React.createElement(Text, null, " web:"), + React.createElement(Text, null, " exposure:"), + React.createElement(Text, null, " include: '*'") + ); + } + + // Remove trailing blank lines at the end + while (elements.length > 0 && elements[elements.length - 1].props && elements[elements.length - 1].props.children === "") { + elements.pop(); + } + + return React.createElement(React.Fragment, null, ...elements); +} + +/** + * Generate Solace consumer settings (matching reference getConsumerSettings logic) + */ +function generateSolaceConsumerSettings(functions) { + logger.debug('ApplicationYml.js: generateSolaceConsumerSettings() - Generating Solace consumer settings'); + let ret = null; + + functions.forEach(func => { + // Check if this is a queue-based consumer with subscriptions + if (func.isQueueWithSubscription) { + // Use consistent binding name that matches the function name + let bindingName = func.name; + if (func.isQueueWithSubscription && func.queueName) { + bindingName = toJavaClassName(func.queueName); + } + const fullBindingName = `${bindingName}-in-0`; + + if (!ret) { + ret = {}; + ret.bindings = {}; + } + + ret.bindings[fullBindingName] = {}; + ret.bindings[fullBindingName].consumer = {}; + ret.bindings[fullBindingName].consumer.queueNameExpression = `'''${func.queueName || func.name}'''`; + + // Add additional subscriptions (all except the main one) + if (func.additionalSubscriptions && func.additionalSubscriptions.length > 1) { + // Filter out the main subscription (subscribeChannel) from additional subscriptions + const additionalSubs = func.additionalSubscriptions.filter(sub => sub !== func.subscribeChannel); + if (additionalSubs.length > 0) { + ret.bindings[fullBindingName].consumer.queueAdditionalSubscriptions = additionalSubs; + } + } + } + }); + + return ret; +} + +/** + * Check if Jackson configuration is needed for JSR310 types + */ +function needsJacksonConfiguration(processedData) { + logger.debug('ApplicationYml.js: needsJacksonConfiguration() - Checking if Jackson config is needed'); + const functions = processedData.functions || []; + + // Check if any function uses JSR310 types + const jsr310Types = [ + 'java.time.LocalDate', + 'java.time.LocalTime', + 'java.time.LocalDateTime', + 'java.time.Instant', + 'java.time.OffsetDateTime', + 'java.time.Duration' + ]; + + return functions.some(func => { + const subscribePayload = func.subscribePayload; + const publishPayload = func.publishPayload; + + return jsr310Types.some(type => + subscribePayload === type || publishPayload === type + ); + }); +} + +/** + * Generate header mapping configuration for parametersToHeaders feature + * Matches the Nunjucks reference implementation logic + */ +function generateHeaderMappingConfiguration(consumerFunctions, binder) { + logger.debug('ApplicationYml.js: generateHeaderMappingConfiguration() - Generating header mapping config'); + const config = {}; + + // Only process dynamic consumer functions (those with channel parameters) + consumerFunctions.forEach(func => { + if (func.dynamic && func.channelInfo && func.channelInfo.parameters && func.channelInfo.parameters.length > 0) { + config[func.name] = { + 'input-header-mapping-expression': {} + }; + + // Generate header mappings for each channel parameter + func.channelInfo.parameters.forEach(param => { + let headerExpression; + if (binder === 'solace') { + headerExpression = `headers.solace_destination.getName.split("/")[${param.position}]`; + } else if (binder === 'rabbit') { + headerExpression = `headers.amqp_receivedRoutingKey.getName.split("/")[${param.position}]`; + } + + if (headerExpression) { + config[func.name]['input-header-mapping-expression'][param.name] = headerExpression; + } + }); + } + }); + + return config; +} + +module.exports = { + ApplicationYml, + generateSolaceConsumerSettings, + needsJacksonConfiguration, + generateHeaderMappingConfiguration +}; \ No newline at end of file diff --git a/components/ModelClass.js b/components/ModelClass.js new file mode 100644 index 00000000..732f408f --- /dev/null +++ b/components/ModelClass.js @@ -0,0 +1,1072 @@ +const React = require('react'); +const { Text } = require('@asyncapi/generator-react-sdk'); +const { logger } = require('../utils/logger'); +const { + getEnhancedType, + checkPropertyNames, + getIdentifierName, + getSchemaType, + toPascalCase, + toCamelCase, + isJavaReservedWord +} = require('../utils/typeUtils'); +const { stripPackageName } = require('../utils/typeUtils'); + +/** + * Get Java type for property + */ +function getJavaType(property) { + logger.debug(`ModelClass.js: getJavaType() - Getting Java type for property: ${property.name}, type: ${property.type}, hasSchema: ${!!property.schema}`); + + if (!property) return 'Object'; + + // Handle case where type might be an enhanced type object instead of string + let type = property.type; + if (type && typeof type === 'object') { + logger.debug(`ModelClass.js: getJavaType() - Type is enhanced type object:`, JSON.stringify(type, null, 2)); + // Check if it's an enhanced type object with javaType property (from Avro processing) + if (type.javaType) { + logger.debug(`ModelClass.js: getJavaType() - Found enhanced type object, using javaType: ${type.javaType}`); + return type.javaType; // Return directly, it's already the correct Java type + } else if (typeof type.type === 'function') { + logger.debug(`ModelClass.js: getJavaType() - Found AsyncAPI type() method, calling it`); + type = type.type(); + } else { + logger.debug(`ModelClass.js: getJavaType() - Type object has no recognized format, defaulting to 'string'`); + type = 'string'; // Default assumption for simple properties + } + } + const format = property.format; + const schema = property.schema; + const itemsSchema = property.itemsSchema; + + if (type === 'array') { + if (itemsSchema) { + // itemsSchema is an AsyncAPI schema object, not a property object + const itemType = itemsSchema.type ? itemsSchema.type() : null; + const itemFormat = itemsSchema.format ? itemsSchema.format() : null; + + if (!itemType || itemType === 'object') { + // Array of objects - need to generate inner class + // For inner classes, prioritize property name over schema name + let itemSchemaName = itemsSchema.extensions && itemsSchema.extensions().get('x-parser-schema-id')?.value(); + // Try other extension names if not found + if (!itemSchemaName) { + itemSchemaName = itemsSchema.extensions && itemsSchema.extensions().get('x-ep-schema-name')?.value(); + } + // Try schema id if still not found + if (!itemSchemaName && itemsSchema.id) { + itemSchemaName = itemsSchema.id(); + } + + // For array properties that will generate inner classes, use property name + // This ensures consistent naming (e.g., chargeAdjustments -> ChargeAdjustments) + if (itemSchemaName && !itemSchemaName.startsWith('()'; + } else if (!type || type === 'object') { + const schemaName = property.schemaName || property.name; + if (schemaName) { + const { className } = stripPackageName(schemaName); + return `new ${toPascalCase(className)}()`; + } + return 'new Object()'; + } + + return 'null'; +} + +/** + * Generate all-args constructor + */ +function generateAllArgsConstructor(className, properties, indentLevel = 0, extendsClass = null, parentProperties = []) { + logger.debug(`ModelClass.js: generateAllArgsConstructor() - Generating constructor for ${className}${extendsClass ? ` extends ${extendsClass}` : ''}`); + + const indent = ' '.repeat(indentLevel); + const elements = []; + + // If no properties and no parent, skip + if ((!properties || properties.length === 0) && (!parentProperties || parentProperties.length === 0)) { + return elements; + } + + // For inherited classes, constructor should include parent and child fields + let allProperties = []; + if (extendsClass && parentProperties && parentProperties.length > 0) { + allProperties = [...parentProperties, ...properties]; + } else { + allProperties = properties; + } + + // Constructor signature: parent fields first, then child fields + const paramList = allProperties.map(prop => { + const javaType = getJavaType(prop); + const paramName = getIdentifierName(prop.name); // Use safe identifier for parameter + return `${javaType} ${paramName}`; + }).join(', '); + + elements.push(React.createElement(Text, null, `${indent}public ${className}(${paramList}) {`)); + + // If extending a class, call super() with parent parameters + if (extendsClass && parentProperties && parentProperties.length > 0) { + const superParamList = parentProperties.map(prop => getIdentifierName(prop.name)).join(', '); + elements.push(React.createElement(Text, null, `${indent} super(${superParamList});`)); + } else if (extendsClass) { + elements.push(React.createElement(Text, null, `${indent} super();`)); + } + + // Assign only child fields (not parent fields) + (properties || []).forEach(prop => { + const fieldName = getIdentifierName(prop.name); + const paramName = getIdentifierName(prop.name); // Use safe identifier for parameter + elements.push(React.createElement(Text, null, `${indent} this.${fieldName} = ${paramName};`)); + }); + + elements.push(React.createElement(Text, null, `${indent}}`)); + elements.push(React.createElement(Text, null, "")); + + return elements; +} + +/** + * Generate field declarations + */ +function generateFields(properties, indentLevel = 0) { + logger.debug('ModelClass.js: generateFields() - Generating field declarations'); + + const indent = ' '.repeat(indentLevel); + const elements = []; + + if (!properties || properties.length === 0) { + return elements; + } + + properties.forEach(prop => { + const javaType = getJavaType(prop); + const fieldName = getIdentifierName(prop.name); + const originalName = prop.name; + + // Always add JsonProperty annotation (matching backup behavior) + elements.push(React.createElement(Text, null, `${indent}@JsonProperty("${originalName}")`)); + + // Add validation annotations for required fields + if (prop.required) { + elements.push(React.createElement(Text, null, `${indent}@NotNull`)); + } + + // Add Min/Max validation annotations for numeric constraints + if (prop.minimum !== undefined) { + elements.push(React.createElement(Text, null, `${indent}@Min(${prop.minimum})`)); + } + if (prop.maximum !== undefined) { + elements.push(React.createElement(Text, null, `${indent}@Max(${prop.maximum})`)); + } + + elements.push(React.createElement(Text, null, `${indent}private ${javaType} ${fieldName};`)); + elements.push(React.createElement(Text, null, "")); + }); + + return elements; +} + +/** + * Generate getters and setters + */ +function generateAccessors(className, properties, indentLevel = 0) { + logger.debug(`ModelClass.js: generateAccessors() - Generating accessors for ${className}`); + + const indent = ' '.repeat(indentLevel); + const elements = []; + + if (!properties || properties.length === 0) { + return elements; + } + + properties.forEach(prop => { + const javaType = getJavaType(prop); + const fieldName = getIdentifierName(prop.name); + const methodName = toPascalCase(prop.name); + + // Getter + elements.push(React.createElement(Text, null, `${indent}public ${javaType} get${methodName}() {`)); + elements.push(React.createElement(Text, null, `${indent} return ${fieldName};`)); + elements.push(React.createElement(Text, null, `${indent}}`)); + elements.push(React.createElement(Text, null, "")); + + // Setter + const paramName = getIdentifierName(prop.name); // Use safe identifier for parameter + elements.push(React.createElement(Text, null, `${indent}public ${className} set${methodName}(${javaType} ${paramName}) {`)); + elements.push(React.createElement(Text, null, `${indent} this.${fieldName} = ${paramName};`)); + elements.push(React.createElement(Text, null, `${indent} return this;`)); + elements.push(React.createElement(Text, null, `${indent}}`)); + elements.push(React.createElement(Text, null, "")); + }); + + return elements; +} + +/** + * Generate toString method + */ +function generateToString(className, properties, indentLevel = 0, extendsClass = null) { + logger.debug(`ModelClass.js: generateToString() - Generating toString for ${className}${extendsClass ? ` extends ${extendsClass}` : ''}`); + + const indent = ' '.repeat(indentLevel); + const elements = []; + + elements.push(React.createElement(Text, null, `${indent}@Override`)); + elements.push(React.createElement(Text, null, `${indent}public String toString() {`)); + + if (extendsClass && properties && properties.length > 0) { + // For inherited classes, use parent's toString and add child fields + elements.push(React.createElement(Text, null, `${indent} String parentString = super.toString();`)); + let returnLine = `${indent} return parentString.substring(0, parentString.length() - 1)`; + properties.forEach((prop, index) => { + const fieldName = getIdentifierName(prop.name); + const javaType = getJavaType(prop); + const isLast = index === properties.length - 1; + returnLine += `\n${indent} + ", ${fieldName}: " + ${fieldName}`; + if (javaType === 'Object') { + returnLine += '.toString()'; + } else if (javaType.endsWith('[]')) { + returnLine += ' != null ? java.util.Arrays.toString(' + fieldName + ') : "null"'; + } + if (isLast) { + returnLine += ' + " ]"'; + } + }); + returnLine += ';'; + elements.push(React.createElement(Text, null, returnLine)); + } else { + // For non-inherited classes, use the original logic + let returnLine = `${indent} return "${className} ["`; + if (properties && properties.length > 0) { + properties.forEach((prop, index) => { + const fieldName = getIdentifierName(prop.name); + const javaType = getJavaType(prop); + const isLast = index === properties.length - 1; + const separator = index === 0 ? " " : ", "; + returnLine += `\n${indent} + "${separator}${fieldName}: " + ${fieldName}`; + if (javaType === 'Object') { + returnLine += '.toString()'; + } else if (javaType.endsWith('[]')) { + returnLine += ' != null ? java.util.Arrays.toString(' + fieldName + ') : "null"'; + } + }); + } + returnLine += `\n${indent} + " ]";`; + elements.push(React.createElement(Text, null, returnLine)); + } + elements.push(React.createElement(Text, null, `${indent}}`)); + return elements; +} + +/** + * Generate enum if property has enum values + */ +function generateEnum(property, indentLevel = 0) { + logger.debug('ModelClass.js: generateEnum() - Generating enum for property'); + + const indent = ' '.repeat(indentLevel); + const elements = []; + + // Defensive check for property + if (!property) { + logger.warn('ModelClass.js: generateEnum() - Property is undefined or null'); + return elements; + } + + // Handle both direct enum arrays and enum functions (from Avro processing) + let enumValues = null; + if (property.enum) { + if (Array.isArray(property.enum)) { + enumValues = property.enum; + } else if (typeof property.enum === 'function') { + try { + enumValues = property.enum(); + // Additional check in case the function returns undefined + if (!enumValues) { + logger.warn('ModelClass.js: generateEnum() - Enum function returned undefined'); + return elements; + } + } catch (error) { + logger.warn(`ModelClass.js: generateEnum() - Error calling enum function: ${error.message}`); + return elements; + } + } + } + + if (!enumValues || !Array.isArray(enumValues) || enumValues.length === 0) { + return elements; + } + + // Defensive check for property name + if (!property.name) { + logger.warn('ModelClass.js: generateEnum() - Property name is undefined or null'); + return elements; + } + + const enumName = toPascalCase(property.name); + + // Convert enum values to valid Java identifiers + const validEnumValues = enumValues.map(value => { + if (typeof value === 'string') { + // Handle values with hyphens (e.g., "in-app" -> "IN_APP") + if (value.includes('-')) { + return value.replace(/-/g, '_').toUpperCase(); + } + // Handle values with spaces (e.g., "low priority" -> "LOW_PRIORITY") + if (value.includes(' ')) { + return value.replace(/\s+/g, '_').toUpperCase(); + } + // Handle numeric values (e.g., "123" -> "V_123") + if (/^\d+$/.test(value)) { + return `V_${value}`; + } + // Convert to uppercase for Java enum convention + return value.toUpperCase(); + } + // For non-string values, convert to string and make uppercase + return String(value).toUpperCase(); + }); + + const enumValuesString = validEnumValues.join(', '); + + // Generate as a static enum inside the class (matching reference project behavior) + elements.push(React.createElement(Text, null, `${indent}public static enum ${enumName} { ${enumValuesString} }`)); + elements.push(React.createElement(Text, null, "")); + + return elements; +} + +/** + * Generate inner classes for object properties + */ +function generateInnerClasses(properties, indentLevel = 0, processedData = null) { + logger.debug('ModelClass.js: generateInnerClasses() - Generating inner classes'); + logger.debug(`ModelClass.js: generateInnerClasses() - Properties count: ${properties ? properties.length : 0}`); + + const elements = []; + const nestedInnerClasses = []; // Collect nested inner classes to process at the same level + + if (!properties || properties.length === 0) { + logger.debug('ModelClass.js: generateInnerClasses() - No properties to process'); + return elements; + } + + // Get list of schemas being processed as standalone classes + const standaloneSchemaNames = new Set(); + if (processedData && processedData.schemas) { + processedData.schemas.forEach(schema => { + if (schema.name) { + standaloneSchemaNames.add(schema.name); + } + }); + } + logger.debug(`ModelClass.js: generateInnerClasses() - Standalone schema names: ${Array.from(standaloneSchemaNames).join(', ')}`); + + properties.forEach((prop, index) => { + logger.debug(`ModelClass.js: generateInnerClasses() - Processing property ${index}: ${prop.name}, type: ${prop.type}`); + const type = prop.type; + const schema = prop.schema; + const itemsSchema = prop.itemsSchema; + + logger.debug(`ModelClass.js: generateInnerClasses() - Property ${prop.name}: schema=${!!schema}, itemsSchema=${!!itemsSchema}`); + if (type && typeof type === 'string' && (type === 'object' || type.startsWith('object-'))) { + // Check if this object property schema is already being processed as a standalone class + let schemaName = null; + if (schema && schema.extensions) { + try { + const schemaId = schema.extensions().get('x-parser-schema-id')?.value(); + if (schemaId) { + // Extract schema name from schema ID (e.g., "sentAt" from "sentAt.json") + schemaName = schemaId.split('/').pop().replace('.json', ''); + } + } catch (error) { + logger.debug(`ModelClass.js: generateInnerClasses() - Error getting schema name: ${error.message}`); + } + } + + // If schema name is found and it's in the standalone list, skip generating inner class + if (schemaName && standaloneSchemaNames.has(schemaName)) { + logger.debug(`ModelClass.js: generateInnerClasses() - Skipping inner class for ${prop.name} because ${schemaName} is already a standalone class`); + return; + } + + logger.debug(`ModelClass.js: generateInnerClasses() - Generating inner class for object property: ${prop.name}`); + // Generate inner class for object property + const innerClassName = toPascalCase(prop.name); + const innerProperties = []; + + // Process properties of the nested object + if (!schema || typeof schema.properties !== 'function') { + logger.debug(`ModelClass.js: generateInnerClasses() - Schema is null or properties is not a function: schema=${!!schema}, properties=${schema ? typeof schema.properties : 'N/A'}`); + return elements; + } + + const schemaProperties = schema.properties(); + logger.debug(`ModelClass.js: generateInnerClasses() - Schema properties type: ${typeof schemaProperties}`); + + if (schemaProperties) { + let propertyArray = []; + + // Handle different property collection types + if (typeof schemaProperties.values === 'function') { + // Map-like object with values() method + propertyArray = Array.from(schemaProperties.values()); + } else if (typeof schemaProperties === 'object') { + // Plain object - convert to array of properties + propertyArray = Object.entries(schemaProperties).map(([propName, propSchema]) => { + // Debug: Log the propSchema to understand the structure + logger.debug(`ModelClass.js: generateInnerClasses() - propSchema for ${propName}:`, { + type: propSchema.type, + format: propSchema.format, + typeType: typeof propSchema.type, + formatType: typeof propSchema.format + }); + + // Create a property-like object that matches the expected structure + return { + id: () => propName, + type: typeof propSchema.type === 'function' ? (() => { + const rawType = propSchema.type(); + logger.debug(`ModelClass.js: generateInnerClasses() - propSchema.type() returned: ${rawType}`); + return rawType.toLowerCase(); + })() : propSchema.type, // Ensure lowercase + format: typeof propSchema.format === 'function' ? propSchema.format() : propSchema.format, // Call function if it's a function + description: () => propSchema.description, + extensions: () => ({ + get: (key) => ({ value: () => propSchema[key] }) + }), + enum: () => propSchema.enum, + items: () => propSchema.items + }; + }); + } + + logger.debug(`ModelClass.js: generateInnerClasses() - Found ${propertyArray.length} inner properties`); + propertyArray.forEach(innerProp => { + const propertyName = innerProp.id(); + // Fix: Extract type and format values (now direct values, not functions) + const innerPropType = innerProp.type; + const innerPropFormat = innerProp.format; + const isRequired = schema.required && Array.isArray(schema.required()) && schema.required().includes(propertyName); + + // Create a property object that getJavaType can understand + const propertyObj = { + name: propertyName, + type: innerPropType, // Always schema type, not Java type + format: innerPropFormat, + schema: innerProp, + itemsSchema: innerProp.items ? innerProp.items() : undefined + }; + + innerProperties.push({ + name: propertyName, + type: innerPropType, // Always schema type, not Java type + description: innerProp.description ? innerProp.description() : '', + required: isRequired, + schemaName: innerProp.extensions && innerProp.extensions().get('x-parser-schema-id')?.value(), + format: innerPropFormat, + enum: innerProp.enum ? innerProp.enum() : undefined, + items: innerProp.items ? innerProp.items() : undefined, + schema: innerProp, + itemsSchema: innerProp.items ? innerProp.items() : undefined + }); + }); + } + + logger.debug(`ModelClass.js: generateInnerClasses() - Generated ${innerProperties.length} inner properties for ${innerClassName}`); + elements.push(...generateClass(innerClassName, innerProperties, indentLevel + 1, true)); + } else if (type === 'array' && itemsSchema && itemsSchema.properties && typeof itemsSchema.properties === 'function') { + // Check if this is actually a primitive array before generating inner class + const itemType = itemsSchema.type ? itemsSchema.type() : null; + const itemFormat = itemsSchema.format ? itemsSchema.format() : null; + + // If it's a primitive type (not object), don't generate inner class + if (itemType && itemType !== 'object' && !itemType.startsWith('object-')) { + logger.debug(`ModelClass.js: generateInnerClasses() - Skipping inner class for array property ${prop.name}: itemType=${itemType} (primitive array)`); + return; + } + + logger.debug(`ModelClass.js: generateInnerClasses() - Generating inner class for array property: ${prop.name}`); + // Generate inner class for array items + // Use the property name for the inner class name (e.g., chargeAdjustments -> ChargeAdjustments) + const innerClassName = toPascalCase(prop.name); + const innerProperties = []; + + // Process properties of the array items + const schemaProperties = itemsSchema.properties(); + logger.debug(`ModelClass.js: generateInnerClasses() - Items schema properties type: ${typeof schemaProperties}`); + + if (schemaProperties) { + let propertyArray = []; + + // Handle different property collection types + if (typeof schemaProperties.values === 'function') { + // Map-like object with values() method + propertyArray = Array.from(schemaProperties.values()); + } else if (typeof schemaProperties === 'object') { + // Plain object - convert to array of properties + propertyArray = Object.entries(schemaProperties).map(([propName, propSchema]) => { + // Debug: Log the propSchema to understand the structure + logger.debug(`ModelClass.js: generateInnerClasses() - array propSchema for ${propName}:`, { + type: propSchema.type, + format: propSchema.format, + typeType: typeof propSchema.type, + formatType: typeof propSchema.format + }); + + let ast = { + id: propName, + type: typeof propSchema.type === 'function' ? propSchema.type() : propSchema.type, + format: typeof propSchema.format === 'function' ? propSchema.format() : propSchema.format, + description: typeof propSchema.description === 'function' ? propSchema.description() : propSchema.description, + extensions: typeof propSchema.extensions === 'function' ? propSchema.extensions() : propSchema.extensions, + enum: typeof propSchema.enum === 'function' ? propSchema.enum() : propSchema.enum, + items: typeof propSchema.items === 'function' ? propSchema.items() : propSchema.items + }; + + // logger.debug(`ModelClass.js: generateInnerClasses() - propName: ${propName}`, ast); + + if (ast.type === 'object') { + // Create a clean AST object without extensions for debugging + const cleanAst = { ...ast }; + delete cleanAst.extensions; + logger.debug(`ModelClass.js: generateInnerClasses() - Found nested inner class propName: ${propName}`, cleanAst); + // Collect nested inner class for later processing at the same level + const nestedClassName = toPascalCase(propName); + const nestedProperties = []; + + // Process the nested object's properties + if (propSchema.properties && typeof propSchema.properties === 'function') { + const nestedSchemaProperties = propSchema.properties(); + if (nestedSchemaProperties && typeof nestedSchemaProperties === 'object') { + Object.entries(nestedSchemaProperties).forEach(([nestedPropName, nestedPropSchema]) => { + nestedProperties.push({ + name: nestedPropName, + type: typeof nestedPropSchema.type === 'function' ? nestedPropSchema.type() : nestedPropSchema.type, + format: typeof nestedPropSchema.format === 'function' ? nestedPropSchema.format() : nestedPropSchema.format, + description: typeof nestedPropSchema.description === 'function' ? nestedPropSchema.description() : nestedPropSchema.description, + required: propSchema.required && Array.isArray(propSchema.required()) && propSchema.required().includes(nestedPropName), + schema: nestedPropSchema, + itemsSchema: nestedPropSchema.items ? (typeof nestedPropSchema.items === 'function' ? nestedPropSchema.items() : nestedPropSchema.items) : undefined + }); + }); + } + } + + nestedInnerClasses.push({ + className: nestedClassName, + properties: nestedProperties + }); + } + if (propName === 'options') { + logger.debug(`I am here`); + } + + return ast; + }); + } + + logger.debug(`ModelClass.js: generateInnerClasses() - Found ${propertyArray.length} array item properties`); + propertyArray.forEach(innerProp => { + const propertyName = innerProp.id; + // Fix: Extract type and format values (now direct values, not functions) + const innerPropType = innerProp.type; + const innerPropFormat = innerProp.format; + const isRequired = itemsSchema.required && Array.isArray(itemsSchema.required()) && itemsSchema.required().includes(propertyName); + + // Create a property object that getJavaType can understand + const propertyObj = { + name: propertyName, + type: innerPropType, // Always schema type, not Java type + format: innerPropFormat, + schema: innerProp, + itemsSchema: innerProp.items + }; + + innerProperties.push({ + name: propertyName, + type: innerPropType, // Always schema type, not Java type + description: innerProp.description, + required: isRequired, + schemaName: innerProp.extensions && typeof innerProp.extensions.get === 'function' ? innerProp.extensions.get('x-parser-schema-id')?.value() : undefined, + format: innerPropFormat, + enum: innerProp.enum, + items: innerProp.items, + schema: innerProp, + itemsSchema: innerProp.items, + }); + }); + } + + logger.debug(`ModelClass.js: generateInnerClasses() - Generated ${innerProperties.length} array item properties for ${innerClassName}`); + elements.push(...generateClass(innerClassName, innerProperties, indentLevel + 1, true)); + } else { + logger.debug(`ModelClass.js: generateInnerClasses() - Skipping property ${prop.name}: type=${type}, hasSchema=${!!schema}, hasItemsSchema=${!!itemsSchema}`); + } + }); + + logger.debug(`ModelClass.js: generateInnerClasses() - Generated ${elements.length} inner class elements`); + + // Process all collected nested inner classes at the same level + if (nestedInnerClasses.length > 0) { + logger.debug(`ModelClass.js: generateInnerClasses() - Processing ${nestedInnerClasses.length} nested inner classes`); + nestedInnerClasses.forEach(nestedClass => { + logger.debug(`ModelClass.js: generateInnerClasses() - Generating nested inner class: ${nestedClass.className}`); + elements.push(...generateClass( + nestedClass.className, + nestedClass.properties, + indentLevel + 1, // Same level as other inner classes + true // isStatic + )); + }); + } + + return elements; +} + +/** + * Generate Java class (matching reference project structure) + */ +function generateClass(className, properties, indentLevel = 0, isStatic = false, extendsClass = null, parentProperties = [], processedData = null) { + logger.debug(`ModelClass.js: generateClass() - Generating class ${className}${extendsClass ? ` extends ${extendsClass}` : ''}`); + + const indent = ' '.repeat(indentLevel); + const elements = []; + + // Class declaration + const staticKeyword = isStatic ? 'static ' : ''; + const extendsClause = extendsClass ? ` extends ${extendsClass}` : ''; + elements.push(React.createElement(Text, null, `${indent}@JsonInclude(JsonInclude.Include.NON_NULL)`)); + elements.push(React.createElement(Text, null, `${indent}public ${staticKeyword}class ${className}${extendsClause} {`)); + + // Default constructor + const bodyIndent = indent + ' '; + elements.push(React.createElement(Text, null, `${bodyIndent}public ${className}() {`)); + if (extendsClass) { + elements.push(React.createElement(Text, null, `${bodyIndent} super();`)); + } + elements.push(React.createElement(Text, null, `${bodyIndent}}`)); + elements.push(React.createElement(Text, null, "")); + + // All-args constructor + elements.push(...generateAllArgsConstructor(className, properties, indentLevel + 1, extendsClass, parentProperties)); + + // Fields with smart JsonProperty annotations + elements.push(...generateFields(properties, indentLevel + 1)); + elements.push(React.createElement(Text, null, "")); + + // Getters and setters + elements.push(...generateAccessors(className, properties, indentLevel + 1)); + + // Inner classes (enhanced with processedData context) + elements.push(...generateInnerClasses(properties, indentLevel + 1, processedData)); + + // Enums + properties.forEach(prop => { + elements.push(...generateEnum(prop, indentLevel + 1)); + }); + + // Generate enums for Avro processed fields that have enum information + properties.forEach(prop => { + if (prop.type && typeof prop.type === 'object' && prop.type.enumSymbols) { + const enumElements = generateEnum({ + name: prop.name, + enum: prop.type.enumSymbols + }, indentLevel + 1); + elements.push(...enumElements); + } + }); + + // toString method + elements.push(...generateToString(className, properties, indentLevel + 1, extendsClass)); + + elements.push(React.createElement(Text, null, `${indent}}`)); + + return elements; +} + +/** + * ModelClass component for generating Java model classes + * Enhanced with full context awareness and smart generation capabilities + * + * @param {Object} schema - Processed schema object with properties array + * @param {Object} params - User parameters (javaPackage, etc.) + * @param {Object} asyncapi - Full AsyncAPI document + * @param {Object} processedData - All processed data (schemas, functions, imports, etc.) + * @param {string} extendsClass - Parent class name if inheriting + * @param {Array} parentProperties - Properties from parent class + * @param {string} namespace - Schema namespace + * @param {string} className - Override class name + */ +function ModelClass({ schema, params, asyncapi, processedData, extendsClass, parentProperties, namespace, className }) { + logger.debug('ModelClass.js: ModelClass() - Generating model class component'); + logger.debug('ModelClass.js: Input validation:', { + hasSchema: !!schema, + hasParams: !!params, + hasAsyncapi: !!asyncapi, + hasProcessedData: !!processedData, + schemaPropertiesLength: schema?.properties?.length, + schemaClassName: schema?.className, + schemaName: schema?.name + }); + + if (!schema) { + logger.warn('ModelClass.js: ModelClass() - No schema provided'); + return []; + } + + const elements = []; + + // 1. SMART PACKAGE NAME RESOLUTION (restored from backup) + const packageName = getSmartPackageName(params, asyncapi, schema); + if (packageName) { + elements.push(React.createElement(Text, null, `package ${packageName};`)); + elements.push(React.createElement(Text, null, "")); + } + + // 2. SMART IMPORT ANALYSIS (restored from backup + enhanced) + const importAnalysis = analyzeRequiredImports(schema, processedData); + + // Add base imports + elements.push(React.createElement(Text, null, "import com.fasterxml.jackson.annotation.JsonInclude;")); + + // Conditional JsonProperty import (only when needed) + if (importAnalysis.needsJsonProperty) { + elements.push(React.createElement(Text, null, "import com.fasterxml.jackson.annotation.JsonProperty;")); + } + + // Add cross-schema imports (using processedData) + importAnalysis.crossSchemaImports.forEach(importStatement => { + elements.push(React.createElement(Text, null, importStatement)); + }); + + // Add validation imports if needed + importAnalysis.validationImports.forEach(importStatement => { + elements.push(React.createElement(Text, null, importStatement)); + }); + + // Add utility imports if needed + importAnalysis.utilityImports.forEach(importStatement => { + elements.push(React.createElement(Text, null, importStatement)); + }); + + elements.push(React.createElement(Text, null, "")); + + // 3. DETERMINE CLASS NAME (with multiple fallback strategies) + const finalClassName = className || + schema.className || + toPascalCase(schema.name) || + 'UnknownSchema'; + + // 4. PREPARE PROPERTIES (handle both processed arrays and AsyncAPI functions) + const schemaProperties = prepareSchemaProperties(schema); + + // 5. GENERATE THE MAIN CLASS + elements.push(...generateClass( + finalClassName, + schemaProperties, + 0, + false, + extendsClass, + parentProperties, + processedData // Pass context for enhanced generation + )); + + return elements; +} + +/** + * Smart package name resolution using all available sources + */ +function getSmartPackageName(params, asyncapi, schema) { + logger.debug('ModelClass.js: getSmartPackageName() - Resolving package name'); + + // Priority 1: User-provided package in params + if (params && params.javaPackage) { + logger.debug('ModelClass.js: Using params.javaPackage:', params.javaPackage); + return params.javaPackage; + } + + // Priority 2: AsyncAPI document extension + if (asyncapi && asyncapi.info && asyncapi.info().extensions) { + try { + const javaPackageExt = asyncapi.info().extensions().get('x-java-package'); + if (javaPackageExt) { + const packageName = javaPackageExt.value(); + logger.debug('ModelClass.js: Using AsyncAPI x-java-package:', packageName); + return packageName; + } + } catch (error) { + logger.debug('ModelClass.js: Error reading AsyncAPI extensions:', error.message); + } + } + + // Priority 3: Schema namespace (Avro schemas) + if (schema && schema.namespace) { + logger.debug('ModelClass.js: Using schema.namespace:', schema.namespace); + return schema.namespace; + } + + // Priority 4: Extract from schema name if it contains dots + if (schema && schema.name && String(schema.name).includes('.')) { + const { javaPackage } = stripPackageName(schema.name); + if (javaPackage) { + logger.debug('ModelClass.js: Extracted from schema name:', javaPackage); + return javaPackage; + } + } + + // Priority 5: Schema package path + if (schema && schema.packagePath) { + const packageName = schema.packagePath.replace(/\//g, '.'); + logger.debug('ModelClass.js: Using schema.packagePath:', packageName); + return packageName; + } + + // Fallback + logger.debug('ModelClass.js: Using fallback package name'); + return 'com.company'; +} + +/** + * Analyze what imports are actually needed for this schema + */ +function analyzeRequiredImports(schema, processedData) { + logger.debug('ModelClass.js: analyzeRequiredImports() - Analyzing import requirements'); + + const analysis = { + needsJsonProperty: false, + crossSchemaImports: [], + validationImports: [], + utilityImports: [] + }; + + const properties = schema.properties || []; + + // Always add JsonProperty for all properties (matching backup behavior) + analysis.needsJsonProperty = properties.length > 0; + + // Analyze cross-schema references using processedData + if (processedData && processedData.schemas) { + const currentPackage = getSmartPackageName(null, null, schema); + + properties.forEach(prop => { + const propType = getJavaType(prop); + + // Check if this type references another schema + const referencedSchema = processedData.schemas.find(s => + s.className === propType || + propType.includes(s.className) + ); + + if (referencedSchema && referencedSchema.namespace && + referencedSchema.namespace !== currentPackage) { + const importStatement = `import ${referencedSchema.namespace}.${referencedSchema.className};`; + if (!analysis.crossSchemaImports.includes(importStatement)) { + analysis.crossSchemaImports.push(importStatement); + } + } + }); + } + + // Check for validation imports (if schema has validation constraints) + const hasValidation = properties.some(prop => + prop.required || + (prop.format && ['email', 'uri', 'date', 'date-time'].includes(prop.format)) || + prop.minimum !== undefined || + prop.maximum !== undefined + ); + + if (hasValidation) { + analysis.validationImports.push('import jakarta.validation.constraints.NotNull;'); + + // Add Min/Max imports if needed + const hasMinMax = properties.some(prop => prop.minimum !== undefined || prop.maximum !== undefined); + if (hasMinMax) { + analysis.validationImports.push('import jakarta.validation.constraints.Min;'); + analysis.validationImports.push('import jakarta.validation.constraints.Max;'); + } + } + + // Check for utility imports + properties.forEach(prop => { + const propType = getJavaType(prop); + + // Check for Map types + if (propType.includes('Map<')) { + analysis.utilityImports.push('import java.util.Map;'); + } + + // Check for array types that might need Arrays.toString() + if (propType.endsWith('[]')) { + analysis.utilityImports.push('import java.util.Arrays;'); + } + }); + + // Remove duplicates + analysis.utilityImports = [...new Set(analysis.utilityImports)]; + + logger.debug('ModelClass.js: Import analysis result:', analysis); + return analysis; +} + +/** + * Prepare schema properties handling both processed arrays and AsyncAPI functions + */ +function prepareSchemaProperties(schema) { + logger.debug('ModelClass.js: prepareSchemaProperties() - Preparing properties'); + + if (!schema.properties) { + logger.debug('ModelClass.js: No properties found'); + return []; + } + + // If it's already a processed array (from processors), use it directly + if (Array.isArray(schema.properties)) { + logger.debug('ModelClass.js: Using processed properties array'); + return schema.properties; + } + + // If it's an AsyncAPI function, call it and process the result + if (typeof schema.properties === 'function') { + logger.debug('ModelClass.js: Processing AsyncAPI properties function'); + try { + const asyncApiProperties = schema.properties(); + if (asyncApiProperties && typeof asyncApiProperties.values === 'function') { + const propertyArray = Array.from(asyncApiProperties.values()); + return propertyArray.map(prop => ({ + name: prop.id(), + type: getSchemaType(prop), + description: prop.description ? prop.description() : '', + required: false, // TODO: Determine from schema.required() + format: prop.format ? prop.format() : undefined, + enum: prop.enum ? prop.enum() : undefined, + schema: prop, + itemsSchema: prop.items ? prop.items() : undefined + })); + } + } catch (error) { + logger.warn('ModelClass.js: Error processing AsyncAPI properties:', error.message); + } + } + + logger.debug('ModelClass.js: Using empty properties array as fallback'); + return []; +} + + + +module.exports = ModelClass; \ No newline at end of file diff --git a/components/PomXml.js b/components/PomXml.js new file mode 100644 index 00000000..730f8e5b --- /dev/null +++ b/components/PomXml.js @@ -0,0 +1,524 @@ +const React = require('react'); +const { Text } = require('@asyncapi/generator-react-sdk'); +const { logger } = require('../utils/logger'); +const { isJavaReservedWord } = require('../utils/typeUtils'); + +/** + * PomXml component for generating Maven pom.xml + */ +function PomXml({ asyncapi, params, processedData, artifactType = 'application' }) { + logger.debug('PomXml.js: PomXml() - Generating pom.xml component'); + const info = asyncapi.info(); + const groupId = getGroupId(info, params); + const artifactId = getArtifactId(info, params); + const version = info.version(); + const springBootVersion = getSpringBootVersion(info, params); + const springCloudVersion = getSpringCloudVersion(info, params); + const springCloudStreamVersion = getSpringCloudStreamVersion(info, params); + const solaceSpringCloudVersion = getSolaceSpringCloudVersion(info, params); + const kafkaSpringCloudVersion = getKafkaSpringCloudVersion(info, params); + const rabbitSpringCloudVersion = getRabbitSpringCloudVersion(info, params); + const binder = params.binder || 'kafka'; + const actuator = params.actuator === 'true' || params.actuator === true; + + if (artifactType === 'application') { + return React.createElement(ApplicationPomXml, { + groupId, + artifactId, + version, + springBootVersion, + springCloudVersion, + solaceSpringCloudVersion, + kafkaSpringCloudVersion, + rabbitSpringCloudVersion, + binder, + actuator, + processedData + }); + } else { + return React.createElement(LibraryPomXml, { + groupId, + artifactId, + version, + springCloudStreamVersion + }); + } +} + +function ApplicationPomXml({ groupId, artifactId, version, springBootVersion, springCloudVersion, solaceSpringCloudVersion, kafkaSpringCloudVersion, rabbitSpringCloudVersion, binder, actuator, processedData }) { + logger.debug('PomXml.js: ApplicationPomXml() - Generating application pom.xml'); + return React.createElement(React.Fragment, null, + React.createElement(Text, null, ''), + React.createElement(Text, null, ''), + React.createElement(Text, null, ' 4.0.0'), + React.createElement(Text, null, ''), + React.createElement(Text, null, ` ${groupId}`), + React.createElement(Text, null, ` ${artifactId}`), + React.createElement(Text, null, ` ${version}`), + React.createElement(Text, null, ' jar'), + React.createElement(Text, null, ` ${artifactId}`), + React.createElement(Text, null, ' Auto-generated Spring Cloud Stream AsyncAPI application'), + React.createElement(Text, null, ''), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' org.springframework.boot'), + React.createElement(Text, null, ' spring-boot-starter-parent'), + React.createElement(Text, null, ` ${springBootVersion}`), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ''), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ` ${springCloudVersion}`), + ...(binder === 'solace' ? [ + React.createElement(Text, null, ` ${solaceSpringCloudVersion}`) + ] : []), + ...(binder === 'kafka' ? [ + React.createElement(Text, null, ` ${kafkaSpringCloudVersion}`) + ] : []), + ...(binder === 'rabbit' ? [ + React.createElement(Text, null, ` ${rabbitSpringCloudVersion}`) + ] : []), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ''), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' org.springframework.cloud'), + React.createElement(Text, null, ' spring-cloud-dependencies'), + React.createElement(Text, null, ' ${spring-cloud.version}'), + React.createElement(Text, null, ' pom'), + React.createElement(Text, null, ' import'), + React.createElement(Text, null, ' '), + ...(binder === 'solace' ? [ + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' com.solace.spring.cloud'), + React.createElement(Text, null, ' solace-spring-cloud-bom'), + React.createElement(Text, null, ' ${solace-spring-cloud-bom.version}'), + React.createElement(Text, null, ' pom'), + React.createElement(Text, null, ' import'), + React.createElement(Text, null, ' ') + ] : []), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ''), + React.createElement(Text, null, ' '), + ...(binder === 'rabbit' ? [ + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' org.springframework.cloud'), + React.createElement(Text, null, ' spring-cloud-stream-binder-rabbit'), + React.createElement(Text, null, ` ${rabbitSpringCloudVersion}`), + React.createElement(Text, null, ' ') + ] : binder === 'solace' ? [ + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' com.solace.spring.cloud'), + React.createElement(Text, null, ' spring-cloud-starter-stream-solace'), + React.createElement(Text, null, ' ') + ] : [ + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' org.springframework.cloud'), + React.createElement(Text, null, ' spring-cloud-stream-binder-kafka'), + React.createElement(Text, null, ` ${kafkaSpringCloudVersion}`), + React.createElement(Text, null, ' ') + ]), + ...(actuator ? [ + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' org.springframework.boot'), + React.createElement(Text, null, ' spring-boot-starter-web'), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' org.springframework.boot'), + React.createElement(Text, null, ' spring-boot-starter-actuator'), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' io.micrometer'), + React.createElement(Text, null, ' micrometer-registry-prometheus'), + React.createElement(Text, null, ' ') + ] : []), + ...(needsJacksonJsr310(processedData) ? [ + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' com.fasterxml.jackson.datatype'), + React.createElement(Text, null, ' jackson-datatype-jsr310'), + React.createElement(Text, null, ' ') + ] : []), + ...(needsJacksonAnnotations(processedData) ? [ + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' com.fasterxml.jackson.core'), + React.createElement(Text, null, ' jackson-annotations'), + React.createElement(Text, null, ' ') + ] : []), + ...(needsValidation(processedData) ? [ + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' org.springframework.boot'), + React.createElement(Text, null, ' spring-boot-starter-validation'), + React.createElement(Text, null, ' ') + ] : []), + + React.createElement(Text, null, ' '), + React.createElement(Text, null, ''), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' org.springframework.boot'), + React.createElement(Text, null, ' spring-boot-maven-plugin'), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ''), + React.createElement(Text, null, '') + ); +} + +function LibraryPomXml({ groupId, artifactId, version, springCloudStreamVersion }) { + logger.debug('PomXml.js: LibraryPomXml() - Generating library pom.xml'); + return React.createElement(React.Fragment, null, + React.createElement(Text, null, ''), + React.createElement(Text, null, ''), + React.createElement(Text, null, ' 4.0.0'), + React.createElement(Text, null, ''), + React.createElement(Text, null, ` ${groupId}`), + React.createElement(Text, null, ` ${artifactId}`), + React.createElement(Text, null, ` ${version}`), + React.createElement(Text, null, ` ${artifactId}`), + React.createElement(Text, null, ' jar'), + React.createElement(Text, null, ''), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' org.apache.maven.plugins'), + React.createElement(Text, null, ' maven-compiler-plugin'), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' 8'), + React.createElement(Text, null, ' 8'), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ''), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' 1.8'), + React.createElement(Text, null, ` ${springCloudStreamVersion}`), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ''), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' org.springframework.cloud'), + React.createElement(Text, null, ' spring-cloud-stream'), + React.createElement(Text, null, ' ${spring-cloud-stream.version}'), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' '), + React.createElement(Text, null, ''), + React.createElement(Text, null, ''), + React.createElement(Text, null, '') + ); +} + +function getGroupId(info, params) { + logger.debug('PomXml.js: getGroupId() - Getting group ID'); + + // PRIORITY 1: Check for x-group-id extension first (higher priority than params) + const extensions = info.extensions(); + if (extensions) { + const xGroupId = extensions.get('x-group-id'); + if (xGroupId) { + const value = xGroupId.value(); + logger.debug('PomXml.js: getGroupId() - Using x-group-id extension:', value); + return value; + } + } + + // PRIORITY 2: Use params.groupId only if it's not the default value + if (params.groupId && params.groupId !== 'com.company') { + logger.debug('PomXml.js: getGroupId() - Using non-default params.groupId:', params.groupId); + return params.groupId; + } + + logger.debug('PomXml.js: getGroupId() - Using default: com.company'); + return 'com.company'; +} + +function getArtifactId(info, params) { + logger.debug('PomXml.js: getArtifactId() - Getting artifact ID'); + + // PRIORITY 1: Check AsyncAPI extensions first + const extensions = info.extensions(); + if (extensions) { + const xArtifactId = extensions.get('x-artifact-id'); + if (xArtifactId) { + const value = xArtifactId.value(); + logger.debug('PomXml.js: getArtifactId() - Using x-artifact-id extension:', value); + return value; + } + } + + // PRIORITY 2: Check params (but not if it's the default value) + if (params.artifactId && params.artifactId !== 'project-name') { + logger.debug('PomXml.js: getArtifactId() - Using params.artifactId:', params.artifactId); + return params.artifactId; + } + + // PRIORITY 3: Use default value (same as reference project) + logger.debug('PomXml.js: getArtifactId() - Using default: project-name'); + return 'project-name'; +} + +function getSpringBootVersion(info, params) { + logger.debug('PomXml.js: getSpringBootVersion() - Getting Spring Boot version'); + + // PRIORITY 1: Check AsyncAPI extensions first + if (info.extensions().get('x-spring-boot-version')) { + const value = info.extensions().get('x-spring-boot-version').value(); + logger.debug('PomXml.js: getSpringBootVersion() - Using x-spring-boot-version extension:', value); + return value; + } + + // PRIORITY 2: Check params (but not if it's the default value) + if (params.springBootVersion && params.springBootVersion !== '3.4.4') { + logger.debug('PomXml.js: getSpringBootVersion() - Using non-default params.springBootVersion:', params.springBootVersion); + return params.springBootVersion; + } + + // PRIORITY 3: Use default value + logger.debug('PomXml.js: getSpringBootVersion() - Using default: 3.4.4'); + return '3.4.4'; +} + +function getSpringCloudVersion(info, params) { + logger.debug('PomXml.js: getSpringCloudVersion() - Getting Spring Cloud version'); + + // PRIORITY 1: Check AsyncAPI extensions first + if (info.extensions().get('x-spring-cloud-version')) { + const value = info.extensions().get('x-spring-cloud-version').value(); + logger.debug('PomXml.js: getSpringCloudVersion() - Using x-spring-cloud-version extension:', value); + return value; + } + + // PRIORITY 2: Check params (but not if it's the default value) + if (params.springCloudVersion && params.springCloudVersion !== '2024.0.0') { + logger.debug('PomXml.js: getSpringCloudVersion() - Using non-default params.springCloudVersion:', params.springCloudVersion); + return params.springCloudVersion; + } + + // PRIORITY 3: Use default value + logger.debug('PomXml.js: getSpringCloudVersion() - Using default: 2024.0.0'); + return '2024.0.0'; +} + +function getSpringCloudStreamVersion(info, params) { + logger.debug('PomXml.js: getSpringCloudStreamVersion() - Getting Spring Cloud Stream version'); + + // PRIORITY 1: Check AsyncAPI extensions first + if (info.extensions().get('x-spring-cloud-stream-version')) { + const value = info.extensions().get('x-spring-cloud-stream-version').value(); + logger.debug('PomXml.js: getSpringCloudStreamVersion() - Using x-spring-cloud-stream-version extension:', value); + return value; + } + + // PRIORITY 2: Check params (but not if it's the default value) + if (params.springCloudStreamVersion && params.springCloudStreamVersion !== '3.1.3') { + logger.debug('PomXml.js: getSpringCloudStreamVersion() - Using non-default params.springCloudStreamVersion:', params.springCloudStreamVersion); + return params.springCloudStreamVersion; + } + + // PRIORITY 3: Use default value + logger.debug('PomXml.js: getSpringCloudStreamVersion() - Using default: 3.1.3'); + return '3.1.3'; +} + +function getSolaceSpringCloudVersion(info, params) { + logger.debug('PomXml.js: getSolaceSpringCloudVersion() - Getting Solace Spring Cloud version'); + + // PRIORITY 1: Check AsyncAPI extensions first + if (info.extensions().get('x-solace-spring-cloud-version')) { + const value = info.extensions().get('x-solace-spring-cloud-version').value(); + logger.debug('PomXml.js: getSolaceSpringCloudVersion() - Using x-solace-spring-cloud-version extension:', value); + return value; + } + + // PRIORITY 2: Check params (but not if it's the default value) + if (params.solaceSpringCloudVersion && params.solaceSpringCloudVersion !== '4.8.0') { + logger.debug('PomXml.js: getSolaceSpringCloudVersion() - Using non-default params.solaceSpringCloudVersion:', params.solaceSpringCloudVersion); + return params.solaceSpringCloudVersion; + } + + // PRIORITY 3: Use default value + logger.debug('PomXml.js: getSolaceSpringCloudVersion() - Using default: 4.8.0'); + return '4.8.0'; +} + +function getKafkaSpringCloudVersion(info, params) { + logger.debug('PomXml.js: getKafkaSpringCloudVersion() - Getting Kafka Spring Cloud version'); + + // PRIORITY 1: Check AsyncAPI extensions first + if (info.extensions().get('x-kafka-spring-cloud-version')) { + const value = info.extensions().get('x-kafka-spring-cloud-version').value(); + logger.debug('PomXml.js: getKafkaSpringCloudVersion() - Using x-kafka-spring-cloud-version extension:', value); + return value; + } + + // PRIORITY 2: Check params (but not if it's the default value) + if (params.kafkaSpringCloudVersion && params.kafkaSpringCloudVersion !== '4.2.0') { + logger.debug('PomXml.js: getKafkaSpringCloudVersion() - Using non-default params.kafkaSpringCloudVersion:', params.kafkaSpringCloudVersion); + return params.kafkaSpringCloudVersion; + } + + // PRIORITY 3: Use default value + logger.debug('PomXml.js: getKafkaSpringCloudVersion() - Using default: 4.2.0'); + return '4.2.0'; +} + +function getRabbitSpringCloudVersion(info, params) { + logger.debug('PomXml.js: getRabbitSpringCloudVersion() - Getting RabbitMQ Spring Cloud version'); + + // PRIORITY 1: Check AsyncAPI extensions first + if (info.extensions().get('x-rabbit-spring-cloud-version')) { + const value = info.extensions().get('x-rabbit-spring-cloud-version').value(); + logger.debug('PomXml.js: getRabbitSpringCloudVersion() - Using x-rabbit-spring-cloud-version extension:', value); + return value; + } + + // PRIORITY 2: Check params (but not if it's the default value) + if (params.rabbitSpringCloudVersion && params.rabbitSpringCloudVersion !== '4.2.0') { + logger.debug('PomXml.js: getRabbitSpringCloudVersion() - Using non-default params.rabbitSpringCloudVersion:', params.rabbitSpringCloudVersion); + return params.rabbitSpringCloudVersion; + } + + // PRIORITY 3: Use default value + logger.debug('PomXml.js: getRabbitSpringCloudVersion() - Using default: 4.2.0'); + return '4.2.0'; +} + +/** + * Check if Jackson JSR310 dependency is needed based on processed data + */ +function needsJacksonJsr310(processedData) { + logger.debug('PomXml.js: needsJacksonJsr310() - Checking if Jackson JSR310 is needed'); + if (!processedData) { + logger.debug('PomXml.js: needsJacksonJsr310() - processedData is null/undefined, returning false'); + return false; + } + + // Check if any schema has properties with JSR310 types + const jsr310Types = [ + 'java.time.LocalDate', + 'java.time.LocalTime', + 'java.time.LocalDateTime', + 'java.time.Instant', + 'java.time.OffsetDateTime', + 'java.time.Duration' + ]; + + const schemas = processedData.schemas || []; + + return schemas.some(schema => { + const properties = schema.properties || []; + logger.debug(`PomXml.js: needsJacksonJsr310() - Checking schema: ${schema.name}, properties count: ${properties.length}`); + + return properties.some(property => { + // Check both type and format to detect JSR310 types + const type = property.type; + const format = property.format; + const schemaName = property.schemaName; + + // Check for date-time format which maps to OffsetDateTime + if (type === 'string' && format === 'date-time') { + return true; + } + + // Check for other JSR310 patterns + if (type === 'string' && (format === 'date' || format === 'time')) { + return true; + } + + return false; + }); + }); +} + +/** + * Check if Jackson annotations dependency is needed based on processed data + */ +function needsJacksonAnnotations(processedData) { + logger.debug('PomXml.js: needsJacksonAnnotations() - Checking if Jackson annotations are needed'); + if (!processedData) { + logger.debug('PomXml.js: needsJacksonAnnotations() - processedData is null/undefined, returning false'); + return false; + } + + const schemas = processedData.schemas || []; + + // Check if any schema has properties that need Jackson annotations + return schemas.some(schema => { + const properties = schema.properties || []; + + return properties.some(property => { + // Check if property name is a Java reserved word + if (isJavaReservedWord(property.name)) { + logger.debug(`PomXml.js: needsJacksonAnnotations() - Found Java reserved word property: ${property.name}`); + return true; + } + + // Check if property has JsonProperty annotation + if (property.needsJsonProperty) { + logger.debug(`PomXml.js: needsJacksonAnnotations() - Found property needing JsonProperty: ${property.name}`); + return true; + } + + return false; + }); + }); +} + + + +/** + * Check if validation dependency is needed based on processed data + */ +function needsValidation(processedData) { + logger.debug('PomXml.js: needsValidation() - Checking if validation is needed'); + if (!processedData) { + logger.debug('PomXml.js: needsValidation() - processedData is null/undefined, returning false'); + return false; + } + + const schemas = processedData.schemas || []; + + // Check if any schema has properties with validation constraints + return schemas.some(schema => { + const properties = schema.properties || []; + + return properties.some(property => { + // Check for validation constraints (minimum, maximum, required) + if (property.minimum !== undefined || property.maximum !== undefined) { + logger.debug(`PomXml.js: needsValidation() - Found property with min/max constraints: ${property.name}`); + return true; + } + + // Check for required fields (NotNull annotations) + if (property.required) { + logger.debug(`PomXml.js: needsValidation() - Found required property: ${property.name}`); + return true; + } + + return false; + }); + }); +} + + + +module.exports = { + PomXml, + ApplicationPomXml, + LibraryPomXml, + getGroupId, + getArtifactId, + getSpringBootVersion, + getSpringCloudVersion, + getSpringCloudStreamVersion, + getSolaceSpringCloudVersion, + needsJacksonJsr310, + needsJacksonAnnotations, + needsValidation +}; \ No newline at end of file diff --git a/components/Readme.js b/components/Readme.js new file mode 100644 index 00000000..906e82e2 --- /dev/null +++ b/components/Readme.js @@ -0,0 +1,637 @@ +const React = require('react'); +const { Text } = require('@asyncapi/generator-react-sdk'); +const { logger } = require('../utils/logger'); + +/** + * Enhanced Readme component for generating contextual README.md + */ +function Readme({ asyncapi, params, processedData }) { + logger.debug('Readme.js: Readme() - Generating enhanced README.md component'); + + const title = getTitle(asyncapi); + const version = getVersion(asyncapi); + const description = getDescription(asyncapi); + const applicationDomain = getApplicationDomain(asyncapi); + const schemas = processedData?.schemas || []; + const functions = processedData?.functions || []; + const channels = getChannels(asyncapi); + const queues = getQueues(asyncapi); + + // Deduplicate schemas, functions, and channels + const uniqueSchemas = deduplicateSchemas(schemas); + const uniqueFunctions = deduplicateFunctions(functions); + const uniqueChannels = deduplicateChannels(channels); + + // Extract dynamic values from parameters + const techStack = getTechnologyStack(params); + const javaVersion = getJavaVersion(params); + const mavenVersion = getMavenVersion(params); + const binderType = getBinderType(params); + const binderName = getBinderName(params); + const connectionConfig = getConnectionConfig(params, binderType); + + return React.createElement(React.Fragment, null, + // Header + React.createElement(Text, null, `# ${title}`), + React.createElement(Text, null, ""), + React.createElement(Text, null, `## Version ${version}`), + React.createElement(Text, null, ""), + + // Description + ...(description || '').split('\n').map((line, index) => + React.createElement(Text, { key: index }, line) + ), + React.createElement(Text, null, ""), + + // Project Overview + React.createElement(Text, null, "## Project Overview"), + React.createElement(Text, null, ""), + React.createElement(Text, null, `This is a **Spring Cloud Stream** application generated from the **${applicationDomain}** AsyncAPI specification.`), + React.createElement(Text, null, ""), + React.createElement(Text, null, "### Technology Stack"), + ...techStack.map(tech => + React.createElement(Text, { key: tech.name }, `- **${tech.name}** ${tech.version}`) + ), + React.createElement(Text, null, ""), + + // Generated Components + React.createElement(Text, null, "## Generated Components"), + React.createElement(Text, null, ""), + + // Model Classes + React.createElement(Text, null, "### Model Classes"), + ...uniqueSchemas.map(schema => + React.createElement(Text, { key: schema.name }, `- **${schema.className || schema.name}**`) + ), + React.createElement(Text, null, ""), + + // Functions + React.createElement(Text, null, "### Spring Cloud Stream Functions"), + ...uniqueFunctions.map(func => { + // Use sendMethodName for send functions, otherwise use the function name + const displayName = func.type === 'send' && func.sendMethodName ? func.sendMethodName : func.name; + return React.createElement(Text, { key: func.name }, `- **${displayName}** - ${getFunctionDescription(func)}`); + }), + React.createElement(Text, null, ""), + + // Message Channels + React.createElement(Text, null, "### Message Channels"), + ...uniqueChannels.map(channel => + React.createElement(Text, { key: channel.name }, `- **${channel.name}**`) + ), + React.createElement(Text, null, ""), + + // Solace Queues + ...(queues.length > 0 ? [ + React.createElement(Text, null, "### Solace Queues"), + ...queues.map(queue => [ + React.createElement(Text, { key: queue.name }, `- **${queue.name}** - ${queue.description}`), + ...(queue.topicSubscriptions && queue.topicSubscriptions.length > 0 ? + queue.topicSubscriptions.map((topic, index) => + React.createElement(Text, { key: `${queue.name}-topic-${index}` }, ` - \`${topic}\``) + ) : [] + ) + ]).flat(), + React.createElement(Text, null, "") + ] : []), + + // Getting Started + React.createElement(Text, null, "## Getting Started"), + React.createElement(Text, null, ""), + React.createElement(Text, null, "### Prerequisites"), + React.createElement(Text, null, `- Java ${javaVersion} or higher`), + React.createElement(Text, null, `- Maven ${mavenVersion}+`), + React.createElement(Text, null, `- ${binderType} broker (local or cloud)`), + React.createElement(Text, null, ""), + React.createElement(Text, null, "### Configuration"), + React.createElement(Text, null, `Update the ${binderType} connection settings in \`src/main/resources/application.yml\`:`), + React.createElement(Text, null, ""), + React.createElement(Text, null, "```yaml"), + ...connectionConfig.map(line => + React.createElement(Text, { key: line }, line) + ), + React.createElement(Text, null, "```"), + React.createElement(Text, null, ""), + + // Running the Application + React.createElement(Text, null, "### Running the Application"), + React.createElement(Text, null, ""), + React.createElement(Text, null, "1. **Build the application:**"), + React.createElement(Text, null, " ```bash"), + React.createElement(Text, null, " mvn clean compile"), + React.createElement(Text, null, " ```"), + React.createElement(Text, null, ""), + React.createElement(Text, null, "2. **Run the application:**"), + React.createElement(Text, null, " ```bash"), + React.createElement(Text, null, " mvn spring-boot:run"), + React.createElement(Text, null, " ```"), + React.createElement(Text, null, ""), + + // Development Guide + React.createElement(Text, null, "## Development Guide"), + React.createElement(Text, null, ""), + React.createElement(Text, null, "### Adding Business Logic"), + React.createElement(Text, null, "Each generated function in `Application.java` contains placeholder business logic:"), + React.createElement(Text, null, ""), + + // Consumer Function Example + React.createElement(Text, null, "#### Consumer Functions"), + React.createElement(Text, null, "Process incoming messages:"), + React.createElement(Text, null, ""), + React.createElement(Text, null, "```java"), + React.createElement(Text, null, "@Bean"), + React.createElement(Text, null, "public Consumer> yourConsumer() {"), + React.createElement(Text, null, " return data -> {"), + React.createElement(Text, null, " // Add your business logic here"), + React.createElement(Text, null, " logger.info(\"Received: \" + data.toString());"), + React.createElement(Text, null, " };"), + React.createElement(Text, null, "}"), + React.createElement(Text, null, "```"), + React.createElement(Text, null, ""), + + // Supplier Function Example + React.createElement(Text, null, "#### Supplier Functions"), + React.createElement(Text, null, "Generate and publish messages:"), + React.createElement(Text, null, ""), + React.createElement(Text, null, "```java"), + React.createElement(Text, null, "@Bean"), + React.createElement(Text, null, "public Supplier yourSupplier() {"), + React.createElement(Text, null, " return () -> {"), + React.createElement(Text, null, " // Create and populate your message"), + React.createElement(Text, null, " YourMessageType message = new YourMessageType();"), + React.createElement(Text, null, " // Add your business logic here"), + React.createElement(Text, null, " return message;"), + React.createElement(Text, null, " };"), + React.createElement(Text, null, "}"), + React.createElement(Text, null, "```"), + React.createElement(Text, null, ""), + React.createElement(Text, null, "### Sending Messages"), + React.createElement(Text, null, "Use the generated `send` methods to publish messages:"), + React.createElement(Text, null, ""), + React.createElement(Text, null, "```java"), + React.createElement(Text, null, "// Example: Send order completed message"), + React.createElement(Text, null, "sendOrderCompleted(orderStatus, source, country, storeId, orderId);"), + React.createElement(Text, null, "```"), + React.createElement(Text, null, ""), + + // Testing + React.createElement(Text, null, "### Testing"), + React.createElement(Text, null, "1. **Unit Tests:** Create tests for your business logic"), + React.createElement(Text, null, `2. **Integration Tests:** Test with a local ${binderType} broker`), + React.createElement(Text, null, "3. **End-to-End Tests:** Test complete message flows"), + React.createElement(Text, null, ""), + + // Deployment + React.createElement(Text, null, "### Deployment"), + React.createElement(Text, null, "1. **Build JAR:** `mvn clean package`"), + React.createElement(Text, null, "2. **Run JAR:** `java -jar target/your-app.jar`"), + React.createElement(Text, null, "3. **Docker:** Use the generated Dockerfile (if available)"), + React.createElement(Text, null, ""), + + // Troubleshooting + React.createElement(Text, null, "## Troubleshooting"), + React.createElement(Text, null, ""), + React.createElement(Text, null, "### Common Issues"), + React.createElement(Text, null, `- **Connection Issues:** Verify ${binderType} broker connectivity`), + React.createElement(Text, null, `- **Queue Not Found:** Ensure queues exist in ${binderType}`), + React.createElement(Text, null, "- **Message Format:** Verify message payload matches schema"), + React.createElement(Text, null, ""), + React.createElement(Text, null, "### Logging"), + React.createElement(Text, null, "Adjust logging levels in `application.yml`:"), + React.createElement(Text, null, ""), + React.createElement(Text, null, "```yaml"), + React.createElement(Text, null, "logging:"), + React.createElement(Text, null, " level:"), + React.createElement(Text, null, " com.company: DEBUG"), + React.createElement(Text, null, " org.springframework.cloud.stream: DEBUG"), + React.createElement(Text, null, "```"), + React.createElement(Text, null, ""), + + // API Reference + React.createElement(Text, null, "## API Reference"), + React.createElement(Text, null, ""), + React.createElement(Text, null, "### Message Types"), + ...getMessageTypes(functions).map(msgType => + React.createElement(Text, { key: msgType }, `- **${msgType}**`) + ), + React.createElement(Text, null, ""), + + // Configuration Reference + React.createElement(Text, null, "## Configuration Reference"), + React.createElement(Text, null, ""), + React.createElement(Text, null, "### Key Properties"), + React.createElement(Text, null, "- `spring.cloud.function.definition` - Function definitions"), + React.createElement(Text, null, "- `spring.cloud.stream.bindings.*.destination` - Message destinations"), + React.createElement(Text, null, "- `spring.cloud.stream.bindings.*.group` - Consumer groups"), + React.createElement(Text, null, `- \`spring.cloud.stream.${binderName}.bindings.*.consumer.queueNameExpression\` - Queue names`), + React.createElement(Text, null, ""), + + // License + React.createElement(Text, null, "## License"), + React.createElement(Text, null, "This project is generated from AsyncAPI specification. Please refer to the original specification for licensing information."), + React.createElement(Text, null, "") + ); +} + +function getTitle(asyncapi) { + logger.debug('Readme.js: getTitle() - Getting title from AsyncAPI'); + try { + if (asyncapi.info && typeof asyncapi.info === 'function') { + const info = asyncapi.info(); + if (info && info.title && typeof info.title === 'function') { + return info.title(); + } + } + } catch (error) { + logger.warn('Error getting title:', error.message); + } + return 'AsyncAPI Application'; +} + +function getVersion(asyncapi) { + logger.debug('Readme.js: getVersion() - Getting version from AsyncAPI'); + try { + if (asyncapi.info && typeof asyncapi.info === 'function') { + const info = asyncapi.info(); + if (info && info.version && typeof info.version === 'function') { + return info.version(); + } + } + } catch (error) { + logger.warn('Error getting version:', error.message); + } + return '1.0.0'; +} + +function getDescription(asyncapi) { + logger.debug('Readme.js: getDescription() - Getting description from AsyncAPI'); + try { + if (asyncapi.info && typeof asyncapi.info === 'function') { + const info = asyncapi.info(); + if (info && info.description && typeof info.description === 'function') { + return info.description(); + } + } + } catch (error) { + logger.warn('Error getting description:', error.message); + } + return 'Generated Spring Cloud Stream application for event-driven microservices.'; +} + +function getApplicationDomain(asyncapi) { + logger.debug('Readme.js: getApplicationDomain() - Getting application domain'); + try { + if (asyncapi.info && typeof asyncapi.info === 'function') { + const info = asyncapi.info(); + if (info && info.extensions && typeof info.extensions === 'function') { + const extensions = info.extensions(); + const domainName = extensions.get('x-ep-application-domain-name'); + if (domainName && typeof domainName.value === 'function') { + return domainName.value(); + } + } + } + } catch (error) { + logger.warn('Error getting application domain:', error.message); + } + return 'AsyncAPI Application'; +} + +function getTechnologyStack(params) { + logger.debug('Readme.js: getTechnologyStack() - Getting technology stack from params'); + const techStack = []; + + // Spring Boot + const springBootVersion = params.springBootVersion || '3.4.4'; + techStack.push({ name: 'Spring Boot', version: springBootVersion }); + + // Spring Cloud Stream + const springCloudStreamVersion = params.springCloudStreamVersion || '3.1.3'; + techStack.push({ name: 'Spring Cloud Stream', version: springCloudStreamVersion }); + + // Spring Cloud + const springCloudVersion = params.springCloudVersion || '2024.0.0'; + techStack.push({ name: 'Spring Cloud', version: springCloudVersion }); + + // Binder-specific version + const binderType = getBinderType(params); + if (binderType === 'Solace') { + const solaceVersion = params.solaceSpringCloudVersion || '4.8.0'; + techStack.push({ name: 'Solace Spring Cloud', version: solaceVersion }); + } else if (binderType === 'Kafka') { + const kafkaVersion = params.kafkaSpringCloudVersion || '4.2.0'; + techStack.push({ name: 'Kafka Spring Cloud', version: kafkaVersion }); + } else if (binderType === 'RabbitMQ') { + const rabbitVersion = params.rabbitSpringCloudVersion || '4.2.0'; + techStack.push({ name: 'RabbitMQ Spring Cloud', version: rabbitVersion }); + } + + // Java + const javaVersion = getJavaVersion(params); + techStack.push({ name: 'Java', version: `${javaVersion}+` }); + + return techStack; +} + +function getJavaVersion(params) { + logger.debug('Readme.js: getJavaVersion() - Getting Java version from params'); + return params.javaVersion || '17'; +} + +function getMavenVersion(params) { + logger.debug('Readme.js: getMavenVersion() - Getting Maven version from params'); + return params.mavenVersion || '3.6'; +} + +function getBinderType(params) { + logger.debug('Readme.js: getBinderType() - Getting binder type from params'); + const binder = params.binder || 'solace'; + + // Map binder to display name + const binderMap = { + 'solace': 'Solace PubSub+', + 'kafka': 'Apache Kafka', + 'rabbitmq': 'RabbitMQ', + 'redis': 'Redis', + 'pulsar': 'Apache Pulsar' + }; + + return binderMap[binder.toLowerCase()] || 'Message Broker'; +} + +function getBinderName(params) { + logger.debug('Readme.js: getBinderName() - Getting binder name from params'); + const binder = params.binder || 'solace'; + return binder.toLowerCase(); +} + +function getConnectionConfig(params, binderType) { + logger.debug('Readme.js: getConnectionConfig() - Getting connection config from params'); + const config = []; + + config.push("spring:"); + config.push(" cloud:"); + config.push(" stream:"); + config.push(" binders:"); + + const binderName = getBinderName(params); + config.push(` ${binderName}-binder:`); + config.push(" type: " + binderName); + + if (binderType === 'Solace PubSub+') { + config.push(" environment:"); + config.push(" solace:"); + config.push(" java:"); + config.push(` host: '${params.host || 'tcp://your-solace-host:55554'}'`); + config.push(` msgVpn: '${params.msgVpn || 'your-message-vpn'}'`); + config.push(` clientUsername: '${params.username || 'your-username'}'`); + config.push(` clientPassword: '${params.password || 'your-password'}'`); + } else if (binderType === 'Apache Kafka') { + config.push(" environment:"); + config.push(" spring:"); + config.push(" kafka:"); + config.push(" bootstrap-servers: '${params.bootstrapServers || 'localhost:9092'}'"); + config.push(" security:"); + config.push(" protocol: '${params.securityProtocol || 'PLAINTEXT'}'"); + } else if (binderType === 'RabbitMQ') { + config.push(" environment:"); + config.push(" spring:"); + config.push(" rabbitmq:"); + config.push(` host: '${params.rabbitHost || 'localhost'}'`); + config.push(` port: ${params.rabbitPort || 5672}`); + config.push(` username: '${params.rabbitUsername || 'guest'}'`); + config.push(` password: '${params.rabbitPassword || 'guest'}'`); + } + + return config; +} + + +function getFunctionDescription(func) { + // Use the actual generated function information from processedData + const functionType = func.type || 'unknown'; + const isDynamic = func.dynamic || false; + const hasParams = func.hasParams || false; + const messageName = func.messageName || ''; + const sendMethodName = func.sendMethodName || ''; + + // Build a comprehensive description based on the actual function properties + let description = ''; + + if (functionType === 'supplier') { + description = 'Message supplier function for publishing messages'; + if (isDynamic) { + description += ' (dynamic topic)'; + } + if (messageName) { + description += ` - publishes ${messageName} messages`; + } + } else if (functionType === 'consumer') { + description = 'Message consumer function for processing messages'; + if (func.isQueueWithSubscription) { + description += ` from queue "${func.queueName}"`; + } + } else if (functionType === 'send') { + description = 'Dynamic send function for publishing messages'; + if (hasParams) { + description += ' with dynamic topic parameters'; + } + } else { + // Fallback for unknown types + if (func.name && func.name.includes('Supplier')) { + description = 'Message supplier function for publishing messages'; + } else if (func.name && func.name.includes('Consumer')) { + description = 'Message consumer function for processing messages'; + } else { + description = 'Spring Cloud Stream function'; + } + } + + return description; +} + +function getChannels(asyncapi) { + logger.debug('Readme.js: getChannels() - Getting channels'); + const channels = []; + try { + if (asyncapi.channels && typeof asyncapi.channels === 'function') { + const channelMap = asyncapi.channels(); + // Get the raw JSON to access channel names + const rawChannels = asyncapi._json?.channels || {}; + for (const [name, channel] of Object.entries(rawChannels)) { + const description = getChannelDescription(channel); + channels.push({ name, description }); + } + } + } catch (error) { + logger.warn('Error getting channels:', error.message); + } + return channels; +} + +function getChannelDescription(channel) { + try { + const operations = []; + if (channel.operations && typeof channel.operations === 'function') { + const ops = channel.operations(); + for (const op of ops.values()) { + if (op.action && typeof op.action === 'function') { + operations.push(op.action()); + } + } + } + + // Get channel description from AsyncAPI + let description = ''; + if (channel.description && typeof channel.description === 'function') { + description = channel.description(); + } + + return description || `${operations.join('/')} operations`; + } catch (error) { + return 'Message channel'; + } +} + +function getQueues(asyncapi) { + logger.debug('Readme.js: getQueues() - Getting Solace queues'); + const queueMap = new Map(); + try { + if (asyncapi.channels && typeof asyncapi.channels === 'function') { + // Get the raw JSON to access channel names + const rawChannels = asyncapi._json?.channels || {}; + for (const [name, channel] of Object.entries(rawChannels)) { + const channelQueues = extractQueuesFromChannel(channel); + for (const queue of channelQueues) { + if (queueMap.has(queue.name)) { + // Merge topic subscriptions for existing queue + const existingQueue = queueMap.get(queue.name); + const allSubscriptions = new Set([ + ...existingQueue.topicSubscriptions, + ...queue.topicSubscriptions + ]); + existingQueue.topicSubscriptions = Array.from(allSubscriptions); + existingQueue.description = `Queue with ${existingQueue.topicSubscriptions.length} topic subscriptions`; + } else { + queueMap.set(queue.name, queue); + } + } + } + } + } catch (error) { + logger.warn('Error getting queues:', error.message); + } + return Array.from(queueMap.values()); +} + +function extractQueuesFromChannel(channel) { + const queues = []; + try { + // Check for publish operations + if (channel.publish && channel.publish.bindings && channel.publish.bindings.solace) { + const solaceBinding = channel.publish.bindings.solace; + if (solaceBinding.destinations && Array.isArray(solaceBinding.destinations)) { + for (const dest of solaceBinding.destinations) { + if (dest.destinationType === 'queue' && dest.queue) { + const topicSubscriptions = dest.queue.topicSubscriptions || []; + queues.push({ + name: dest.queue.name, + description: `Queue with ${topicSubscriptions.length} topic subscriptions`, + topicSubscriptions: topicSubscriptions.map(sub => sub.topic || sub) + }); + } + } + } + } + + // Check for subscribe operations + if (channel.subscribe && channel.subscribe.bindings && channel.subscribe.bindings.solace) { + const solaceBinding = channel.subscribe.bindings.solace; + if (solaceBinding.destinations && Array.isArray(solaceBinding.destinations)) { + for (const dest of solaceBinding.destinations) { + if (dest.destinationType === 'queue' && dest.queue) { + const topicSubscriptions = dest.queue.topicSubscriptions || []; + queues.push({ + name: dest.queue.name, + description: `Queue with ${topicSubscriptions.length} topic subscriptions`, + topicSubscriptions: topicSubscriptions.map(sub => sub.topic || sub) + }); + } + } + } + } + } catch (error) { + logger.warn('Error extracting queues from channel:', error.message); + } + return queues; +} + +function getMessageTypes(functions) { + const messageTypes = new Set(); + functions.forEach(func => { + if (func.messageTypes && Array.isArray(func.messageTypes)) { + func.messageTypes.forEach(type => messageTypes.add(type)); + } + }); + return Array.from(messageTypes); +} + +function deduplicateSchemas(schemas) { + const seen = new Set(); + const unique = []; + + schemas.forEach(schema => { + const key = schema.className || schema.name; + if (!seen.has(key)) { + seen.add(key); + unique.push(schema); + } + }); + + return unique; +} + +function deduplicateFunctions(functions) { + const seen = new Set(); + const unique = []; + + functions.forEach(func => { + if (!seen.has(func.name)) { + seen.add(func.name); + unique.push(func); + } + }); + + return unique; +} + +function deduplicateChannels(channels) { + const seen = new Set(); + const unique = []; + + channels.forEach(channel => { + if (!seen.has(channel.name)) { + seen.add(channel.name); + unique.push(channel); + } + }); + + return unique; +} + +module.exports = { + Readme, + getTitle, + getVersion, + getDescription, + getApplicationDomain, + getTechnologyStack, + getJavaVersion, + getMavenVersion, + getBinderType, + getBinderName, + getConnectionConfig, + getChannels, + getQueues, + getMessageTypes +}; \ No newline at end of file diff --git a/filters/all.js b/filters/all.js deleted file mode 100644 index 03344f79..00000000 --- a/filters/all.js +++ /dev/null @@ -1,1084 +0,0 @@ -const filter = module.exports; -const yaml = require('js-yaml'); -const generatorFilters = require('@asyncapi/generator-filters'); -const _ = require('lodash'); -const ScsLib = require('../lib/scsLib.js'); -const scsLib = new ScsLib(); -const ApplicationModel = require('../lib/applicationModel.js'); -const applicationModel = new ApplicationModel('all'); -// To enable debug logging, set the env var DEBUG="type function" with whatever things you want to see. -const debugDynamic = require('debug')('dynamic'); -const debugFunction = require('debug')('function'); -const debugJavaClass = require('debug')('javaClass'); -const debugPayload = require('debug')('payload'); -const debugProperty = require('debug')('property'); -const debugChannel = require('debug')('channel'); -const debugType = require('debug')('type'); - -const stringMap = new Map(); -stringMap.set('date',{javaType: 'java.time.LocalDate', printFormat: '%s', sample: '2000-12-31'}); -stringMap.set('date-time',{javaType: 'java.time.OffsetDateTime', printFormat: '%s', sample: '2000-12-31T23:59:59+01:00'}); -stringMap.set('byte',{javaType: 'byte[]', printFormat: '%s', sample: 'U3dhZ2dlciByb2Nrcw=='}); -stringMap.set('binary',{javaType: 'byte[]', printFormat: '%s', sample: 'base64-encoded file contents'}); -stringMap.set(undefined,{javaType: 'String', printFormat: '%s', sample: '"string"'}); - -const integerMap = new Map(); -integerMap.set('int32',{javaType: 'Integer', printFormat: '%d', sample: '1'}); -integerMap.set('int64',{javaType: 'Long', printFormat: '%d', sample: '1L'}); -integerMap.set(undefined,{javaType: 'Integer', printFormat: '%d', sample: '1'}); - -const numberMap = new Map(); -numberMap.set('float',{javaType: 'Float', printFormat: '%f', sample: '1.1F'}); -numberMap.set('double',{javaType: 'Double', printFormat: '%f', sample: '1.1'}); -numberMap.set(undefined,{javaType: 'java.math.BigDecimal', printFormat: '%s', sample: '100.1'}); - -const booleanMap = new Map(); -booleanMap.set(undefined,{javaType: 'Boolean', printFormat: '%s', sample: 'true'}); - -const nullMap = new Map(); -nullMap.set(undefined,{javaType: 'String', printFormat: '%s', sample: 'null'}); - -const typeMap = new Map(); -typeMap.set('boolean', booleanMap); -typeMap.set('integer', integerMap); -typeMap.set('null', nullMap); -typeMap.set('number', numberMap); -typeMap.set('string', stringMap); - -function getType(type, format) { - let typeObject = typeMap.get(type).get(format); - if (typeObject === undefined) { - typeObject = typeMap.get(type).get(undefined); - } - return typeObject; -} - -class SCSFunction { - get isPublisher() { - return this.type === 'function' || this.type === 'supplier'; - } - - get isSubscriber() { - return this.type === 'function' || this.type === 'consumer'; - } - - get publishBindingName() { - return `${this.name }-out-0`; - } - - get subscribeBindingName() { - return `${this.name }-in-0`; - } - - // This returns true if this is a function, but we need to render it as a consumer - // because we need to call streamBridge to send out the message. - get functionAsConsumer() { - return this.type === 'function' && this.dynamic && this.dynamicType === 'streamBridge'; - } - - get functionSignature() { - let ret = ''; - if (this.type === 'consumer' || (this.type === 'function' && this.dynamic && this.dynamicType === 'streamBridge')) { - if (this.reactive) { - ret = `public Consumer> ${this.name}()`; - } else if (this.dynamic && this.parametersToHeaders) { - ret = `public Consumer> ${this.name}()`; - } else { - ret = `public Consumer<${this.subscribePayload}> ${this.name}()`; - } - } else if (this.type === 'supplier') { - ret = this.getSupplierFunctionSignature(); - } else if (this.type === 'function') { - ret = this.getFunctionMethodSignature(); - } else { - throw new Error(`Can't determine the function signature for ${this.name} because the type is ${this.type}`); - } - return ret; - } - - getSupplierFunctionSignature() { - let ret = ''; - - if (this.dynamic) { - if (this.reactive) { - ret = `public Supplier>> ${this.name}()`; - } else { - ret = `public Supplier> ${this.name}()`; - } - } else if (this.reactive) { - ret = `public Supplier> ${this.name}()`; - } else { - ret = `public Supplier<${this.publishPayload}> ${this.name}()`; - } - - return ret; - } - - getFunctionMethodSignature() { - let ret = ''; - - if (this.dynamic) { - if (this.reactive) { - ret = `public Function, Flux>> ${this.name}()`; - } else { - ret = `public Function<${this.subscribePayload}, Message<${this.publishPayload}>> ${this.name}()`; - } - } else if (this.reactive) { - ret = `public Function, Flux<${this.publishPayload}>> ${this.name}()`; - } else { - ret = `public Function<${this.subscribePayload}, ${this.publishPayload}> ${this.name}()`; - } - - return ret; - } -} - -// This generates the object that gets rendered in the application.yaml file. -function appProperties([asyncapi, params]) { - debugProperty('appProperties start'); - - if (params.binder !== 'kafka' && params.binder !== 'rabbit' && params.binder !== 'solace') { - throw new Error('Please provide a parameter named \'binder\' with the value kafka, rabbit or solace.'); - } - - const doc = {}; - doc.spring = {}; - doc.spring.cloud = {}; - const cloud = doc.spring.cloud; - cloud.function = {}; - - // See if we have dynamic functions, and if the parametersToHeaders param is set. - // If so, add the input-header-mapping-expression config to consumers which consume dynamic channels. - if (params.parametersToHeaders) { - handleParametersToHeaders(asyncapi, params, cloud); - } - - debugProperty('appProperties getFunctionDefinitions'); - cloud.function.definition = getFunctionDefinitions(asyncapi, params); - cloud.stream = {}; - const scs = cloud.stream; - debugProperty('appProperties getBindings'); - scs.bindings = getBindings(asyncapi, params); - - if (params.binder === 'solace') { - debugProperty('appProperties getAdditionalSubs'); - const additionalSubs = getAdditionalSubs(asyncapi, params); - - if (additionalSubs) { - scs.solace = additionalSubs; - } - } - - if (params.binder === 'kafka') { - const brokerSettings = getBrokerSettings(asyncapi, params); - - if (brokerSettings) { - scs.kafka = brokerSettings; - } - } - - if (isApplication(params)) { - if (params.binder === 'solace') { - scs.binders = {}; - scs.binders['solace-binder'] = {}; - const sb = scs.binders['solace-binder']; - sb.type = 'solace'; - sb.environment = {}; - sb.environment.solace = getSolace(params); - } - - doc.logging = {}; - doc.logging.level = {}; - doc.logging.level.root = 'info'; - doc.logging.level.org = {}; - doc.logging.level.org.springframework = 'info'; - - if (params.actuator === 'true') { - doc.server = {}; - doc.server.port = 8080; - doc.management = {}; - doc.management.endpoints = {}; - doc.management.endpoints.web = {}; - doc.management.endpoints.web.exposure = {}; - doc.management.endpoints.web.exposure.include = '*'; - } - } - const ym = yaml.safeDump(doc, { lineWidth: 200 }); - debugProperty('appProperties end'); - return ym; -} -filter.appProperties = appProperties; - -function handleParametersToHeaders(asyncapi, params, cloud) { - const dynamicFuncs = getDynamicFunctions([asyncapi, params]); - - if (dynamicFuncs && (params.binder === 'solace' || params.binder === 'rabbit')) { - cloud.function.configuration = {}; - const funcs = getFunctionSpecs(asyncapi, params); - - funcs.forEach((spec, name, map) => { - if (spec.dynamic && spec.type === 'consumer') { - cloud.function.configuration[name] = {}; - cloud.function.configuration[name]['input-header-mapping-expression'] = {}; - const headerConfig = cloud.function.configuration[name]['input-header-mapping-expression']; - addHeaderConfigs(params, spec.channelInfo, headerConfig); - } - }); - } -} - -function addHeaderConfigs(params, channelInfo, headerConfig) { - for (const param of channelInfo.parameters) { - if (params.binder === 'solace') { - headerConfig[param.name] = `headers.solace_destination.getName.split("/")[${param.position}]`; - } else if (params.binder === 'rabbit') { - headerConfig[param.name] = `headers.amqp_receivedRoutingKey.getName.split("/")[${param.position}]`; - } - } -} - -function artifactId([info, params]) { - return scsLib.getParamOrDefault(info, params, 'artifactId', 'x-artifact-id'); -} -filter.artifactId = artifactId; - -function addtoExtraIncludesFromFunctionSpecs(asyncapi, params, extraIncludes) { - const funcs = getFunctionSpecs(asyncapi, params); - - funcs.forEach((spec, name, map) => { - if (spec.dynamic) { - extraIncludes.dynamic = true; - } - if (spec.multipleMessages || spec.dynamic) { - extraIncludes.needMessage = true; - } - if (spec.type === 'function' && !spec.functionAsConsumer) { - extraIncludes.needBean = true; - extraIncludes.needFunction = true; - } - if ((spec.type === 'supplier' && !(spec.dynamic && spec.dynamicType === 'streamBridge'))) { - extraIncludes.needBean = true; - extraIncludes.needSupplier = true; - } - if (spec.type === 'consumer' || spec.functionAsConsumer) { - extraIncludes.needBean = true; - extraIncludes.needConsumer = true; - } - }); -} - -function appExtraIncludes([asyncapi, params]) { - const extraIncludes = {}; - - for (const channelName in asyncapi.channels()) { - const channel = asyncapi.channels()[channelName]; - const subscribe = channel.subscribe(); - - if (subscribe && (subscribe.hasMultipleMessages())) { - extraIncludes.needMessage = true; - } - - const publish = channel.publish(); - if (publish && publish.hasMultipleMessages()) { - extraIncludes.needMessage = true; - } - } - - addtoExtraIncludesFromFunctionSpecs(asyncapi, params, extraIncludes); - return extraIncludes; -} - -filter.appExtraIncludes = appExtraIncludes; - -function identifierName(str) { - return scsLib.getIdentifierName(str); -} -filter.identifierName = identifierName; - -function indent1(numTabs) { - return indent(numTabs); -} -filter.indent1 = indent1; - -function indent2(numTabs) { - return indent(numTabs + 1); -} -filter.indent2 = indent2; - -function indent3(numTabs) { - return indent(numTabs + 2); -} -filter.indent3 = indent3; -// This returns the proper Java type for a schema property. -function fixType([name, javaName, property]) { - debugType(`fixType: ${name}`); - debugType(property); - - let isArrayOfObjects = false; - - // For message headers, type is a property. - // For schema properties, type is a function. - let type = property.type; - let format = property.format; - debugType(`fixType: ${property}`); - - if (typeof type === 'function') { - type = property.type(); - format = property.format(); - } - - debugType(`fixType: type: ${type} javaName ${javaName}`); - debugType(property); - // If a schema has a property that is a ref to another schema, - // the type is undefined, and the title gives the title of the referenced schema. - let typeName; - if (type === undefined) { - if (property.enum()) { - debugType('It is an enum.'); - typeName = _.upperFirst(javaName); - } else if (property.oneOf() || property.anyOf() || property.allOf()) { - // Picking a type for the user may be difficult - especially since the first avro union value must be the default value which is normally of type null. - typeName = 'Object'; - } else { - throw new Error(`Can't determine the type of property ${ name }`); - } - } else if (type === 'array') { - if (!property.items()) { - throw new Error(`Array named ${ name } must have an 'items' property to indicate what type the array elements are.`); - } - let itemsType = property.items().type(); - if (itemsType) { - if (itemsType === 'object') { - isArrayOfObjects = true; - itemsType = _.upperFirst(javaName); - } else { - itemsType = getType(itemsType, format).javaType; - } - } - if (!itemsType) { - itemsType = property.items().ext('x-parser-schema-id'); - - if (!itemsType) { - throw new Error(`Array named ${ name }: can't determine the type of the items.`); - } - } - typeName = `${itemsType}[]`; - } else if (type === 'object') { - typeName = _.upperFirst(javaName); - } else if (property.enum()) { - debugType('It is an enum.'); - typeName = _.upperFirst(javaName); - } else { - typeName = getType(type,format).javaType; - if (!typeName) { - typeName = type; - } - } - return [typeName, isArrayOfObjects]; -} -filter.fixType = fixType; - -function functionSpecs([asyncapi, params]) { - return getFunctionSpecs(asyncapi, params); -} -filter.functionSpecs = functionSpecs; - -// This returns the non-SCS type functions for sending to dynamic channels. -function getDynamicFunctions([asyncapi, params]) { - const functionMap = new Map(); - debugDynamic('start:'); - for (const channelName in asyncapi.channels()) { - const channel = asyncapi.channels()[channelName]; - debugDynamic(`getDynamicFunctions channelName ${channelName}`); - debugDynamic(channel); - const publisher = scsLib.getRealPublisher(asyncapi.info(), params, channel); - if (publisher) { - debugDynamic('found publisher:'); - debugDynamic(publisher); - const channelInfo = getChannelInfo(params, channelName, channel); - if (channelInfo.hasParams) { - const spec = {}; - spec.channelInfo = channelInfo; - spec.payloadClass = getPayloadClass(publisher); - spec.sendMethodName = getSendFunctionName(channelName, publisher); - functionMap.set(spec.sendMethodName, spec); - } - } - } - debugDynamic('functionMap'); - debugDynamic(functionMap); - return functionMap; -} -filter.getDynamicFunctions = getDynamicFunctions; - -// This returns the list of methods belonging to an object, just to help debugging. -const getMethods = (obj) => { - const properties = new Set(); - let currentObj = obj; - do { - Object.getOwnPropertyNames(currentObj).forEach(item => properties.add(item)); - } while ((currentObj = Object.getPrototypeOf(currentObj))); - return [...properties.keys()].filter(item => typeof obj[item] === 'function'); -}; - -function getModelClass(customSchemaObject) { - return applicationModel.getModelClass(customSchemaObject); -} -filter.getModelClass = getModelClass; - -function getAnonymousSchemaForRef(schemaName) { - return applicationModel.getAnonymousSchemaForRef(schemaName); -} -filter.getAnonymousSchemaForRef = getAnonymousSchemaForRef; - -function getRealPublisher([info, params, channel]) { - return scsLib.getRealPublisher(info, params, channel); -} -filter.getRealPublisher = getRealPublisher; - -function getRealSubscriber([info, params, channel]) { - return scsLib.getRealSubscriber(info, params, channel); -} -filter.getRealSubscriber = getRealSubscriber; - -function groupId([info, params]) { - return scsLib.getParamOrDefault(info, params, 'groupId', 'x-group-id'); -} -filter.groupId = groupId; - -function isEmpty(obj) { - if (!obj) { - return true; - } - return obj && Object.keys(obj).length === 0 && obj.constructor === Object; -} -filter.isEmpty = isEmpty; - -// Called from the java-class partial -function logJavaClass(obj) { - debugJavaClass(obj); -} -filter.logJavaClass = logJavaClass; - -function logFull(obj) { - console.log(obj); - if (obj) { - console.log(dump(obj)); - console.log(getMethods(obj)); - } - return obj; -} -filter.logFull = logFull; - -function lowerFirst(str) { - return _.lowerFirst(str); -} -filter.lowerFirst = lowerFirst; - -function mainClassName([info, params]) { - return scsLib.getParamOrDefault(info, params, 'javaClass', 'x-java-class', 'Application'); -} -filter.mainClassName = mainClassName; - -// This returns the Java class name of the payload. -function payloadClass([channelName, channel]) { - let ret; - - if (channel.publish()) { - ret = getPayloadClass(channel.publish()); - } - - if (!ret && channel.subscribe()) { - ret = getPayloadClass(channel.subscribe()); - } - - if (!ret) { - throw new Error(`Channel ${ channelName }: no payload class has been defined.`); - } - return ret; -} -filter.payloadClass = payloadClass; - -function schemaExtraIncludes([schemaName, schema]) { - debugProperty(`schemaExtraIncludes ${schemaName} ${schema.type()}`); - - const ret = {}; - if (checkPropertyNames(schemaName, schema)) { - ret.needJsonPropertyInclude = true; - } - debugProperty('checkPropertyNames:'); - debugProperty(ret); - return ret; -} -filter.schemaExtraIncludes = schemaExtraIncludes; - -function solaceSpringCloudVersion([info, params]) { - return scsLib.getParamOrDefault(info, params, 'solaceSpringCloudVersion', 'x-solace-spring-cloud-version'); -} -filter.solaceSpringCloudVersion = solaceSpringCloudVersion; - -function springBootVersion([info, params]) { - return scsLib.getParamOrDefault(info, params, 'springBootVersion', 'x-spring-boot-version'); -} -filter.springBootVersion = springBootVersion; - -function springCloudStreamVersion([info, params]) { - return scsLib.getParamOrDefault(info, params, 'springCloudStreamVersion', 'x-spring-cloud-stream-version'); -} -filter.springCloudStreamVersion = springCloudStreamVersion; - -function springCloudVersion([info, params]) { - return scsLib.getParamOrDefault(info, params, 'springCloudVersion', 'x-spring-cloud-version'); -} -filter.springCloudVersion = springCloudVersion; - -function stringify(obj) { - return JSON.stringify(obj, null, 2); -} -filter.stringify = stringify; - -function extraImports([asyncapi, params]) { - return getExtraImports(asyncapi); -} -filter.extraImports = extraImports; - -function getExtraImports(asyncapi) { - const schemaImports = []; - const channelOperationInfos = []; - for (const channelName in asyncapi.channels()) { - const channel = asyncapi.channels()[channelName]; - if (channel.hasPublish()) { - channelOperationInfos.push(channel.publish()); - } - if (channel.hasSubscribe()) { - channelOperationInfos.push(channel.subscribe()); - } - } - if (channelOperationInfos.length > 0) { - channelOperationInfos.forEach(channelOperationInfo => { - const fullPackagePath = getPayloadPackage(channelOperationInfo); - if (fullPackagePath) { - schemaImports.push(fullPackagePath); - } - }); - } - return schemaImports; -} - -function getPayloadPackage(pubOrSub) { - let fullPackagePath; - if (!pubOrSub.hasMultipleMessages()) { - let payload; - if (pubOrSub.message()) { - payload = pubOrSub.message().payload(); - } - if (payload) { - const type = payload.type(); - const importName = payload.ext('x-parser-schema-id'); - // This is a schema within a package - like an avro schema in a namespace. We're hoping the full thing is part of the x-schema-parser-id. - if ((!type || type === 'object') && importName.includes('.')) { - fullPackagePath = importName; - } - } - } - return fullPackagePath; -} - -// Returns true if any property names will be different between json and java. -function checkPropertyNames(name, schema) { - const ret = false; - - debugProperty(`checkPropertyNames: checking schema ${name}`); - debugProperty(schema); - - let properties = schema.properties(); - - if (schema.type() === 'array') { - properties = schema.items().properties(); - } - - debugProperty(`schema type : ${schema.type()}`); - - for (const propName in properties) { - const javaName = scsLib.getIdentifierName(propName); - const prop = properties[propName]; - debugProperty(`checking ${propName} ${prop.type()}`); - - if (javaName !== propName) { - debugProperty(`Java name ${javaName} is different from ${propName}`); - return true; - } - if (prop.type() === 'object') { - debugProperty('Recursing into object'); - const check = checkPropertyNames(propName, prop); - if (check) { - return true; - } - } else if (prop.type() === 'array') { - debugProperty(`checkPropertyNames: ${prop}`); - if (!prop.items) { - throw new Error(`Array named ${ propName } must have an 'items' property to indicate what type the array elements are.`); - } - const itemsType = prop.items().type(); - debugProperty(`checkPropertyNames: ${prop.items}`); - debugProperty(`array of ${itemsType}`); - if (itemsType === 'object') { - debugProperty('Recursing into array'); - const check = checkPropertyNames(propName, prop.items()); - if (check) { - return true; - } - } - } - } - return ret; -} - -function dump(obj) { - let s = typeof obj; - for (const p in obj) { - s += ' '; - s += p; - } - return s; -} - -function getAdditionalSubs(asyncapi, params) { - let ret; - const funcs = getFunctionSpecs(asyncapi, params); - funcs.forEach((spec, name, map) => { - debugProperty(`getAdditionalSubs: ${spec.name} ${spec.isQueueWithSubscription} ${spec.additionalSubscriptions}`); - // The first additional subscription will be the destination. If there is more than one the rest go here. - if (spec.isQueueWithSubscription && spec.additionalSubscriptions.length > 1) { - if (!ret) { - ret = {}; - ret.bindings = {}; - } - const bindingName = `${spec.subscribeBindingName}`; - ret.bindings[bindingName] = {}; - ret.bindings[bindingName].consumer = {}; - ret.bindings[bindingName].consumer.queueAdditionalSubscriptions = spec.additionalSubscriptions.slice(1); - } - }); - return ret; -} - -function getBrokerSettings(asyncapi, params) { - let brokerSettings; - - if (params.useServers === 'true') { - let brokers = ''; - - for (const serverName in asyncapi.servers()) { - const server = asyncapi.servers()[serverName]; - let url = server.url(); - if (server.variables()) { - url = generatorFilters.replaceServerVariablesWithValues(url, server.variables()); - } - brokers += `${url},`; - } - brokers = brokers.substring(0, brokers.length - 1); - brokerSettings = {}; - brokerSettings.binder = {}; - brokerSettings.binder.brokers = brokers; - } - return brokerSettings; -} - -// This returns the SCSt bindings config that will appear in application.yaml. -function getBindings(asyncapi, params) { - const ret = {}; - const funcs = getFunctionSpecs(asyncapi, params); - const functionsThatAreBeans = filterOutNonBeanFunctionSpecs(funcs); - functionsThatAreBeans.forEach((spec, name, map) => { - if (spec.isPublisher) { - ret[spec.publishBindingName] = {}; - ret[spec.publishBindingName].destination = spec.publishChannel; - } - if (spec.isSubscriber) { - ret[spec.subscribeBindingName] = {}; - ret[spec.subscribeBindingName].destination = decodeURI(spec.subscribeChannel); - if (spec.group) { - ret[spec.subscribeBindingName].group = spec.group; - } - } - }); - return ret; -} - -// This returns the base function name that SCSt will use to map functions with bindings. -function getFunctionName(channelName, operation, isSubscriber) { - if (operation.ext('x-scs-function-name')) { - return operation.ext('x-scs-function-name'); - } - - let ret; - let functionName; - const smfBinding = operation.binding('smf'); - - if (smfBinding && smfBinding.queueName && smfBinding.topicSubscriptions) { - functionName = smfBinding.queueName; - } else { - if (operation.id()) { - return operation.id(); - } - functionName = channelName; - } - - if (isSubscriber === undefined) { - ret = _.camelCase(functionName); - } else { - ret = _.camelCase(functionName) + (isSubscriber ? 'Consumer' : 'Supplier'); - } - - return ret; -} - -function filterOutNonBeanFunctionSpecs(funcs) { - const beanFunctionSpecs = new Map(); - const entriesIterator = funcs.entries(); - - let iterValue = entriesIterator.next(); - while (!iterValue.done) { - const funcSpec = iterValue.value[1]; - - // This is the inverse of the condition in the Application template file - // Add it if its not dynamic (hasParams = true, isPublisher = true) and type is supplier or streamBridge - if (!(funcSpec.isPublisher && funcSpec.channelInfo.hasParams && - (funcSpec.type === 'supplier' || funcSpec.dynamicType === 'streamBridge'))) { - beanFunctionSpecs.set(iterValue.value[0], iterValue.value[1]); - } - iterValue = entriesIterator.next(); - } - return beanFunctionSpecs; -} - -// This returns the string that gets rendered in the function.definition part of application.yaml. -function getFunctionDefinitions(asyncapi, params) { - let ret = ''; - const funcs = getFunctionSpecs(asyncapi, params); - const functionsThatAreBeans = filterOutNonBeanFunctionSpecs(funcs); - const names = functionsThatAreBeans.keys(); - ret = Array.from(names).join(';'); - return ret; -} - -function getFunctionSpecs(asyncapi, params) { - // This maps function names to SCS function definitions. - - debugFunction('--------------------------- getFunctionSpecs -------------------'); - - if (params.dynamicType !== 'header' && params.dynamicType !== 'streamBridge') { - throw new Error(`The dynamicType parameter must be either 'header' or 'streamBridge. Given: ${params.dynamicType}`); - } - - const functionMap = new Map(); - const reactive = params.reactive === 'true'; - const info = asyncapi.info(); - - for (const channelName in asyncapi.channels()) { - const channel = asyncapi.channels()[channelName]; - debugFunction(`getFunctionSpecs channelName ${channelName}`); - debugFunction(channel); - let functionSpec; - - const publish = scsLib.getRealPublisher(info, params, channel); - if (publish) { - const name = getFunctionName(channelName, publish, false); - debugFunction(`We have a real publisher named ${name}`); - functionSpec = functionMap.get(name); - if (functionSpec) { - if (functionSpec.isPublisher) { - throw new Error(`Function ${name} can't publish to both channels ${name} and ${channelName}.`); - } - functionSpec.type = 'function'; - debugFunction('Found existing subscriber, so this is a function.'); - } else { - const channelInfo = getChannelInfo(params, channelName, channel); - functionSpec = new SCSFunction(); - functionSpec.name = name; - functionSpec.type = 'supplier'; - functionSpec.reactive = reactive; - functionSpec.dynamic = channelInfo.hasParams; - functionSpec.channelInfo = channelInfo; - functionSpec.sendMethodName = getSendFunctionName(channelName, publish); - functionSpec.dynamicType = params.dynamicType; - functionSpec.parametersToHeaders = params.parametersToHeaders; - functionSpec.multipleMessageComment = getMultipleMessageComment(publish); - functionMap.set(name, functionSpec); - } - const payload = getPayloadClass(publish); - if (!payload) { - throw new Error(`Channel ${channelName}: no payload class has been defined.`); - } - functionSpec.publishPayload = payload; - functionSpec.publishChannel = channelName; - } - - const subscribe = scsLib.getRealSubscriber(info, params, channel); - - if (subscribe) { - const name = getFunctionName(channelName, subscribe, true); - debugFunction(`We have a real subscriber named ${name}`); - const smfBinding = subscribe.binding('smf'); - debugFunction('smfBinding:'); - debugFunction(smfBinding); - functionSpec = functionMap.get(name); - if (functionSpec) { - debugFunction(`This already exists: ${name} isQueueWithSubscription: ${functionSpec.isQueueWithSubscription}`); - if (functionSpec.isQueueWithSubscription) { // This comes from an smf binding to a queue. - debugFunction(functionSpec); - for (const sub of smfBinding.channelSubscriptions) { - let foundIt = false; - for (const existingSub of functionSpec.additionalSubscriptions) { - debugFunction(`Comparing ${sub} to ${existingSub}`); - if (sub === existingSub) { - foundIt = true; - break; - } - } - - if (!foundIt) { - debugFunction(`Adding new sub ${sub}`); - functionSpec.additionalSubscriptions.push(sub); - functionSpec.multipleMessages = true; - } - } - debugFunction(`The queue ${functionSpec.name} has multiple subs: ${functionSpec.multipleMessages}`); - if (functionSpec.multipleMessages) { - functionSpec.subscribePayload = 'Message'; - } - debugFunction('Updated function spec:'); - debugFunction(functionSpec); - continue; - } else { - if (functionSpec.isSubscriber) { - throw new Error(`Function ${name} can't subscribe to both channels ${functionSpec.channel} and ${channelName}.`); - } - functionSpec.type = 'function'; - functionSpec.dynamicType = params.dynamicType; - } - } else { - debugFunction('This is a new one.'); - const channelInfo = getChannelInfo(params, channelName, channel); - functionSpec = new SCSFunction(); - functionSpec.name = name; - functionSpec.type = 'consumer'; - functionSpec.reactive = reactive; - functionSpec.dynamic = channelInfo.hasParams; - functionSpec.channelInfo = channelInfo; - functionSpec.dynamicType = params.dynamicType; - functionSpec.parametersToHeaders = params.parametersToHeaders; - functionSpec.multipleMessageComment = getMultipleMessageComment(subscribe); - if (smfBinding && smfBinding.queueName && smfBinding.topicSubscriptions) { - debugFunction(`A new one with subscriptions: ${smfBinding.topicSubscriptions}`); - functionSpec.additionalSubscriptions = smfBinding.topicSubscriptions; - functionSpec.isQueueWithSubscription = true; - functionSpec.multipleMessages = smfBinding.topicSubscriptions && smfBinding.topicSubscriptions.length > 1; - } - functionMap.set(name, functionSpec); - } - - if (functionSpec.multipleMessages) { - functionSpec.subscribePayload = 'Message'; - } else { - const payload = getPayloadClass(subscribe); - if (!payload) { - throw new Error(`Channel ${channelName}: no payload class has been defined.`); - } - functionSpec.subscribePayload = payload; - } - const group = subscribe.ext('x-scs-group'); - if (group) { - functionSpec.group = group; - } - const dest = subscribe.ext('x-scs-destination'); - if (dest) { - functionSpec.subscribeChannel = dest; - } else if (functionSpec.isQueueWithSubscription) { - functionSpec.subscribeChannel = functionSpec.additionalSubscriptions[0]; - debugFunction(`Setting subscribeChannel for channelWithSubs: ${functionSpec.subscribeChannel}`); - } else { - const channelInfo = getChannelInfo(params, channelName, channel); - functionSpec.subscribeChannel = channelInfo.subscribeChannel; - } - } - - debugFunction('functionSpec:'); - debugFunction(functionSpec); - } - - return functionMap; -} - -function getSendFunctionName(channelName, operation) { - return `send${_.upperFirst(getFunctionName(channelName, operation, undefined))}`; -} - -function getMultipleMessageComment(pubOrSub) { - let ret; - - // We deliberately leave out the last newline, because that makes it easier to use in the template. - // Otherwise it's really hard to get rid of an extra unwanted newline. - if (pubOrSub.hasMultipleMessages()) { - ret = '// The message can be of type:'; - pubOrSub.messages().forEach(m => { - ret += '\n\t// '; - ret += getMessagePayloadType(m); - }); - } - - return ret; -} - -function getPayloadClass(pubOrSub) { - let ret; - - debugPayload(pubOrSub); - if (pubOrSub.hasMultipleMessages()) { - ret = 'Message'; - } else { - const message = pubOrSub.message(); - if (message) { - ret = getMessagePayloadType(message); - } - } - debugPayload(`getPayloadClass: ${ret}`); - - return ret; -} - -function getMessagePayloadType(message) { - let ret; - const payload = message.payload(); - debugPayload('payload:'); - debugPayload(payload); - - if (payload) { - const type = payload.type(); - debugPayload('type:'); - debugPayload(type); - - if (!type || type === 'object') { - ret = payload.ext('x-parser-schema-id'); - const { className } = scsLib.stripPackageName(ret); - ret = _.camelCase(className); - ret = _.upperFirst(ret); - } else { - ret = getType(type, payload.format()).javaType; - } - } - return ret; -} - -function sortParametersUsingChannelName(parameters, channelName) { - // This doesnt work if theres two of the same variables in the channel name (scenario unlikely) - parameters.forEach(param => { - param.indexInChannelName = channelName.indexOf(param.rawName); - }); - return _.sortBy(parameters, ['indexInChannelName']); -} - -// This returns the connection properties for a solace binder, for application.yaml. -function getSolace(params) { - const ret = {}; - ret.java = {}; - ret.java.host = params.host; - ret.java.msgVpn = params.msgVpn; - ret.java.clientUsername = params.username; - ret.java.clientPassword = params.password; - return ret; -} - -// This returns an object containing information the template needs to render channel strings. -function getChannelInfo(params, channelName, channel) { - const ret = {}; - - // This isfor the parameterToHeader feature. - const delimiter = (params.binder === 'rabbit' || params.binder === 'kafka') ? '.' : '/'; - const channelParts = channelName.split(delimiter); - - let publishChannel = String(channelName); - let subscribeChannel = String(channelName); - const parameters = []; - - debugChannel('parameters:'); - debugChannel(channel.parameters()); - for (const name in channel.parameters()) { - const nameWithBrackets = `{${name}}`; - const parameter = channel.parameter(name); - const schema = parameter.schema(); - const type = getType(schema.type(), schema.format()); - const param = { - name: _.camelCase(name), - rawName: name - }; - debugChannel(`name: ${name} type:`); - debugChannel(type); - let sampleArg = 1; - - subscribeChannel = subscribeChannel.replace(nameWithBrackets, '*'); - - // Figure out what channel part it's in. This is just for the parameterToHeader feature. - for (let i = 0; i < channelParts.length; i++) { - if (channelParts[i] === nameWithBrackets) { - param.position = i; - break; - } - } - - [publishChannel, sampleArg] = handleParameterType(name, param, type, publishChannel, schema, nameWithBrackets); - param.sampleArg = sampleArg; - parameters.push(param); - } - // The channel parameters aren't in any particular order when they come in. - // This means, to be safe, we need to order them like how it is in the channel name. - ret.parameters = sortParametersUsingChannelName(parameters, channelName); - ret.functionArgList = ret.parameters.map(param => param.name).join(', '); - ret.functionParamList = ret.parameters.map(param => `${param.type} ${param.name}`).join(', '); - ret.sampleArgList = ret.parameters.map(param => param.sampleArg).join(', '); - ret.channelName = channelName; - ret.publishChannel = publishChannel; - ret.subscribeChannel = subscribeChannel; - ret.hasParams = parameters.length > 0; - return ret; -} - -function handleParameterType(name, param, type, publishChannel, schema, nameWithBrackets) { - let sampleArg = 1; - if (type) { - debugChannel('It is a type:'); - debugChannel(type); - const javaType = type.javaType || typeMap.get(type); - if (!javaType) throw new Error(`channelInfo filter: type not found in typeMap: ${type}`); - param.type = javaType; - const printfArg = type.printFormat; - debugChannel(`printf: ${printfArg}`); - if (!printfArg) throw new Error(`channelInfo filter: printFormat not found in formatMap: ${type}`); - debugChannel(`Replacing ${nameWithBrackets}`); - publishChannel = publishChannel.replace(nameWithBrackets, printfArg); - sampleArg = type.sample; - } else { - const en = schema.enum(); - if (en) { - debugChannel(`It is an enum: ${en}`); - param.type = _.upperFirst(name); - param.enum = en; - sampleArg = `Messaging.${param.type}.${en[0]}`; - debugChannel(`Replacing ${nameWithBrackets}`); - publishChannel = publishChannel.replace(nameWithBrackets, '%s'); - } else { - throw new Error(`channelInfo filter: Unknown parameter type: ${ JSON.stringify(schema)}`); - } - } - param.sampleArg = sampleArg; - return [publishChannel, sampleArg]; -} - -function indent(numTabs) { - return '\t'.repeat(numTabs); -} - -function isApplication(params) { - return params.artifactType === 'application'; -} diff --git a/hooks/post-process.js b/hooks/post-process.js index 83e1e7ad..24ddf289 100644 --- a/hooks/post-process.js +++ b/hooks/post-process.js @@ -1,137 +1,447 @@ -// vim: set ts=2 sw=2 sts=2 expandtab : const fs = require('fs'); const path = require('path'); -const ApplicationModel = require('../lib/applicationModel.js'); -const _ = require('lodash'); -const applicationModel = new ApplicationModel('post'); -// To enable debug logging, set the env var DEBUG="postProcess" with whatever things you want to see. -const debugPostProcess = require('debug')('postProcess'); -const sourceHead = '/src/main/java/'; +const { logger } = require('../utils/logger'); +/** + * Post-process hook that runs after file generation + * Handles directory creation, file moving, and cleanup + */ module.exports = { 'generate:after': generator => { - const asyncapi = generator.asyncapi; - const sourcePath = generator.targetDir + sourceHead; - - // NEW - - const defaultJavaPackage = getDefaultJavaPackage(generator); - const defaultJavaPackageDir = getDefaultJavaPackageDir(generator, defaultJavaPackage); - - asyncapi.allSchemas().forEach((schema, schemaName) => { - processSchema(generator, schemaName, schema, sourcePath, defaultJavaPackageDir); - }); - - // Rename the pom file if necessary, and only include Application.java when an app is requested. - const artifactType = generator.templateParams['artifactType']; - - if (artifactType === 'library') { - fs.renameSync(path.resolve(generator.targetDir, 'pom.lib'), path.resolve(generator.targetDir, 'pom.xml')); - fs.unlinkSync(path.resolve(generator.targetDir, 'pom.app')); - fs.unlinkSync(path.resolve(sourcePath, 'Application.java')); - } else { - fs.renameSync(path.resolve(generator.targetDir, 'pom.app'), path.resolve(generator.targetDir, 'pom.xml')); - fs.unlinkSync(path.resolve(generator.targetDir, 'pom.lib')); - if (defaultJavaPackageDir) { - moveFile(sourcePath, defaultJavaPackageDir, 'Application.java'); + logger.debug('post-process.js: generate:after() - Starting post-process hook'); + logger.debug('Post-process hook: Starting file organization...'); + + const targetDir = generator.targetDir; + const javaPackage = generator.templateParams.javaPackage || 'com.company'; + const packagePath = javaPackage.replace(/\./g, '/'); + + // Create the main Java source directory structure + const javaSourceDir = path.join(targetDir, 'src/main/java'); + ensureDirectoryExists(javaSourceDir); + + // Create resources directory + const resourcesDir = path.join(targetDir, 'src/main/resources'); + ensureDirectoryExists(resourcesDir); + + // Move and organize generated files + organizeGeneratedFiles(generator, targetDir, javaSourceDir, resourcesDir); + + // Copy the original AsyncAPI file to the generated root + // Get the original file path from the generator context + const originalAsyncApiFile = generator.originalAsyncApiFilePath; + + if (originalAsyncApiFile && fs.existsSync(originalAsyncApiFile)) { + const destPath = path.join(targetDir, path.basename(originalAsyncApiFile)); + try { + fs.copyFileSync(originalAsyncApiFile, destPath); + logger.debug(`Copied original AsyncAPI file to generated root: ${destPath}`); + } catch (err) { + logger.warn(`Failed to copy AsyncAPI file to generated root: ${err.message}`); } + } else { + logger.warn(`Could not find original AsyncAPI file at: ${originalAsyncApiFile}`); } - applicationModel.reset(); // Must clear its cache for when we run the jest tests. + + logger.debug('Post-process hook: File organization completed'); } }; -function getDefaultJavaPackage(generator) { - const asyncapi = generator.asyncapi; - const info = asyncapi.info(); - let javaPackage = generator.templateParams['javaPackage']; - const extensions = info.extensions(); - - if (!javaPackage && info && extensions) { - javaPackage = extensions['x-java-package']; +/** + * Ensure a directory exists, creating it if necessary + */ +function ensureDirectoryExists(dirPath) { + logger.debug('post-process.js: ensureDirectoryExists() - Ensuring directory exists'); + if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath, { recursive: true }); + logger.debug(`Post-process: Created directory: ${dirPath}`); } +} - debugPostProcess(`getDefaultJavaPackage: ${javaPackage}`); - return javaPackage; +/** + * Organize generated files into their correct locations + */ +function organizeGeneratedFiles(generator, targetDir, javaSourceDir, resourcesDir) { + logger.debug('post-process.js: organizeGeneratedFiles() - Organizing generated files'); + const files = fs.readdirSync(targetDir); + + files.forEach(file => { + const filePath = path.join(targetDir, file); + const stats = fs.statSync(filePath); + + if (stats.isFile()) { + // Handle Java files + if (file.endsWith('.java')) { + // Filter out files that shouldn't be Java classes + if (shouldKeepJavaFile(file, generator)) { + moveJavaFileWithPackage(filePath, javaSourceDir, file, generator); + } else { + logger.debug(`Post-process: Removing unwanted Java file: ${file}`); + fs.unlinkSync(filePath); + } + } + // Handle YAML/Properties files + else if (file.endsWith('.yml') || file.endsWith('.yaml') || file.endsWith('.properties')) { + moveResourceFile(filePath, resourcesDir, file); + } + // Keep pom.xml and README.md in root + else if (file === 'pom.xml' || file === 'README.md' || file === 'package.json' || file === 'package-lock.json') { + logger.debug(`Post-process: Keeping ${file} in root directory`); + } + // Clean up any other files that shouldn't be in root + else { + logger.debug(`Post-process: Removing unexpected file: ${file}`); + fs.unlinkSync(filePath); + } + } + }); } -function getDefaultJavaPackageDir(generator, defaultJavaPackage) { - let defaultPackageDir; +/** + * Move Java file to proper package directory structure + */ +function moveJavaFileWithPackage(sourcePath, targetDir, fileName, generator) { + logger.debug('post-process.js: moveJavaFileWithPackage() - Moving Java file to package directory'); + const schemaName = fileName.replace('.java', ''); + + // Special handling for Application.java - use javaPackage parameter + if (schemaName === 'Application') { + const javaPackage = generator.templateParams.javaPackage || 'com.company'; + const packagePath = javaPackage.replace(/\./g, '/'); + const packageDir = path.join(targetDir, packagePath); + ensureDirectoryExists(packageDir); - if (defaultJavaPackage) { - const packageDir = packageToPath(defaultJavaPackage); - defaultPackageDir = `${generator.targetDir}${sourceHead}${packageDir}`; - } + // Move file to package directory + const targetPath = path.join(packageDir, fileName); + fs.renameSync(sourcePath, targetPath); + if (fs.existsSync(sourcePath)) { + fs.unlinkSync(sourcePath); + } + logger.debug(`Post-process: Moved ${fileName} to package ${javaPackage}`); - debugPostProcess(`getDefaultJavaPackageDir: ${defaultPackageDir}`); - return defaultPackageDir; -} + // Update the file content to include package declaration + updatePackageDeclaration(targetPath, javaPackage); + return; + } + + // Check if this file is already in a namespace directory (Avro schema) + const sourceDir = path.dirname(sourcePath); + const relativePath = path.relative(generator.targetDir, sourcePath); + + // If the file is already in src/main/java/package/path/ structure, it's an Avro schema + if (relativePath.startsWith('src/main/java/') && relativePath.includes('/')) { + logger.debug(`Post-process: File ${fileName} is already in correct namespace location: ${relativePath}`); + // File is already in the right place, just ensure package declaration is correct + const packagePath = relativePath.replace('src/main/java/', '').replace(`/${fileName}`, ''); + const javaPackage = packagePath.replace(/\//g, '.'); + updatePackageDeclaration(sourcePath, javaPackage); + return; + } + + // Get package information for this schema (existing logic for non-Avro schemas) + const packageInfo = getPackageInfo(schemaName, generator); -function packageToPath(javaPackage) { - return javaPackage.replace(/\./g, '/'); -} + if (packageInfo && packageInfo.javaPackage) { + // Create package directory structure + const packagePath = packageInfo.javaPackage.replace(/\./g, '/'); + const packageDir = path.join(targetDir, packagePath); + ensureDirectoryExists(packageDir); -function processSchema(generator, schemaName, schema, sourcePath, defaultJavaPackageDir) { - const fileName = getFileName(schemaName); - const filePath = path.resolve(sourcePath, fileName); - debugPostProcess(`processSchema ${schemaName}`); - debugPostProcess(schema); - const modelClass = applicationModel.getModelClass({schema, schemaName}); - const javaName = modelClass.getClassName(); - if ((schema.type() && schema.type() !== 'object') || _.startsWith(javaName, 'Anonymous')) { - debugPostProcess(`deleting ${filePath}`); - if (fs.existsSync(filePath)) { - fs.unlinkSync(filePath); + // Move file to package directory + const targetPath = path.join(packageDir, fileName); + fs.renameSync(sourcePath, targetPath); + // Remove any leftover file in the original location (shouldn't exist, but just in case) + if (fs.existsSync(sourcePath)) { + fs.unlinkSync(sourcePath); } + logger.debug(`Post-process: Moved ${fileName} to package ${packageInfo.javaPackage}`); + + // Update the file content to include package declaration + updatePackageDeclaration(targetPath, packageInfo.javaPackage); } else { - const packageDir = getPackageDir(generator, defaultJavaPackageDir, modelClass); - debugPostProcess(`packageDir: ${packageDir}`); + // For schema classes that don't have explicit package info, use the default package + const defaultPackage = 'com.company'; + const packagePath = defaultPackage.replace(/\./g, '/'); + const packageDir = path.join(targetDir, packagePath); + ensureDirectoryExists(packageDir); - if (packageDir) { - moveFile(sourcePath, packageDir, fileName); + // Move file to package directory + const targetPath = path.join(packageDir, fileName); + fs.renameSync(sourcePath, targetPath); + if (fs.existsSync(sourcePath)) { + fs.unlinkSync(sourcePath); } + logger.debug(`Post-process: Moved ${fileName} to default package ${defaultPackage}`); - debugPostProcess(`javaName: ${javaName} schemaName: ${schemaName}`); - if (javaName !== schemaName) { - const currentPath = packageDir || sourcePath; - const newPath = path.resolve(currentPath, `${javaName}.java`); - const oldPath = path.resolve(currentPath, fileName); - fs.renameSync(oldPath, newPath); - debugPostProcess(`Renamed class file ${schemaName} to ${javaName}`); - } + // Update the file content to include package declaration + updatePackageDeclaration(targetPath, defaultPackage); } } -function getFileName(schemaName) { - const trimmedSchemaName = trimSchemaName(schemaName); - return `${trimmedSchemaName}.java`; +/** + * Get package information for a schema + */ +function getPackageInfo(schemaName, generator) { + logger.debug('post-process.js: getPackageInfo() - Getting package information for schema'); + try { + const asyncapi = generator.asyncapi; + + // First, try the existing logic for regular schemas (preserve current functionality) + const schemas = asyncapi.allSchemas().all(); + if (schemas) { + let foundSchema = null; + schemas.forEach((schema, key) => { + if (typeof key !== 'string') { + // logger.debug(`Skipping non-string schema key: ${key}`); + return; + } + const id = schema.id && typeof schema.id === 'function' ? schema.id() : null; + if (id === schemaName) { + foundSchema = schema; + } + }); + + if (foundSchema) { + logger.debug(`Post-process: Found schema for ${schemaName}`); + + // Check if schema has a namespace (for Avro schemas) + const schemaId = foundSchema.id(); + const dotIndex = schemaId.lastIndexOf('.'); + if (dotIndex > 0) { + const javaPackage = schemaId.substring(0, dotIndex); + const className = schemaId.substring(dotIndex + 1); + logger.debug(`Post-process: Found namespace in schema ID: ${javaPackage}.${className}`); + return { javaPackage, className }; + } + + // Check for namespace in schema's _json property (AVRO schemas) + const schemaData = foundSchema._json; + if (schemaData && schemaData.namespace) { + const javaPackage = schemaData.namespace; + const className = schemaData.name || schemaName; + logger.debug(`Post-process: Found namespace in _json: ${javaPackage}.${className}`); + return { javaPackage, className }; + } + + logger.debug(`Post-process: No namespace found for ${schemaName}, schemaData:`, JSON.stringify(schemaData, null, 2)); + } + } + + // Additional check: Look for AVRO schemas in message payloads (new functionality) + const avroPackageInfo = getAvroPackageInfoFromMessages(schemaName, asyncapi); + if (avroPackageInfo) { + logger.debug(`Post-process: Found AVRO schema in message payloads: ${avroPackageInfo.javaPackage}.${avroPackageInfo.className}`); + return avroPackageInfo; + } + + // Final check: Read package information from the generated Java file (only if no AVRO info found) + const filePackageInfo = getPackageInfoFromFile(schemaName, generator.targetDir); + if (filePackageInfo) { + logger.debug(`Post-process: Found package info in generated file: ${filePackageInfo.javaPackage}.${filePackageInfo.className}`); + return filePackageInfo; + } + + // Default fallback + logger.debug(`Post-process: No package info found for ${schemaName}, using default`); + return { javaPackage: null, className: schemaName }; + + } catch (error) { + logger.warn(`Post-process: Error getting package info for ${schemaName}:`, error.message); + return { javaPackage: null, className: schemaName }; + } } -function trimSchemaName(schemaName) { - let trimmedSchemaName = schemaName; - if (schemaName.startsWith('<')) { - trimmedSchemaName = schemaName.replace('<', ''); - trimmedSchemaName = trimmedSchemaName.replace(/>$/, ''); +/** + * Get package information from generated Java file + */ +function getPackageInfoFromFile(schemaName, targetDir) { + logger.debug('post-process.js: getPackageInfoFromFile() - Getting package info from generated file'); + try { + const filePath = path.join(targetDir, `${schemaName}.java`); + if (fs.existsSync(filePath)) { + const content = fs.readFileSync(filePath, 'utf8'); + const packageMatch = content.match(/^package\s+([^;]+);/m); + if (packageMatch) { + const javaPackage = packageMatch[1].trim(); + return { javaPackage, className: schemaName }; + } + } + } catch (error) { + logger.warn(`Post-process: Error reading package info from file for ${schemaName}:`, error.message); } - return trimmedSchemaName; + return null; } -function getPackageDir(generator, defaultJavaPackageDir, modelClass) { - const fileSpecificPackage = modelClass.getJavaPackage(); - if (fileSpecificPackage) { - const packagePath = packageToPath(fileSpecificPackage); - return `${generator.targetDir}${sourceHead}${packagePath}`; +/** + * Get AVRO package information from message payloads + */ +function getAvroPackageInfoFromMessages(schemaName, asyncapi) { + logger.debug('post-process.js: getAvroPackageInfoFromMessages() - Getting AVRO package info from messages'); + try { + // Check components.messages for AVRO schemas + const messages = asyncapi.components().messages(); + if (messages) { + // Try different ways to iterate over messages + if (typeof messages.forEach === 'function') { + messages.forEach((msg, msgName) => { + try { + // Check the message's _json property for AVRO namespace + if (msg._json && msg._json.payload) { + const payloadData = msg._json.payload; + + // Check for AVRO namespace in x-parser-schema-id + if (payloadData && payloadData['x-parser-schema-id']) { + const schemaId = payloadData['x-parser-schema-id']; + + // Extract package and class name from schema ID (e.g., "com.example.api.jobOrder.JobOrder") + const lastDotIndex = schemaId.lastIndexOf('.'); + if (lastDotIndex > 0) { + const javaPackage = schemaId.substring(0, lastDotIndex); + const className = schemaId.substring(lastDotIndex + 1); + + // Check if this matches our schema name + if (className === schemaName) { + logger.debug(`Post-process: Found AVRO schema match in components.messages: ${javaPackage}.${className}`); + return { javaPackage, className }; + } + } + } + + // Fallback: Check for name and namespace fields (original AVRO format) + if (payloadData && payloadData.namespace && payloadData.name) { + const javaPackage = payloadData.namespace; + const className = payloadData.name; + + // Check if this matches our schema name + if (className === schemaName) { + logger.debug(`Post-process: Found AVRO schema match in components.messages: ${javaPackage}.${className}`); + return { javaPackage, className }; + } + } + } + } catch (error) { + logger.warn(`Post-process: Error processing message ${msgName}:`, error.message); + } + }); + } + } + + // Also check for AVRO schemas in channel operations (inline messages) + const channels = asyncapi.channels(); + if (channels && typeof channels.values === 'function') { + for (const channel of channels.values()) { + const channelName = channel.id(); + + // Get all operations for this channel + const operations = channel.operations && typeof channel.operations === 'function' + ? Array.from(channel.operations().values()) + : []; + + // Check all operations for Avro messages + for (const operation of operations) { + try { + const messages = operation.messages && typeof operation.messages === 'function' + ? Array.from(operation.messages().values()) + : []; + + for (const message of messages) { + const schemaFormat = message.schemaFormat && message.schemaFormat(); + if (schemaFormat && schemaFormat.includes('avro')) { + // This is an Avro message, check for namespace + const payload = message.payload && message.payload(); + if (payload && payload._json) { + const payloadData = payload._json; + + // Check for name and namespace fields (original Avro format) + if (payloadData.namespace && payloadData.name) { + const javaPackage = payloadData.namespace; + const className = payloadData.name; + + // Check if this matches our schema name + if (className === schemaName) { + logger.debug(`Post-process: Found AVRO schema match in channel operations: ${javaPackage}.${className}`); + return { javaPackage, className }; + } + } + + // Check for namespace in x-parser-schema-id (transformed Avro format) + if (payloadData['x-parser-schema-id']) { + const schemaId = payloadData['x-parser-schema-id']; + + // Extract package and class name from schema ID (e.g., "userpublisher.User") + const lastDotIndex = schemaId.lastIndexOf('.'); + if (lastDotIndex > 0) { + const javaPackage = schemaId.substring(0, lastDotIndex); + const className = schemaId.substring(lastDotIndex + 1); + + // Check if this matches our schema name + if (className === schemaName) { + logger.debug(`Post-process: Found AVRO schema match in channel operations via x-parser-schema-id: ${javaPackage}.${className}`); + return { javaPackage, className }; + } + } + } + } + } + } + } catch (error) { + logger.warn(`Post-process: Error checking channel ${channelName} operation for AVRO namespace:`, error.message); + } + } + } + } + + } catch (error) { + logger.warn('Post-process: Error extracting AVRO package info from messages:', error.message); } - return defaultJavaPackageDir; + + return null; } -function moveFile(oldDirectory, newDirectory, fileName) { - if (!fs.existsSync(newDirectory)) { - fs.mkdirSync(newDirectory, { recursive: true }); - debugPostProcess(`Made directory ${newDirectory}`); +/** + * Update package declaration in Java file + */ +function updatePackageDeclaration(filePath, javaPackage) { + logger.debug('post-process.js: updatePackageDeclaration() - Updating package declaration in Java file'); + try { + let content = fs.readFileSync(filePath, 'utf8'); + + // Check if package declaration already exists + const packageMatch = content.match(/^package\s+([^;]+);/m); + if (packageMatch) { + const currentPackage = packageMatch[1].trim(); + if (currentPackage !== javaPackage) { + // Update existing package declaration + content = content.replace(/^package\s+[^;]+;/m, `package ${javaPackage};`); + fs.writeFileSync(filePath, content, 'utf8'); + logger.debug(`Post-process: Updated package declaration from ${currentPackage} to ${javaPackage}`); + } + } else { + // Add package declaration at the beginning + content = `package ${javaPackage};\n\n${content}`; + fs.writeFileSync(filePath, content, 'utf8'); + logger.debug(`Post-process: Added package declaration: ${javaPackage}`); + } + } catch (error) { + logger.warn(`Post-process: Error updating package declaration in ${filePath}:`, error.message); } - const oldPath = path.resolve(oldDirectory, fileName); - const newPath = path.resolve(newDirectory, fileName); - fs.copyFileSync(oldPath, newPath); - fs.unlinkSync(oldPath); - debugPostProcess(`Moved ${fileName} from ${oldPath} to ${newPath}`); } + +/** + * Determine if a Java file should be kept + * Since pre-processing now handles all schema filtering, we keep all files that reach this point + */ +function shouldKeepJavaFile(fileName, generator) { + const schemaName = fileName.replace('.java', ''); + logger.debug(`[shouldKeepJavaFile] Keeping ${schemaName}.java (pre-filtered by schema collection)`); + return true; // Keep all files that made it through pre-processing +} + +/** + * Move resource file to resources directory + */ +function moveResourceFile(sourcePath, targetDir, fileName) { + logger.debug('post-process.js: moveResourceFile() - Moving resource file to resources directory'); + const targetPath = path.join(targetDir, fileName); + fs.renameSync(sourcePath, targetPath); + logger.debug(`Post-process: Moved ${fileName} to resources directory`); +} \ No newline at end of file diff --git a/hooks/pre-process.js b/hooks/pre-process.js index 468f983b..9e748e31 100644 --- a/hooks/pre-process.js +++ b/hooks/pre-process.js @@ -1,58 +1,280 @@ -const ApplicationModel = require('../lib/applicationModel.js'); const _ = require('lodash'); +const { logger, configureFromGenerator } = require('../utils/logger'); -function setSchemaIdsForFileName(asyncapi) { - asyncapi.allSchemas().forEach((schema, schemaName) => { - // If we leave the $id the way it is, the generator will name the schema files what their $id is, which is always a bad idea. - // So we leave it in, but $id is going to be changed to be the class name we want. - // If we remove the $id and there's no x-parser-schema-id, then it wont be returned by allSchemas(). - if (schema.$id()) { - // Assuming one of x-parser-schema-id and $id must be present. - let classNameForGenerator; - const parserSchemaId = schema.ext('x-parser-schema-id'); - classNameForGenerator = parserSchemaId ? parserSchemaId : _.camelCase(schema.$id().substring(schema.$id().lastIndexOf('/') + 1)); - - if (classNameForGenerator === 'items') { - let parentSchema; - if (schema.options) { - parentSchema = schema.options.parent; - } - let parentSchemaItems; - if (parentSchema) { - parentSchemaItems = parentSchema.items(); - } - let parentSchemaItemsId; - if (parentSchemaItems && parentSchemaItems._json) { - parentSchemaItemsId = parentSchemaItems._json.$id; +/** + * Pre-process hook that runs before file generation + * Handles schema normalization and parameter setup + */ +module.exports = { + 'generate:before': generator => { + // Configure logger based on generator's debug setting + configureFromGenerator(generator); + + logger.debug('pre-process.js: generate:before() - Starting pre-process hook'); + logger.debug('Pre-process hook: Starting schema normalization...'); + + // Normalize schema IDs for Java class names + normalizeSchemaIds(generator.asyncapi); + + // Set up any additional parameters if needed + setupTemplateParameters(generator); + + logger.debug('Pre-process hook: Schema normalization completed'); + } +}; + +/** + * Normalize schema IDs to ensure valid Java class names + */ +function normalizeSchemaIds(asyncapi) { + logger.debug('pre-process.js: normalizeSchemaIds() - Normalizing schema IDs'); + const schemas = asyncapi.allSchemas().all(); + if (!schemas) return; + + for (const schema of schemas) { + const schemaName = schema.extensions().get('x-ep-schema-name')?.value() || schema.id(); + if (typeof schemaName !== 'string') { + // logger.debug(`Skipping non-string schema key: ${schemaName}`); + return; + } + if (schema.$id && typeof schema.$id === 'function') { + const originalId = schema.$id(); + if (originalId) { + // Check if this is a URI ID that should be mapped to a component name + let className = originalId; + + if (originalId.startsWith('http://')) { + // Try to map URI ID to component name + const mappedComponentName = mapSchemaIdToComponentName(originalId, asyncapi); + if (mappedComponentName) { + className = mappedComponentName; + logger.debug(`Pre-process: Mapped schema ID from "${originalId}" to component name "${className}"`); + } else { + // If no mapping found, extract just the filename + if (originalId.includes('/')) { + className = originalId.substring(originalId.lastIndexOf('/') + 1); + } + // Convert to valid Java class name (PascalCase) + className = _.upperFirst(_.camelCase(className)); + logger.debug(`Pre-process: Normalized schema ID from "${originalId}" to "${className}"`); + } + } else { + // If it's a full path, extract just the filename + if (originalId.includes('/')) { + className = originalId.substring(originalId.lastIndexOf('/') + 1); + } + + // Convert to valid Java class name (PascalCase) + className = _.upperFirst(_.camelCase(className)); + + // Handle special cases + if (className === 'Items') { + // Handle array items - append 'Items' to parent class name + className = 'Items'; + } + + logger.debug(`Pre-process: Normalized schema ID from "${originalId}" to "${className}"`); } - if (parentSchemaItemsId === schema.$id()) { - const parentParserSchemaId = parentSchema.ext('x-parser-schema-id'); - classNameForGenerator = parentParserSchemaId ? parentParserSchemaId : _.camelCase(parentSchema.$id().substring(parentSchema.$id().lastIndexOf('/') + 1)); - // If we come across this schema later in the code generator, we'll know to rename it to its parent because the proper settings will be set in the model class. - schema._json['x-model-class-name'] = classNameForGenerator; - classNameForGenerator += 'Items'; + + // Update the schema ID for file naming + schema._json.$id = className; + } + } + } +} + +/** + * Map schema ID to component name for inline schemas + * This handles cases like http://example.com/root.json -> RideReceipt + */ +function mapSchemaIdToComponentName(schemaId, asyncapi) { + logger.debug(`πŸ” DEBUG: mapSchemaIdToComponentName called with schemaId: ${schemaId}`); + + if (!schemaId || !schemaId.startsWith('http://')) { + logger.debug(`❌ DEBUG: schemaId ${schemaId} is not a valid URI ID`); + return null; + } + + // Check if this URI ID matches any component schema + // Try accessing components directly from JSON to get proper string keys + const componentsJson = asyncapi._json && asyncapi._json.components; + logger.debug(`πŸ” DEBUG: componentsJson type: ${typeof componentsJson}`); + + if (componentsJson && componentsJson.schemas) { + logger.debug(`πŸ” DEBUG: Found components.schemas with keys: ${Object.keys(componentsJson.schemas).join(', ')}`); + + for (const [componentName, schema] of Object.entries(componentsJson.schemas)) { + const schemaJsonId = schema.$id; + logger.debug(`πŸ” DEBUG: Component ${componentName} has $id: ${schemaJsonId}`); + if (schemaJsonId === schemaId) { + logger.debug(`βœ… DEBUG: Found match! ${schemaId} -> ${componentName}`); + logger.debug(`Pre-process: Mapped schema ID ${schemaId} to component name ${componentName}`); + return componentName; + } + } + } + + // Fallback to using the AsyncAPI library method + const componentsSchemas = asyncapi.components().schemas(); + logger.debug(`πŸ” DEBUG: componentsSchemas type: ${typeof componentsSchemas}, forEach: ${typeof componentsSchemas?.forEach}`); + + if (componentsSchemas) { + if (typeof componentsSchemas.forEach === 'function') { + let foundComponentName = null; + componentsSchemas.forEach((schema, componentName) => { + // Check if this component schema has the same URI ID + const schemaJsonId = schema._json && schema._json.$id; + logger.debug(`πŸ” DEBUG: Component ${componentName} has $id: ${schemaJsonId}`); + if (schemaJsonId === schemaId) { + foundComponentName = componentName; + logger.debug(`βœ… DEBUG: Found match! ${schemaId} -> ${componentName}`); } + }); + if (foundComponentName) { + logger.debug(`Pre-process: Mapped schema ID ${schemaId} to component name ${foundComponentName}`); + return foundComponentName; + } + } + } + + logger.debug(`❌ DEBUG: No mapping found for schema ID ${schemaId}`); + return null; +} + +/** + * Set up any additional template parameters + */ +function setupTemplateParameters(generator) { + logger.debug('pre-process.js: setupTemplateParameters() - Setting up template parameters'); + const asyncapi = generator.asyncapi; + const info = asyncapi.info(); + + // Try to extract Java package from AVRO namespaces in messages + // let javaPackage = extractJavaPackageFromAvroNamespaces(asyncapi); + let javaPackage = null; + + // Fallback to extension or default + if (!javaPackage) { + if (!generator.templateParams.javaPackage) { + const extensions = info.extensions(); + if (extensions && extensions.get('x-java-package')) { + javaPackage = extensions.get('x-java-package').value(); + } else { + javaPackage = 'com.company'; } - schema._json.$id = classNameForGenerator; + } else { + javaPackage = generator.templateParams.javaPackage; } + } + + // Set the Java package + generator.templateParams.javaPackage = javaPackage; + + // Set default artifact type if not specified + if (!generator.templateParams.artifactType) { + generator.templateParams.artifactType = 'application'; + } + + logger.debug('Pre-process: Template parameters set up:', { + javaPackage: generator.templateParams.javaPackage, + artifactType: generator.templateParams.artifactType }); } -function setSchemaIdsForFileNameIncludingDuplicates(asyncapi) { - // We do this multiple times because allSchemas() returns a list of deduplicated schemas, so if we change the $id of a schema, - // we wont change any of the duplicates. We continue until there are no more duplicates to change. - let numSchemas; - let newNumSchemas; - do { - numSchemas = asyncapi.allSchemas().size; - setSchemaIdsForFileName(asyncapi); - newNumSchemas = asyncapi.allSchemas().size; - } while (numSchemas !== newNumSchemas); +/** + * Extract Java package from AVRO namespaces in messages + */ +function extractJavaPackageFromAvroNamespaces(asyncapi) { + logger.debug('pre-process.js: extractJavaPackageFromAvroNamespaces() - Extracting Java package from AVRO namespaces'); + try { + // Check components.messages for AVRO schemas + const messages = asyncapi.components().messages(); + if (messages) { + // Try different ways to iterate over messages + if (typeof messages.forEach === 'function') { + let foundPackages = new Set(); + + messages.forEach((msg, msgName) => { + try { + // Check the message's _json property for AVRO namespace + if (msg._json && msg._json.payload) { + const payloadData = msg._json.payload; + + // Check for AVRO namespace in x-parser-schema-id + if (payloadData && payloadData['x-parser-schema-id']) { + const schemaId = payloadData['x-parser-schema-id']; + + // Extract package from schema ID (e.g., "com.example.api.jobOrder.JobOrder" -> "com.example.api.jobOrder") + const lastDotIndex = schemaId.lastIndexOf('.'); + if (lastDotIndex > 0) { + const javaPackage = schemaId.substring(0, lastDotIndex); + foundPackages.add(javaPackage); + logger.debug(`Pre-process: Found AVRO namespace: ${javaPackage}`); + } + } + + // Fallback: Check for name and namespace fields (original AVRO format) + if (payloadData && payloadData.namespace) { + const javaPackage = payloadData.namespace; + foundPackages.add(javaPackage); + logger.debug(`Pre-process: Found AVRO namespace: ${javaPackage}`); + } + } + } catch (error) { + logger.warn(`Pre-process: Error processing message ${msgName}:`, error.message); + } + }); + + // If we found packages, use the first one (or a common parent if multiple) + if (foundPackages.size > 0) { + const packages = Array.from(foundPackages); + if (packages.length === 1) { + return packages[0]; + } else { + // Multiple packages found - try to find a common parent + const commonParent = findCommonParentPackage(packages); + if (commonParent) { + return commonParent; + } + // If no common parent, use the first package + return packages[0]; + } + } + } + } + } catch (error) { + logger.warn('Pre-process: Error extracting AVRO namespaces:', error.message); + } + + return null; } -module.exports = { - 'generate:before': generator => { - setSchemaIdsForFileNameIncludingDuplicates(generator.asyncapi); - ApplicationModel.asyncapi = generator.asyncapi; +/** + * Find common parent package from multiple packages + */ +function findCommonParentPackage(packages) { + logger.debug('pre-process.js: findCommonParentPackage() - Finding common parent package'); + if (packages.length === 0) return null; + if (packages.length === 1) return packages[0]; + + // Sort packages by length (shortest first) + const sortedPackages = packages.sort((a, b) => a.length - b.length); + const shortest = sortedPackages[0]; + + // Find the longest common prefix + let commonPrefix = ''; + const parts = shortest.split('.'); + + for (let i = 0; i < parts.length; i++) { + const testPrefix = parts.slice(0, i + 1).join('.'); + const allMatch = packages.every(pkg => pkg.startsWith(testPrefix + '.') || pkg === testPrefix); + + if (allMatch) { + commonPrefix = testPrefix; + } else { + break; + } } -}; \ No newline at end of file + + return commonPrefix || null; +} \ No newline at end of file diff --git a/lib/applicationModel.js b/lib/applicationModel.js deleted file mode 100644 index ff2bc22d..00000000 --- a/lib/applicationModel.js +++ /dev/null @@ -1,172 +0,0 @@ -const ModelClass = require('./modelClass.js'); -const debugApplicationModel = require('debug')('applicationModel'); -const _ = require('lodash'); -const ScsLib = require('./scsLib.js'); -const scsLib = new ScsLib(); -const instanceMap = new Map(); - -class ApplicationModel { - constructor(caller) { - this.caller = caller; - debugApplicationModel(`constructor for ${caller} ++++++++++++++++++++++++++++++++++++++++++`); - instanceMap.set(caller, this); - debugApplicationModel(instanceMap); - } - - getModelClass({schema, schemaName}) { - debugApplicationModel(`getModelClass for caller ${this.caller} schema ${schemaName}`); - this.setupSuperClassMap(); - this.setupModelClassMap(); - let modelClass; - if (schema) { - const parserSchemaName = schema.ext('x-parser-schema-id'); - // Try to use x-parser-schema-id as key - modelClass = this.modelClassMap[parserSchemaName]; - if (modelClass && _.startsWith(modelClass.getClassName(), 'Anonymous')) { - // If we translated this schema from the map using an anonymous schema key, we have no idea what the name should be, so we use the one provided directly from the source - not the generator. - // Otherwise, if we translated this schema from the map using a known schema (the name of the schema was picked out correctly by the generator), use that name. - modelClass.setClassName(_.upperFirst(this.isAnonymousSchema(parserSchemaName) ? schemaName : parserSchemaName)); - } - } - // Using x-parser-schema-id didn't work for us, fall back to trying to get at least something using the provided name. - if (!modelClass) { - modelClass = this.modelClassMap[schemaName] || this.modelClassMap[_.camelCase(schemaName)]; - } - debugApplicationModel(`returning modelClass for caller ${this.caller} ${schemaName}`); - debugApplicationModel(modelClass); - return modelClass; - } - - getSchema(schemaName) { - return ApplicationModel.asyncapi.components().schema(schemaName); - } - - setupSuperClassMap() { - if (this.superClassMap) { - return; - } - this.superClassMap = new Map(); - this.anonymousSchemaToSubClassMap = new Map(); - debugApplicationModel('-------- SCHEMAS -------------'); - debugApplicationModel(ApplicationModel.asyncapi.allSchemas()); - ApplicationModel.asyncapi.allSchemas().forEach((schema, schemaName) => { - debugApplicationModel(`${schemaName}:`); - debugApplicationModel(schema); - const allOf = schema.allOf(); - if (allOf) { - this.handleAllOfSchema(schema, schemaName, allOf); - } - }); - debugApplicationModel('-----------------------------'); - debugApplicationModel('superclassMap:'); - debugApplicationModel(this.superClassMap); - debugApplicationModel('anonymousSchemaToSubClassMap:'); - debugApplicationModel(this.anonymousSchemaToSubClassMap); - } - - handleAllOfSchema(schema, schemaName, allOfSchema) { - let anonymousSchema; - let namedSchema; - allOfSchema.forEach(innerSchema => { - debugApplicationModel('=== allOf inner schema: ==='); - debugApplicationModel(innerSchema); - debugApplicationModel('==========================='); - const name = innerSchema._json['x-parser-schema-id']; - if (this.isAnonymousSchema(name)) { - anonymousSchema = name; - } else { - namedSchema = name; - } - }); - if (!anonymousSchema || !namedSchema) { - console.log('Warning: Unable to find both an anonymous and a named schema in an allOf schema.'); - console.log(schema); - } else { - this.superClassMap[anonymousSchema] = namedSchema; - this.anonymousSchemaToSubClassMap[anonymousSchema] = schemaName; - this.superClassMap[schemaName] = namedSchema; - this.anonymousSchemaToSubClassMap[schemaName] = anonymousSchema; - } - } - - setupModelClassMap() { - if (this.modelClassMap) { - return; - } - this.modelClassMap = new Map(); - this.nameToSchemaMap = new Map(); - // Register all schemas recursively as a flat map of name -> ModelClass - ApplicationModel.asyncapi.allSchemas().forEach((schema, name) => { - debugApplicationModel(`setupModelClassMap ${name} type ${schema.type()}`); - this.registerSchemaNameToModelClass(schema, name); - this.nameToSchemaMap[name] = schema; - }); - debugApplicationModel('modelClassMap:'); - debugApplicationModel(this.modelClassMap); - } - - isAnonymousSchema(schemaName) { - return schemaName.startsWith('<'); - } - - registerSchemaNameToModelClass(schema, schemaName) { - let modelClass = this.modelClassMap[schemaName]; - if (!modelClass) { - modelClass = new ModelClass(); - } - - if (this.isAnonymousSchema(schemaName)) { - this.handleAnonymousSchemaForAllOf(modelClass, schemaName); - } - const components = ApplicationModel.asyncapi._json.components; - const nonInnerClassSchemas = Object.keys(components? components.schemas || {} : {}); - if (nonInnerClassSchemas.includes(schemaName)) { - modelClass.setCanBeInnerClass(false); - } - - const classNameAndLocation = scsLib.stripPackageName(schemaName); - let className = classNameAndLocation.className; - const javaPackage = classNameAndLocation.javaPackage; - if (schema._json['x-model-class-name']) { - className = schema._json['x-model-class-name']; - } - modelClass.setJavaPackage(javaPackage); - modelClass.setClassName(className); - debugApplicationModel(`schemaName ${schemaName} className: ${modelClass.getClassName()} super: ${modelClass.getSuperClassName()} javaPackage: ${javaPackage}`); - this.modelClassMap[schemaName] = modelClass; - debugApplicationModel(`Added ${schemaName}`); - debugApplicationModel(modelClass); - } - - getAnonymousSchemaForRef(realSchemaName) { - // During our allOf parsing, we found this real schema to anon-schema association - const anonSchema = this.anonymousSchemaToSubClassMap[realSchemaName]; - return anonSchema ? this.nameToSchemaMap[anonSchema] : undefined; - } - - handleAnonymousSchemaForAllOf(modelClass, schemaName) { - const subclassName = this.anonymousSchemaToSubClassMap[schemaName]; - if (subclassName) { - modelClass.setSuperClassName(this.superClassMap[schemaName]); - // Be sure the anonymous modelClass and the named modelClass are updated with the superclass information - // We dont want the anonymous schema because the class name won't be correct if it's a $ref, so if the modelClass exists, update that one, if it doesn't we'll make it - const existingModelClass = this.modelClassMap[subclassName]; - if (existingModelClass) { - existingModelClass.setSuperClassName(this.superClassMap[schemaName]); - } - return subclassName; - } - return schemaName; - } - - reset() { - instanceMap.forEach((val) => { - val.superClassMap = null; - val.anonymousSchemaToSubClassMap = null; - val.modelClassMap = null; - val.nameToSchemaMap = null; - }); - } -} - -module.exports = ApplicationModel; diff --git a/lib/modelClass.js b/lib/modelClass.js deleted file mode 100644 index b9d7f3ac..00000000 --- a/lib/modelClass.js +++ /dev/null @@ -1,49 +0,0 @@ -const _ = require('lodash'); - -class ModelClass { - constructor() { - this.innerClass = true; - } - - getClassName() { - return this.className; - } - - setClassName(originalName) { - this.className = this.fixClassName(originalName); - } - - getSuperClassName() { - return this.superClassName; - } - - setSuperClassName(originalName) { - this.superClassName = this.fixClassName(originalName); - } - - getJavaPackage() { - return this.javaPackage; - } - - setJavaPackage(javaPackage) { - this.javaPackage = javaPackage; - } - - isSubClass() { - return this.superClassName !== undefined; - } - - fixClassName(originalName) { - return _.upperFirst(_.camelCase(originalName)); - } - - setCanBeInnerClass(innerClass) { - this.innerClass = innerClass; - } - - canBeInnerClass() { - return this.innerClass; - } -} - -module.exports = ModelClass; \ No newline at end of file diff --git a/lib/scsLib.js b/lib/scsLib.js deleted file mode 100644 index 2e84d12e..00000000 --- a/lib/scsLib.js +++ /dev/null @@ -1,159 +0,0 @@ -// This contains functions that are common to both the all.js filter and the post-process.js hook. -//const Common = require('./common.ts'); -const _ = require('lodash'); - -class ScsLib { - constructor() { - if (!ScsLib.javaKeywords) { - this.initReservedWords(); - } - } - - // This returns a valid Java class name. - getClassName(name) { - const ret = _.camelCase(name); - console.log(`getClassName: ${name} ${ret}`); - return _.upperFirst(ret); - } - - // This returns a valid Java identifier name. - getIdentifierName(name) { - let ret = _.camelCase(name); - - if (ScsLib.javaKeywords.has(ret)) { - ret = `_${ret}`; - } - - return ret; - } - - // This returns the value of a param, or specification extension if the param isn't set. - // If neither is set and the required flag is true, it throws an error. - getParamOrExtension(info, params, paramName, extensionName, description, example, required) { - let ret = ''; - if (params[paramName]) { - ret = params[paramName]; - } else if (info.extensions()[extensionName]) { - ret = info.extensions()[extensionName]; - } else if (required) { - throw new Error(`Can't determine the ${description}. Please set the param ${paramName} or info.${extensionName}. Example: ${example}`); - } - return ret; - } - - // This returns the value of a param, or specification extension if the param isn't set. - // If neither is set it returns defaultValue. - getParamOrDefault(info, params, paramName, extensionName, defaultValue) { - let ret = ''; - if (params[paramName]) { - ret = params[paramName]; - } else if (info.extensions()[extensionName]) { - ret = info.extensions()[extensionName]; - } else { - ret = defaultValue; - } - return ret; - } - - /* - By default, the 'view' is 'client', which means that when the doc says subscribe, we publish. - By setting the view to 'provider', when the doc says subscribe, we subscribe. - */ - isProvidererView(info, params) { - const view = this.getParamOrDefault(info, params, 'view', 'x-view', undefined); - return view === 'provider'; - } - - /* - See isProviderView above. - This returns true if the operation should physically subscribe, based on the 'view' param. - */ - isRealSubscriber(info, params, operation) { - const isProvider = this.isProvidererView(info, params); - const ret = (isProvider && operation.isSubscribe()) || (!isProvider && !operation.isSubscribe()); - console.log(`isRealSubscriber: isProvider: ${isProvider} isSubscribe: ${operation.isSubscribe()}`); - return ret; - } - - getRealPublisher(info, params, channel) { - const isProvider = this.isProvidererView(info, params); - return isProvider ? channel.publish() : channel.subscribe(); - } - - getRealSubscriber(info, params, channel) { - const isProvider = this.isProvidererView(info, params); - return isProvider ? channel.subscribe() : channel.publish(); - } - - /** - * Takes a string, splits on the last instance of '.' (dot) if it exists and returns an object of the separated pieces. - * - * @param {String} dotSeparatedName Example: 'com.solace.api.Schema'. - * @returns {Object} { javaPackage, className } Example: { javaPackage: "com.solace.api", className: "Schema" }. - */ - stripPackageName(dotSeparatedName) { - // If there is a dot in the schema name, it's probably an Avro schema with a fully qualified name (including the namespace.) - const indexOfDot = dotSeparatedName.lastIndexOf('.'); - if (indexOfDot > 0) { - return { javaPackage: dotSeparatedName.substring(0, indexOfDot), className: dotSeparatedName.substring(indexOfDot + 1) }; - } - return { className: dotSeparatedName }; - } - - initReservedWords() { - // This is the set of Java reserved words, to ensure that we don't generate any by mistake. - ScsLib.javaKeywords = new Set(); - ScsLib.javaKeywords.add('abstract'); - ScsLib.javaKeywords.add('assert'); - ScsLib.javaKeywords.add('boolean'); - ScsLib.javaKeywords.add('break'); - ScsLib.javaKeywords.add('byte'); - ScsLib.javaKeywords.add('case'); - ScsLib.javaKeywords.add('catch'); - ScsLib.javaKeywords.add('char'); - ScsLib.javaKeywords.add('class'); - ScsLib.javaKeywords.add('const'); - ScsLib.javaKeywords.add('continue'); - ScsLib.javaKeywords.add('default'); - ScsLib.javaKeywords.add('do'); - ScsLib.javaKeywords.add('double'); - ScsLib.javaKeywords.add('else'); - ScsLib.javaKeywords.add('enum'); - ScsLib.javaKeywords.add('extends'); - ScsLib.javaKeywords.add('final'); - ScsLib.javaKeywords.add('finally'); - ScsLib.javaKeywords.add('float'); - ScsLib.javaKeywords.add('for'); - ScsLib.javaKeywords.add('if'); - ScsLib.javaKeywords.add('goto'); - ScsLib.javaKeywords.add('implements'); - ScsLib.javaKeywords.add('import'); - ScsLib.javaKeywords.add('instalceof'); - ScsLib.javaKeywords.add('int'); - ScsLib.javaKeywords.add('interface'); - ScsLib.javaKeywords.add('long'); - ScsLib.javaKeywords.add('native'); - ScsLib.javaKeywords.add('new'); - ScsLib.javaKeywords.add('package'); - ScsLib.javaKeywords.add('private'); - ScsLib.javaKeywords.add('proteccted'); - ScsLib.javaKeywords.add('public'); - ScsLib.javaKeywords.add('return'); - ScsLib.javaKeywords.add('short'); - ScsLib.javaKeywords.add('static'); - ScsLib.javaKeywords.add('strictfp'); - ScsLib.javaKeywords.add('super'); - ScsLib.javaKeywords.add('switch'); - ScsLib.javaKeywords.add('syncronized'); - ScsLib.javaKeywords.add('this'); - ScsLib.javaKeywords.add('throw'); - ScsLib.javaKeywords.add('throws'); - ScsLib.javaKeywords.add('transient'); - ScsLib.javaKeywords.add('try'); - ScsLib.javaKeywords.add('void'); - ScsLib.javaKeywords.add('volatile'); - ScsLib.javaKeywords.add('while'); - } -} - -module.exports = ScsLib; diff --git a/package-lock.json b/package-lock.json index 50058e13..1085876f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "@asyncapi/java-spring-cloud-stream-template", "version": "0.13.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -9,82 +9,73 @@ "version": "0.13.0", "license": "Apache-2.0", "dependencies": { + "@asyncapi/generator": "^2.7.0", "@asyncapi/generator-filters": "^2.1.0", - "@types/node": "^16.7.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.15" + "@asyncapi/generator-hooks": "^0.1.0", + "@asyncapi/generator-react-sdk": "^1.1.2", + "filenamify": "^4.3.0", + "generate-schema": "^2.6.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "react": "^18.0.0" }, "devDependencies": { - "@asyncapi/generator": "^1.9.4", - "eslint": "^7.32.0", - "eslint-plugin-jest": "^24.3.6", - "jest": "^27.0.4" - } + "@asyncapi/parser": "^3.1.0", + "@testing-library/jest-dom": "^6.6.3", + "@types/jest": "^29.0.0", + "@types/js-yaml": "^4.0.9", + "@types/lodash": "^4.14.200", + "@types/react": "^18.0.0", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "eslint": "^8.0.0", + "eslint-plugin-jest": "^27.0.0", + "jest": "^29.0.0", + "ts-jest": "^29.0.0", + "typescript": "^5.0.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true }, "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", - "dev": true, - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser/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/@apidevtools/json-schema-ref-parser/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/@asyncapi/avro-schema-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@asyncapi/avro-schema-parser/-/avro-schema-parser-1.0.1.tgz", - "integrity": "sha512-j3JWLDkzWARlo2v/olOAgJ1aB9HNsvUUUHPKkx54ZNHUUbyVcDpQhBNSdvm8OBNKVa53QxLoDK7g59jhgUJZ9g==", - "dev": true, + "version": "3.0.24", + "resolved": "https://registry.npmjs.org/@asyncapi/avro-schema-parser/-/avro-schema-parser-3.0.24.tgz", + "integrity": "sha512-YMyr2S2heMrWHRyECknjHeejlZl5exUSv9nD1gTejAT13fSf0PqIRydZ9ZuoglCLBg55AeehypR2zLIBu/9kHQ==", "dependencies": { - "avsc": "^5.7.3" + "@asyncapi/parser": "^3.1.0", + "@types/json-schema": "^7.0.11", + "avsc": "^5.7.6" } }, "node_modules/@asyncapi/generator": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@asyncapi/generator/-/generator-1.9.4.tgz", - "integrity": "sha512-uMnYcqpKo0UJoYhCJCHdKs27oCMC14y+ESUGjdi/hO6qCUghnKClqj+XwkqW3mRoWF03tPYdEXl/YriuzVzqnQ==", - "dev": true, - "dependencies": { - "@asyncapi/avro-schema-parser": "^1.0.0", - "@asyncapi/generator-react-sdk": "^0.2.23", - "@asyncapi/openapi-schema-parser": "^2.0.1", - "@asyncapi/parser": "^1.15.0", - "@asyncapi/raml-dt-schema-parser": "^2.0.1", - "@npmcli/arborist": "^2.2.4", - "ajv": "^6.10.2", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@asyncapi/generator/-/generator-2.7.1.tgz", + "integrity": "sha512-r1FFuirpxKXsKo3nUFqR931Iu/DrzIio0CmOsHkLHxdDuqBy0/odm2D/HXJxp7g5i1XElXNSX4MQ6gu5jFamzA==", + "dependencies": { + "@asyncapi/generator-hooks": "*", + "@asyncapi/generator-react-sdk": "*", + "@asyncapi/multi-parser": "^2.1.1", + "@asyncapi/nunjucks-filters": "*", + "@asyncapi/parser": "^3.0.14", + "@npmcli/arborist": "5.6.3", + "@npmcli/config": "^8.0.2", + "ajv": "^8.12.0", "chokidar": "^3.4.0", "commander": "^6.1.0", "filenamify": "^4.1.0", @@ -94,44 +85,52 @@ "js-yaml": "^3.13.1", "levenshtein-edit-distance": "^2.0.5", "loglevel": "^1.6.8", - "markdown-it": "^12.3.2", "minimatch": "^3.0.4", "node-fetch": "^2.6.0", "nunjucks": "^3.2.0", + "requireg": "^0.2.2", "resolve-from": "^5.0.0", "resolve-pkg": "^2.0.0", "semver": "^7.3.2", "simple-git": "^3.3.0", - "source-map-support": "^0.5.19", - "ts-node": "^9.1.1", - "typescript": "^4.2.2" + "ts-node": "^10.9.1", + "typescript": "^4.9.3" }, "bin": { "ag": "cli.js", "asyncapi-generator": "cli.js" }, "engines": { - "node": ">12.16", - "npm": ">6.13.7" + "node": ">=18.12.0", + "npm": ">=8.19.0" } }, "node_modules/@asyncapi/generator-filters": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@asyncapi/generator-filters/-/generator-filters-2.1.0.tgz", "integrity": "sha512-OZcz8VjivvNvofEunGL+SO5M9Sq8CczNNyuBhdDzAhmdBxRPCswnliDFuHK+ZJ6XA/JgSfx2zN3H2uwzPajIgw==", + "deprecated": "Now part of @asyncapi/generator as of v2.1.0. Details: https://github.com/asyncapi/generator/releases/tag/@asyncapi/generator@2.1.0", "dependencies": { "lodash": "^4.17.15", "markdown-it": "^10.0.0", "openapi-sampler": "1.0.0-beta.17" } }, + "node_modules/@asyncapi/generator-hooks": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@asyncapi/generator-hooks/-/generator-hooks-0.1.0.tgz", + "integrity": "sha512-cTfwiXNrNE4Z5ZkbLyX4jCAnJEQgTXpPRhSzTpt08R3Md+2tO8CMQWo4B4C8fSSy3M4aBWePJ4bbILOEqduvUg==", + "deprecated": "Hooks are now part of generator repository and also out of the box integrated with the generator, so no need to set it as dependency any more: https://github.com/asyncapi/generator/releases/tag/%40asyncapi%2Fgenerator%402.5.0", + "dependencies": { + "fs.extra": "^1.3.2" + } + }, "node_modules/@asyncapi/generator-react-sdk": { - "version": "0.2.23", - "resolved": "https://registry.npmjs.org/@asyncapi/generator-react-sdk/-/generator-react-sdk-0.2.23.tgz", - "integrity": "sha512-q/6yajFzqYyQ/vC2e1gicJ7MZxRGAjYB/to0lo9i5An2MqFquBfuvediocbjoDC8En4pIt/JePgKc+9STnckYA==", - "dev": true, + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@asyncapi/generator-react-sdk/-/generator-react-sdk-1.1.3.tgz", + "integrity": "sha512-8pO8qVqNmASdcJK+uKXHgqE6BcmEQ+c7ypYf8pKNYaXr0FLFifaQGaTkUhG4fjnzNsUro6N+GywGYHRy1PpVng==", "dependencies": { - "@asyncapi/parser": "^1.13.0", + "@asyncapi/parser": "^3.1.0", "@babel/core": "7.12.9", "@babel/preset-env": "^7.12.7", "@babel/preset-react": "^7.12.7", @@ -147,7 +146,6 @@ "version": "7.12.9", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/generator": "^7.12.5", @@ -174,44 +172,115 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@asyncapi/generator-react-sdk/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/@asyncapi/generator-react-sdk/node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@asyncapi/generator-react-sdk/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/@asyncapi/generator-react-sdk/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/@asyncapi/generator/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 + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@asyncapi/generator/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==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@asyncapi/generator/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@asyncapi/multi-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@asyncapi/multi-parser/-/multi-parser-2.2.0.tgz", + "integrity": "sha512-C+0IRBPDaUOX5JhyC1RKVJ3WQsMdFKHL4vWovG1u4rDToCNxXIfG5m6IIYbmZId5HNQ6bl9BneDt2Ml+pkeRbA==", + "dependencies": { + "@asyncapi/avro-schema-parser": "^3.0.3", + "@asyncapi/openapi-schema-parser": "^3.0.4", + "@asyncapi/parser": "*", + "@asyncapi/protobuf-schema-parser": "^3.0.0", + "@asyncapi/raml-dt-schema-parser": "^4.0.4", + "parserapiv1": "npm:@asyncapi/parser@^2.1.0", + "parserapiv2": "npm:@asyncapi/parser@3.0.0-next-major-spec.8" + } }, - "node_modules/@asyncapi/generator/node_modules/entities": { + "node_modules/@asyncapi/nunjucks-filters": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@asyncapi/nunjucks-filters/-/nunjucks-filters-2.1.0.tgz", + "integrity": "sha512-sRhWg5N3vDouuXrG5l4JoTFmQUxoM1cviYnC9cA+KpUDQoeZ3wxFqo7RGxZh4i0pI3o1ZnYLTGBtsFN3mTZL9Q==", + "dependencies": { + "lodash": "^4.17.15", + "markdown-it": "^12.3.2", + "openapi-sampler": "1.0.0-beta.17" + } + }, + "node_modules/@asyncapi/nunjucks-filters/node_modules/entities": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/@asyncapi/generator/node_modules/linkify-it": { + "node_modules/@asyncapi/nunjucks-filters/node_modules/linkify-it": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dev": true, "dependencies": { "uc.micro": "^1.0.1" } }, - "node_modules/@asyncapi/generator/node_modules/markdown-it": { + "node_modules/@asyncapi/nunjucks-filters/node_modules/markdown-it": { "version": "12.3.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dev": true, "dependencies": { "argparse": "^2.0.1", "entities": "~2.1.0", @@ -223,102 +292,136 @@ "markdown-it": "bin/markdown-it.js" } }, - "node_modules/@asyncapi/generator/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, + "node_modules/@asyncapi/openapi-schema-parser": { + "version": "3.0.24", + "resolved": "https://registry.npmjs.org/@asyncapi/openapi-schema-parser/-/openapi-schema-parser-3.0.24.tgz", + "integrity": "sha512-7wz2yVDedJMS+TzOuqCvRWJMc6pNHICKZcOhnW6ZvyVLAh7hYIqQE1WA4OoXT4cKVbwSU3V2Q4bZagSsAIQd6Q==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "@asyncapi/parser": "^3.1.0", + "@openapi-contrib/openapi-schema-to-json-schema": "~3.2.0", + "ajv": "^8.11.0", + "ajv-errors": "^3.0.0", + "ajv-formats": "^2.1.1" } }, - "node_modules/@asyncapi/openapi-schema-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@asyncapi/openapi-schema-parser/-/openapi-schema-parser-2.0.1.tgz", - "integrity": "sha512-algbtdM1gcAOa8+V8kp7WeBhdaNac82jmZUXx8YjyNfRVo02N2juDrjeBAGJd+FNva9Mb4MM7qfkJoAFpTL5VQ==", - "dev": true, + "node_modules/@asyncapi/parser": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@asyncapi/parser/-/parser-3.4.0.tgz", + "integrity": "sha512-Sxn74oHiZSU6+cVeZy62iPZMFMvKp4jupMFHelSICCMw1qELmUHPvuZSr+ZHDmNGgHcEpzJM5HN02kR7T4g+PQ==", + "dependencies": { + "@asyncapi/specs": "^6.8.0", + "@openapi-contrib/openapi-schema-to-json-schema": "~3.2.0", + "@stoplight/json": "3.21.0", + "@stoplight/json-ref-readers": "^1.2.2", + "@stoplight/json-ref-resolver": "^3.1.5", + "@stoplight/spectral-core": "^1.18.3", + "@stoplight/spectral-functions": "^1.7.2", + "@stoplight/spectral-parsers": "^1.0.2", + "@stoplight/spectral-ref-resolver": "^1.0.3", + "@stoplight/types": "^13.12.0", + "@types/json-schema": "^7.0.11", + "@types/urijs": "^1.19.19", + "ajv": "^8.17.1", + "ajv-errors": "^3.0.0", + "ajv-formats": "^2.1.1", + "avsc": "^5.7.5", + "js-yaml": "^4.1.0", + "jsonpath-plus": "^10.0.0", + "node-fetch": "2.6.7" + } + }, + "node_modules/@asyncapi/parser/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dependencies": { - "@openapi-contrib/openapi-schema-to-json-schema": "^3.0.0" + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/@asyncapi/parser": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@asyncapi/parser/-/parser-1.15.0.tgz", - "integrity": "sha512-ff4ljaNry0BFvlM1SOSff3jvZyKkiBVJgIOqHcUZtKBAmXxpvsX0nz9pi8fHbg9NrmNyASPCVTCpiDb7Zasreg==", - "dev": true, + "node_modules/@asyncapi/protobuf-schema-parser": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@asyncapi/protobuf-schema-parser/-/protobuf-schema-parser-3.5.1.tgz", + "integrity": "sha512-rfSHrsJm+W5I10KhQGx2VZTBObw0w5fsMCcZJVSCV1E9YhKDUQkeH+78QBzuLdHtfo9ut90Ykx02wslpZlcu1A==", "dependencies": { - "@apidevtools/json-schema-ref-parser": "^9.0.6", - "@asyncapi/specs": "^2.14.0", - "@fmvilas/pseudo-yaml-ast": "^0.3.1", - "ajv": "^6.10.1", - "js-yaml": "^3.13.1", - "json-to-ast": "^2.1.0", - "lodash.clonedeep": "^4.5.0", - "node-fetch": "^2.6.0", - "tiny-merge-patch": "^0.1.2" + "@asyncapi/parser": "^3.4.0", + "@types/protocol-buffers-schema": "^3.4.3", + "protobufjs": "^7.4.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/@asyncapi/raml-dt-schema-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@asyncapi/raml-dt-schema-parser/-/raml-dt-schema-parser-2.0.1.tgz", - "integrity": "sha512-R7i35IbVbvGyPNm3t5ToPDtYUwDtVjWF/oCgCVPK/wLpNQ0uVZX5Y0JFhO78VUHEep0NKuuI2CZh6oLz0ebMVQ==", - "dev": true, + "version": "4.0.24", + "resolved": "https://registry.npmjs.org/@asyncapi/raml-dt-schema-parser/-/raml-dt-schema-parser-4.0.24.tgz", + "integrity": "sha512-Fy9IwCXPpXoG4Mkm7sXgWucSwYg8POwdx16xuHAmV6AerpcM8nk5mT/tARLtR3wrMst3OBwReEVYzwT3esSb8g==", "dependencies": { - "js-yaml": "^3.13.1", - "ramldt2jsonschema": "^1.1.0" + "@asyncapi/parser": "^3.1.0", + "js-yaml": "^4.1.0", + "ramldt2jsonschema": "^1.2.3", + "webapi-parser": "^0.5.0" } }, "node_modules/@asyncapi/specs": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-2.14.0.tgz", - "integrity": "sha512-hHsYF6XsYNIKb1P2rXaooF4H+uKKQ4b/Ljxrk3rZ3riEDiSxMshMEfb1fUlw9Yj4V4OmJhjXwkNvw8W59AXv1A==", - "dev": true + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-6.10.0.tgz", + "integrity": "sha512-vB5oKLsdrLUORIZ5BXortZTlVyGWWMC1Nud/0LtgxQ3Yn2738HigAD6EVqScvpPsDUI/bcLVsYEXN4dtXQHVng==", + "dependencies": { + "@types/json-schema": "^7.0.11" + } }, "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dependencies": { - "@babel/highlight": "^7.10.4" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "dev": true, + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", - "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.9", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -328,107 +431,75 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dev": true, + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", - "dev": true, + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", - "dev": true, + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", - "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", - "dev": true, + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-member-expression-to-functions": "^7.17.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -437,14 +508,22 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", - "dev": true, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -453,306 +532,210 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", - "dev": true, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", "dependencies": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", - "dev": true, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "dependencies": { - "@babel/types": "^7.17.0" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dev": true, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", - "dev": true, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dev": true, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.17.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "dev": true, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", - "dev": true, + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", "dependencies": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", - "dev": true, + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", + "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, + "node_modules/@babel/parser": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", + "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.2" - }, - "bin": { - "parser": "bin/babel-parser.js" + "@babel/types": "^7.28.2" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", - "dev": true, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -761,248 +744,69 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", - "dev": true, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "dependencies": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", - "dev": true, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", - "dev": true, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", - "dev": true, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "engines": { "node": ">=6.9.0" }, @@ -1010,22 +814,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -1077,25 +865,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -1126,12 +918,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", - "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", - "dev": true, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1243,12 +1034,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1257,30 +1048,27 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", - "dev": true, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", - "dev": true, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1289,13 +1077,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", - "dev": true, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1304,13 +1093,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", - "dev": true, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1319,20 +1109,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", - "dev": true, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1341,22 +1123,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/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/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", - "dev": true, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", + "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1365,13 +1137,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", - "dev": true, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1380,29 +1152,32 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", - "dev": true, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", - "dev": true, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz", + "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -1411,14 +1186,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", - "dev": true, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1427,13 +1201,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", - "dev": true, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1442,15 +1216,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", - "dev": true, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "dependencies": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1459,13 +1231,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", - "dev": true, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1474,30 +1245,27 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", - "dev": true, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", - "dev": true, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1506,16 +1274,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", - "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", - "dev": true, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1524,17 +1289,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", - "dev": true, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "dependencies": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1543,14 +1303,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", - "dev": true, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1559,28 +1317,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", - "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", - "dev": true, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", - "dev": true, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1589,14 +1348,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", - "dev": true, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1605,13 +1362,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", - "dev": true, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1620,13 +1376,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", - "dev": true, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1635,13 +1390,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", - "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", - "dev": true, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1650,17 +1404,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", - "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", - "dev": true, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1669,13 +1419,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", - "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", - "dev": true, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.16.7" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1684,14 +1434,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", - "dev": true, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1700,13 +1451,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", - "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", - "dev": true, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "dependencies": { - "regenerator-transform": "^0.15.0" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1715,28 +1466,27 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", - "dev": true, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", - "dev": true, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1745,14 +1495,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", - "dev": true, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1761,13 +1509,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", - "dev": true, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1776,13 +1523,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", - "dev": true, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", + "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1791,13 +1541,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", - "dev": true, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1806,13 +1556,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", - "dev": true, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1821,14 +1570,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", - "dev": true, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1837,86 +1585,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", - "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", - "dev": true, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "dependencies": { - "@babel/compat-data": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.16.7", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.16.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", - "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.16.7", - "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", - "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", - "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", - "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.16.8", - "@babel/plugin-transform-modules-systemjs": "^7.16.7", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", - "@babel/plugin-transform-new-target": "^7.16.7", - "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", - "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.16.7", - "@babel/plugin-transform-reserved-words": "^7.16.7", - "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", - "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", - "@babel/plugin-transform-unicode-escapes": "^7.16.7", - "@babel/plugin-transform-unicode-regex": "^7.16.7", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.8", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.20.2", - "semver": "^6.3.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1925,43 +1599,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-react": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", - "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", - "dev": true, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.16.7", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@babel/plugin-transform-react-pure-annotations": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1970,865 +1630,1141 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", - "dev": true, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", - "dev": true, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/plugin-transform-react-jsx": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz", + "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", - "dev": true, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/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, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "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" + "@babel/helper-plugin-utils": "^7.27.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, "engines": { - "node": ">= 4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/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, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@fmvilas/pseudo-yaml-ast": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@fmvilas/pseudo-yaml-ast/-/pseudo-yaml-ast-0.3.1.tgz", - "integrity": "sha512-8OAB74W2a9M3k9bjYD8AjVXkX+qO8c0SqNT5HlgOqx7AxSw8xdksEcZp7gFtfi+4njSxT6+76ZR+1ubjAwQHOg==", - "dev": true, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "dependencies": { - "yaml-ast-parser": "0.0.43" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=10.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "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" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/console": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.2.tgz", - "integrity": "sha512-/zYigssuHLImGeMAACkjI4VLAiiJznHgAl3xnFT19iWyct2LhrH3KXOjHRmxBGTkiPLZKKAJAgaPpiU9EZ9K+w==", - "dev": true, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", "dependencies": { - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.0.2", - "jest-util": "^27.0.2", - "slash": "^3.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/console/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, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jest/console/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" + "node_modules/@babel/preset-env": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "dependencies": { + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/console/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/@jest/console/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/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@jest/console/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, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@jest/core": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.4.tgz", - "integrity": "sha512-+dsmV8VUs1h/Szb+rEWk8xBM1fp1I///uFy9nk3wXGvRsF2lBp8EVPmtWc+QFRb3MY2b7u2HbkGF1fzoDzQTLA==", - "dev": true, + "node_modules/@babel/preset-react": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", "dependencies": { - "@jest/console": "^27.0.2", - "@jest/reporters": "^27.0.4", - "@jest/test-result": "^27.0.2", - "@jest/transform": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^27.0.2", - "jest-config": "^27.0.4", - "jest-haste-map": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-regex-util": "^27.0.1", - "jest-resolve": "^27.0.4", - "jest-resolve-dependencies": "^27.0.4", - "jest-runner": "^27.0.4", - "jest-runtime": "^27.0.4", - "jest-snapshot": "^27.0.4", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "jest-watcher": "^27.0.2", - "micromatch": "^4.0.4", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/core/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, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dependencies": { - "color-convert": "^2.0.1" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, + "node_modules/@babel/traverse": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", + "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2", + "debug": "^4.3.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/@jest/core/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, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "dependencies": { - "color-name": "~1.1.4" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/core/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/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "node_modules/@jest/core/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, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@jest/core/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==", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@jest/environment": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.3.tgz", - "integrity": "sha512-pN9m7fbKsop5vc3FOfH8NF7CKKdRbEZzcxfIo1n2TT6ucKWLFq0P6gCJH0GpnQp036++yY9utHOxpeT1WnkWTA==", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^27.0.3", - "@jest/types": "^27.0.2", - "@types/node": "*", - "jest-mock": "^27.0.3" + "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": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@jest/fake-timers": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.3.tgz", - "integrity": "sha512-fQ+UCKRIYKvTCEOyKPnaPnomLATIhMnHC/xPZ7yT1Uldp7yMgMxoYIFidDbpSTgB79+/U+FgfoD30c6wg3IUjA==", + "node_modules/@eslint/eslintrc/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": { - "@jest/types": "^27.0.2", - "@sinonjs/fake-timers": "^7.0.2", - "@types/node": "*", - "jest-message-util": "^27.0.2", - "jest-mock": "^27.0.3", - "jest-util": "^27.0.2" + "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/@eslint/eslintrc/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/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@jest/globals": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.3.tgz", - "integrity": "sha512-OzsIuf7uf+QalqAGbjClyezzEcLQkdZ+7PejUrZgDs+okdAK8GwRCGcYCirHvhMBBQh60Jr3NlIGbn/KBPQLEQ==", + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { - "@jest/environment": "^27.0.3", - "@jest/types": "^27.0.2", - "expect": "^27.0.2" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=10.10.0" } }, - "node_modules/@jest/reporters": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.4.tgz", - "integrity": "sha512-Xa90Nm3JnV0xCe4M6A10M9WuN9krb+WFKxV1A98Y4ePCw40n++r7uxFUNU7DT1i9Behj7fjrAIju9oU0t1QtCg==", + "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": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.0.2", - "@jest/test-result": "^27.0.2", - "@jest/transform": "^27.0.2", - "@jest/types": "^27.0.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.0.2", - "jest-resolve": "^27.0.4", - "jest-util": "^27.0.2", - "jest-worker": "^27.0.2", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", + "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "engines": { + "node": ">=12" }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/reporters/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, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dependencies": { - "color-convert": "^2.0.1" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@jest/reporters/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, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dependencies": { - "color-name": "~1.1.4" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@jest/reporters/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/@isaacs/string-locale-compare": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==" }, - "node_modules/@jest/reporters/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==", + "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/@jest/reporters/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==", + "node_modules/@istanbuljs/load-nyc-config/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": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "sprintf-js": "~1.0.2" } }, - "node_modules/@jest/source-map": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.1.tgz", - "integrity": "sha512-yMgkF0f+6WJtDMdDYNavmqvbHtiSpwRN2U/W+6uztgfqgkq/PXdKPqjBTUF1RD/feth4rH5N3NW0T5+wIuln1A==", + "node_modules/@istanbuljs/load-nyc-config/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": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "node_modules/@jest/test-result": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.2.tgz", - "integrity": "sha512-gcdWwL3yP5VaIadzwQtbZyZMgpmes8ryBAJp70tuxghiA8qL4imJyZex+i+USQH2H4jeLVVszhwntgdQ97fccA==", + "node_modules/@istanbuljs/load-nyc-config/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": { - "@jest/console": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@jest/test-sequencer": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.4.tgz", - "integrity": "sha512-6UFEVwdmxYdyNffBxVVZxmXEdBE4riSddXYSnFNH0ELFQFk/bvagizim8WfgJTqF4EKd+j1yFxvhb8BMHfOjSQ==", + "node_modules/@istanbuljs/load-nyc-config/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": { - "@jest/test-result": "^27.0.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.2", - "jest-runtime": "^27.0.4" + "p-locate": "^4.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "node_modules/@jest/transform": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.2.tgz", - "integrity": "sha512-H8sqKlgtDfVog/s9I4GG2XMbi4Ar7RBxjsKQDUhn2XHAi3NG+GoQwWMER+YfantzExbjNqQvqBHzo/G2pfTiPw==", + "node_modules/@istanbuljs/load-nyc-config/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": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.0.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.2", - "jest-regex-util": "^27.0.1", - "jest-util": "^27.0.2", - "micromatch": "^4.0.4", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/transform/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==", + "node_modules/@istanbuljs/load-nyc-config/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": { - "color-convert": "^2.0.1" + "p-limit": "^2.2.0" }, "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/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@jest/transform/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==", + "node_modules/@jest/core/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" }, "engines": { - "node": ">=7.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform/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/@jest/transform/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==", + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform/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==", + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "jest-get-type": "^29.6.3" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/types": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.2.tgz", - "integrity": "sha512-XpjCtJ/99HB4PmyJ2vgmN7vT+JLP7RW1FBT9RgnMFS4Dt7cvIyBee8O3/j98aUZ34ZpenPZFqmaaObWSeL65dg==", + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/types/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==", + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "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": ">=10" + "node": "*" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/types/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==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">=7.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/types/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/@jest/types/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==", + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/types/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==", + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=6.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, "engines": { - "node": ">=6.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "dev": true + "node_modules/@jsep-plugin/assignment": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", + "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@jsep-plugin/regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", + "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@jsep-plugin/ternary": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@jsep-plugin/ternary/-/ternary-1.1.4.tgz", + "integrity": "sha512-ck5wiqIbqdMX6WRQztBL7ASDty9YLgJ3sSAK5ZpBzXeySvFGCzIvM6UiAI4hTZ22fEcYQVV/zhUbNscggW+Ukg==", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } }, "node_modules/@kwsites/file-exists": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "dev": true, "dependencies": { "debug": "^4.1.1" } @@ -2836,8 +2772,7 @@ "node_modules/@kwsites/promise-deferred": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "dev": true + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -2875,125 +2810,414 @@ } }, "node_modules/@npmcli/arborist": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-2.8.2.tgz", - "integrity": "sha512-6E1XJ0YXBaI9J+25gcTF110MGNx3jv6npr4Rz1U0UAqkuVV7bbDznVJvNqi6F0p8vgrE+Smf9jDTn1DR+7uBjQ==", - "dev": true, + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-5.6.3.tgz", + "integrity": "sha512-/7hbqEM6YuRjwTcQXkK1+xKslEblY5kFQe0tZ7jKyMlIR6x4iOmhLErIkBBGtTKvYxRKdpcxnFXjCobg3UqmsA==", "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^1.0.2", - "@npmcli/metavuln-calculator": "^1.1.0", - "@npmcli/move-file": "^1.1.0", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/metavuln-calculator": "^3.0.1", + "@npmcli/move-file": "^2.0.0", "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^1.0.1", - "@npmcli/package-json": "^1.0.1", - "@npmcli/run-script": "^1.8.2", - "bin-links": "^2.2.1", - "cacache": "^15.0.3", + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/package-json": "^2.0.0", + "@npmcli/query": "^1.2.0", + "@npmcli/run-script": "^4.1.3", + "bin-links": "^3.0.3", + "cacache": "^16.1.3", "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^5.2.1", "json-parse-even-better-errors": "^2.3.1", "json-stringify-nice": "^1.1.4", + "minimatch": "^5.1.0", "mkdirp": "^1.0.4", "mkdirp-infer-owner": "^2.0.0", - "npm-install-checks": "^4.0.0", - "npm-package-arg": "^8.1.5", - "npm-pick-manifest": "^6.1.0", - "npm-registry-fetch": "^11.0.0", - "pacote": "^11.3.5", - "parse-conflict-json": "^1.1.1", - "proc-log": "^1.0.0", + "nopt": "^6.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.0.0", + "npm-pick-manifest": "^7.0.2", + "npm-registry-fetch": "^13.0.0", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "parse-conflict-json": "^2.0.1", + "proc-log": "^2.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^1.0.1", "read-package-json-fast": "^2.0.2", "readdir-scoped-modules": "^1.1.0", "rimraf": "^3.0.2", - "semver": "^7.3.5", - "ssri": "^8.0.1", - "treeverse": "^1.0.4", + "semver": "^7.3.7", + "ssri": "^9.0.0", + "treeverse": "^2.0.0", "walk-up-path": "^1.0.0" }, "bin": { "arborist": "bin/index.js" }, "engines": { - "node": ">= 10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@npmcli/arborist/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" + "node_modules/@npmcli/arborist/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" } }, - "node_modules/@npmcli/arborist/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, + "node_modules/@npmcli/config": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.3.4.tgz", + "integrity": "sha512-01rtHedemDNhUXdicU7s+QYz/3JyV5Naj84cvdXGH4mgCdL+agmSYaLF4LUG4vMCLzhBO8YtS0gPpH1FGvbgAw==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/package-json": "^5.1.1", + "ci-info": "^4.0.0", + "ini": "^4.1.2", + "nopt": "^7.2.1", + "proc-log": "^4.2.0", + "semver": "^7.3.5", + "walk-up-path": "^3.0.1" }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@npmcli/git": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", - "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", - "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", + "node_modules/@npmcli/config/node_modules/@npmcli/git": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^4.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^2.0.2" + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@npmcli/git/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" + "node_modules/@npmcli/config/node_modules/@npmcli/map-workspaces": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", + "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==", + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/git/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, + "node_modules/@npmcli/config/node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", + "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/@npmcli/package-json": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz", + "integrity": "sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==", "dependencies": { - "lru-cache": "^6.0.0" + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^4.0.0", + "semver": "^7.5.3" }, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/@npmcli/promise-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", + "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", + "dependencies": { + "which": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@npmcli/installed-package-contents": { + "node_modules/@npmcli/config/node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/config/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/config/node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/@npmcli/config/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/config/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@npmcli/config/node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/npm-pick-manifest": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", + "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/walk-up-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==" + }, + "node_modules/@npmcli/config/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", + "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", + "dependencies": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/git/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==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/installed-package-contents": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", - "dev": true, "dependencies": { "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" @@ -3006,127 +3230,203 @@ } }, "node_modules/@npmcli/map-workspaces": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-1.0.4.tgz", - "integrity": "sha512-wVR8QxhyXsFcD/cORtJwGQodeeaDf0OxcHie8ema4VgFeqwYkFsDPnSrIRSytX8xR6nKPAH89WnwTcaU608b/Q==", - "dev": true, + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-2.0.4.tgz", + "integrity": "sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==", "dependencies": { "@npmcli/name-from-folder": "^1.0.1", - "glob": "^7.1.6", - "minimatch": "^3.0.4", - "read-package-json-fast": "^2.0.1" + "glob": "^8.0.1", + "minimatch": "^5.0.1", + "read-package-json-fast": "^2.0.3" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@npmcli/metavuln-calculator": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-1.1.1.tgz", - "integrity": "sha512-9xe+ZZ1iGVaUovBVFI9h3qW+UuECUzhvZPxK9RaEA2mjU26o5D0JloGYWwLYvQELJNmBdQB6rrpuN8jni6LwzQ==", - "dev": true, + "node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dependencies": { - "cacache": "^15.0.5", - "pacote": "^11.1.11", - "semver": "^7.3.2" + "balanced-match": "^1.0.0" } }, - "node_modules/@npmcli/metavuln-calculator/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, + "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" } }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "dev": true, + "node_modules/@npmcli/metavuln-calculator": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-3.1.1.tgz", + "integrity": "sha512-n69ygIaqAedecLeVH3KnO39M6ZHiJ2dEv5A7DGvcqCB8q17BGUgW8QaanIkbWUo2aYGZqJaOORTLAlIvKjNDKA==", "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "cacache": "^16.0.0", + "json-parse-even-better-errors": "^2.3.1", + "pacote": "^13.0.3", + "semver": "^7.3.5" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@npmcli/move-file/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" + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/@npmcli/name-from-folder": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz", - "integrity": "sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==", - "dev": true + "integrity": "sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==" }, "node_modules/@npmcli/node-gyp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.2.tgz", - "integrity": "sha512-yrJUe6reVMpktcvagumoqD9r08fH1iRo01gn1u0zoCApa9lnZGEigVKUd2hzsCId4gdtkZZIVscLhNxMECKgRg==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", + "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } }, "node_modules/@npmcli/package-json": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-1.0.1.tgz", - "integrity": "sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-2.0.0.tgz", + "integrity": "sha512-42jnZ6yl16GzjWSH7vtrmWyJDGVa/LXPdpN2rcUWolFjc9ON2N3uz0qdBbQACfmhuJZ2lbKYtmK5qx68ZPLHMA==", "dependencies": { "json-parse-even-better-errors": "^2.3.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/@npmcli/promise-spawn": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", - "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", + "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", "dependencies": { "infer-owner": "^1.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@npmcli/run-script": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz", - "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", - "dev": true, + "node_modules/@npmcli/query": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-1.2.0.tgz", + "integrity": "sha512-uWglsUM3PjBLgTSmZ3/vygeGdvWEIZ3wTUnzGFbprC/RtvQSaT+GAXu1DXmSFj2bD3oOZdcRm1xdzsV2z1YWdw==", "dependencies": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" + "npm-package-arg": "^9.1.0", + "postcss-selector-parser": "^6.0.10", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", + "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", + "dependencies": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/@openapi-contrib/openapi-schema-to-json-schema": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@openapi-contrib/openapi-schema-to-json-schema/-/openapi-schema-to-json-schema-3.1.1.tgz", - "integrity": "sha512-FMvdhv9Jr9tULjJAQaQzhCmNYYj2vQFVnl7CGlLAImZvJal71oedXMGszpPaZTLftAk5TCHqjnirig+P6LZxug==", - "dev": true, + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@openapi-contrib/openapi-schema-to-json-schema/-/openapi-schema-to-json-schema-3.2.0.tgz", + "integrity": "sha512-Gj6C0JwCr8arj0sYuslWXUBSP/KnUlEGnPW4qxlXvAl543oaNQgMgIgkQUA6vs5BCCvwTEiL8m/wdWzfl4UvSw==", "dependencies": { "fast-deep-equal": "^3.1.3" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "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/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" @@ -3149,7 +3449,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", @@ -3162,217 +3461,667 @@ "rollup": "^1.20.0||^2.0.0" } }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@tootallnate/once": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", - "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==", - "dev": true, + "node_modules/@stoplight/better-ajv-errors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz", + "integrity": "sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA==", + "dependencies": { + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, "engines": { - "node": ">= 6" + "node": "^12.20 || >= 14.13" + }, + "peerDependencies": { + "ajv": ">=8" } }, - "node_modules/@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", - "dev": true, + "node_modules/@stoplight/json": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.21.0.tgz", + "integrity": "sha512-5O0apqJ/t4sIevXCO3SBN9AHCEKKR/Zb4gaj7wYe5863jme9g02Q0n/GhM7ZCALkL+vGPTe4ZzTETP8TFtsw3g==", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@stoplight/ordered-object-literal": "^1.0.3", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^13.6.0", + "jsonc-parser": "~2.2.1", + "lodash": "^4.17.21", + "safe-stable-stringify": "^1.1" + }, + "engines": { + "node": ">=8.3.0" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", - "dev": true, + "node_modules/@stoplight/json-ref-readers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@stoplight/json-ref-readers/-/json-ref-readers-1.2.2.tgz", + "integrity": "sha512-nty0tHUq2f1IKuFYsLM4CXLZGHdMn+X/IwEUIpeSOXt0QjMUbL0Em57iJUDzz+2MkWG83smIigNZ3fauGjqgdQ==", "dependencies": { - "@babel/types": "^7.0.0" + "node-fetch": "^2.6.0", + "tslib": "^1.14.1" + }, + "engines": { + "node": ">=8.3.0" } }, - "node_modules/@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", - "dev": true, + "node_modules/@stoplight/json-ref-resolver": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.6.tgz", + "integrity": "sha512-YNcWv3R3n3U6iQYBsFOiWSuRGE5su1tJSiX6pAPRVk7dP0L7lqCteXGzuVRQ0gMZqUl8v1P0+fAKxF6PLo9B5A==", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@stoplight/json": "^3.21.0", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^12.3.0 || ^13.0.0", + "@types/urijs": "^1.19.19", + "dependency-graph": "~0.11.0", + "fast-memoize": "^2.5.2", + "immer": "^9.0.6", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "urijs": "^1.19.11" + }, + "engines": { + "node": ">=8.3.0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "node_modules/@stoplight/json-ref-resolver/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/@stoplight/ordered-object-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.5.tgz", + "integrity": "sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@stoplight/path": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@stoplight/path/-/path-1.3.2.tgz", + "integrity": "sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@stoplight/spectral-core": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.20.0.tgz", + "integrity": "sha512-5hBP81nCC1zn1hJXL/uxPNRKNcB+/pEIHgCjPRpl/w/qy9yC9ver04tw1W0l/PMiv0UeB5dYgozXVQ4j5a6QQQ==", + "dependencies": { + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "~3.21.0", + "@stoplight/path": "1.3.2", + "@stoplight/spectral-parsers": "^1.0.0", + "@stoplight/spectral-ref-resolver": "^1.0.4", + "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/types": "~13.6.0", + "@types/es-aggregate-error": "^1.0.2", + "@types/json-schema": "^7.0.11", + "ajv": "^8.17.1", + "ajv-errors": "~3.0.0", + "ajv-formats": "~2.1.1", + "es-aggregate-error": "^1.0.7", + "jsonpath-plus": "^10.3.0", + "lodash": "~4.17.21", + "lodash.topath": "^4.5.2", + "minimatch": "3.1.2", + "nimma": "0.2.3", + "pony-cause": "^1.1.1", + "simple-eval": "1.0.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-core/node_modules/@stoplight/types": { + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.6.0.tgz", + "integrity": "sha512-dzyuzvUjv3m1wmhPfq82lCVYGcXG0xUYgqnWfCq3PCVR4BKFhjdkHrnJ+jIDoMKvXb05AZP/ObQF6+NpDo29IQ==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + } + }, + "node_modules/@stoplight/spectral-core/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/@stoplight/spectral-formats": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-formats/-/spectral-formats-1.8.2.tgz", + "integrity": "sha512-c06HB+rOKfe7tuxg0IdKDEA5XnjL2vrn/m/OVIIxtINtBzphZrOgtRn7epQ5bQF5SWp84Ue7UJWaGgDwVngMFw==", + "dependencies": { + "@stoplight/json": "^3.17.0", + "@stoplight/spectral-core": "^1.19.2", + "@types/json-schema": "^7.0.7", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-formats/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/@stoplight/spectral-functions": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-functions/-/spectral-functions-1.10.1.tgz", + "integrity": "sha512-obu8ZfoHxELOapfGsCJixKZXZcffjg+lSoNuttpmUFuDzVLT3VmH8QkPXfOGOL5Pz80BR35ClNAToDkdnYIURg==", + "dependencies": { + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "^3.17.1", + "@stoplight/spectral-core": "^1.19.4", + "@stoplight/spectral-formats": "^1.8.1", + "@stoplight/spectral-runtime": "^1.1.2", + "ajv": "^8.17.1", + "ajv-draft-04": "~1.0.0", + "ajv-errors": "~3.0.0", + "ajv-formats": "~2.1.1", + "lodash": "~4.17.21", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-functions/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/@stoplight/spectral-parsers": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-parsers/-/spectral-parsers-1.0.5.tgz", + "integrity": "sha512-ANDTp2IHWGvsQDAY85/jQi9ZrF4mRrA5bciNHX+PUxPr4DwS6iv4h+FVWJMVwcEYdpyoIdyL+SRmHdJfQEPmwQ==", + "dependencies": { + "@stoplight/json": "~3.21.0", + "@stoplight/types": "^14.1.1", + "@stoplight/yaml": "~4.3.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-parsers/node_modules/@stoplight/types": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-14.1.1.tgz", + "integrity": "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + } + }, + "node_modules/@stoplight/spectral-parsers/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/@stoplight/spectral-ref-resolver": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ref-resolver/-/spectral-ref-resolver-1.0.5.tgz", + "integrity": "sha512-gj3TieX5a9zMW29z3mBlAtDOCgN3GEc1VgZnCVlr5irmR4Qi5LuECuFItAq4pTn5Zu+sW5bqutsCH7D4PkpyAA==", + "dependencies": { + "@stoplight/json-ref-readers": "1.2.2", + "@stoplight/json-ref-resolver": "~3.1.6", + "@stoplight/spectral-runtime": "^1.1.2", + "dependency-graph": "0.11.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-ref-resolver/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/@stoplight/spectral-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-runtime/-/spectral-runtime-1.1.4.tgz", + "integrity": "sha512-YHbhX3dqW0do6DhiPSgSGQzr6yQLlWybhKwWx0cqxjMwxej3TqLv3BXMfIUYFKKUqIwH4Q2mV8rrMM8qD2N0rQ==", + "dependencies": { + "@stoplight/json": "^3.20.1", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^13.6.0", + "abort-controller": "^3.0.0", + "lodash": "^4.17.21", + "node-fetch": "^2.7.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-runtime/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/@stoplight/types": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.20.0.tgz", + "integrity": "sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + } + }, + "node_modules/@stoplight/yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.3.0.tgz", + "integrity": "sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w==", + "dependencies": { + "@stoplight/ordered-object-literal": "^1.0.5", + "@stoplight/types": "^14.1.1", + "@stoplight/yaml-ast-parser": "0.0.50", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=10.8" + } + }, + "node_modules/@stoplight/yaml-ast-parser": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.50.tgz", + "integrity": "sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ==" + }, + "node_modules/@stoplight/yaml/node_modules/@stoplight/types": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-14.1.1.tgz", + "integrity": "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + } + }, + "node_modules/@stoplight/yaml/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.7.0.tgz", + "integrity": "sha512-RI2e97YZ7MRa+vxP4UUnMuMFL2buSsf0ollxUbTgrbPLKhMn8KVTx7raS6DYjC7v1NDVrioOvaShxsguLNISCA==", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "devOptional": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "devOptional": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "devOptional": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "devOptional": true, + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/es-aggregate-error": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/es-aggregate-error/-/es-aggregate-error-1.0.6.tgz", + "integrity": "sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg==", + "dependencies": { + "@types/node": "*" } }, "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true + }, "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", "dev": true }, "node_modules/@types/node": { - "version": "16.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.1.tgz", - "integrity": "sha512-4/Z9DMPKFexZj/Gn3LylFgamNKHm4K3QDi0gz9B26Uk0c8izYf97B5fxfpspMNkWlFupblKM/nV8+NA9Ffvr+w==" + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "dependencies": { + "undici-types": "~7.10.0" + } }, - "node_modules/@types/prettier": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.0.tgz", - "integrity": "sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==", + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true + }, + "node_modules/@types/protocol-buffers-schema": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@types/protocol-buffers-schema/-/protocol-buffers-schema-3.4.3.tgz", + "integrity": "sha512-8cCg6BiIj4jS0LXUFq3sndmd46yyPLYqMzvXLcTM1MRubh3sfZlQiehoCjGDxSHTqGSjjx8EtVNryIAl0njQWg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/react": { + "version": "18.3.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", + "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/semver": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", "dev": true }, "node_modules/@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, + "node_modules/@types/urijs": { + "version": "1.19.25", + "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.25.tgz", + "integrity": "sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg==" + }, "node_modules/@types/yargs": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz", - "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.0.tgz", - "integrity": "sha512-9XD9s7mt3QWMk82GoyUpc/Ji03vz4T5AYlHF9DcoFNfJ/y3UAclRsfGiE2gLfXtyC+JRA3trR7cR296TEb1oiQ==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.28.0", - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/typescript-estree": "4.28.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": ">=5" + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.0.tgz", - "integrity": "sha512-eCALCeScs5P/EYjwo6se9bdjtrh8ByWjtHzOkC4Tia6QQWtQr3PHovxh3TdYTuFcurkYI4rmFsRFpucADIkseg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/visitor-keys": "4.28.0" + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/types": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.0.tgz", - "integrity": "sha512-p16xMNKKoiJCVZY5PW/AfILw2xe1LfruTcfAKBj3a+wgNYP5I9ZEKNDOItoRt53p4EiPV6iRSICy8EPanG9ZVA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3380,21 +4129,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.0.tgz", - "integrity": "sha512-m19UQTRtxMzKAm8QxfKpvh6OwQSXaW1CdZPoCaQuLwAq7VZMNuhJmZR4g5281s2ECt658sldnJfdpSZZaxUGMQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/visitor-keys": "4.28.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3406,61 +4156,103 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "brace-expansion": "^2.0.1" }, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=10" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.0.tgz", - "integrity": "sha512-PjJyTWwrlrvM5jazxYF5ZPs/nl0kHDZMVbuIcbpawVXaDPelp3+S9zpOz5RmVUfS/fD5l5+ZXNKnWhNYjPzCvw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.28.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true + }, "node_modules/a-sync-waterfall": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", - "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", - "dev": true - }, - "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } }, "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "bin": { "acorn": "bin/acorn" }, @@ -3468,16 +4260,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -3488,19 +4270,20 @@ } }, "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } }, "node_modules/agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dependencies": { "debug": "4" }, @@ -3509,13 +4292,10 @@ } }, "node_modules/agentkeepalive": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.4.tgz", - "integrity": "sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ==", - "dev": true, + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", "humanize-ms": "^1.2.1" }, "engines": { @@ -3523,10 +4303,9 @@ } }, "node_modules/aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -3536,33 +4315,64 @@ } }, "node_modules/ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "dev": true, + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "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" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", + "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", + "peerDependencies": { + "ajv": "^8.0.1" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, "node_modules/ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "dependencies": { - "type-fest": "^0.11.0" + "type-fest": "^0.21.3" }, "engines": { "node": ">=8" @@ -3572,12 +4382,12 @@ } }, "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3587,28 +4397,28 @@ "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/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, + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3618,33 +4428,55 @@ } }, "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==" }, "node_modules/are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", "dependencies": { "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dependencies": { - "sprintf-js": "~1.0.2" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-union": { @@ -3656,355 +4488,284 @@ "node": ">=8" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "bin": { + "astring": "bin/astring" } }, - "node_modules/assert-plus": { + "node_modules/async-function": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "engines": { - "node": ">=0.8" + "node": ">= 0.4" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, "node_modules/avsc": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/avsc/-/avsc-5.7.4.tgz", - "integrity": "sha512-z4oo33lmnvvNRqfUe3YjDGGpqu/L2+wXBIhMtwq6oqZ+exOUAkQYM6zd2VWKF7AIlajOF8ZZuPFfryTG9iLC/w==", - "dev": true, + "version": "5.7.9", + "resolved": "https://registry.npmjs.org/avsc/-/avsc-5.7.9.tgz", + "integrity": "sha512-yOA4wFeI7ET3v32Di/sUybQ+ttP20JHSW3mxLuNGeO0uD6PPcvLrIQXSvy/rhJOWU5JrYh7U4OHplWMmtAtjMg==", "engines": { "node": ">=0.11" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, "node_modules/babel-jest": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.2.tgz", - "integrity": "sha512-9OThPl3/IQbo4Yul2vMz4FYwILPQak8XelX4YGowygfHaOl5R5gfjm4iVx4d8aUugkW683t8aq0A74E7b5DU1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^27.0.2", - "@jest/types": "^27.0.2", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^27.0.1", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, - "node_modules/babel-jest/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/babel-jest/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "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/babel-jest/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==", + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/babel-jest/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/babel-jest/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/babel-jest/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==", + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" }, "engines": { "node": ">=8" } }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "node_modules/babel-plugin-istanbul/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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" + "bin": { + "semver": "bin/semver.js" } }, "node_modules/babel-plugin-jest-hoist": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.1.tgz", - "integrity": "sha512-sqBF0owAcCDBVEDtxqfYr2F36eSHdx7lAVGyYuOBRnKdD6gzcy0I0XrAYCZgOA3CRrLhmR+Uae9nogPzmAtOfQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", + "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dev": true, + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "dev": true, + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dev": true, + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1" + "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-source-map-support": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/babel-plugin-source-map-support/-/babel-plugin-source-map-support-2.1.3.tgz", - "integrity": "sha512-BV5X1sJ6TmL8BUonudz4/9dRaxAJty/MMc6AjwnTLPsdnf6LfVGncDyI/3wDCF/2OA0xXjsWkJHUPrNU5N0EEg==", - "dev": true, + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-source-map-support/-/babel-plugin-source-map-support-2.2.0.tgz", + "integrity": "sha512-YWB1DfnYjPakY0J16nemRW2HEqsX/zEBQJAbiZsc4q7Zn5aOoVqA1hoaQbXheeBHBXPFiS6da1WFrSbcnXHNWg==", "dependencies": { - "@babel/helper-module-imports": "^7.10.4" + "@babel/helper-module-imports": "^7.16.7" } }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "node_modules/babel-preset-jest": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.1.tgz", - "integrity": "sha512-nIBIqCEpuiyhvjQs2mVNwTxQQa2xk70p9Dd/0obQGBf8FBzbnI8QhQKzLsWMN2i6q+5B0OcWDtrboBX5gmOLyA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^27.0.1", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/bcrypt-pbkdf": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/bin-links": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-2.2.1.tgz", - "integrity": "sha512-wFzVTqavpgCCYAh8SVBdnZdiQMxTkGR+T3b14CNpBXIBe2neJWaMGAZ55XWWHELJJ89dscuq0VCBqcVaIOgCMg==", - "dev": true, + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-3.0.3.tgz", + "integrity": "sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==", "dependencies": { - "cmd-shim": "^4.0.1", - "mkdirp": "^1.0.3", - "npm-normalize-package-bin": "^1.0.0", - "read-cmd-shim": "^2.0.0", + "cmd-shim": "^5.0.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0", + "read-cmd-shim": "^3.0.0", "rimraf": "^3.0.0", - "write-file-atomic": "^3.0.3" + "write-file-atomic": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/bin-links/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" - }, + "node_modules/bin-links/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "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, + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4014,7 +4775,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -4022,17 +4782,10 @@ "node": ">=8" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, "node_modules/browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", - "dev": true, + "version": "4.25.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.3.tgz", + "integrity": "sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==", "funding": [ { "type": "opencollective", @@ -4041,14 +4794,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001735", + "electron-to-chromium": "^1.5.204", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -4057,6 +4813,18 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -4067,91 +4835,98 @@ } }, "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", + "dependencies": { + "semver": "^7.0.0" + } }, "node_modules/cacache": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", - "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", - "dev": true, + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dependencies": { - "@npmcli/move-file": "^1.0.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" }, "engines": { - "node": ">= 10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/cacache/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" - }, + "node_modules/cacache/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==", "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/cacache/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dependencies": { - "aggregate-error": "^3.0.0" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-bind": { + "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -4171,10 +4946,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001332", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", - "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", - "dev": true, + "version": "1.0.30001735", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001735.tgz", + "integrity": "sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==", "funding": [ { "type": "opencollective", @@ -4183,27 +4957,27 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "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==", + "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": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/char-regex": { @@ -4216,10 +4990,9 @@ } }, "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -4232,6 +5005,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -4240,121 +5016,106 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, "engines": { "node": ">=10" } }, "node_modules/ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } }, "node_modules/cjs-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz", - "integrity": "sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "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==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/cmd-shim": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-4.1.0.tgz", - "integrity": "sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw==", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-5.0.0.tgz", + "integrity": "sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==", "dependencies": { "mkdirp-infer-owner": "^2.0.0" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, - "node_modules/code-error-fragment": { - "version": "0.0.230", - "resolved": "https://registry.npmjs.org/code-error-fragment/-/code-error-fragment-0.0.230.tgz", - "integrity": "sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "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, + "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.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "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/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" } }, "node_modules/commander": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, "engines": { "node": ">= 6" } @@ -4362,70 +5123,65 @@ "node_modules/common-ancestor-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "dev": true + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, "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" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/core-js-compat": { - "version": "3.22.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.2.tgz", - "integrity": "sha512-Fns9lU06ZJ07pdfmPMu7OnkIKGPKDzXKIiuGlSvHHapwqMUF2QnnsWwtueFZtSyZEilP0o6iUeHQwpn7LxtLUw==", - "dev": true, + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.0.tgz", + "integrity": "sha512-gRoVMBawZg0OnxaVv3zpqLLxaHmsubEGyTnqdpI/CEBvX4JadI1dMSHxagThprYRtSVbuQxvi6iUatdPxohHpA==", "dependencies": { - "browserslist": "^4.20.2", - "semver": "7.0.0" + "browserslist": "^4.25.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, "bin": { - "semver": "bin/semver.js" + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "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, + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -4435,63 +5191,83 @@ "node": ">= 8" } }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", "dev": true }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "dev": true }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dependencies": { - "assert-plus": "^1.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" }, "engines": { - "node": ">=0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -4505,47 +5281,57 @@ "node_modules/debuglog": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", - "dev": true, + "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "engines": { "node": "*" } }, - "node_modules/decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", - "dev": true - }, "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } }, "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "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/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/define-properties": { + "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -4554,28 +5340,33 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, "engines": { - "node": ">=0.4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "engines": { - "node": ">= 0.6" + "node": ">= 0.6.0" } }, "node_modules/detect-newline": { @@ -4588,10 +5379,9 @@ } }, "node_modules/dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", - "dev": true, + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dependencies": { "asap": "^2.0.0", "wrappy": "1" @@ -4601,18 +5391,17 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, "engines": { "node": ">=0.3.1" } }, "node_modules/diff-sequences": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.1.tgz", - "integrity": "sha512-XPLijkfJUh/PIBnfkcSHgvD6tlYixmcMAn3osTk6jt+H0v/mgURto1XUiD9DKuGX5NDoVS6dSlA23gd9FUaCFg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/dir-glob": { @@ -4639,50 +5428,42 @@ "node": ">=6.0.0" } }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, + "node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dependencies": { - "webidl-conversions": "^5.0.0" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/electron-to-chromium": { - "version": "1.4.122", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.122.tgz", - "integrity": "sha512-VuLNxTIt8sBWIT2sd186xPd18Y8KcK8myLd9nMdSJOYZwFUxxbLVmX/T1VX+qqaytRlrYYQv39myxJdXtu7Ysw==", - "dev": true + "version": "1.5.207", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.207.tgz", + "integrity": "sha512-mryFrrL/GXDTmAtIVMVf+eIXM09BBPlO5IQ7lUyKmK8d+A4VpRGG+M3ofoVef6qyF8s60rJei8ymlJxjUA8Faw==" }, "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sindresorhus/emittery?sponsor=1" @@ -4691,44 +5472,17 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/encoding": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.2" } }, - "node_modules/encoding/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, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/entities": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", @@ -4738,7 +5492,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, "engines": { "node": ">=6" } @@ -4746,402 +5499,486 @@ "node_modules/err-code": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, + "node_modules/es-aggregate-error": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.14.tgz", + "integrity": "sha512-3YxX6rVb07B5TV11AV5wsL7nQCHXNwoHPsQC8S4AmBiqYhyNCJ5BRKXkXyDJvs8QzXN20NgRtxe3dEEQD9NLHA==", + "dependencies": { + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "globalthis": "^1.0.4", + "has-property-descriptors": "^1.0.2", + "set-function-name": "^2.0.2" + }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "es-errors": "^1.3.0" }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=6.0" + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, - "optionalDependencies": { - "source-map": "~0.6.1" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "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": ">=4.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "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.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-plugin-jest": { - "version": "24.3.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz", - "integrity": "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==", + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "^4.0.1" + "@typescript-eslint/utils": "^5.10.0" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": ">= 4", - "eslint": ">=5" + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" }, "peerDependenciesMeta": { "@typescript-eslint/eslint-plugin": { "optional": true + }, + "jest": { + "optional": true } } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { - "node": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "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==", + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "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==", + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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==", + "node_modules/eslint-plugin-jest/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=8.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==", + "node_modules/eslint-plugin-jest/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0" } }, - "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==", + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { - "node": ">= 4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/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==", + "node_modules/eslint/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": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/eslint/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": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10.13.0" } }, - "node_modules/eslint/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/eslint/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/eslint/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/strip-json-comments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", - "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", - "dev": true, + "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==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "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==", + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/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/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/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": ">=0.10" } }, "node_modules/esrecurse": { @@ -5156,7 +5993,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -5165,30 +6002,27 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" }, "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/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -5215,73 +6049,49 @@ "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/expect": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.2.tgz", - "integrity": "sha512-YJFNJe2+P2DqH+ZrXy+ydRQYO87oxRUonZImpDodR1G7qo3NYd3pL+NQ9Keqpez3cehczYwZDBC3A7xk3n7M/w==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/types": "^27.0.2", - "ansi-styles": "^5.0.0", - "jest-get-type": "^27.0.1", - "jest-matcher-utils": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-regex-util": "^27.0.1" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/expect/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "engines": [ - "node >=0.6.0" - ] + "node_modules/exponential-backoff": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==" }, "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 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "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" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -5290,28 +6100,47 @@ "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 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "dependencies": { "bser": "2.1.1" @@ -5332,8 +6161,7 @@ "node_modules/filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", - "dev": true, + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", "engines": { "node": ">=4" } @@ -5342,7 +6170,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", - "dev": true, "dependencies": { "filename-reserved-regex": "^2.0.0", "strip-outer": "^1.0.1", @@ -5359,7 +6186,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5368,25 +6194,29 @@ } }, "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==", + "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": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -5394,50 +6224,91 @@ } }, "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==" }, "node_modules/foreachasync": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", - "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=", - "dev": true + "integrity": "sha512-J+ler7Ta54FwwNcx6wQRDhTIbNeyDcARMkOcguEqnEdtm0jKvN3Li3PDAb2Du3ubJYEWfYL83XMROXdsXAXycw==" }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, "engines": { - "node": "*" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "engines": { - "node": ">= 0.12" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-extra": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.6.4.tgz", + "integrity": "sha512-5rU898vl/Z948L+kkJedbmo/iltzmiF5bn/eEk0j/SgrPpI+Ydau9xlJPicV7Av2CHYBGz5LAlwTnBU80j1zPQ==", + "dependencies": { + "jsonfile": "~1.0.1", + "mkdirp": "0.3.x", + "ncp": "~0.4.2", + "rimraf": "~2.2.0" + } + }, + "node_modules/fs-extra/node_modules/mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "node_modules/fs-extra/node_modules/rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "bin": { + "rimraf": "bin.js" } }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, "dependencies": { "minipass": "^3.0.0" }, @@ -5448,8 +6319,7 @@ "node_modules/fs.extra": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fs.extra/-/fs.extra-1.3.2.tgz", - "integrity": "sha1-3QI/kwE77iRTHxszUUw3sg/ZM0k=", - "dev": true, + "integrity": "sha512-Ig401VXtyrWrz23k9KxAx9OrnL8AHSLNhQ8YJH2wSYuH0ZUfxwBeY6zXkd/oOyVRFTlpEu/0n5gHeuZt7aqbkw==", "dependencies": { "fs-extra": "~0.6.1", "mkdirp": "~0.3.5", @@ -5459,51 +6329,21 @@ "node": "*" } }, - "node_modules/fs.extra/node_modules/fs-extra": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.6.4.tgz", - "integrity": "sha1-9G8MdbeEH40gCzNIzU1pHVoJnRU=", - "dev": true, - "dependencies": { - "jsonfile": "~1.0.1", - "mkdirp": "0.3.x", - "ncp": "~0.4.2", - "rimraf": "~2.2.0" - } - }, - "node_modules/fs.extra/node_modules/jsonfile": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-1.0.1.tgz", - "integrity": "sha1-6l7+QLg2kLmGZ2FKc5L8YOhCwN0=", - "dev": true - }, "node_modules/fs.extra/node_modules/mkdirp": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true - }, - "node_modules/fs.extra/node_modules/rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true, - "bin": { - "rimraf": "bin.js" - } + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, "optional": true, "os": [ @@ -5514,85 +6354,80 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dependencies": { - "number-is-nan": "^1.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" }, "engines": { - "node": ">=0.10.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, + "node_modules/generate-schema": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/generate-schema/-/generate-schema-2.6.0.tgz", + "integrity": "sha512-EUBKfJNzT8f91xUk5X5gKtnbdejZeE065UAJ3BCzE8VEbvwKI9Pm5jaWmqVeK1MYc1g5weAVFDTSJzN7ymtTqA==", "dependencies": { - "ansi-regex": "^2.0.0" + "commander": "^2.9.0", + "type-of-is": "^3.4.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "generate-schema": "bin/generate-schema" } }, + "node_modules/generate-schema/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "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" } @@ -5607,14 +6442,23 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5629,6 +6473,18 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -5641,30 +6497,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5674,7 +6536,6 @@ "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" }, @@ -5682,11 +6543,29 @@ "node": ">= 6" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "dependencies": { "ini": "2.0.0" }, @@ -5701,15 +6580,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, "engines": { "node": ">=10" } }, "node_modules/globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -5721,16 +6599,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globals/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, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/globby": { @@ -5753,95 +6634,112 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "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 + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "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/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, "engines": { - "node": ">=4" + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "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" + "es-define-property": "^1.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dependencies": { - "function-bind": "^1.1.1" + "dunder-proto": "^1.0.0" }, "engines": { - "node": ">= 0.4.0" + "node": ">= 0.4" + }, + "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": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "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" + "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, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -5852,19 +6750,36 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { - "whatwg-encoding": "^1.0.5" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/hosted-git-info/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==", + "engines": { + "node": ">=12" } }, "node_modules/html-escaper": { @@ -5874,18 +6789,16 @@ "dev": true }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==" }, "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dependencies": { - "@tootallnate/once": "1", + "@tootallnate/once": "2", "agent-base": "6", "debug": "4" }, @@ -5893,26 +6806,10 @@ "node": ">= 6" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dependencies": { "agent-base": "6", "debug": "4" @@ -5933,46 +6830,75 @@ "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dependencies": { "ms": "^2.0.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, + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dev": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", "dependencies": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" } }, "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==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "dependencies": { "parent-module": "^1.0.0", @@ -5995,9 +6921,9 @@ } }, "node_modules/import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "dependencies": { "pkg-dir": "^4.2.0", @@ -6008,13 +6934,15 @@ }, "engines": { "node": ">=8" + }, + "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": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "engines": { "node": ">=0.8.19" } @@ -6023,7 +6951,6 @@ "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" } @@ -6031,14 +6958,13 @@ "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -6047,42 +6973,95 @@ "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 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "license": "MIT", + "node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", "engines": { "node": ">= 12" } }, - "node_modules/ip-address/node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true, - "license": "MIT" + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, - "license": "BSD-3-Clause" + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -6090,44 +7069,103 @@ "node": ">=8" } }, - "node_modules/is-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", - "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", - "dev": true, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dependencies": { - "ci-info": "^3.1.1" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, - "bin": { - "is-ci": "bin.js" + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -6141,11 +7179,27 @@ "node": ">=6" } }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, @@ -6156,23 +7210,103 @@ "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", - "dev": true + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "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-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "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-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-stream": { "version": "2.0.1", @@ -6186,102 +7320,144 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "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==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=10" } }, "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==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.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": ">=10" } }, "node_modules/istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "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", @@ -6289,13 +7465,13 @@ "source-map": "^0.6.1" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -6305,24 +7481,39 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.4.tgz", - "integrity": "sha512-Px1iKFooXgGSkk1H8dJxxBIrM3tsc5SIuI4kfKYK2J+4rvCvPGr/cXktxh0e9zIPQ5g09kOMNfHQEmusBUf/ZA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "dependencies": { - "@jest/core": "^27.0.4", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^27.0.4" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { @@ -6331,13251 +7522,4213 @@ } }, "node_modules/jest-changed-files": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.2.tgz", - "integrity": "sha512-eMeb1Pn7w7x3wue5/vF73LPCJ7DKQuC9wQUR5ebP9hDPpk5hzcT/3Hmz3Q5BOFpR3tgbmaWhJcMTVgC8Z1NuMw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { - "@jest/types": "^27.0.2", "execa": "^5.0.0", - "throat": "^6.0.1" + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.4.tgz", - "integrity": "sha512-QD+eblDiRphta630WRKewuASLs/oY1Zki2G4bccntRvrTHQ63ljwFR5TLduuK4Zg0ZPzW0+8o6AP7KRd1yKOjw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^27.0.3", - "@jest/test-result": "^27.0.2", - "@jest/types": "^27.0.2", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.0.2", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^27.0.2", - "jest-matcher-utils": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-runtime": "^27.0.4", - "jest-snapshot": "^27.0.4", - "jest-util": "^27.0.2", - "pretty-format": "^27.0.2", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" + "stack-utils": "^2.0.3" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/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==", + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-circus/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" + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" }, - "engines": { - "node": ">=7.0.0" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/jest-circus/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/jest-circus/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==", + "node_modules/jest-config/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "engines": { "node": ">=8" } }, - "node_modules/jest-circus/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==", + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "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": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-config": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.4.tgz", - "integrity": "sha512-VkQFAHWnPQefdvHU9A+G3H/Z3NrrTKqWpvxgQz3nkUdkDTWeKJE6e//BL+R7z79dXOMVksYgM/z6ndtN0hfChg==", + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.0.4", - "@jest/types": "^27.0.2", - "babel-jest": "^27.0.2", "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "is-ci": "^3.0.0", - "jest-circus": "^27.0.4", - "jest-environment-jsdom": "^27.0.3", - "jest-environment-node": "^27.0.3", - "jest-get-type": "^27.0.1", - "jest-jasmine2": "^27.0.4", - "jest-regex-util": "^27.0.1", - "jest-resolve": "^27.0.4", - "jest-runner": "^27.0.4", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "micromatch": "^4.0.4", - "pretty-format": "^27.0.2" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-config/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==", + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "detect-newline": "^3.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-config/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==", + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=7.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-config/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/jest-config/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==", + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-config/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==", + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/jest-diff": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.2.tgz", - "integrity": "sha512-BFIdRb0LqfV1hBt8crQmw6gGQHVDhM87SpMIZ45FPYKReZYG5er1+5pIn2zKqvrJp6WNox0ylR8571Iwk2Dmgw==", + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.0.1", - "jest-get-type": "^27.0.1", - "pretty-format": "^27.0.2" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-diff/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==", + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-diff/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==", + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=7.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-diff/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/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } }, - "node_modules/jest-diff/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==", + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-diff/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==", + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-docblock": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.1.tgz", - "integrity": "sha512-TA4+21s3oebURc7VgFV4r7ltdIJ5rtBH1E3Tbovcg7AV+oLfD5DcJ2V2vJ5zFA9sL5CFd/d2D6IpsAeSheEdrA==", + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { - "detect-newline": "^3.0.0" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.2.tgz", - "integrity": "sha512-OLMBZBZ6JkoXgUenDtseFRWA43wVl2BwmZYIWQws7eS7pqsIvePqj/jJmEnfq91ALk3LNphgwNK/PRFBYi7ITQ==", + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/types": "^27.0.2", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", "chalk": "^4.0.0", - "jest-get-type": "^27.0.1", - "jest-util": "^27.0.2", - "pretty-format": "^27.0.2" + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/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==", + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "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": ">=10" + "node": "*" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-each/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==", + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "engines": { - "node": ">=7.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/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/jest-each/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==", + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/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==", + "node_modules/jest-util/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "engines": { "node": ">=8" } }, - "node_modules/jest-environment-jsdom": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.3.tgz", - "integrity": "sha512-5KLmgv1bhiimpSA8oGTnZYk6g4fsNyZiA/6gI2tAZUgrufd7heRUSVh4gRokzZVEj8zlwAQYT0Zs6tuJSW/ECA==", + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { - "@jest/environment": "^27.0.3", - "@jest/fake-timers": "^27.0.3", - "@jest/types": "^27.0.2", - "@types/node": "*", - "jest-mock": "^27.0.3", - "jest-util": "^27.0.2", - "jsdom": "^16.6.0" + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-environment-node": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.3.tgz", - "integrity": "sha512-co2/IVnIFL3cItpFULCvXFg9us4gvWXgs7mutAMPCbFhcqh56QAOdKhNzC2+RycsC/k4mbMj1VF+9F/NzA0ROg==", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "dependencies": { - "@jest/environment": "^27.0.3", - "@jest/fake-timers": "^27.0.3", - "@jest/types": "^27.0.2", - "@types/node": "*", - "jest-mock": "^27.0.3", - "jest-util": "^27.0.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.1.tgz", - "integrity": "sha512-9Tggo9zZbu0sHKebiAijyt1NM77Z0uO4tuWOxUCujAiSeXv30Vb5D4xVF4UR4YWNapcftj+PbByU54lKD7/xMg==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.2.tgz", - "integrity": "sha512-37gYfrYjjhEfk37C4bCMWAC0oPBxDpG0qpl8lYg8BT//wf353YT/fzgA7+Dq0EtM7rPFS3JEcMsxdtDwNMi2cA==", - "dev": true, - "dependencies": { - "@jest/types": "^27.0.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^27.0.1", - "jest-serializer": "^27.0.1", - "jest-util": "^27.0.2", - "jest-worker": "^27.0.2", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=10" }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-jasmine2": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.4.tgz", - "integrity": "sha512-yj3WrjjquZwkJw+eA4c9yucHw4/+EHndHWSqgHbHGQfT94ihaaQsa009j1a0puU8CNxPDk0c1oAPeOpdJUElwA==", + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.0.3", - "@jest/source-map": "^27.0.1", - "@jest/test-result": "^27.0.2", - "@jest/types": "^27.0.2", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", + "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.0.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.0.2", - "jest-matcher-utils": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-runtime": "^27.0.4", - "jest-snapshot": "^27.0.4", - "jest-util": "^27.0.2", - "pretty-format": "^27.0.2", - "throat": "^6.0.1" + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-jasmine2/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==", + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-jasmine2/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jest-jasmine2/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" - }, + "node_modules/jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha512-+kHj8HXArPfpPEKGLZ+kB5ONRTCiGQXo8RQYL0hH8t6pWXUBBK5KkkQmTNOwKK4LEsd0yTsgtjJVm4UBSZea4w==", "engines": { - "node": ">=7.0.0" + "node": ">= 0.6.0" } }, - "node_modules/jest-jasmine2/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/jest-jasmine2/node_modules/has-flag": { + "node_modules/js-tokens": { "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" - } + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "node_modules/jest-jasmine2/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, + "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==", "dependencies": { - "has-flag": "^4.0.0" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=8" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jest-leak-detector": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.2.tgz", - "integrity": "sha512-TZA3DmCOfe8YZFIMD1GxFqXUkQnIoOGQyy4hFCA2mlHtnAaf+FeOMxi0fZmfB41ZL+QbFG6BVaZF5IeFIVy53Q==", - "dev": true, - "dependencies": { - "jest-get-type": "^27.0.1", - "pretty-format": "^27.0.2" - }, + "node_modules/jsep": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", + "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.16.0" } }, - "node_modules/jest-matcher-utils": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.2.tgz", - "integrity": "sha512-Qczi5xnTNjkhcIB0Yy75Txt+Ez51xdhOxsukN7awzq2auZQGPHcQrJ623PZj0ECDEMOk2soxWx05EXdXGd1CbA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.0.2", - "jest-get-type": "^27.0.1", - "pretty-format": "^27.0.2" + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6" } }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-pointer": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", + "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "foreach": "^2.0.4" } }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, + "node_modules/json-schema-migrate": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-0.2.0.tgz", + "integrity": "sha512-dq4/oHWmtw/+0ytnXsDqVn+VsVweTEmzm5jLgguPn9BjSzn6/q58ZiZx3BHiQyJs612f0T5Z+MrUEUUY5DHsRg==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "ajv": "^5.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "node_modules/json-schema-migrate/node_modules/ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/json-schema-migrate/node_modules/fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==" + }, + "node_modules/json-schema-migrate/node_modules/json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "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/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/json-stringify-nice": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/jest-message-util": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.2.tgz", - "integrity": "sha512-rTqWUX42ec2LdMkoUPOzrEd1Tcm+R1KfLOmFK+OVNo4MnLsEaxO5zPDb2BbdSmthdM/IfXxOZU60P/WbWF8BTw==", - "dev": true, + "node_modules/jsonc-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", + "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==" + }, + "node_modules/jsonfile": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-1.0.1.tgz", + "integrity": "sha512-KbsDJNRfRPF5v49tMNf9sqyyGqGLBcz1v5kZT01kG5ns5mQSltwxCKVmUzVKtEinkUnTDtSrp6ngWpV7Xw0ZlA==" + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/jsonpath-plus": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz", + "integrity": "sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.0.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "pretty-format": "^27.0.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "@jsep-plugin/assignment": "^1.3.0", + "@jsep-plugin/regex": "^1.0.4", + "jsep": "^1.4.0" + }, + "bin": { + "jsonpath": "bin/jsonpath-cli.js", + "jsonpath-plus": "bin/jsonpath-cli.js" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=18.0.0" } }, - "node_modules/jest-message-util/node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.14.5" - }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/just-diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-5.2.0.tgz", + "integrity": "sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==" + }, + "node_modules/just-diff-apply": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", + "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "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" + "json-buffer": "3.0.1" } }, - "node_modules/jest-message-util/node_modules/chalk/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==", + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=6" } }, - "node_modules/jest-message-util/node_modules/chalk/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" - }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/jest-message-util/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==", + "node_modules/levenshtein-edit-distance": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/levenshtein-edit-distance/-/levenshtein-edit-distance-2.0.5.tgz", + "integrity": "sha512-Yuraz7QnMX/JENJU1HA6UtdsbhRzoSFnGpVGVryjQgHtl2s/YmVgmNYkVs5yzVZ9aAvQR9wPBUH3lG755ylxGA==", + "bin": { + "levenshtein-edit-distance": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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": { - "color-name": "~1.1.4" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.8.0" } }, - "node_modules/jest-message-util/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/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "node_modules/jest-message-util/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/linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dependencies": { + "uc.micro": "^1.0.1" } }, - "node_modules/jest-mock": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.3.tgz", - "integrity": "sha512-O5FZn5XDzEp+Xg28mUz4ovVcdwBBPfAhW9+zJLO0Efn2qNbYcDaJvSlRiQ6BCZUCVOJjALicuJQI9mRFjv1o9Q==", + "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": { - "@jest/types": "^27.0.2", - "@types/node": "*" + "p-locate": "^5.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "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.topath": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", + "integrity": "sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==" + }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" + "node": ">= 0.6.0" }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" } }, - "node_modules/jest-regex-util": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.1.tgz", - "integrity": "sha512-6nY6QVcpTgEKQy1L41P4pr3aOddneK17kn3HJw6SdwGiKfgCGTvH02hVXL0GU8GEKtPH83eD2DIDgxHXOxVohQ==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==" }, - "node_modules/jest-resolve": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.4.tgz", - "integrity": "sha512-BcfyK2i3cG79PDb/6gB6zFeFQlcqLsQjGBqznFCpA0L/3l1L/oOsltdUjs5eISAWA9HS9qtj8v2PSZr/yWxONQ==", - "dev": true, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dependencies": { - "@jest/types": "^27.0.2", - "chalk": "^4.0.0", - "escalade": "^3.1.1", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "resolve": "^1.20.0", - "slash": "^3.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/jest-resolve-dependencies": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.4.tgz", - "integrity": "sha512-F33UPfw1YGWCV2uxJl7wD6TvcQn5IC0LtguwY3r4L7R6H4twpLkp5Q2ZfzRx9A2I3G8feiy0O0sqcn/Qoym71A==", - "dev": true, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dependencies": { - "@jest/types": "^27.0.2", - "jest-regex-util": "^27.0.1", - "jest-snapshot": "^27.0.4" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "yallist": "^3.0.2" } }, - "node_modules/jest-resolve/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==", + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/jest-resolve/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==", + "node_modules/make-fetch-happen/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==", + "engines": { + "node": ">=12" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "tmpl": "1.0.5" + } + }, + "node_modules/markdown-it": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "dependencies": { + "argparse": "^1.0.7", + "entities": "~2.0.0", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "engines": { - "node": ">=7.0.0" + "node": ">= 0.4" } }, - "node_modules/jest-resolve/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/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, + "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/jest-resolve/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==", + "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": ">= 8" } }, - "node_modules/jest-resolve/node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8.6" } }, - "node_modules/jest-resolve/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==", + "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, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/jest-runner": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.4.tgz", - "integrity": "sha512-NfmvSYLCsCJk2AG8Ar2NAh4PhsJJpO+/r+g4bKR5L/5jFzx/indUpnVBdrfDvuqhGLLAvrKJ9FM/Nt8o1dsqxg==", + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "@jest/console": "^27.0.2", - "@jest/environment": "^27.0.3", - "@jest/test-result": "^27.0.2", - "@jest/transform": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-docblock": "^27.0.1", - "jest-environment-jsdom": "^27.0.3", - "jest-environment-node": "^27.0.3", - "jest-haste-map": "^27.0.2", - "jest-leak-detector": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-resolve": "^27.0.4", - "jest-runtime": "^27.0.4", - "jest-util": "^27.0.2", - "jest-worker": "^27.0.2", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "*" } }, - "node_modules/jest-runner/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, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dependencies": { - "color-convert": "^2.0.1" + "yallist": "^4.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 8" } }, - "node_modules/jest-runner/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, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dependencies": { - "color-name": "~1.1.4" + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" }, "engines": { - "node": ">=7.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/jest-runner/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/jest-runner/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, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/jest-runner/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, + "node_modules/minipass-json-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz", + "integrity": "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==", "dependencies": { - "has-flag": "^4.0.0" + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/jest-runtime": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.4.tgz", - "integrity": "sha512-voJB4xbAjS/qYPboV+e+gmg3jfvHJJY4CagFWBOM9dQKtlaiTjcpD2tWwla84Z7PtXSQPeIpXY0qksA9Dum29A==", - "dev": true, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dependencies": { - "@jest/console": "^27.0.2", - "@jest/environment": "^27.0.3", - "@jest/fake-timers": "^27.0.3", - "@jest/globals": "^27.0.3", - "@jest/source-map": "^27.0.1", - "@jest/test-result": "^27.0.2", - "@jest/transform": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-mock": "^27.0.3", - "jest-regex-util": "^27.0.1", - "jest-resolve": "^27.0.4", - "jest-snapshot": "^27.0.4", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^16.0.3" + "minipass": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "node_modules/jest-runtime/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, + "node_modules/minipass/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/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dependencies": { - "color-convert": "^2.0.1" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 8" } }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "node_modules/minizlib/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/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-runtime/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, + "node_modules/mkdirp-infer-owner": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz", + "integrity": "sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==", "dependencies": { - "color-name": "~1.1.4" + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" }, "engines": { - "node": ">=7.0.0" + "node": ">=10" } }, - "node_modules/jest-runtime/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/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "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/jest-runtime/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/ncp": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", + "integrity": "sha512-PfGU8jYWdRl4FqJfCy0IzbkGyFHntfWygZg46nFk/dJD/XRrk2cj0SsKSX9n5u5gE0E0YfEpKWrEkfjnlZSTXA==", + "bin": { + "ncp": "bin/ncp" } }, - "node_modules/jest-runtime/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, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/jest-runtime/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/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, - "node_modules/jest-serializer": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.1.tgz", - "integrity": "sha512-svy//5IH6bfQvAbkAEg1s7xhhgHTtXu0li0I2fdKHDsLP2P2MOiscPQIENQep8oU2g2B3jqLyxKKzotZOz4CwQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } + "node_modules/nested-error-stacks": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", + "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==" }, - "node_modules/jest-snapshot": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.4.tgz", - "integrity": "sha512-hnjrvpKGdSMvKfbHyaG5Kul7pDJGZvjVy0CKpzhu28MmAssDXS6GpynhXzgst1wBQoKD8c9b2VS2a5yhDLQRCA==", - "dev": true, + "node_modules/nimma": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/nimma/-/nimma-0.2.3.tgz", + "integrity": "sha512-1ZOI8J+1PKKGceo/5CT5GfQOG6H8I2BencSK06YarZ2wXwH37BSSUWldqJmMJYA5JfqDqffxDXynt6f11AyKcA==", "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/parser": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.0.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^27.0.2", - "jest-get-type": "^27.0.1", - "jest-haste-map": "^27.0.2", - "jest-matcher-utils": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-resolve": "^27.0.4", - "jest-util": "^27.0.2", - "natural-compare": "^1.4.0", - "pretty-format": "^27.0.2", - "semver": "^7.3.2" + "@jsep-plugin/regex": "^1.0.1", + "@jsep-plugin/ternary": "^1.0.2", + "astring": "^1.8.1", + "jsep": "^1.2.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^12.20 || >=14.13" + }, + "optionalDependencies": { + "jsonpath-plus": "^6.0.1 || ^10.1.0", + "lodash.topath": "^4.5.2" } }, - "node_modules/jest-snapshot/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, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { - "color-convert": "^2.0.1" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "4.x || >=6.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, + "node_modules/node-gyp": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" }, - "engines": { - "node": ">=10" + "bin": { + "node-gyp": "bin/node-gyp.js" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": "^12.13 || ^14.13 || >=16" } }, - "node_modules/jest-snapshot/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, + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dependencies": { - "color-name": "~1.1.4" + "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": ">=7.0.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-snapshot/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/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, - "node_modules/jest-snapshot/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/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dependencies": { - "lru-cache": "^6.0.0" + "abbrev": "^1.0.0" }, "bin": { - "semver": "bin/semver.js" + "nopt": "bin/nopt.js" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/jest-snapshot/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, + "node_modules/normalize-package-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", + "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", "dependencies": { - "has-flag": "^4.0.0" + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/jest-util": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.2.tgz", - "integrity": "sha512-1d9uH3a00OFGGWSibpNYr+jojZ6AckOMCXV2Z4K3YXDnzpkAaXQyIpY14FOJPiUmil7CD+A6Qs+lnnh6ctRbIA==", - "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", "dependencies": { - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^3.0.0", - "picomatch": "^2.2.3" + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-install-checks": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", + "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", + "dependencies": { + "semver": "^7.1.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/jest-util/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, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "node_modules/npm-package-arg": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dependencies": { - "color-convert": "^2.0.1" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, + "node_modules/npm-packlist": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", + "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" }, - "engines": { - "node": ">=10" + "bin": { + "npm-packlist": "bin/index.js" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/jest-util/node_modules/color-convert": { + "node_modules/npm-packlist/node_modules/npm-bundled": { "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, + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", + "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", "dependencies": { - "color-name": "~1.1.4" + "npm-normalize-package-bin": "^2.0.0" }, "engines": { - "node": ">=7.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/jest-util/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/npm-packlist/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } }, - "node_modules/jest-util/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, + "node_modules/npm-pick-manifest": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.2.tgz", + "integrity": "sha512-gk37SyRmlIjvTfcYl6RzDbSmS9Y4TOBXfsPnoYqTHARNgWbyDiCSMLUpmALDj4jjcTZpURiEfsSHJj9k7EV4Rw==", + "dependencies": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/jest-util/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==", + "node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", + "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", + "dependencies": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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": { - "has-flag": "^4.0.0" + "path-key": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/jest-validate": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.2.tgz", - "integrity": "sha512-UgBF6/oVu1ofd1XbaSotXKihi8nZhg0Prm8twQ9uCuAfo59vlxCXMPI/RKmrZEVgi3Nd9dS0I8A0wzWU48pOvg==", - "dev": true, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", "dependencies": { - "@jest/types": "^27.0.2", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.0.1", - "leven": "^3.1.0", - "pretty-format": "^27.0.2" + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/jest-validate/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, + "node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", "dependencies": { - "color-convert": "^2.0.1" + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" }, "engines": { - "node": ">=8" + "node": ">= 6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, + "node_modules/nunjucks/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "engines": { - "node": ">=10" + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "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==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-validate/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==", + "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": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-validate/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/jest-validate/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/openapi-sampler": { + "version": "1.0.0-beta.17", + "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.0.0-beta.17.tgz", + "integrity": "sha512-xYGPaPaEQFFAGQVrRpunkb8loNfL1rq4fJ+q7NH+LVBsrHKGUicD2f5Rzw6fWcRwwcOvnKD/aik9guiNWq2kpA==", + "dependencies": { + "json-pointer": "^0.6.0" } }, - "node_modules/jest-validate/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==", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/jest-watcher": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.2.tgz", - "integrity": "sha512-8nuf0PGuTxWj/Ytfw5fyvNn/R80iXY8QhIT0ofyImUvdnoaBdT6kob0GmhXR+wO+ALYVnh8bQxN4Tjfez0JgkA==", - "dev": true, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dependencies": { - "@jest/test-result": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.0.2", - "string-length": "^4.0.1" + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-watcher/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==", + "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": { - "color-convert": "^2.0.1" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "p-limit": "^3.0.2" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-watcher/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, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dependencies": { - "color-name": "~1.1.4" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-watcher/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/jest-watcher/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==", + "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": ">=8" + "node": ">=6" } }, - "node_modules/jest-watcher/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, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "node_modules/pacote": { + "version": "13.6.2", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", + "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", "dependencies": { - "has-flag": "^4.0.0" + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/jest-worker": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", - "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", + "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": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "callsites": "^3.0.0" }, "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/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": ">=6" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, + "node_modules/parse-conflict-json": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-2.0.2.tgz", + "integrity": "sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==", "dependencies": { - "has-flag": "^4.0.0" + "json-parse-even-better-errors": "^2.3.1", + "just-diff": "^5.0.1", + "just-diff-apply": "^5.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/jest/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==", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, + "node_modules/parserapiv1": { + "name": "@asyncapi/parser", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@asyncapi/parser/-/parser-2.1.2.tgz", + "integrity": "sha512-2pHKnr2P8EujcrvZo4x4zNwsEIAg5vb1ZEhl2+OH0YBg8EYH/Xx73XZ+bbwLaYIg1gvFjm29jNB9UL3CMeDU5w==", + "dependencies": { + "@asyncapi/specs": "^5.1.0", + "@openapi-contrib/openapi-schema-to-json-schema": "~3.2.0", + "@stoplight/json": "^3.20.2", + "@stoplight/json-ref-readers": "^1.2.2", + "@stoplight/json-ref-resolver": "^3.1.5", + "@stoplight/spectral-core": "^1.16.1", + "@stoplight/spectral-functions": "^1.7.2", + "@stoplight/spectral-parsers": "^1.0.2", + "@stoplight/spectral-ref-resolver": "^1.0.3", + "@stoplight/types": "^13.12.0", + "@types/json-schema": "^7.0.11", + "@types/urijs": "^1.19.19", + "ajv": "^8.11.0", + "ajv-errors": "^3.0.0", + "ajv-formats": "^2.1.1", + "avsc": "^5.7.5", + "js-yaml": "^4.1.0", + "jsonpath-plus": "^7.2.0", + "node-fetch": "2.6.7" + } + }, + "node_modules/parserapiv1/node_modules/@asyncapi/specs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-5.1.0.tgz", + "integrity": "sha512-yffhETqehkim43luMnPKOwzY0D0YtU4bKpORIXIaid6p5Y5kDLrMGJaEPkNieQp03HMjhjFrnUPtT8kvqe0+aQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "@types/json-schema": "^7.0.11" + } + }, + "node_modules/parserapiv1/node_modules/jsonpath-plus": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", + "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=12.0.0" } }, - "node_modules/jest/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, + "node_modules/parserapiv1/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dependencies": { - "color-name": "~1.1.4" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=7.0.0" + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/jest/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/parserapiv2": { + "name": "@asyncapi/parser", + "version": "3.0.0-next-major-spec.8", + "resolved": "https://registry.npmjs.org/@asyncapi/parser/-/parser-3.0.0-next-major-spec.8.tgz", + "integrity": "sha512-d8ebYM08BCsx3Q4AeLke6naU/NrcAXFEVpS6b3EWcKRdUDce+v0X5k9aDH+YXWCaQApEF28UzcxhlSOJvhIFgQ==", + "dependencies": { + "@asyncapi/specs": "^6.0.0-next-major-spec.9", + "@openapi-contrib/openapi-schema-to-json-schema": "~3.2.0", + "@stoplight/json-ref-resolver": "^3.1.5", + "@stoplight/spectral-core": "^1.16.1", + "@stoplight/spectral-functions": "^1.7.2", + "@stoplight/spectral-parsers": "^1.0.2", + "@types/json-schema": "^7.0.11", + "@types/urijs": "^1.19.19", + "ajv": "^8.11.0", + "ajv-errors": "^3.0.0", + "ajv-formats": "^2.1.1", + "avsc": "^5.7.5", + "js-yaml": "^4.1.0", + "jsonpath-plus": "^7.2.0", + "node-fetch": "2.6.7", + "ramldt2jsonschema": "^1.2.3", + "webapi-parser": "^0.5.0" + } }, - "node_modules/jest/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, + "node_modules/parserapiv2/node_modules/jsonpath-plus": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", + "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", "engines": { - "node": ">=8" + "node": ">=12.0.0" } }, - "node_modules/jest/node_modules/jest-cli": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.4.tgz", - "integrity": "sha512-E0T+/i2lxsWAzV7LKYd0SB7HUAvePqaeIh5vX43/G5jXLhv1VzjYzJAGEkTfvxV774ll9cyE2ljcL73PVMEOXQ==", - "dev": true, + "node_modules/parserapiv2/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dependencies": { - "@jest/core": "^27.0.4", - "@jest/test-result": "^27.0.2", - "@jest/types": "^27.0.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "jest-config": "^27.0.4", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "prompts": "^2.0.1", - "yargs": "^16.0.3" - }, - "bin": { - "jest": "bin/jest.js" + "whatwg-url": "^5.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "4.x || >=6.0.0" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0" + "encoding": "^0.1.0" }, "peerDependenciesMeta": { - "node-notifier": { + "encoding": { "optional": true } } }, - "node_modules/jest/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==", + "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, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", - "dev": true, + "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==", "engines": { - "node": ">= 0.6.0" + "node": ">=0.10.0" } }, - "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/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } }, - "node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "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-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "node_modules/jsdom": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", - "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.5", - "xml-name-validator": "^3.0.0" - }, "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/jsdom/node_modules/acorn": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.0.tgz", - "integrity": "sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w==", + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, - "bin": { - "acorn": "bin/acorn" - }, "engines": { - "node": ">=0.4.0" + "node": ">= 6" } }, - "node_modules/jsdom/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "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": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "find-up": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jsdom/node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "node_modules/pkg-dir/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": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/jsdom/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/pkg-dir/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": ">= 4.0.0" + "node": ">=8" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/pkg-dir/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, - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "p-try": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-pointer": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", - "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", - "dependencies": { - "foreach": "^2.0.4" - } - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "node_modules/json-schema-migrate": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-0.2.0.tgz", - "integrity": "sha1-ukelsAcvxyOWRg4b1gtE1SF4u8Y=", - "dev": true, - "dependencies": { - "ajv": "^5.0.0" - } - }, - "node_modules/json-schema-migrate/node_modules/ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "dependencies": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "node_modules/json-schema-migrate/node_modules/fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "node_modules/json-schema-migrate/node_modules/json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json-stringify-nice": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", - "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "node_modules/json-to-ast": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json-to-ast/-/json-to-ast-2.1.0.tgz", - "integrity": "sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==", - "dev": true, - "dependencies": { - "code-error-fragment": "0.0.230", - "grapheme-splitter": "^1.0.4" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "node_modules/pkg-dir/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": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/just-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-3.1.1.tgz", - "integrity": "sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==", - "dev": true - }, - "node_modules/just-diff-apply": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-3.0.0.tgz", - "integrity": "sha512-K2MLc+ZC2DVxX4V61bIKPeMUUfj1YYZ3h0myhchDXOW1cKoPZMnjIoNCqv9bF2n5Oob1PFxuR2gVJxkxz4e58w==", - "dev": true - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, + "node_modules/pony-cause": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-1.1.1.tgz", + "integrity": "sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g==", "engines": { - "node": ">=6" - } - }, - "node_modules/levenshtein-edit-distance": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/levenshtein-edit-distance/-/levenshtein-edit-distance-2.0.5.tgz", - "integrity": "sha512-Yuraz7QnMX/JENJU1HA6UtdsbhRzoSFnGpVGVryjQgHtl2s/YmVgmNYkVs5yzVZ9aAvQR9wPBUH3lG755ylxGA==", - "dev": true, - "bin": { - "levenshtein-edit-distance": "cli.js" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node": ">=12.0.0" } }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "dependencies": { - "uc.micro": "^1.0.1" + "node": ">= 0.4" } }, - "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, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dependencies": { - "p-locate": "^4.1.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "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.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "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==", + "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.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" + "node": ">= 0.8.0" } }, - "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==", + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, + "node_modules/proc-log": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", "engines": { - "node": ">= 10" - } - }, - "node_modules/makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "dependencies": { - "tmpl": "1.0.x" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/markdown-it": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", - "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", - "dependencies": { - "argparse": "^1.0.7", - "entities": "~2.0.0", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "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/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-db": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", - "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.31", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", - "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", - "dev": true, - "dependencies": { - "mime-db": "1.48.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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/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/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.4.tgz", - "integrity": "sha512-TielGogIzbUEtd1LsjZFs47RWuHHfhl6TiCx1InVxApBAmQ8bL0dL5ilkLGcRvuyW/A9nE+Lvn855Ewz8S0PnQ==", - "dev": true, - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mkdirp-infer-owner": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz", - "integrity": "sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-infer-owner/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/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/ncp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", - "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=", - "dev": true, - "bin": { - "ncp": "bin/ncp" - } - }, - "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "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-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/node-gyp/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", - "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", - "dev": true - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "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-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm-install-checks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", - "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", - "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-install-checks/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "node_modules/npm-package-arg": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", - "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-packlist": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", - "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", - "dev": true, - "dependencies": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-pick-manifest": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", - "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", - "dev": true, - "dependencies": { - "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" - } - }, - "node_modules/npm-pick-manifest/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-registry-fetch": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", - "dev": true, - "dependencies": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "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/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nunjucks": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", - "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", - "dev": true, - "dependencies": { - "a-sync-waterfall": "^1.0.0", - "asap": "^2.0.3", - "commander": "^5.1.0" - }, - "bin": { - "nunjucks-precompile": "bin/precompile" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "chokidar": "^3.3.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/nunjucks/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "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/openapi-sampler": { - "version": "1.0.0-beta.17", - "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.0.0-beta.17.tgz", - "integrity": "sha512-xYGPaPaEQFFAGQVrRpunkb8loNfL1rq4fJ+q7NH+LVBsrHKGUicD2f5Rzw6fWcRwwcOvnKD/aik9guiNWq2kpA==", - "dependencies": { - "json-pointer": "^0.6.0" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-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/pacote": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz", - "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", - "dev": true, - "dependencies": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", - "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pacote/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/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/parse-conflict-json": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-1.1.1.tgz", - "integrity": "sha512-4gySviBiW5TRl7XHvp1agcS7SOe0KZOjC//71dzZVWJrY9hCrgtvl5v3SyIxCZ4fZF47TxD9nfzmxcx76xmbUw==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "just-diff": "^3.0.1", - "just-diff-apply": "^3.0.0" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "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==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "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/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "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.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.2.tgz", - "integrity": "sha512-mXKbbBPnYTG7Yra9qFBtqj+IXcsvxsvOBco3QHxtxTl+hHKq6QdzMZ+q0CtL4ORHZgwGImRr2XZUX2EWzORxig==", - "dev": true, - "dependencies": { - "@jest/types": "^27.0.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pretty-format/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/proc-log": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-1.0.0.tgz", - "integrity": "sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==", - "dev": true - }, - "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/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-all-reject-late": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", - "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-call-limit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.1.tgz", - "integrity": "sha512-3+hgaa19jzCGLuSCbieeRsu5C2joKfYn8pY6JAuXFRVfF4IO+L7UPpFWNTeWT9pM7uhskvbPPd/oEOktCn317Q==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "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/ramldt2jsonschema": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/ramldt2jsonschema/-/ramldt2jsonschema-1.2.3.tgz", - "integrity": "sha512-+wLDAV2NNv9NkfEUOYStaDu/6RYgYXeC1zLtXE+dMU/jDfjpN4iJnBGycDwFTFaIQGosOQhxph7fEX6Mpwxdug==", - "dev": true, - "dependencies": { - "commander": "^5.0.0", - "js-yaml": "^3.14.0", - "json-schema-migrate": "^0.2.0", - "webapi-parser": "^0.5.0" - }, - "bin": { - "dt2js": "bin/dt2js.js", - "js2dt": "bin/js2dt.js" - } - }, - "node_modules/ramldt2jsonschema/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ramldt2jsonschema/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/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/read-cmd-shim": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz", - "integrity": "sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw==", - "dev": true - }, - "node_modules/read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "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/readdir-scoped-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "dev": true, - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/resolve-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", - "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true, - "engines": { - "node": ">= 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": "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/rollup": { - "version": "2.79.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", - "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "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.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/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/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "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/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "node_modules/simple-git": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.16.0.tgz", - "integrity": "sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==", - "dev": true, - "dependencies": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.4" - }, - "funding": { - "type": "github", - "url": "https://github.com/steveukx/git-js?sponsor=1" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.0.0.tgz", - "integrity": "sha512-FIgZbQWlnjVEQvMkylz64/rUggGtrKstPnx8OZyYFG0tAFR8CSBtpXxSwbFLHyeXFn/cunFL7MpuSOvDSOPo9g==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "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/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/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-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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/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/strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/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/supports-hyperlinks/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/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/tar/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/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true - }, - "node_modules/tiny-merge-patch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tiny-merge-patch/-/tiny-merge-patch-0.1.2.tgz", - "integrity": "sha1-Lo3tGcVuoV29OtTtXbHI5a1UTDw=", - "dev": true - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "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/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/treeverse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-1.0.4.tgz", - "integrity": "sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==", - "dev": true - }, - "node_modules/trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "dependencies": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "typescript": ">=2.7" - } - }, - "node_modules/tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", - "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", - "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "dev": true, - "dependencies": { - "builtins": "^1.0.3" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walk": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz", - "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==", - "dev": true, - "dependencies": { - "foreachasync": "^3.0.0" - } - }, - "node_modules/walk-up-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz", - "integrity": "sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==", - "dev": true - }, - "node_modules/walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "dependencies": { - "makeerror": "1.0.x" - } - }, - "node_modules/webapi-parser": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/webapi-parser/-/webapi-parser-0.5.0.tgz", - "integrity": "sha512-fPt6XuMqLSvBz8exwX4QE1UT+pROLHa00EMDCdO0ybICduwQ1V4f7AWX4pNOpCp+x+0FjczEsOxtQU0d8L3QKw==", - "dev": true, - "dependencies": { - "ajv": "6.5.2" - } - }, - "node_modules/webapi-parser/node_modules/ajv": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", - "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.1" - } - }, - "node_modules/webapi-parser/node_modules/fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.6.0.tgz", - "integrity": "sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "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/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "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-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/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "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/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/yaml-ast-parser": { - "version": "0.0.43", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", - "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", - "dev": true - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.0" - } - }, - "@apidevtools/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", - "dev": true, - "requires": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - }, - "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" - } - } - } - }, - "@asyncapi/avro-schema-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@asyncapi/avro-schema-parser/-/avro-schema-parser-1.0.1.tgz", - "integrity": "sha512-j3JWLDkzWARlo2v/olOAgJ1aB9HNsvUUUHPKkx54ZNHUUbyVcDpQhBNSdvm8OBNKVa53QxLoDK7g59jhgUJZ9g==", - "dev": true, - "requires": { - "avsc": "^5.7.3" - } - }, - "@asyncapi/generator": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@asyncapi/generator/-/generator-1.9.4.tgz", - "integrity": "sha512-uMnYcqpKo0UJoYhCJCHdKs27oCMC14y+ESUGjdi/hO6qCUghnKClqj+XwkqW3mRoWF03tPYdEXl/YriuzVzqnQ==", - "dev": true, - "requires": { - "@asyncapi/avro-schema-parser": "^1.0.0", - "@asyncapi/generator-react-sdk": "^0.2.23", - "@asyncapi/openapi-schema-parser": "^2.0.1", - "@asyncapi/parser": "^1.15.0", - "@asyncapi/raml-dt-schema-parser": "^2.0.1", - "@npmcli/arborist": "^2.2.4", - "ajv": "^6.10.2", - "chokidar": "^3.4.0", - "commander": "^6.1.0", - "filenamify": "^4.1.0", - "fs.extra": "^1.3.2", - "global-dirs": "^3.0.0", - "jmespath": "^0.15.0", - "js-yaml": "^3.13.1", - "levenshtein-edit-distance": "^2.0.5", - "loglevel": "^1.6.8", - "markdown-it": "^12.3.2", - "minimatch": "^3.0.4", - "node-fetch": "^2.6.0", - "nunjucks": "^3.2.0", - "resolve-from": "^5.0.0", - "resolve-pkg": "^2.0.0", - "semver": "^7.3.2", - "simple-git": "^3.3.0", - "source-map-support": "^0.5.19", - "ts-node": "^9.1.1", - "typescript": "^4.2.2" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true - }, - "linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - }, - "markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dev": true, - "requires": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@asyncapi/generator-filters": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@asyncapi/generator-filters/-/generator-filters-2.1.0.tgz", - "integrity": "sha512-OZcz8VjivvNvofEunGL+SO5M9Sq8CczNNyuBhdDzAhmdBxRPCswnliDFuHK+ZJ6XA/JgSfx2zN3H2uwzPajIgw==", - "requires": { - "lodash": "^4.17.15", - "markdown-it": "^10.0.0", - "openapi-sampler": "1.0.0-beta.17" - } - }, - "@asyncapi/generator-react-sdk": { - "version": "0.2.23", - "resolved": "https://registry.npmjs.org/@asyncapi/generator-react-sdk/-/generator-react-sdk-0.2.23.tgz", - "integrity": "sha512-q/6yajFzqYyQ/vC2e1gicJ7MZxRGAjYB/to0lo9i5An2MqFquBfuvediocbjoDC8En4pIt/JePgKc+9STnckYA==", - "dev": true, - "requires": { - "@asyncapi/parser": "^1.13.0", - "@babel/core": "7.12.9", - "@babel/preset-env": "^7.12.7", - "@babel/preset-react": "^7.12.7", - "@rollup/plugin-babel": "^5.2.1", - "babel-plugin-source-map-support": "^2.1.3", - "prop-types": "^15.7.2", - "react": "^17.0.1", - "rollup": "^2.60.1", - "source-map-support": "^0.5.19" - }, - "dependencies": { - "@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@asyncapi/openapi-schema-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@asyncapi/openapi-schema-parser/-/openapi-schema-parser-2.0.1.tgz", - "integrity": "sha512-algbtdM1gcAOa8+V8kp7WeBhdaNac82jmZUXx8YjyNfRVo02N2juDrjeBAGJd+FNva9Mb4MM7qfkJoAFpTL5VQ==", - "dev": true, - "requires": { - "@openapi-contrib/openapi-schema-to-json-schema": "^3.0.0" - } - }, - "@asyncapi/parser": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@asyncapi/parser/-/parser-1.15.0.tgz", - "integrity": "sha512-ff4ljaNry0BFvlM1SOSff3jvZyKkiBVJgIOqHcUZtKBAmXxpvsX0nz9pi8fHbg9NrmNyASPCVTCpiDb7Zasreg==", - "dev": true, - "requires": { - "@apidevtools/json-schema-ref-parser": "^9.0.6", - "@asyncapi/specs": "^2.14.0", - "@fmvilas/pseudo-yaml-ast": "^0.3.1", - "ajv": "^6.10.1", - "js-yaml": "^3.13.1", - "json-to-ast": "^2.1.0", - "lodash.clonedeep": "^4.5.0", - "node-fetch": "^2.6.0", - "tiny-merge-patch": "^0.1.2" - } - }, - "@asyncapi/raml-dt-schema-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@asyncapi/raml-dt-schema-parser/-/raml-dt-schema-parser-2.0.1.tgz", - "integrity": "sha512-R7i35IbVbvGyPNm3t5ToPDtYUwDtVjWF/oCgCVPK/wLpNQ0uVZX5Y0JFhO78VUHEep0NKuuI2CZh6oLz0ebMVQ==", - "dev": true, - "requires": { - "js-yaml": "^3.13.1", - "ramldt2jsonschema": "^1.1.0" - } - }, - "@asyncapi/specs": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-2.14.0.tgz", - "integrity": "sha512-hHsYF6XsYNIKb1P2rXaooF4H+uKKQ4b/Ljxrk3rZ3riEDiSxMshMEfb1fUlw9Yj4V4OmJhjXwkNvw8W59AXv1A==", - "dev": true - }, - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "dev": true - }, - "@babel/core": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", - "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.9", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.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.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dev": true, - "requires": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", - "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-member-expression-to-functions": "^7.17.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", - "dev": true, - "requires": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", - "dev": true, - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" - } - }, - "@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" - } - }, - "@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", - "dev": true, - "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" - } - }, - "@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - } - }, - "@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", - "dev": true, - "requires": { - "@babel/types": "^7.25.2" - } - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", - "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "globals": "^11.1.0" - }, - "dependencies": { - "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/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", - "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", - "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", - "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", - "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.17.0" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", - "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", - "dev": true, - "requires": { - "@babel/plugin-transform-react-jsx": "^7.16.7" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", - "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", - "dev": true, - "requires": { - "regenerator-transform": "^0.15.0" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/preset-env": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", - "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.16.7", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.16.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", - "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.16.7", - "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", - "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", - "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", - "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.16.8", - "@babel/plugin-transform-modules-systemjs": "^7.16.7", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", - "@babel/plugin-transform-new-target": "^7.16.7", - "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", - "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.16.7", - "@babel/plugin-transform-reserved-words": "^7.16.7", - "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", - "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", - "@babel/plugin-transform-unicode-escapes": "^7.16.7", - "@babel/plugin-transform-unicode-regex": "^7.16.7", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.8", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.20.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", - "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.16.7", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@babel/plugin-transform-react-pure-annotations": "^7.16.7" - } - }, - "@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - } - } - } - }, - "@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "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" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "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 - } - } - }, - "@fmvilas/pseudo-yaml-ast": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@fmvilas/pseudo-yaml-ast/-/pseudo-yaml-ast-0.3.1.tgz", - "integrity": "sha512-8OAB74W2a9M3k9bjYD8AjVXkX+qO8c0SqNT5HlgOqx7AxSw8xdksEcZp7gFtfi+4njSxT6+76ZR+1ubjAwQHOg==", - "dev": true, - "requires": { - "yaml-ast-parser": "0.0.43" - } - }, - "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@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" - } - }, - "@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 - }, - "@jest/console": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.2.tgz", - "integrity": "sha512-/zYigssuHLImGeMAACkjI4VLAiiJznHgAl3xnFT19iWyct2LhrH3KXOjHRmxBGTkiPLZKKAJAgaPpiU9EZ9K+w==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.0.2", - "jest-util": "^27.0.2", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/core": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.4.tgz", - "integrity": "sha512-+dsmV8VUs1h/Szb+rEWk8xBM1fp1I///uFy9nk3wXGvRsF2lBp8EVPmtWc+QFRb3MY2b7u2HbkGF1fzoDzQTLA==", - "dev": true, - "requires": { - "@jest/console": "^27.0.2", - "@jest/reporters": "^27.0.4", - "@jest/test-result": "^27.0.2", - "@jest/transform": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^27.0.2", - "jest-config": "^27.0.4", - "jest-haste-map": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-regex-util": "^27.0.1", - "jest-resolve": "^27.0.4", - "jest-resolve-dependencies": "^27.0.4", - "jest-runner": "^27.0.4", - "jest-runtime": "^27.0.4", - "jest-snapshot": "^27.0.4", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "jest-watcher": "^27.0.2", - "micromatch": "^4.0.4", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/environment": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.3.tgz", - "integrity": "sha512-pN9m7fbKsop5vc3FOfH8NF7CKKdRbEZzcxfIo1n2TT6ucKWLFq0P6gCJH0GpnQp036++yY9utHOxpeT1WnkWTA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^27.0.3", - "@jest/types": "^27.0.2", - "@types/node": "*", - "jest-mock": "^27.0.3" - } - }, - "@jest/fake-timers": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.3.tgz", - "integrity": "sha512-fQ+UCKRIYKvTCEOyKPnaPnomLATIhMnHC/xPZ7yT1Uldp7yMgMxoYIFidDbpSTgB79+/U+FgfoD30c6wg3IUjA==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "@sinonjs/fake-timers": "^7.0.2", - "@types/node": "*", - "jest-message-util": "^27.0.2", - "jest-mock": "^27.0.3", - "jest-util": "^27.0.2" - } - }, - "@jest/globals": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.3.tgz", - "integrity": "sha512-OzsIuf7uf+QalqAGbjClyezzEcLQkdZ+7PejUrZgDs+okdAK8GwRCGcYCirHvhMBBQh60Jr3NlIGbn/KBPQLEQ==", - "dev": true, - "requires": { - "@jest/environment": "^27.0.3", - "@jest/types": "^27.0.2", - "expect": "^27.0.2" - } - }, - "@jest/reporters": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.4.tgz", - "integrity": "sha512-Xa90Nm3JnV0xCe4M6A10M9WuN9krb+WFKxV1A98Y4ePCw40n++r7uxFUNU7DT1i9Behj7fjrAIju9oU0t1QtCg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.0.2", - "@jest/test-result": "^27.0.2", - "@jest/transform": "^27.0.2", - "@jest/types": "^27.0.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.0.2", - "jest-resolve": "^27.0.4", - "jest-util": "^27.0.2", - "jest-worker": "^27.0.2", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/source-map": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.1.tgz", - "integrity": "sha512-yMgkF0f+6WJtDMdDYNavmqvbHtiSpwRN2U/W+6uztgfqgkq/PXdKPqjBTUF1RD/feth4rH5N3NW0T5+wIuln1A==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.2.tgz", - "integrity": "sha512-gcdWwL3yP5VaIadzwQtbZyZMgpmes8ryBAJp70tuxghiA8qL4imJyZex+i+USQH2H4jeLVVszhwntgdQ97fccA==", - "dev": true, - "requires": { - "@jest/console": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.4.tgz", - "integrity": "sha512-6UFEVwdmxYdyNffBxVVZxmXEdBE4riSddXYSnFNH0ELFQFk/bvagizim8WfgJTqF4EKd+j1yFxvhb8BMHfOjSQ==", - "dev": true, - "requires": { - "@jest/test-result": "^27.0.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.2", - "jest-runtime": "^27.0.4" - } - }, - "@jest/transform": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.2.tgz", - "integrity": "sha512-H8sqKlgtDfVog/s9I4GG2XMbi4Ar7RBxjsKQDUhn2XHAi3NG+GoQwWMER+YfantzExbjNqQvqBHzo/G2pfTiPw==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.0.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.2", - "jest-regex-util": "^27.0.1", - "jest-util": "^27.0.2", - "micromatch": "^4.0.4", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/types": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.2.tgz", - "integrity": "sha512-XpjCtJ/99HB4PmyJ2vgmN7vT+JLP7RW1FBT9RgnMFS4Dt7cvIyBee8O3/j98aUZ34ZpenPZFqmaaObWSeL65dg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "dev": true - }, - "@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "dev": true, - "requires": { - "debug": "^4.1.1" - } - }, - "@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "dev": true - }, - "@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" - } - }, - "@npmcli/arborist": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-2.8.2.tgz", - "integrity": "sha512-6E1XJ0YXBaI9J+25gcTF110MGNx3jv6npr4Rz1U0UAqkuVV7bbDznVJvNqi6F0p8vgrE+Smf9jDTn1DR+7uBjQ==", - "dev": true, - "requires": { - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^1.0.2", - "@npmcli/metavuln-calculator": "^1.1.0", - "@npmcli/move-file": "^1.1.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^1.0.1", - "@npmcli/package-json": "^1.0.1", - "@npmcli/run-script": "^1.8.2", - "bin-links": "^2.2.1", - "cacache": "^15.0.3", - "common-ancestor-path": "^1.0.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "npm-install-checks": "^4.0.0", - "npm-package-arg": "^8.1.5", - "npm-pick-manifest": "^6.1.0", - "npm-registry-fetch": "^11.0.0", - "pacote": "^11.3.5", - "parse-conflict-json": "^1.1.1", - "proc-log": "^1.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "ssri": "^8.0.1", - "treeverse": "^1.0.4", - "walk-up-path": "^1.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@npmcli/git": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", - "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", - "dev": true, - "requires": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", - "dev": true, - "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "@npmcli/map-workspaces": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-1.0.4.tgz", - "integrity": "sha512-wVR8QxhyXsFcD/cORtJwGQodeeaDf0OxcHie8ema4VgFeqwYkFsDPnSrIRSytX8xR6nKPAH89WnwTcaU608b/Q==", - "dev": true, - "requires": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^7.1.6", - "minimatch": "^3.0.4", - "read-package-json-fast": "^2.0.1" - } - }, - "@npmcli/metavuln-calculator": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-1.1.1.tgz", - "integrity": "sha512-9xe+ZZ1iGVaUovBVFI9h3qW+UuECUzhvZPxK9RaEA2mjU26o5D0JloGYWwLYvQELJNmBdQB6rrpuN8jni6LwzQ==", - "dev": true, - "requires": { - "cacache": "^15.0.5", - "pacote": "^11.1.11", - "semver": "^7.3.2" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "@npmcli/name-from-folder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz", - "integrity": "sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==", - "dev": true - }, - "@npmcli/node-gyp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.2.tgz", - "integrity": "sha512-yrJUe6reVMpktcvagumoqD9r08fH1iRo01gn1u0zoCApa9lnZGEigVKUd2hzsCId4gdtkZZIVscLhNxMECKgRg==", - "dev": true - }, - "@npmcli/package-json": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-1.0.1.tgz", - "integrity": "sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==", - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.1" - } - }, - "@npmcli/promise-spawn": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", - "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", - "dev": true, - "requires": { - "infer-owner": "^1.0.4" - } - }, - "@npmcli/run-script": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz", - "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", - "dev": true, - "requires": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" - } - }, - "@openapi-contrib/openapi-schema-to-json-schema": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@openapi-contrib/openapi-schema-to-json-schema/-/openapi-schema-to-json-schema-3.1.1.tgz", - "integrity": "sha512-FMvdhv9Jr9tULjJAQaQzhCmNYYj2vQFVnl7CGlLAImZvJal71oedXMGszpPaZTLftAk5TCHqjnirig+P6LZxug==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@tootallnate/once": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", - "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", - "dev": true - }, - "@types/node": { - "version": "16.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.1.tgz", - "integrity": "sha512-4/Z9DMPKFexZj/Gn3LylFgamNKHm4K3QDi0gz9B26Uk0c8izYf97B5fxfpspMNkWlFupblKM/nV8+NA9Ffvr+w==" - }, - "@types/prettier": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.0.tgz", - "integrity": "sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", - "dev": true - }, - "@types/yargs": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz", - "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "dev": true - }, - "@typescript-eslint/experimental-utils": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.0.tgz", - "integrity": "sha512-9XD9s7mt3QWMk82GoyUpc/Ji03vz4T5AYlHF9DcoFNfJ/y3UAclRsfGiE2gLfXtyC+JRA3trR7cR296TEb1oiQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.28.0", - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/typescript-estree": "4.28.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - } - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.0.tgz", - "integrity": "sha512-eCALCeScs5P/EYjwo6se9bdjtrh8ByWjtHzOkC4Tia6QQWtQr3PHovxh3TdYTuFcurkYI4rmFsRFpucADIkseg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/visitor-keys": "4.28.0" - } - }, - "@typescript-eslint/types": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.0.tgz", - "integrity": "sha512-p16xMNKKoiJCVZY5PW/AfILw2xe1LfruTcfAKBj3a+wgNYP5I9ZEKNDOItoRt53p4EiPV6iRSICy8EPanG9ZVA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.0.tgz", - "integrity": "sha512-m19UQTRtxMzKAm8QxfKpvh6OwQSXaW1CdZPoCaQuLwAq7VZMNuhJmZR4g5281s2ECt658sldnJfdpSZZaxUGMQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/visitor-keys": "4.28.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.0.tgz", - "integrity": "sha512-PjJyTWwrlrvM5jazxYF5ZPs/nl0kHDZMVbuIcbpawVXaDPelp3+S9zpOz5RmVUfS/fD5l5+ZXNKnWhNYjPzCvw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.0", - "eslint-visitor-keys": "^2.0.0" - } - }, - "a-sync-waterfall": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", - "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", - "dev": true - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "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": {} - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.4.tgz", - "integrity": "sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "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" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } - } - }, - "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": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "avsc": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/avsc/-/avsc-5.7.4.tgz", - "integrity": "sha512-z4oo33lmnvvNRqfUe3YjDGGpqu/L2+wXBIhMtwq6oqZ+exOUAkQYM6zd2VWKF7AIlajOF8ZZuPFfryTG9iLC/w==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "babel-jest": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.2.tgz", - "integrity": "sha512-9OThPl3/IQbo4Yul2vMz4FYwILPQak8XelX4YGowygfHaOl5R5gfjm4iVx4d8aUugkW683t8aq0A74E7b5DU1Q==", - "dev": true, - "requires": { - "@jest/transform": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^27.0.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.1.tgz", - "integrity": "sha512-sqBF0owAcCDBVEDtxqfYr2F36eSHdx7lAVGyYuOBRnKdD6gzcy0I0XrAYCZgOA3CRrLhmR+Uae9nogPzmAtOfQ==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1" - } - }, - "babel-plugin-source-map-support": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/babel-plugin-source-map-support/-/babel-plugin-source-map-support-2.1.3.tgz", - "integrity": "sha512-BV5X1sJ6TmL8BUonudz4/9dRaxAJty/MMc6AjwnTLPsdnf6LfVGncDyI/3wDCF/2OA0xXjsWkJHUPrNU5N0EEg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.1.tgz", - "integrity": "sha512-nIBIqCEpuiyhvjQs2mVNwTxQQa2xk70p9Dd/0obQGBf8FBzbnI8QhQKzLsWMN2i6q+5B0OcWDtrboBX5gmOLyA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^27.0.1", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bin-links": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-2.2.1.tgz", - "integrity": "sha512-wFzVTqavpgCCYAh8SVBdnZdiQMxTkGR+T3b14CNpBXIBe2neJWaMGAZ55XWWHELJJ89dscuq0VCBqcVaIOgCMg==", - "dev": true, - "requires": { - "cmd-shim": "^4.0.1", - "mkdirp": "^1.0.3", - "npm-normalize-package-bin": "^1.0.0", - "read-cmd-shim": "^2.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^3.0.3" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "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.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true - }, - "cacache": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", - "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^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" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "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.30001332", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", - "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz", - "integrity": "sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw==", - "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==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "cmd-shim": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-4.1.0.tgz", - "integrity": "sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw==", - "dev": true, - "requires": { - "mkdirp-infer-owner": "^2.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-error-fragment": { - "version": "0.0.230", - "resolved": "https://registry.npmjs.org/code-error-fragment/-/code-error-fragment-0.0.230.tgz", - "integrity": "sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw==", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "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": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true - }, - "common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "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" - } - }, - "core-js-compat": { - "version": "3.22.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.2.tgz", - "integrity": "sha512-Fns9lU06ZJ07pdfmPMu7OnkIKGPKDzXKIiuGlSvHHapwqMUF2QnnsWwtueFZtSyZEilP0o6iUeHQwpn7LxtLUw==", - "dev": true, - "requires": { - "browserslist": "^4.20.2", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "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" - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", - "dev": true - }, - "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.1.tgz", - "integrity": "sha512-XPLijkfJUh/PIBnfkcSHgvD6tlYixmcMAn3osTk6jt+H0v/mgURto1XUiD9DKuGX5NDoVS6dSlA23gd9FUaCFg==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.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" - } - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "electron-to-chromium": { - "version": "1.4.122", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.122.tgz", - "integrity": "sha512-VuLNxTIt8sBWIT2sd186xPd18Y8KcK8myLd9nMdSJOYZwFUxxbLVmX/T1VX+qqaytRlrYYQv39myxJdXtu7Ysw==", - "dev": true - }, - "emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "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==", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "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, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "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 - }, - "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 - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "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" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "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 - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", - "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", - "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" - } - }, - "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" - } - } - } - }, - "eslint-plugin-jest": { - "version": "24.3.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz", - "integrity": "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "^4.0.1" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "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" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "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 - }, - "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" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expect": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.2.tgz", - "integrity": "sha512-YJFNJe2+P2DqH+ZrXy+ydRQYO87oxRUonZImpDodR1G7qo3NYd3pL+NQ9Keqpez3cehczYwZDBC3A7xk3n7M/w==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "ansi-styles": "^5.0.0", - "jest-get-type": "^27.0.1", - "jest-matcher-utils": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-regex-util": "^27.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "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-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "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" - } - }, - "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": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "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" - } - }, - "filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", - "dev": true - }, - "filenamify": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", - "dev": true, - "requires": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, - "foreachasync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", - "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.extra": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fs.extra/-/fs.extra-1.3.2.tgz", - "integrity": "sha1-3QI/kwE77iRTHxszUUw3sg/ZM0k=", - "dev": true, - "requires": { - "fs-extra": "~0.6.1", - "mkdirp": "~0.3.5", - "walk": "^2.3.9" - }, - "dependencies": { - "fs-extra": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.6.4.tgz", - "integrity": "sha1-9G8MdbeEH40gCzNIzU1pHVoJnRU=", - "dev": true, - "requires": { - "jsonfile": "~1.0.1", - "mkdirp": "0.3.x", - "ncp": "~0.4.2", - "rimraf": "~2.2.0" - } - }, - "jsonfile": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-1.0.1.tgz", - "integrity": "sha1-6l7+QLg2kLmGZ2FKc5L8YOhCwN0=", - "dev": true - }, - "mkdirp": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", - "dev": true - }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "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==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "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-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 - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "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" - } - }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "requires": { - "ini": "2.0.0" - }, - "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - } - } - }, - "globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - }, - "dependencies": { - "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 - } - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "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 - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "dependencies": { - "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" - } - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-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-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-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "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-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "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 - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "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" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "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" - }, - "dependencies": { - "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 - } - } - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "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 - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "requires": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "dependencies": { - "jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true - }, - "sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - } - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", - "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", - "dev": true, - "requires": { - "ci-info": "^3.1.1" - } - }, - "is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", - "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-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "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 - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "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.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "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.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.4.tgz", - "integrity": "sha512-Px1iKFooXgGSkk1H8dJxxBIrM3tsc5SIuI4kfKYK2J+4rvCvPGr/cXktxh0e9zIPQ5g09kOMNfHQEmusBUf/ZA==", - "dev": true, - "requires": { - "@jest/core": "^27.0.4", - "import-local": "^3.0.2", - "jest-cli": "^27.0.4" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-cli": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.4.tgz", - "integrity": "sha512-E0T+/i2lxsWAzV7LKYd0SB7HUAvePqaeIh5vX43/G5jXLhv1VzjYzJAGEkTfvxV774ll9cyE2ljcL73PVMEOXQ==", - "dev": true, - "requires": { - "@jest/core": "^27.0.4", - "@jest/test-result": "^27.0.2", - "@jest/types": "^27.0.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "jest-config": "^27.0.4", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "prompts": "^2.0.1", - "yargs": "^16.0.3" - } - }, - "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" - } - } - } - }, - "jest-changed-files": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.2.tgz", - "integrity": "sha512-eMeb1Pn7w7x3wue5/vF73LPCJ7DKQuC9wQUR5ebP9hDPpk5hzcT/3Hmz3Q5BOFpR3tgbmaWhJcMTVgC8Z1NuMw==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "execa": "^5.0.0", - "throat": "^6.0.1" - } - }, - "jest-circus": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.4.tgz", - "integrity": "sha512-QD+eblDiRphta630WRKewuASLs/oY1Zki2G4bccntRvrTHQ63ljwFR5TLduuK4Zg0ZPzW0+8o6AP7KRd1yKOjw==", - "dev": true, - "requires": { - "@jest/environment": "^27.0.3", - "@jest/test-result": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.0.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.0.2", - "jest-matcher-utils": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-runtime": "^27.0.4", - "jest-snapshot": "^27.0.4", - "jest-util": "^27.0.2", - "pretty-format": "^27.0.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-config": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.4.tgz", - "integrity": "sha512-VkQFAHWnPQefdvHU9A+G3H/Z3NrrTKqWpvxgQz3nkUdkDTWeKJE6e//BL+R7z79dXOMVksYgM/z6ndtN0hfChg==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.0.4", - "@jest/types": "^27.0.2", - "babel-jest": "^27.0.2", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "is-ci": "^3.0.0", - "jest-circus": "^27.0.4", - "jest-environment-jsdom": "^27.0.3", - "jest-environment-node": "^27.0.3", - "jest-get-type": "^27.0.1", - "jest-jasmine2": "^27.0.4", - "jest-regex-util": "^27.0.1", - "jest-resolve": "^27.0.4", - "jest-runner": "^27.0.4", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "micromatch": "^4.0.4", - "pretty-format": "^27.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-diff": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.2.tgz", - "integrity": "sha512-BFIdRb0LqfV1hBt8crQmw6gGQHVDhM87SpMIZ45FPYKReZYG5er1+5pIn2zKqvrJp6WNox0ylR8571Iwk2Dmgw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.0.1", - "jest-get-type": "^27.0.1", - "pretty-format": "^27.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-docblock": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.1.tgz", - "integrity": "sha512-TA4+21s3oebURc7VgFV4r7ltdIJ5rtBH1E3Tbovcg7AV+oLfD5DcJ2V2vJ5zFA9sL5CFd/d2D6IpsAeSheEdrA==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.2.tgz", - "integrity": "sha512-OLMBZBZ6JkoXgUenDtseFRWA43wVl2BwmZYIWQws7eS7pqsIvePqj/jJmEnfq91ALk3LNphgwNK/PRFBYi7ITQ==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "chalk": "^4.0.0", - "jest-get-type": "^27.0.1", - "jest-util": "^27.0.2", - "pretty-format": "^27.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-jsdom": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.3.tgz", - "integrity": "sha512-5KLmgv1bhiimpSA8oGTnZYk6g4fsNyZiA/6gI2tAZUgrufd7heRUSVh4gRokzZVEj8zlwAQYT0Zs6tuJSW/ECA==", - "dev": true, - "requires": { - "@jest/environment": "^27.0.3", - "@jest/fake-timers": "^27.0.3", - "@jest/types": "^27.0.2", - "@types/node": "*", - "jest-mock": "^27.0.3", - "jest-util": "^27.0.2", - "jsdom": "^16.6.0" - } - }, - "jest-environment-node": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.3.tgz", - "integrity": "sha512-co2/IVnIFL3cItpFULCvXFg9us4gvWXgs7mutAMPCbFhcqh56QAOdKhNzC2+RycsC/k4mbMj1VF+9F/NzA0ROg==", - "dev": true, - "requires": { - "@jest/environment": "^27.0.3", - "@jest/fake-timers": "^27.0.3", - "@jest/types": "^27.0.2", - "@types/node": "*", - "jest-mock": "^27.0.3", - "jest-util": "^27.0.2" - } - }, - "jest-get-type": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.1.tgz", - "integrity": "sha512-9Tggo9zZbu0sHKebiAijyt1NM77Z0uO4tuWOxUCujAiSeXv30Vb5D4xVF4UR4YWNapcftj+PbByU54lKD7/xMg==", - "dev": true - }, - "jest-haste-map": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.2.tgz", - "integrity": "sha512-37gYfrYjjhEfk37C4bCMWAC0oPBxDpG0qpl8lYg8BT//wf353YT/fzgA7+Dq0EtM7rPFS3JEcMsxdtDwNMi2cA==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^27.0.1", - "jest-serializer": "^27.0.1", - "jest-util": "^27.0.2", - "jest-worker": "^27.0.2", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.4.tgz", - "integrity": "sha512-yj3WrjjquZwkJw+eA4c9yucHw4/+EHndHWSqgHbHGQfT94ihaaQsa009j1a0puU8CNxPDk0c1oAPeOpdJUElwA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.0.3", - "@jest/source-map": "^27.0.1", - "@jest/test-result": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.0.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.0.2", - "jest-matcher-utils": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-runtime": "^27.0.4", - "jest-snapshot": "^27.0.4", - "jest-util": "^27.0.2", - "pretty-format": "^27.0.2", - "throat": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-leak-detector": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.2.tgz", - "integrity": "sha512-TZA3DmCOfe8YZFIMD1GxFqXUkQnIoOGQyy4hFCA2mlHtnAaf+FeOMxi0fZmfB41ZL+QbFG6BVaZF5IeFIVy53Q==", - "dev": true, - "requires": { - "jest-get-type": "^27.0.1", - "pretty-format": "^27.0.2" - } - }, - "jest-matcher-utils": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.2.tgz", - "integrity": "sha512-Qczi5xnTNjkhcIB0Yy75Txt+Ez51xdhOxsukN7awzq2auZQGPHcQrJ623PZj0ECDEMOk2soxWx05EXdXGd1CbA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.0.2", - "jest-get-type": "^27.0.1", - "pretty-format": "^27.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-message-util": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.2.tgz", - "integrity": "sha512-rTqWUX42ec2LdMkoUPOzrEd1Tcm+R1KfLOmFK+OVNo4MnLsEaxO5zPDb2BbdSmthdM/IfXxOZU60P/WbWF8BTw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.0.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "pretty-format": "^27.0.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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" - } - } - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - } - } - }, - "jest-mock": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.3.tgz", - "integrity": "sha512-O5FZn5XDzEp+Xg28mUz4ovVcdwBBPfAhW9+zJLO0Efn2qNbYcDaJvSlRiQ6BCZUCVOJjALicuJQI9mRFjv1o9Q==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.1.tgz", - "integrity": "sha512-6nY6QVcpTgEKQy1L41P4pr3aOddneK17kn3HJw6SdwGiKfgCGTvH02hVXL0GU8GEKtPH83eD2DIDgxHXOxVohQ==", - "dev": true - }, - "jest-resolve": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.4.tgz", - "integrity": "sha512-BcfyK2i3cG79PDb/6gB6zFeFQlcqLsQjGBqznFCpA0L/3l1L/oOsltdUjs5eISAWA9HS9qtj8v2PSZr/yWxONQ==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "chalk": "^4.0.0", - "escalade": "^3.1.1", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "resolve": "^1.20.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "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" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.4.tgz", - "integrity": "sha512-F33UPfw1YGWCV2uxJl7wD6TvcQn5IC0LtguwY3r4L7R6H4twpLkp5Q2ZfzRx9A2I3G8feiy0O0sqcn/Qoym71A==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "jest-regex-util": "^27.0.1", - "jest-snapshot": "^27.0.4" - } - }, - "jest-runner": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.4.tgz", - "integrity": "sha512-NfmvSYLCsCJk2AG8Ar2NAh4PhsJJpO+/r+g4bKR5L/5jFzx/indUpnVBdrfDvuqhGLLAvrKJ9FM/Nt8o1dsqxg==", - "dev": true, - "requires": { - "@jest/console": "^27.0.2", - "@jest/environment": "^27.0.3", - "@jest/test-result": "^27.0.2", - "@jest/transform": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-docblock": "^27.0.1", - "jest-environment-jsdom": "^27.0.3", - "jest-environment-node": "^27.0.3", - "jest-haste-map": "^27.0.2", - "jest-leak-detector": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-resolve": "^27.0.4", - "jest-runtime": "^27.0.4", - "jest-util": "^27.0.2", - "jest-worker": "^27.0.2", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-runtime": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.4.tgz", - "integrity": "sha512-voJB4xbAjS/qYPboV+e+gmg3jfvHJJY4CagFWBOM9dQKtlaiTjcpD2tWwla84Z7PtXSQPeIpXY0qksA9Dum29A==", - "dev": true, - "requires": { - "@jest/console": "^27.0.2", - "@jest/environment": "^27.0.3", - "@jest/fake-timers": "^27.0.3", - "@jest/globals": "^27.0.3", - "@jest/source-map": "^27.0.1", - "@jest/test-result": "^27.0.2", - "@jest/transform": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-mock": "^27.0.3", - "jest-regex-util": "^27.0.1", - "jest-resolve": "^27.0.4", - "jest-snapshot": "^27.0.4", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^16.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "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 - }, - "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" - } - } - } - }, - "jest-serializer": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.1.tgz", - "integrity": "sha512-svy//5IH6bfQvAbkAEg1s7xhhgHTtXu0li0I2fdKHDsLP2P2MOiscPQIENQep8oU2g2B3jqLyxKKzotZOz4CwQ==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "27.0.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.4.tgz", - "integrity": "sha512-hnjrvpKGdSMvKfbHyaG5Kul7pDJGZvjVy0CKpzhu28MmAssDXS6GpynhXzgst1wBQoKD8c9b2VS2a5yhDLQRCA==", - "dev": true, - "requires": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/parser": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.0.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^27.0.2", - "jest-get-type": "^27.0.1", - "jest-haste-map": "^27.0.2", - "jest-matcher-utils": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-resolve": "^27.0.4", - "jest-util": "^27.0.2", - "natural-compare": "^1.4.0", - "pretty-format": "^27.0.2", - "semver": "^7.3.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "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" - } - } - } - }, - "jest-util": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.2.tgz", - "integrity": "sha512-1d9uH3a00OFGGWSibpNYr+jojZ6AckOMCXV2Z4K3YXDnzpkAaXQyIpY14FOJPiUmil7CD+A6Qs+lnnh6ctRbIA==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^3.0.0", - "picomatch": "^2.2.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-validate": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.2.tgz", - "integrity": "sha512-UgBF6/oVu1ofd1XbaSotXKihi8nZhg0Prm8twQ9uCuAfo59vlxCXMPI/RKmrZEVgi3Nd9dS0I8A0wzWU48pOvg==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.0.1", - "leven": "^3.1.0", - "pretty-format": "^27.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watcher": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.2.tgz", - "integrity": "sha512-8nuf0PGuTxWj/Ytfw5fyvNn/R80iXY8QhIT0ofyImUvdnoaBdT6kob0GmhXR+wO+ALYVnh8bQxN4Tjfez0JgkA==", - "dev": true, - "requires": { - "@jest/test-result": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.0.2", - "string-length": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-worker": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", - "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.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": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", - "dev": true - }, - "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.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", - "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.5", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.0.tgz", - "integrity": "sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w==", - "dev": true - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-pointer": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", - "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", - "requires": { - "foreach": "^2.0.4" - } - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "json-schema-migrate": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-0.2.0.tgz", - "integrity": "sha1-ukelsAcvxyOWRg4b1gtE1SF4u8Y=", - "dev": true, - "requires": { - "ajv": "^5.0.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "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": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-nice": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", - "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json-to-ast": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json-to-ast/-/json-to-ast-2.1.0.tgz", - "integrity": "sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==", - "dev": true, - "requires": { - "code-error-fragment": "0.0.230", - "grapheme-splitter": "^1.0.4" - } - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "just-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-3.1.1.tgz", - "integrity": "sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==", - "dev": true - }, - "just-diff-apply": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-3.0.0.tgz", - "integrity": "sha512-K2MLc+ZC2DVxX4V61bIKPeMUUfj1YYZ3h0myhchDXOW1cKoPZMnjIoNCqv9bF2n5Oob1PFxuR2gVJxkxz4e58w==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levenshtein-edit-distance": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/levenshtein-edit-distance/-/levenshtein-edit-distance-2.0.5.tgz", - "integrity": "sha512-Yuraz7QnMX/JENJU1HA6UtdsbhRzoSFnGpVGVryjQgHtl2s/YmVgmNYkVs5yzVZ9aAvQR9wPBUH3lG755ylxGA==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "requires": { - "uc.micro": "^1.0.1" - } - }, - "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==" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "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.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "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.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "dev": true, - "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.x" - } - }, - "markdown-it": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", - "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", - "requires": { - "argparse": "^1.0.7", - "entities": "~2.0.0", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "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 - }, - "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-db": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", - "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.31", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", - "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", - "dev": true, - "requires": { - "mime-db": "1.48.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.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" - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.4.tgz", - "integrity": "sha512-TielGogIzbUEtd1LsjZFs47RWuHHfhl6TiCx1InVxApBAmQ8bL0dL5ilkLGcRvuyW/A9nE+Lvn855Ewz8S0PnQ==", - "dev": true, - "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp-infer-owner": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz", - "integrity": "sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "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==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "ncp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", - "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "node-releases": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", - "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", - "dev": true - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "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-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-install-checks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", - "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", - "dev": true, - "requires": { - "semver": "^7.1.1" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "npm-package-arg": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", - "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "npm-packlist": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", - "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", - "dev": true, - "requires": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-pick-manifest": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", - "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", - "dev": true, - "requires": { - "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "npm-registry-fetch": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", - "dev": true, - "requires": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" - } - }, - "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" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nunjucks": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", - "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", - "dev": true, - "requires": { - "a-sync-waterfall": "^1.0.0", - "asap": "^2.0.3", - "commander": "^5.1.0" - }, - "dependencies": { - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - } - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "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" - } - }, - "openapi-sampler": { - "version": "1.0.0-beta.17", - "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.0.0-beta.17.tgz", - "integrity": "sha512-xYGPaPaEQFFAGQVrRpunkb8loNfL1rq4fJ+q7NH+LVBsrHKGUicD2f5Rzw6fWcRwwcOvnKD/aik9guiNWq2kpA==", - "requires": { - "json-pointer": "^0.6.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "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-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 - }, - "pacote": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz", - "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", - "dev": true, - "requires": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", - "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "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" - } - }, - "parse-conflict-json": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-1.1.1.tgz", - "integrity": "sha512-4gySviBiW5TRl7XHvp1agcS7SOe0KZOjC//71dzZVWJrY9hCrgtvl5v3SyIxCZ4fZF47TxD9nfzmxcx76xmbUw==", - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.0", - "just-diff": "^3.0.1", - "just-diff-apply": "^3.0.0" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "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 - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "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.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "pretty-format": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.2.tgz", - "integrity": "sha512-mXKbbBPnYTG7Yra9qFBtqj+IXcsvxsvOBco3QHxtxTl+hHKq6QdzMZ+q0CtL4ORHZgwGImRr2XZUX2EWzORxig==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - } - } - }, - "proc-log": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-1.0.0.tgz", - "integrity": "sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==", - "dev": true - }, - "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 - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-all-reject-late": { + "node_modules/promise-all-reject-late": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", - "dev": true + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "promise-call-limit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.1.tgz", - "integrity": "sha512-3+hgaa19jzCGLuSCbieeRsu5C2joKfYn8pY6JAuXFRVfF4IO+L7UPpFWNTeWT9pM7uhskvbPPd/oEOktCn317Q==", - "dev": true + "node_modules/promise-call-limit": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz", + "integrity": "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "promise-inflight": { + "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" }, - "promise-retry": { + "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "requires": { + "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" } }, - "prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, - "requires": { + "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" } }, - "prop-types": { + "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "requires": { + "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "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" + } }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] }, - "queue-microtask": { + "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 + "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" + } + ] }, - "ramldt2jsonschema": { + "node_modules/ramldt2jsonschema": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/ramldt2jsonschema/-/ramldt2jsonschema-1.2.3.tgz", "integrity": "sha512-+wLDAV2NNv9NkfEUOYStaDu/6RYgYXeC1zLtXE+dMU/jDfjpN4iJnBGycDwFTFaIQGosOQhxph7fEX6Mpwxdug==", - "dev": true, - "requires": { + "dependencies": { "commander": "^5.0.0", "js-yaml": "^3.14.0", "json-schema-migrate": "^0.2.0", "webapi-parser": "^0.5.0" }, + "bin": { + "dt2js": "bin/dt2js.js", + "js2dt": "bin/js2dt.js" + } + }, + "node_modules/ramldt2jsonschema/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "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" - } - } + "sprintf-js": "~1.0.2" } }, - "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "node_modules/ramldt2jsonschema/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" } }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true + "node_modules/ramldt2jsonschema/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==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, - "read-cmd-shim": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz", - "integrity": "sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw==", + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, - "read-package-json-fast": { + "node_modules/read-cmd-shim": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-3.0.1.tgz", + "integrity": "sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/read-package-json": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", + "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", + "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", + "dependencies": { + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/read-package-json-fast": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", - "dev": true, - "requires": { + "dependencies": { "json-parse-even-better-errors": "^2.3.0", "npm-normalize-package-bin": "^1.0.1" + }, + "engines": { + "node": ">=10" } }, - "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" + "node_modules/read-package-json/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "readdir-scoped-modules": { + "node_modules/readdir-scoped-modules": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "dev": true, - "requires": { + "deprecated": "This functionality has been moved to @npmcli/fs", + "dependencies": { "debuglog": "^1.0.1", "dezalgo": "^1.0.0", "graceful-fs": "^4.1.2", "once": "^1.3.0" } }, - "readdirp": { + "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { + "dependencies": { "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "regenerate": { + "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, - "regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, - "requires": { + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dependencies": { "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" } }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", - "dev": true, - "requires": { + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" } }, - "regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==" }, - "regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" } }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requireg": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", + "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", + "dependencies": { + "nested-error-stacks": "~2.0.1", + "rc": "~1.2.7", + "resolve": "~1.7.1" + }, + "engines": { + "node": ">= 4.0.0" + } }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true + "node_modules/requireg/node_modules/resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "dependencies": { + "path-parse": "^1.0.5" + } }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-cwd": { + "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "requires": { + "dependencies": { "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "resolve-from": { + "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" + } }, - "resolve-pkg": { + "node_modules/resolve-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", - "dev": true, - "requires": { + "dependencies": { "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "engines": { + "node": ">=10" } }, - "retry": { + "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "engines": { + "node": ">= 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 + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "rimraf": { + "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, - "requires": { + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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" } }, - "rollup": { + "node_modules/rollup": { "version": "2.79.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", - "dev": true, - "requires": { + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { "fsevents": "~2.3.2" } }, - "run-parallel": { + "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, - "requires": { + "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" } }, - "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/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", + "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==" }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "optional": true }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "set-blocking": { + "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } }, - "shebang-command": { + "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { + "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "engines": { + "node": ">=8" + } }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "simple-git": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.16.0.tgz", - "integrity": "sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==", - "dev": true, - "requires": { + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/simple-eval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-eval/-/simple-eval-1.0.1.tgz", + "integrity": "sha512-LH7FpTAkeD+y5xQC4fzS+tFtaNlvt3Ib1zKzvhjv/Y+cioV4zIuw4IZr2yhRLu67CWL7FR9/6KXKnjRoZTvGGQ==", + "dependencies": { + "jsep": "^1.3.6" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/simple-git": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.28.0.tgz", + "integrity": "sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==", + "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.4" + "debug": "^4.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" } }, - "sisteransi": { + "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "engines": { + "node": ">=8" } }, - "smart-buffer": { + "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } }, - "socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", - "dev": true, - "requires": { - "ip-address": "^9.0.5", + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dependencies": { + "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "socks-proxy-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.0.0.tgz", - "integrity": "sha512-FIgZbQWlnjVEQvMkylz64/rUggGtrKstPnx8OZyYFG0tAFR8CSBtpXxSwbFLHyeXFn/cunFL7MpuSOvDSOPo9g==", - "dev": true, - "requires": { + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dependencies": { "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "debug": "^4.3.3", + "socks": "^2.6.2" }, - "dependencies": { - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - } + "engines": { + "node": ">= 10" } }, - "source-map": { + "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" + } }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "sprintf-js": { + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==" + }, + "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "requires": { + "node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dependencies": { "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "requires": { + "dependencies": { "escape-string-regexp": "^2.0.0" }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } + "engines": { + "node": ">=10" } }, - "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==", + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "requires": { - "safe-buffer": "~5.1.0" + "engines": { + "node": ">=8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" } }, - "string-length": { + "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "requires": { + "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" } }, - "string-width": { + "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { + "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-cjs": { + "name": "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.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "strip-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==", - "dev": true, - "requires": { + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "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/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" } }, - "strip-final-newline": { + "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 - }, - "strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", "dev": true, - "requires": { - "escape-string-regexp": "^1.0.2" + "engines": { + "node": ">=6" } }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, - "requires": { - "has-flag": "^3.0.0" + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "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, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "engines": { + "node": ">=8" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", "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" - } - } + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true + "node_modules/strip-outer/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==", + "engines": { + "node": ">=0.8.0" + } }, - "table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, "dependencies": { - "ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "requires": { + "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/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } + "engines": { + "node": ">=10" } }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" } }, - "test-exclude": { + "node_modules/tar/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/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" + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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" } }, - "text-table": { + "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "tiny-merge-patch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tiny-merge-patch/-/tiny-merge-patch-0.1.2.tgz", - "integrity": "sha1-Lo3tGcVuoV29OtTtXbHI5a1UTDw=", - "dev": true - }, - "tmpl": { + "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" + "node_modules/treeverse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-2.0.0.tgz", + "integrity": "sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A==", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "treeverse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-1.0.4.tgz", - "integrity": "sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==", - "dev": true - }, - "trim-repeated": { + "node_modules/trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", - "dev": true, - "requires": { + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dependencies": { "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/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==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-jest": { + "version": "29.4.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.1.tgz", + "integrity": "sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==", + "dev": true, + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.2", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } } }, - "ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, - "requires": { + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.17", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", - "dev": true + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "tsutils": { + "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, - "requires": { + "dependencies": { "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "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, - "requires": { - "prelude-ls": "~1.1.2" + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "type-detect": { + "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "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==", + "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, - "requires": { - "is-typedarray": "^1.0.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "typescript": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", - "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", - "dev": true + "node_modules/type-of-is": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/type-of-is/-/type-of-is-3.5.1.tgz", + "integrity": "sha512-SOnx8xygcAh8lvDU2exnK2bomASfNjzB3Qz71s2tw9QnX8fkAo7aC+D0H7FV0HjRKj94CKV2Hi71kVkkO6nOxg==", + "engines": { + "node": ">=0.10.5" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } }, - "uc.micro": { + "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==" }, - "unicode-match-property-ecmascript": { + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { + "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "engines": { + "node": ">=4" + } }, - "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" + "node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { + "node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dependencies": { "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "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==", + "dependencies": { "punycode": "^2.1.0" } }, - "util-deprecate": { + "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==" + }, + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "engines": { + "node": ">= 4" + } }, - "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", - "dev": true + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" }, - "v8-to-istanbul": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", - "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, - "requires": { + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" + "convert-source-map": "^2.0.0" }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "dev": true, - "requires": { - "builtins": "^1.0.3" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "engines": { + "node": ">=10.12.0" } }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" + "node_modules/validate-npm-package-name": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "walk": { + "node_modules/walk": { "version": "2.3.15", "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz", "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==", - "dev": true, - "requires": { + "dependencies": { "foreachasync": "^3.0.0" } }, - "walk-up-path": { + "node_modules/walk-up-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz", - "integrity": "sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==", - "dev": true + "integrity": "sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==" }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "requires": { - "makeerror": "1.0.x" + "dependencies": { + "makeerror": "1.0.12" } }, - "webapi-parser": { + "node_modules/webapi-parser": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/webapi-parser/-/webapi-parser-0.5.0.tgz", "integrity": "sha512-fPt6XuMqLSvBz8exwX4QE1UT+pROLHa00EMDCdO0ybICduwQ1V4f7AWX4pNOpCp+x+0FjczEsOxtQU0d8L3QKw==", - "dev": true, - "requires": { + "dependencies": { "ajv": "6.5.2" - }, + } + }, + "node_modules/webapi-parser/node_modules/ajv": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", + "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", "dependencies": { - "ajv": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", - "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.1" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - } + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" } }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true + "node_modules/webapi-parser/node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==" }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } + "node_modules/webapi-parser/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==" }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true + "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==" }, - "whatwg-url": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.6.0.tgz", - "integrity": "sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" + "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==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, - "which": { + "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, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, - "wrap-ansi": { + "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==", "dev": true, - "requires": { + "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-cjs": { + "name": "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": { - "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" - } - }, - "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 - } + "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" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "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": { + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dependencies": { "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "requires": {} - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "y18n": { + "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "yaml-ast-parser": { - "version": "0.0.43", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", - "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", - "dev": true + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "requires": { - "cliui": "^7.0.2", + "dependencies": { + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" } }, - "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==", - "dev": true + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } }, - "yn": { + "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true + "engines": { + "node": ">=6" + } + }, + "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" + } } } } diff --git a/package.json b/package.json index 2812f303..9c6a583b 100644 --- a/package.json +++ b/package.json @@ -19,27 +19,46 @@ "generator", "java", "spring", - "template" + "template", + "react", + "javascript" ], "publishConfig": { "access": "public" }, - "author": "Michael Davis ", + "author": "Giri Venkatesan", "license": "Apache-2.0", "dependencies": { + "@asyncapi/generator": "^2.7.0", "@asyncapi/generator-filters": "^2.1.0", - "@types/node": "^16.7.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.15" + "@asyncapi/generator-hooks": "^0.1.0", + "@asyncapi/generator-react-sdk": "^1.1.2", + "filenamify": "^4.3.0", + "generate-schema": "^2.6.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "react": "^18.0.0" }, "devDependencies": { - "@asyncapi/generator": "^1.9.4", - "eslint": "^7.32.0", - "eslint-plugin-jest": "^24.3.6", - "jest": "^27.0.4" + "@asyncapi/parser": "^3.1.0", + "@testing-library/jest-dom": "^6.6.3", + "@types/jest": "^29.0.0", + "@types/js-yaml": "^4.0.9", + "@types/lodash": "^4.14.200", + "@types/react": "^18.0.0", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "eslint": "^8.0.0", + "eslint-plugin-jest": "^27.0.0", + "jest": "^29.0.0", + "ts-jest": "^29.0.0", + "typescript": "^5.0.0" }, "generator": { - "generator": ">=1.8.6 <=2.3.0", + "renderer": "react", + "apiVersion": "v3", + "generator": ">=2.0.0 <=3.3.0", + "entrypoint": "template/index.js", "parameters": { "actuator": { "description": "If present, it adds the dependencies for spring-boot-starter-web, spring-boot-starter-actuator and micrometer-registry-prometheus.", @@ -74,7 +93,7 @@ "host": { "description": "The host connection property. Currently this only works with the Solace binder. Example: tcp://myhost.com:55555.", "required": false, - "default": "tcp://localhost:55555" + "default": "tcp://localhost:55554" }, "javaPackage": { "description": "The Java package of the generated classes. Alternatively you can set the specification extension info.x-java-package", @@ -103,20 +122,30 @@ "solaceSpringCloudVersion": { "description": "The version of the solace-spring-cloud-bom dependency used when generating an application. Alternatively you can set the specification extension info.x-solace-spring-cloud-version.", "required": false, - "default": "2.1.0" + "default": "4.8.0" + }, + "kafkaSpringCloudVersion": { + "description": "The version of the spring-cloud-stream-binder-kafka dependency used when generating an application with Kafka binder.", + "required": false, + "default": "4.2.0" + }, + "rabbitSpringCloudVersion": { + "description": "The version of the spring-cloud-stream-binder-rabbit dependency used when generating an application with RabbitMQ binder.", + "required": false, + "default": "4.2.0" }, "springBootVersion": { - "description": "The version of Spring Boot used when generating an application. Alternatively you can set the specification extension info.x-spring-booot-version. Example: 2.2.6.RELEASE.", + "description": "The version of Spring Boot used when generating an application. Alternatively you can set the specification extension info.x-spring-boot-version. Example: 3.3.11.", "required": false, - "default": "2.4.7" + "default": "3.4.4" }, "springCloudVersion": { "description": "The version of the spring-cloud-dependencies BOM dependency used when generating an application. Alternatively you can set the specification extension info.x-spring-cloud-version. Example: Hoxton.RELEASE.", "required": false, - "default": "2020.0.3" + "default": "2024.0.0" }, "springCloudStreamVersion": { - "description": "The version of the spring-cloud-stream dependency specified in the Maven file, when generating a library. When generating an application, the spring-cloud-dependencies BOM is used instead. Example: 3.0.1.RELEASE", + "description": "The version of the spring-cloud-stream dependency specified in the Maven file, when generating an application. When generating an application, the spring-cloud-dependencies BOM is used instead. Example: 3.0.1.RELEASE", "required": false, "default": "3.1.3" }, @@ -132,11 +161,38 @@ }, "useServers": { "description": "This option works when binder is kafka. By default it is set to false. When set to true, it will concatenate all the urls in the servers section as a list of brokers for kafka.", - "required": false + "required": false, + "default": false + }, + "kafkaBrokers": { + "description": "Comma-separated list of Kafka broker addresses. Example: localhost:9092,localhost:9093", + "required": false, + "default": "localhost:9092" + }, + "rabbitHost": { + "description": "RabbitMQ host address", + "required": false, + "default": "localhost" + }, + "rabbitPort": { + "description": "RabbitMQ port number", + "required": false, + "default": "5672" + }, + "rabbitUsername": { + "description": "RabbitMQ username", + "required": false, + "default": "guest" + }, + "rabbitPassword": { + "description": "RabbitMQ password", + "required": false, + "default": "guest" } }, "filters": [ "@asyncapi/generator-filters" ] - } + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/partials/all-args-constructor b/partials/all-args-constructor deleted file mode 100644 index e0ee40d5..00000000 --- a/partials/all-args-constructor +++ /dev/null @@ -1,30 +0,0 @@ -{%- macro allArgsConstructor(className, properties, indentLevel) -%} -{% set indent1 = indentLevel | indent1 -%} -{% set indent2 = indentLevel | indent2 -%} -{% set indent3 = indentLevel | indent3 -%} -{% set first = true -%} -{%- set hasNoProperties = properties | isEmpty -%} -{%- if not hasNoProperties -%} -{{ indent2 }}public {{ className }} ( -{%- for name, prop in properties -%} -{%- set propModelClass = {schema: prop, schemaName: name} | getModelClass %} -{%- set realClassName = propModelClass.getClassName() %} -{%- set variableName = realClassName | identifierName %} -{%- set typeInfo = [name, realClassName, prop] | fixType %} -{%- set type = typeInfo[0] -%} -{%- if first -%} -{%- set first = false -%} -{%- else -%} -, {% endif %} -{{ indent3 }}{{ type }} {{ variableName }} -{%- endfor -%} -) { -{% for name, prop in properties -%} -{%- set propModelClass = {schema: prop, schemaName: name} | getModelClass %} -{%- set realClassName = propModelClass.getClassName() %} -{%- set variableName = realClassName | identifierName -%} -{{ indent3 }}this.{{ variableName }} = {{ variableName }}; -{% endfor -%} -{{ indent2 }}} -{%- endif -%} -{% endmacro %} \ No newline at end of file diff --git a/partials/java-class b/partials/java-class deleted file mode 100644 index ba5e968f..00000000 --- a/partials/java-class +++ /dev/null @@ -1,90 +0,0 @@ -{% from "partials/all-args-constructor" import allArgsConstructor -%} -{%- macro javaClass(schemaName, schema, properties, indentLevel, isStatic) %} -{%- set modelClass = {schema: schema, schemaName: schemaName} | getModelClass %} -{%- set schemaForRef = schemaName | getAnonymousSchemaForRef %} -{% if schemaForRef %} -{% set schema = schemaForRef %} -{% set properties = schemaForRef.properties() %} -{% endif %} -{%- if modelClass %} -{%- set className = modelClass.getClassName() %} -{{ 'javaClass' | logJavaClass -}} -{{ className | logJavaClass -}} -{% set indent1 = indentLevel | indent1 -%} -{% set indent2 = indentLevel | indent2 -%} -{% set indent3 = indentLevel | indent3 -%} -{{ indent1 }}@JsonInclude(JsonInclude.Include.NON_NULL) -{{ indent1 }}public {% if isStatic %}static {% endif %}class {{ className }} -{%- if modelClass.isSubClass() %} extends {{ modelClass.getSuperClassName() }}{% endif %} { -{# Default constructor #} -{{ indent2 }}public {{ className }} () { -{{ indent2 }}} -{# If the top level object is an array, we need to deal with that specially. -#} -{%- if schema and schema.type() === 'array' -%} -{{ allArgsConstructor(className, schema.items().properties(), indentLevel) }} -{{ javaClass(type, null, schema.items().properties(), indentLevel+1, true) }} -{%- else -%} {# not an array at the top level. #} -{{ allArgsConstructor(className, properties, indentLevel) }} -{% endif -%} -{# Members #} -{%- for name, prop in properties %} -{%- set propModelClass = {schema: prop, schemaName: name} | getModelClass %} -{%- set realClassName = propModelClass.getClassName() %} -{%- set variableName = realClassName | identifierName -%} -{%- set typeInfo = [realClassName, realClassName, prop] | fixType -%} -{%- set type = typeInfo[0] %} -{% if variableName !== name -%} -{{ indent2 }}@JsonProperty("{{name}}") -{% endif -%} -{{ indent2 }}private {{ type }} {{ variableName }}; -{%- endfor %} - -{#- Getters and Setters #} -{%- for name, prop in properties %} -{%- set propModelClass = {schema: prop, schemaName: name} | getModelClass %} -{%- set realClassName = propModelClass.getClassName() %} -{%- set variableName = realClassName | identifierName -%} -{%- set typeInfo = [name, realClassName, prop] | fixType -%} -{% set type = typeInfo[0] -%} -{% set isArrayOfObjects = typeInfo[1] %} -{{ indent2 }}public {{ type }} get{{- realClassName }}() { -{{ indent3 }}return {{ variableName }}; -{{ indent2 }}} - -{{ indent2 }}public {{ className }} set{{- realClassName }}({{ type }} {{ variableName }}) { -{{ indent3 }}this.{{-variableName }} = {{ variableName }}; -{{ indent3 }}return this; -{{ indent2 }}} -{# Inner classes #} -{%- set innerModelClass = {schema: prop, schemaName: variableName} | getModelClass %} -{%- if prop.type() === 'object' and innerModelClass and innerModelClass.canBeInnerClass() %} -{{ javaClass(variableName, prop, prop.properties(), indentLevel+1, true) }} -{%- endif %} -{%- if isArrayOfObjects and innerModelClass and innerModelClass.canBeInnerClass() %} -{{ javaClass(variableName, prop, prop.items().properties(), indentLevel+1, true) }} -{%- endif %} -{# Enums #} -{%- if prop.enum() %} -{{ indent2 }}public static enum {{ type }} { {{ prop.enum() }} } -{%- endif %} -{%- endfor -%} - -{{ indent2 }}public String toString() { -{{ indent3 }}return "{{ className }} [" -{%- for name, prop in properties %} -{%- set propModelClass = {schema: prop, schemaName: name} | getModelClass %} -{%- set realClassName = propModelClass.getClassName() %} -{%- set variableName = realClassName | identifierName %} -{%- set typeInfo = [realClassName, realClassName, prop] | fixType -%} -{%- set type = typeInfo[0] %} -{{ indent3 }}+ " {{ variableName }}: " + {{ variableName }} -{%- if type === 'Object' -%} -.toString() -{%- endif -%} -{%- endfor %} -{%- if modelClass.isSubClass() %} -{{ indent3 }}+ " super: " + super.toString(){% endif %} -{{ indent3 }}+ " ]"; -{{ indent2 }}} -{{ indent1 }}}{% endif -%} -{%- endmacro -%} \ No newline at end of file diff --git a/partials/java-package b/partials/java-package deleted file mode 100644 index 10f9a3d0..00000000 --- a/partials/java-package +++ /dev/null @@ -1,8 +0,0 @@ -{%- set modelClass = {schema: schema, schemaName: schemaName} | getModelClass -%} -{%- if params['javaPackage'] -%} -package {{ params['javaPackage'] }}; -{%- elif asyncapi.info().extensions()['x-java-package'] -%} -package {{ asyncapi.info().extensions()['x-java-package'] }}; -{%- elif modelClass and modelClass.getJavaPackage() -%} -package {{ modelClass.getJavaPackage() }}; -{% endif %} diff --git a/template/README.md b/template/README.md deleted file mode 100644 index 7ca36bdc..00000000 --- a/template/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# {{ asyncapi.info().title() }} - -## Version {{ asyncapi.info().version() }} - -{{ asyncapi.info().description() | safe }} - diff --git a/template/index.js b/template/index.js new file mode 100644 index 00000000..77843160 --- /dev/null +++ b/template/index.js @@ -0,0 +1,214 @@ +const { logger } = require('../utils/logger'); + +function Template({ asyncapi, params, targetDir }) { + logger.debug('template/index.js: Template() - Generating template files'); + logger.debug('template/index.js: Template() - asyncapi keys:', Object.keys(asyncapi || {})); + logger.debug('template/index.js: Template() - params:', params); + + const React = require('react'); + const { File } = require('@asyncapi/generator-react-sdk'); + const { Application } = require('../components/Application'); + const { ApplicationYml } = require('../components/ApplicationYml'); + const ModelClass = require('../components/ModelClass'); + const { PomXml } = require('../components/PomXml'); + const { Readme } = require('../components/Readme'); + const { processAsyncApi } = require('../utils/asyncApiProcessor'); + const filenamify = require('filenamify'); + + logger.debug('template/index.js: Template() - About to call processAsyncApi'); + try { + const processedData = processAsyncApi(asyncapi, params); + logger.debug('template/index.js: Template() - processAsyncApi completed successfully'); + logger.debug('Processed data:', { + schemasCount: processedData.schemas.length, + functionsCount: processedData.functions.length, + hasExtraIncludes: !!processedData.extraIncludes, + hasImports: !!processedData.imports, + hasAppProperties: !!processedData.appProperties + }); + + // Debug: Log each schema that will be processed + logger.debug('template/index.js: Schemas to process:'); + processedData.schemas.forEach((schema, index) => { + logger.debug(` [${index}] Schema: ${schema.name}, Properties: ${schema.properties.length}, IsAvro: ${schema.isAvro}`); + }); + + const files = []; + + // Generate pom.xml based on artifactType + const artifactType = params.artifactType || 'application'; + logger.debug('template/index.js: Template() - About to generate pom.xml'); + if (artifactType === 'application') { + files.push( + React.createElement(File, { name: "pom.xml" }, + React.createElement(PomXml, { params, asyncapi, processedData, artifactType: "application" }) + ) + ); + } else { + files.push( + React.createElement(File, { name: "pom.xml" }, + React.createElement(PomXml, { params, asyncapi, processedData, artifactType: "library" }) + ) + ); + } + + // Generate README.md + logger.debug('template/index.js: Template() - About to generate README.md'); + files.push( + React.createElement(File, { name: "README.md" }, + React.createElement(Readme, { params, asyncapi, processedData }) + ) + ); + + // Generate Application.java in root (will be moved by post-hook) - only for application type + if (artifactType === 'application') { + const className = getMainClassName(asyncapi, params); + logger.debug('template/index.js: Template() - About to generate Application.java'); + files.push( + React.createElement(File, { name: `${className}.java` }, + React.createElement(Application, { params, asyncapi, processedData }) + ) + ); + } else { + logger.debug('template/index.js: Template() - Skipping Application.java for library type'); + } + + // Generate schema classes in root (will be moved by post-hook) + logger.debug(`template/index.js: Processing ${processedData.schemas.length} schemas for Java file generation`); + processedData.schemas.forEach((processedSchema, index) => { + const schemaName = processedSchema.name; // This is the original schema name from AsyncAPI spec + + logger.debug(`template/index.js: Processing schema [${index}]: ${schemaName}`); + + // Skip schemas with numeric names (0, 1) as they are duplicates of component schemas + if ((typeof schemaName === 'number' && /^\d+$/.test(String(schemaName))) || + (typeof schemaName === 'string' && /^\d+$/.test(schemaName))) { + logger.debug(`template/index.js: Skipping numeric schema name: ${schemaName} (duplicate of component schema)`); + return; + } + + // Skip schemas with undefined or null names + if (!schemaName) { + logger.warn('Skipping schema with undefined name:', processedSchema); + return; + } + + // Check if this schema should generate a separate file + if (processedSchema.shouldGenerateSeparateFile) { + logger.debug(`template/index.js: Generating separate file for standalone schema: ${processedSchema.name}`); + } else { + logger.debug(`template/index.js: Schema ${processedSchema.name} will be embedded in parent class`); + } + + // Use Avro namespace info if available, otherwise use existing logic + let className, filePath; + + if (processedSchema.isAvro && processedSchema.packagePath && processedSchema.className) { + // Avro schema with namespace - generate in root, post-process will move to namespace + className = processedSchema.className; + filePath = `${className}.java`; + } else { + // Regular schema - use existing logic + // Prioritize original schema name over title to ensure correct naming + // Only use title if schema name is not available or is a generic name + let nameToUse = schemaName; + // Ensure schemaName is a string before calling startsWith + const schemaNameStr = String(schemaName); + if (!schemaName || schemaNameStr.startsWith('<') || schemaName === 'root' || schemaName === 'object') { + nameToUse = schemaName || processedSchema.title; + } + className = getSchemaClassName(nameToUse); + filePath = `${className}.java`; + } + + logger.debug(`template/index.js: About to generate ModelClass for ${className}`); + files.push( + React.createElement(File, { name: filePath }, + React.createElement(ModelClass, { + schema: processedSchema, + params, + asyncapi, + processedData, // <-- pass processedData to ModelClass + extendsClass: processedSchema.extendsClass, + namespace: processedSchema.namespace, + className: className, + parentProperties: processedSchema.parentProperties // <-- pass parentProperties + }) + ) + ); + }); + + // Generate application.yml in root (will be moved by post-hook) + logger.debug('template/index.js: Template() - About to generate application.yml'); + files.push( + React.createElement(File, { name: "application.yml" }, + React.createElement(ApplicationYml, { params, asyncapi, processedData }) + ) + ); + + logger.debug('template/index.js: Template() - All files generated successfully'); + return files; + } catch (error) { + logger.error('template/index.js: Template() - Error during template generation:', error); + logger.error('template/index.js: Template() - Error stack:', error.stack); + throw error; + } +} + +function getPackagePath(params, asyncapi) { + logger.debug('template/index.js: getPackagePath() - Getting package path'); + if (params.javaPackage) { + return params.javaPackage.replace(/\./g, '/'); + } + if (asyncapi.info().extensions().get('x-java-package')) { + return asyncapi.info().extensions().get('x-java-package').value().replace(/\./g, '/'); + } + return 'com/company'; +} + +function getMainClassName(asyncapi, params) { + logger.debug('template/index.js: getMainClassName() - Getting main class name'); + return 'Application'; +} + +function getSchemaPackagePath(schema, params, asyncapi) { + logger.debug('template/index.js: getSchemaPackagePath() - Getting schema package path'); + // Check if schema has a namespace (for Avro schemas) + const schemaName = schema.id(); + const dotIndex = schemaName.lastIndexOf('.'); + if (dotIndex > 0) { + const namespace = schemaName.substring(0, dotIndex); + return namespace.replace(/\./g, '/'); + } + + // Use the main package path + return getPackagePath(params, asyncapi); +} + +function getSchemaClassName(schemaName) { + logger.debug('template/index.js: getSchemaClassName() - Getting schema class name'); + // Handle undefined or null schemaName + if (!schemaName) { + logger.warn('getSchemaClassName: schemaName is undefined or null, using default name "UnknownSchema"'); + return 'UnknownSchema'; + } + + // Ensure schemaName is a string + const schemaNameStr = String(schemaName); + const dotIndex = schemaNameStr.lastIndexOf('.'); + let className = dotIndex > 0 ? schemaNameStr.substring(dotIndex + 1) : schemaNameStr; + + // Remove special characters (matching reference project behavior) + className = className.replace(/[^a-zA-Z0-9]/g, ''); + + // Ensure it starts with uppercase + className = className.charAt(0).toUpperCase() + className.slice(1); + + return className; +} + +Template.getPackagePath = getPackagePath; +Template.getMainClassName = getMainClassName; +Template.getSchemaPackagePath = getSchemaPackagePath; +Template.getSchemaClassName = getSchemaClassName; +module.exports = Template; \ No newline at end of file diff --git a/template/pom.app b/template/pom.app deleted file mode 100644 index a7049979..00000000 --- a/template/pom.app +++ /dev/null @@ -1,89 +0,0 @@ - - - 4.0.0 - - {{ [asyncapi.info(), params] | groupId }} - {{ [asyncapi.info(), params] | artifactId }} - {{ asyncapi.info().version() }} - jar - {{ [asyncapi.info(), params] | artifactId }} - Auto-generated Spring Cloud Stream AsyncAPI application - - - org.springframework.boot - spring-boot-starter-parent - {{ [asyncapi.info(), params] | springBootVersion }} - - - - - {{ [asyncapi.info(), params] | springCloudVersion }} -{%- if params.binder === 'solace' %} - {{ [asyncapi.info(), params] | solaceSpringCloudVersion }} -{%- endif %} - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - -{%- if params.binder === 'solace' %} - - com.solace.spring.cloud - solace-spring-cloud-bom - ${solace-spring-cloud-bom.version} - pom - import - -{%- endif %} - - - - -{%- if params.binder === 'rabbit' %} - - org.springframework.cloud - spring-cloud-stream-binder-rabbit - -{%- elif params.binder === 'solace' %} - - com.solace.spring.cloud - spring-cloud-starter-stream-solace - -{%- else %} - - org.springframework.cloud - spring-cloud-stream-binder-kafka - -{%- endif %} -{%- if params.actuator === 'true' %} - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-actuator - - - io.micrometer - micrometer-registry-prometheus - -{%- endif %} - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/template/pom.lib b/template/pom.lib deleted file mode 100644 index af8cfc30..00000000 --- a/template/pom.lib +++ /dev/null @@ -1,40 +0,0 @@ - - - 4.0.0 - - {{ [asyncapi.info(), params] | groupId }} - {{ [asyncapi.info(), params] | artifactId }} - {{ asyncapi.info().version() }} - {{ [asyncapi.info(), params] | artifactId }} - jar - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 8 - 8 - - - - - - - 1.8 - {{ [asyncapi.info(), params] | springCloudStreamVersion }} - - - - - org.springframework.cloud - spring-cloud-stream - ${spring-cloud-stream.version} - - - - - diff --git a/template/src/main/java/$$everySchema$$.java b/template/src/main/java/$$everySchema$$.java deleted file mode 100644 index 4f5f1193..00000000 --- a/template/src/main/java/$$everySchema$$.java +++ /dev/null @@ -1,8 +0,0 @@ -{% include 'partials/java-package' -%} -{% set extraIncludes = [schemaName, schema] | schemaExtraIncludes %} -import com.fasterxml.jackson.annotation.JsonInclude; -{% if extraIncludes.needJsonPropertyInclude -%} -import com.fasterxml.jackson.annotation.JsonProperty; -{% endif %} -{% from "partials/java-class" import javaClass -%} -{{ javaClass(schemaName, schema, schema.properties(), 0, false) }} diff --git a/template/src/main/java/Application.java b/template/src/main/java/Application.java deleted file mode 100644 index eb82e5d6..00000000 --- a/template/src/main/java/Application.java +++ /dev/null @@ -1,177 +0,0 @@ -{%- include 'partials/java-package' -%} -{%- set extraIncludes = [asyncapi, params] | appExtraIncludes %} -{%- set funcs = [asyncapi, params] | functionSpecs %} -{%- set imports = [asyncapi, params] | extraImports %} - -{%- if extraIncludes.needFunction %} -import java.util.function.Function; -{%- endif -%} -{%- if extraIncludes.needConsumer %} -import java.util.function.Consumer; -{%- endif -%} -{%- if extraIncludes.needSupplier %} -import java.util.function.Supplier; -{%- endif %} - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -{%- if extraIncludes.dynamic and params.dynamicType === 'streamBridge' %} -import org.springframework.beans.factory.annotation.Autowired; -{%- endif %} -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -{%- if extraIncludes.dynamic %} - {%- if params.dynamicType === 'streamBridge' %} -import org.springframework.cloud.stream.function.StreamBridge; - {%- else %} -import org.springframework.cloud.stream.binder.BinderHeaders; - {%- endif %} -{%- endif %} -{%- if extraIncludes.needBean %} -import org.springframework.context.annotation.Bean; -{%- endif %} -{%- if extraIncludes.needMessage %} -import org.springframework.messaging.Message; -{%- endif %} -{%- if extraIncludes.dynamic %} -import org.springframework.messaging.support.MessageBuilder; -{%- endif %} -{%- if params.reactive === 'true' %} -import reactor.core.publisher.Flux; -{%- endif %} -{%- for extraImport in imports %} -import {{ extraImport }}; -{%- endfor %} -{% set className = [asyncapi.info(), params] | mainClassName %} -@SpringBootApplication -public class {{ className }} { - - private static final Logger logger = LoggerFactory.getLogger({{ className }}.class); -{%- if extraIncludes.dynamic and params.dynamicType === 'streamBridge' %} - - @Autowired - private StreamBridge streamBridge; -{%- endif %} - - public static void main(String[] args) { - SpringApplication.run({{ className }}.class); - } -{% for funcName, funcSpec in funcs %} - {%- if funcSpec.type === 'function' %} - {%- if funcSpec.dynamic %} - {%- if params.dynamicType === 'header' %} - @Bean - {{ funcSpec.functionSignature | safe }} { - return data -> { - // Add business logic here. - logger.info(data.toString()); - {% for param in funcSpec.channelInfo.parameters -%} - {{ param.type }} {{ param.name }} = {{ param.sampleArg | safe }}; - {% endfor -%} - String topic = String.format("{{ funcSpec.channelInfo.publishChannel }}", - {{ funcSpec.channelInfo.functionArgList }}); - {{ funcSpec.publishPayload | safe }} payload = new {{ funcSpec.publishPayload | safe }}(); - Message message = MessageBuilder - .withPayload(payload) - .setHeader(BinderHeaders.TARGET_DESTINATION, topic) - .build(); - - return message; - }; - } - {%- else %}{# streamBridge, we need a consumer to call our func. #} - // This is a consumer that calls a send method, instead of a function, because it has a dynamic channel and we need streamBridge. - @Bean - {{ funcSpec.functionSignature | safe }} { - return data -> { - // Add business logic here. - logger.info(data.toString()); - {% for param in funcSpec.channelInfo.parameters -%} - {{ param.type }} {{ param.name }} = {{ param.sampleArg | safe }}; - {% endfor -%} - {{ funcSpec.publishPayload | safe }} payload = new {{ funcSpec.publishPayload | safe }}(); - {{ funcSpec.sendMethodName }}(payload, {{ funcSpec.channelInfo.functionArgList }}); - }; - } - {%- endif %} - {%- else %} - @Bean - {{ funcSpec.functionSignature | safe }} { - return data -> { - // Add business logic here. - logger.info(data.toString()); - return new {{ funcSpec.publishPayload | safe }}(); - }; - } - {%- endif %} - {%- elif funcSpec.type === 'consumer' %} - {%- if funcSpec.multipleMessageComment %} - {{ funcSpec.multipleMessageComment }} - {%- endif %} - @Bean - {{ funcSpec.functionSignature | safe }} { - return data -> { - // Add business logic here. - logger.info(data.toString()); - }; - } - {%- else %}{#- it is a supplier. #} - {%- if funcSpec.dynamic %} - {%- if params.dynamicType === 'header' -%} - @Bean - {{ funcSpec.functionSignature | safe }} { - return () -> { - // Add business logic here. - {{ funcSpec.publishPayload | safe }} payload = new {{ funcSpec.publishPayload | safe }}(); - {% for param in funcSpec.channelInfo.parameters -%} - {{ param.type }} {{ param.name }} = {{ param.sampleArg | safe }}; - {% endfor -%} - String topic = String.format("{{ funcSpec.channelInfo.publishChannel }}", - {{ funcSpec.channelInfo.functionArgList }}); - Message message = MessageBuilder - .withPayload(payload) - .setHeader(BinderHeaders.TARGET_DESTINATION, topic) - .build(); - - return message; - }; - } - {# else do nothing, we just use the void function below. #} - {%- endif %}{# dynamic type #} - {%- else -%}{# it is not dynamic. #} - {%- if funcSpec.multipleMessageComment %} - {{ funcSpec.multipleMessageComment }} - {%- endif %} - @Bean - {{ funcSpec.functionSignature | safe }} { - return () -> { - // Add business logic here. - return new {{ funcSpec.publishPayload | safe }}(); - }; - } - {%- endif %}{# dynamic #} - {%- endif %}{# supplier #} -{% endfor %} -{%- set dynamicFuncs = [asyncapi, params] | getDynamicFunctions -%} -{%- if dynamicFuncs.size %} -{%- for sendMethodName, dynFuncSpec in dynamicFuncs %} - {%- if funcSpec.type === 'supplier' or params.dynamicType === 'streamBridge' %} - public void {{ sendMethodName }}( - {{ dynFuncSpec.payloadClass }} payload, {{ dynFuncSpec.channelInfo.functionParamList }} - ) { - String topic = String.format("{{ dynFuncSpec.channelInfo.publishChannel }}", - {{ dynFuncSpec.channelInfo.functionArgList }}); - {%- if params.dynamicType === 'header' -%} - Message message = MessageBuilder - .withPayload(payload) - .setHeader(BinderHeaders.TARGET_DESTINATION, topic) - .build(); - streamBridge.send(topic, message); - {%- else %} - streamBridge.send(topic, payload); - {%- endif %} - } - {%- endif %} -{%- endfor %} -{%- endif %} -} diff --git a/template/src/main/resources/application.yml b/template/src/main/resources/application.yml deleted file mode 100644 index 40aeb7b1..00000000 --- a/template/src/main/resources/application.yml +++ /dev/null @@ -1 +0,0 @@ -{{ [asyncapi, params] | appProperties | safe }} diff --git a/test/__snapshots__/integration.test.js.snap b/test/__snapshots__/integration.test.js.snap deleted file mode 100644 index 2bb74dff..00000000 --- a/test/__snapshots__/integration.test.js.snap +++ /dev/null @@ -1,3064 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`template integration tests using the generator avro schemas should appear in a package based on their namespace, if any. 1`] = ` -"package com.acme; - -import com.fasterxml.jackson.annotation.JsonInclude; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class User { - - public User () { - } - - public User ( - String displayName, - String email, - Integer age) { - this.displayName = displayName; - this.email = email; - this.age = age; - } - - private String displayName; - private String email; - private Integer age; - public String getDisplayName() { - return displayName; - } - - public User setDisplayName(String displayName) { - this.displayName = displayName; - return this; - } - - - public String getEmail() { - return email; - } - - public User setEmail(String email) { - this.email = email; - return this; - } - - - public Integer getAge() { - return age; - } - - public User setAge(Integer age) { - this.age = age; - return this; - } - - public String toString() { - return \\"User [\\" - + \\" displayName: \\" + displayName - + \\" email: \\" + email - + \\" age: \\" + age - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator avro schemas should appear in a package based on their namespace, if any. 2`] = ` -"package com.acme; - -import com.fasterxml.jackson.annotation.JsonInclude; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class User { - - public User () { - } - - public User ( - String displayName, - String email, - Integer age) { - this.displayName = displayName; - this.email = email; - this.age = age; - } - - private String displayName; - private String email; - private Integer age; - public String getDisplayName() { - return displayName; - } - - public User setDisplayName(String displayName) { - this.displayName = displayName; - return this; - } - - - public String getEmail() { - return email; - } - - public User setEmail(String email) { - this.email = email; - return this; - } - - - public Integer getAge() { - return age; - } - - public User setAge(Integer age) { - this.age = age; - return this; - } - - public String toString() { - return \\"User [\\" - + \\" displayName: \\" + displayName - + \\" email: \\" + email - + \\" age: \\" + age - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should generate a class for a schema property that is an array of objects 1`] = ` -" - - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.stream.function.StreamBridge; -import org.springframework.messaging.Message; -import org.springframework.messaging.support.MessageBuilder; - -@SpringBootApplication -public class Application { - - private static final Logger logger = LoggerFactory.getLogger(Application.class); - - @Autowired - private StreamBridge streamBridge; - - public static void main(String[] args) { - SpringApplication.run(Application.class); - } - - - public void sendAcmeRideshareBillingReceiptCreated001RegionChargifyRideId( - RideReceipt payload, String region, String rideId - ) { - String topic = String.format(\\"acme/rideshare/billing/receipt/created/0.0.1/%s/chargify/%s\\", - region, rideId); - streamBridge.send(topic, payload); - } -} -" -`; - -exports[`template integration tests using the generator should generate a class for a schema property that is an array of objects 2`] = ` -" - -import com.fasterxml.jackson.annotation.JsonInclude; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class ChargeAdjustments { - - public ChargeAdjustments () { - } - - public ChargeAdjustments ( - String amount, - String name, - String type) { - this.amount = amount; - this.name = name; - this.type = type; - } - - private String amount; - private String name; - private String type; - public String getAmount() { - return amount; - } - - public ChargeAdjustments setAmount(String amount) { - this.amount = amount; - return this; - } - - - public String getName() { - return name; - } - - public ChargeAdjustments setName(String name) { - this.name = name; - return this; - } - - - public String getType() { - return type; - } - - public ChargeAdjustments setType(String type) { - this.type = type; - return this; - } - - public String toString() { - return \\"ChargeAdjustments [\\" - + \\" amount: \\" + amount - + \\" name: \\" + name - + \\" type: \\" + type - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should generate a class for a schema property that is an array of objects 3`] = ` -" - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class RideReceipt { - - public RideReceipt () { - } - - public RideReceipt ( - String totalOwed, - String duration, - TestObject testObject, - ChargeAdjustments[] chargeAdjustments, - String currencyCode) { - this.totalOwed = totalOwed; - this.duration = duration; - this.testObject = testObject; - this.chargeAdjustments = chargeAdjustments; - this.currencyCode = currencyCode; - } - - @JsonProperty(\\"total_owed\\") - private String totalOwed; - private String duration; - @JsonProperty(\\"test_object\\") - private TestObject testObject; - @JsonProperty(\\"charge_adjustments\\") - private ChargeAdjustments[] chargeAdjustments; - @JsonProperty(\\"currency_code\\") - private String currencyCode; - public String getTotalOwed() { - return totalOwed; - } - - public RideReceipt setTotalOwed(String totalOwed) { - this.totalOwed = totalOwed; - return this; - } - - - public String getDuration() { - return duration; - } - - public RideReceipt setDuration(String duration) { - this.duration = duration; - return this; - } - - - public TestObject getTestObject() { - return testObject; - } - - public RideReceipt setTestObject(TestObject testObject) { - this.testObject = testObject; - return this; - } - - - - @JsonInclude(JsonInclude.Include.NON_NULL) - public static class TestObject { - - public TestObject () { - } - - public TestObject ( - String field1) { - this.field1 = field1; - } - - private String field1; - public String getField1() { - return field1; - } - - public TestObject setField1(String field1) { - this.field1 = field1; - return this; - } - - public String toString() { - return \\"TestObject [\\" - + \\" field1: \\" + field1 - + \\" ]\\"; - } - } - - public ChargeAdjustments[] getChargeAdjustments() { - return chargeAdjustments; - } - - public RideReceipt setChargeAdjustments(ChargeAdjustments[] chargeAdjustments) { - this.chargeAdjustments = chargeAdjustments; - return this; - } - - - - @JsonInclude(JsonInclude.Include.NON_NULL) - public static class ChargeAdjustments { - - public ChargeAdjustments () { - } - public ChargeAdjustments ( - String amount, - String name, - String type) { - this.amount = amount; - this.name = name; - this.type = type; - } - - - private String amount; - private String name; - private String type; - public String getAmount() { - return amount; - } - - public ChargeAdjustments setAmount(String amount) { - this.amount = amount; - return this; - } - - - public String getName() { - return name; - } - - public ChargeAdjustments setName(String name) { - this.name = name; - return this; - } - - - public String getType() { - return type; - } - - public ChargeAdjustments setType(String type) { - this.type = type; - return this; - } - - public String toString() { - return \\"ChargeAdjustments [\\" - + \\" amount: \\" + amount - + \\" name: \\" + name - + \\" type: \\" + type - + \\" ]\\"; - } - } - - public String getCurrencyCode() { - return currencyCode; - } - - public RideReceipt setCurrencyCode(String currencyCode) { - this.currencyCode = currencyCode; - return this; - } - - public String toString() { - return \\"RideReceipt [\\" - + \\" totalOwed: \\" + totalOwed - + \\" duration: \\" + duration - + \\" testObject: \\" + testObject - + \\" chargeAdjustments: \\" + chargeAdjustments - + \\" currencyCode: \\" + currencyCode - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should generate a class for a schema property that is an array of objects 4`] = ` -" - -import com.fasterxml.jackson.annotation.JsonInclude; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class TestObject { - - public TestObject () { - } - - public TestObject ( - String field1) { - this.field1 = field1; - } - - private String field1; - public String getField1() { - return field1; - } - - public TestObject setField1(String field1) { - this.field1 = field1; - return this; - } - - public String toString() { - return \\"TestObject [\\" - + \\" field1: \\" + field1 - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should generate a comment for a consumer receiving multiple messages 1`] = ` -" - -import java.util.function.Consumer; -import java.util.function.Supplier; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.messaging.Message; - -@SpringBootApplication -public class Application { - - private static final Logger logger = LoggerFactory.getLogger(Application.class); - - public static void main(String[] args) { - SpringApplication.run(Application.class); - } - - // The message can be of type: - // Cat - // Dog - @Bean - public Supplier> animalsSupplier() { - return () -> { - // Add business logic here. - return new Message(); - }; - } - - // The message can be of type: - // Cat - // Dog - @Bean - public Consumer> animalsConsumer() { - return data -> { - // Add business logic here. - logger.info(data.toString()); - }; - } - -} -" -`; - -exports[`template integration tests using the generator should generate a consumer and return a payload when using x-scs-function-name and dynamic topic binding 1`] = ` -" - -import java.util.function.Consumer; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.stream.function.StreamBridge; -import org.springframework.context.annotation.Bean; -import org.springframework.messaging.Message; -import org.springframework.messaging.support.MessageBuilder; - -@SpringBootApplication -public class Application { - - private static final Logger logger = LoggerFactory.getLogger(Application.class); - - @Autowired - private StreamBridge streamBridge; - - public static void main(String[] args) { - SpringApplication.run(Application.class); - } - - // This is a consumer that calls a send method, instead of a function, because it has a dynamic channel and we need streamBridge. - @Bean - public Consumer sameFunctionName() { - return data -> { - // Add business logic here. - logger.info(data.toString()); - String messageId = \\"string\\"; - String operation = \\"string\\"; - MyOtherSchema payload = new MyOtherSchema(); - sendSameFunctionName(payload, messageId, operation); - }; - } - - public void sendSameFunctionName( - MyOtherSchema payload, String messageId, String operation - ) { - String topic = String.format(\\"testLevel1/%s/%s\\", - messageId, operation); - streamBridge.send(topic, payload); - } -} -" -`; - -exports[`template integration tests using the generator should generate a function and return a payload when using x-scs-function-name and a static topic 1`] = ` -" - -import java.util.function.Function; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.messaging.Message; - -@SpringBootApplication -public class Application { - - private static final Logger logger = LoggerFactory.getLogger(Application.class); - - public static void main(String[] args) { - SpringApplication.run(Application.class); - } - - @Bean - public Function, Message> sameFunctionName() { - return data -> { - // Add business logic here. - logger.info(data.toString()); - return new Message(); - }; - } - -} -" -`; - -exports[`template integration tests using the generator should generate a model subclass when it sees an allOf 1`] = ` -"package com.acme; - -import com.fasterxml.jackson.annotation.JsonInclude; - - - - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class ExtendedErrorModel extends ErrorModel { - - public ExtendedErrorModel () { - } - - public ExtendedErrorModel ( - String rootCause) { - this.rootCause = rootCause; - } - - private String rootCause; - public String getRootCause() { - return rootCause; - } - - public ExtendedErrorModel setRootCause(String rootCause) { - this.rootCause = rootCause; - return this; - } - - public String toString() { - return \\"ExtendedErrorModel [\\" - + \\" rootCause: \\" + rootCause - + \\" super: \\" + super.toString() - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should generate application files using the solace binder 1`] = ` -" - - 4.0.0 - - com.company - asyncApiFileName - 0.0.1 - jar - asyncApiFileName - Auto-generated Spring Cloud Stream AsyncAPI application - - - org.springframework.boot - spring-boot-starter-parent - 2.4.7 - - - - - 2020.0.3 - 2.1.0 - - - - - - org.springframework.cloud - spring-cloud-dependencies - \${spring-cloud.version} - pom - import - - - com.solace.spring.cloud - solace-spring-cloud-bom - \${solace-spring-cloud-bom.version} - pom - import - - - - - - - com.solace.spring.cloud - spring-cloud-starter-stream-solace - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - -" -`; - -exports[`template integration tests using the generator should generate application files using the solace binder 2`] = ` -"# solace-test-app - -## Version 0.0.1 - - - -" -`; - -exports[`template integration tests using the generator should generate application files using the solace binder 3`] = ` -"package com.acme; - -import java.util.function.Consumer; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.stream.function.StreamBridge; -import org.springframework.context.annotation.Bean; -import org.springframework.messaging.Message; -import org.springframework.messaging.support.MessageBuilder; - -@SpringBootApplication -public class Application { - - private static final Logger logger = LoggerFactory.getLogger(Application.class); - - @Autowired - private StreamBridge streamBridge; - - public static void main(String[] args) { - SpringApplication.run(Application.class); - } - - - @Bean - public Consumer testLevel1MessageIdOperationConsumer() { - return data -> { - // Add business logic here. - logger.info(data.toString()); - }; - } - - public void sendTestLevel1MessageIdOperation( - MySchema payload, String messageId, String operation - ) { - String topic = String.format(\\"testLevel1/%s/%s\\", - messageId, operation); - streamBridge.send(topic, payload); - } -} -" -`; - -exports[`template integration tests using the generator should generate application files using the solace binder 4`] = ` -"package com.acme; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class MySchema { - - public MySchema () { - } - - public MySchema ( - String prop1, - String _long) { - this.prop1 = prop1; - this._long = _long; - } - - private String prop1; - @JsonProperty(\\"long\\") - private String _long; - public String getProp1() { - return prop1; - } - - public MySchema setProp1(String prop1) { - this.prop1 = prop1; - return this; - } - - - public String getLong() { - return _long; - } - - public MySchema setLong(String _long) { - this._long = _long; - return this; - } - - public String toString() { - return \\"MySchema [\\" - + \\" prop1: \\" + prop1 - + \\" _long: \\" + _long - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should generate application files using the solace binder 5`] = ` -"spring: - cloud: - function: - definition: testLevel1MessageIdOperationConsumer - stream: - bindings: - testLevel1MessageIdOperationConsumer-in-0: - destination: testLevel1/*/* - binders: - solace-binder: - type: solace - environment: - solace: - java: - host: testVmrUri - msgVpn: vpnName - clientUsername: user - clientPassword: test -logging: - level: - root: info - org: - springframework: info - -" -`; - -exports[`template integration tests using the generator should generate code from the smarty lighting streetlights example 1`] = ` -" - -import java.util.function.Consumer; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.stream.function.StreamBridge; -import org.springframework.context.annotation.Bean; -import org.springframework.messaging.Message; -import org.springframework.messaging.support.MessageBuilder; - -@SpringBootApplication -public class Application { - - private static final Logger logger = LoggerFactory.getLogger(Application.class); - - @Autowired - private StreamBridge streamBridge; - - public static void main(String[] args) { - SpringApplication.run(Application.class); - } - - @Bean - public Consumer receiveLightMeasurement() { - return data -> { - // Add business logic here. - logger.info(data.toString()); - }; - } - - - - - public void sendTurnOn( - TurnOnOffPayload payload, String streetlightId - ) { - String topic = String.format(\\"smartylighting/streetlights/1/0/action/%s/turn/on\\", - streetlightId); - streamBridge.send(topic, payload); - } - public void sendTurnOff( - TurnOnOffPayload payload, String streetlightId - ) { - String topic = String.format(\\"smartylighting/streetlights/1/0/action/%s/turn/off\\", - streetlightId); - streamBridge.send(topic, payload); - } - public void sendDimLight( - DimLightPayload payload, String streetlightId - ) { - String topic = String.format(\\"smartylighting/streetlights/1/0/action/%s/dim\\", - streetlightId); - streamBridge.send(topic, payload); - } -} -" -`; - -exports[`template integration tests using the generator should generate code from the smarty lighting streetlights example 2`] = ` -" - -import com.fasterxml.jackson.annotation.JsonInclude; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class DimLightPayload { - - public DimLightPayload () { - } - - public DimLightPayload ( - Integer percentage, - SentAt sentAt) { - this.percentage = percentage; - this.sentAt = sentAt; - } - - private Integer percentage; - private SentAt sentAt; - public Integer getPercentage() { - return percentage; - } - - public DimLightPayload setPercentage(Integer percentage) { - this.percentage = percentage; - return this; - } - - - public SentAt getSentAt() { - return sentAt; - } - - public DimLightPayload setSentAt(SentAt sentAt) { - this.sentAt = sentAt; - return this; - } - - public String toString() { - return \\"DimLightPayload [\\" - + \\" percentage: \\" + percentage - + \\" sentAt: \\" + sentAt - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should generate code from the smarty lighting streetlights example 3`] = ` -" - -import com.fasterxml.jackson.annotation.JsonInclude; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class LightMeasuredPayload { - - public LightMeasuredPayload () { - } - - public LightMeasuredPayload ( - Integer lumens, - SentAt sentAt) { - this.lumens = lumens; - this.sentAt = sentAt; - } - - private Integer lumens; - private SentAt sentAt; - public Integer getLumens() { - return lumens; - } - - public LightMeasuredPayload setLumens(Integer lumens) { - this.lumens = lumens; - return this; - } - - - public SentAt getSentAt() { - return sentAt; - } - - public LightMeasuredPayload setSentAt(SentAt sentAt) { - this.sentAt = sentAt; - return this; - } - - public String toString() { - return \\"LightMeasuredPayload [\\" - + \\" lumens: \\" + lumens - + \\" sentAt: \\" + sentAt - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should generate code from the smarty lighting streetlights example 4`] = ` -" - -import com.fasterxml.jackson.annotation.JsonInclude; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class SentAt { - - public SentAt () { - } - - public SentAt ( - SubObject subObject) { - this.subObject = subObject; - } - - @JsonProperty(\\"propertySubobject\\") - private SubObject subObject; - public SubObject getSubObject() { - return subObject; - } - - public SentAt setSubObject(SubObject subObject) { - this.subObject = subObject; - return this; - } - - public String toString() { - return \\"SentAt [\\" - + \\" subObject: \\" + subObject - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should generate code from the smarty lighting streetlights example 5`] = ` -" - -import com.fasterxml.jackson.annotation.JsonInclude; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class TurnOnOffPayload { - - public TurnOnOffPayload () { - } - - public TurnOnOffPayload ( - Command command, - SentAt sentAt) { - this.command = command; - this.sentAt = sentAt; - } - - private Command command; - private SentAt sentAt; - public Command getCommand() { - return command; - } - - public TurnOnOffPayload setCommand(Command command) { - this.command = command; - return this; - } - - - public static enum Command { on,off } - public SentAt getSentAt() { - return sentAt; - } - - public TurnOnOffPayload setSentAt(SentAt sentAt) { - this.sentAt = sentAt; - return this; - } - - public String toString() { - return \\"TurnOnOffPayload [\\" - + \\" command: \\" + command - + \\" sentAt: \\" + sentAt - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should generate code from the smarty lighting streetlights example 6`] = ` -" - -import com.fasterxml.jackson.annotation.JsonInclude; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class SubObject { - - public SubObject () { - } - - public SubObject ( - String propertyA) { - this.propertyA = propertyA; - } - - private String propertyA; - public String getPropertyA() { - return propertyA; - } - - public SubObject setPropertyA(String propertyA) { - this.propertyA = propertyA; - return this; - } - - public String toString() { - return \\"SubObject [\\" - + \\" propertyA: \\" + propertyA - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should generate extra config when using the paramatersToHeaders parameter 1`] = ` -"package com.acme; - -import java.util.function.Consumer; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.stream.function.StreamBridge; -import org.springframework.context.annotation.Bean; -import org.springframework.messaging.Message; -import org.springframework.messaging.support.MessageBuilder; - -@SpringBootApplication -public class Application { - - private static final Logger logger = LoggerFactory.getLogger(Application.class); - - @Autowired - private StreamBridge streamBridge; - - public static void main(String[] args) { - SpringApplication.run(Application.class); - } - - - @Bean - public Consumer> testLevel1MessageIdOperationConsumer() { - return data -> { - // Add business logic here. - logger.info(data.toString()); - }; - } - - public void sendTestLevel1MessageIdOperation( - MySchema payload, String messageId, String operation - ) { - String topic = String.format(\\"testLevel1/%s/%s\\", - messageId, operation); - streamBridge.send(topic, payload); - } -} -" -`; - -exports[`template integration tests using the generator should generate extra config when using the paramatersToHeaders parameter 2`] = ` -"spring: - cloud: - function: - configuration: - testLevel1MessageIdOperationConsumer: - input-header-mapping-expression: - messageId: 'headers.solace_destination.getName.split(\\"/\\")[1]' - operation: 'headers.solace_destination.getName.split(\\"/\\")[2]' - definition: testLevel1MessageIdOperationConsumer - stream: - bindings: - testLevel1MessageIdOperationConsumer-in-0: - destination: testLevel1/*/* - binders: - solace-binder: - type: solace - environment: - solace: - java: - host: testVmrUri - msgVpn: vpnName - clientUsername: user - clientPassword: test -logging: - level: - root: info - org: - springframework: info - -" -`; - -exports[`template integration tests using the generator should generate one class for a schema with multiple references to it in the asyncapi document 1`] = ` -" - -import java.util.function.Consumer; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.stream.function.StreamBridge; -import org.springframework.context.annotation.Bean; -import org.springframework.messaging.Message; -import org.springframework.messaging.support.MessageBuilder; - -@SpringBootApplication -public class Application { - - private static final Logger logger = LoggerFactory.getLogger(Application.class); - - @Autowired - private StreamBridge streamBridge; - - public static void main(String[] args) { - SpringApplication.run(Application.class); - } - - - @Bean - public Consumer taxinycOpsRideUpdatedV1RideStatusDriverIdPassengerIdConsumer() { - return data -> { - // Add business logic here. - logger.info(data.toString()); - }; - } - - public void sendTaxinycBackofficePaymentChargedV1PaymentStatusDriverIdPassengerId( - PaymentCharged payload, String paymentStatus, String driverId, String passengerId - ) { - String topic = String.format(\\"taxinyc/backoffice/payment/charged/v1/%s/%s/%s\\", - paymentStatus, driverId, passengerId); - streamBridge.send(topic, payload); - } -} -" -`; - -exports[`template integration tests using the generator should generate one class for a schema with multiple references to it in the asyncapi document 2`] = ` -" - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class Driver { - - public Driver () { - } - - public Driver ( - Integer driverId, - java.math.BigDecimal rating, - String lastName, - String carClass, - String firstName) { - this.driverId = driverId; - this.rating = rating; - this.lastName = lastName; - this.carClass = carClass; - this.firstName = firstName; - } - - @JsonProperty(\\"driver_id\\") - private Integer driverId; - private java.math.BigDecimal rating; - @JsonProperty(\\"last_name\\") - private String lastName; - @JsonProperty(\\"car_class\\") - private String carClass; - @JsonProperty(\\"first_name\\") - private String firstName; - public Integer getDriverId() { - return driverId; - } - - public Driver setDriverId(Integer driverId) { - this.driverId = driverId; - return this; - } - - - public java.math.BigDecimal getRating() { - return rating; - } - - public Driver setRating(java.math.BigDecimal rating) { - this.rating = rating; - return this; - } - - - public String getLastName() { - return lastName; - } - - public Driver setLastName(String lastName) { - this.lastName = lastName; - return this; - } - - - public String getCarClass() { - return carClass; - } - - public Driver setCarClass(String carClass) { - this.carClass = carClass; - return this; - } - - - public String getFirstName() { - return firstName; - } - - public Driver setFirstName(String firstName) { - this.firstName = firstName; - return this; - } - - public String toString() { - return \\"Driver [\\" - + \\" driverId: \\" + driverId - + \\" rating: \\" + rating - + \\" lastName: \\" + lastName - + \\" carClass: \\" + carClass - + \\" firstName: \\" + firstName - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should generate one class for a schema with multiple references to it in the asyncapi document 3`] = ` -" - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class Passenger { - - public Passenger () { - } - - public Passenger ( - Integer passengerId, - java.math.BigDecimal rating, - String lastName, - String firstName) { - this.passengerId = passengerId; - this.rating = rating; - this.lastName = lastName; - this.firstName = firstName; - } - - @JsonProperty(\\"passenger_id\\") - private Integer passengerId; - private java.math.BigDecimal rating; - @JsonProperty(\\"last_name\\") - private String lastName; - @JsonProperty(\\"first_name\\") - private String firstName; - public Integer getPassengerId() { - return passengerId; - } - - public Passenger setPassengerId(Integer passengerId) { - this.passengerId = passengerId; - return this; - } - - - public java.math.BigDecimal getRating() { - return rating; - } - - public Passenger setRating(java.math.BigDecimal rating) { - this.rating = rating; - return this; - } - - - public String getLastName() { - return lastName; - } - - public Passenger setLastName(String lastName) { - this.lastName = lastName; - return this; - } - - - public String getFirstName() { - return firstName; - } - - public Passenger setFirstName(String firstName) { - this.firstName = firstName; - return this; - } - - public String toString() { - return \\"Passenger [\\" - + \\" passengerId: \\" + passengerId - + \\" rating: \\" + rating - + \\" lastName: \\" + lastName - + \\" firstName: \\" + firstName - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should generate one class for a schema with multiple references to it in the asyncapi document 4`] = ` -" - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class PaymentCharged { - - public PaymentCharged () { - } - - public PaymentCharged ( - Integer rideId, - String entityType, - java.math.BigDecimal amountCharged, - Driver driver, - String paymentChargedId, - Passenger passenger, - String paymentStatus, - String invoiceSystemId, - String informationSource, - String timestamp) { - this.rideId = rideId; - this.entityType = entityType; - this.amountCharged = amountCharged; - this.driver = driver; - this.paymentChargedId = paymentChargedId; - this.passenger = passenger; - this.paymentStatus = paymentStatus; - this.invoiceSystemId = invoiceSystemId; - this.informationSource = informationSource; - this.timestamp = timestamp; - } - - @JsonProperty(\\"ride_id\\") - private Integer rideId; - @JsonProperty(\\"entity_type\\") - private String entityType; - @JsonProperty(\\"amount_charged\\") - private java.math.BigDecimal amountCharged; - private Driver driver; - @JsonProperty(\\"payment_charged_id\\") - private String paymentChargedId; - private Passenger passenger; - @JsonProperty(\\"payment_status\\") - private String paymentStatus; - @JsonProperty(\\"invoice_system_id\\") - private String invoiceSystemId; - @JsonProperty(\\"information_source\\") - private String informationSource; - private String timestamp; - public Integer getRideId() { - return rideId; - } - - public PaymentCharged setRideId(Integer rideId) { - this.rideId = rideId; - return this; - } - - - public String getEntityType() { - return entityType; - } - - public PaymentCharged setEntityType(String entityType) { - this.entityType = entityType; - return this; - } - - - public java.math.BigDecimal getAmountCharged() { - return amountCharged; - } - - public PaymentCharged setAmountCharged(java.math.BigDecimal amountCharged) { - this.amountCharged = amountCharged; - return this; - } - - - public Driver getDriver() { - return driver; - } - - public PaymentCharged setDriver(Driver driver) { - this.driver = driver; - return this; - } - - - - @JsonInclude(JsonInclude.Include.NON_NULL) - public static class Driver { - - public Driver () { - } - - public Driver ( - Integer driverId, - Integer rating, - String lastName, - String carClass, - String firstName) { - this.driverId = driverId; - this.rating = rating; - this.lastName = lastName; - this.carClass = carClass; - this.firstName = firstName; - } - - @JsonProperty(\\"driver_id\\") - private Integer driverId; - private Integer rating; - @JsonProperty(\\"last_name\\") - private String lastName; - @JsonProperty(\\"car_class\\") - private String carClass; - @JsonProperty(\\"first_name\\") - private String firstName; - public Integer getDriverId() { - return driverId; - } - - public Driver setDriverId(Integer driverId) { - this.driverId = driverId; - return this; - } - - - public Integer getRating() { - return rating; - } - - public Driver setRating(Integer rating) { - this.rating = rating; - return this; - } - - - public String getLastName() { - return lastName; - } - - public Driver setLastName(String lastName) { - this.lastName = lastName; - return this; - } - - - public String getCarClass() { - return carClass; - } - - public Driver setCarClass(String carClass) { - this.carClass = carClass; - return this; - } - - - public String getFirstName() { - return firstName; - } - - public Driver setFirstName(String firstName) { - this.firstName = firstName; - return this; - } - - public String toString() { - return \\"Driver [\\" - + \\" driverId: \\" + driverId - + \\" rating: \\" + rating - + \\" lastName: \\" + lastName - + \\" carClass: \\" + carClass - + \\" firstName: \\" + firstName - + \\" ]\\"; - } - } - - public String getPaymentChargedId() { - return paymentChargedId; - } - - public PaymentCharged setPaymentChargedId(String paymentChargedId) { - this.paymentChargedId = paymentChargedId; - return this; - } - - - public Passenger getPassenger() { - return passenger; - } - - public PaymentCharged setPassenger(Passenger passenger) { - this.passenger = passenger; - return this; - } - - - - @JsonInclude(JsonInclude.Include.NON_NULL) - public static class Passenger { - - public Passenger () { - } - - public Passenger ( - Integer passengerId, - Integer rating, - String lastName, - String firstName) { - this.passengerId = passengerId; - this.rating = rating; - this.lastName = lastName; - this.firstName = firstName; - } - - @JsonProperty(\\"passenger_id\\") - private Integer passengerId; - private Integer rating; - @JsonProperty(\\"last_name\\") - private String lastName; - @JsonProperty(\\"first_name\\") - private String firstName; - public Integer getPassengerId() { - return passengerId; - } - - public Passenger setPassengerId(Integer passengerId) { - this.passengerId = passengerId; - return this; - } - - - public Integer getRating() { - return rating; - } - - public Passenger setRating(Integer rating) { - this.rating = rating; - return this; - } - - - public String getLastName() { - return lastName; - } - - public Passenger setLastName(String lastName) { - this.lastName = lastName; - return this; - } - - - public String getFirstName() { - return firstName; - } - - public Passenger setFirstName(String firstName) { - this.firstName = firstName; - return this; - } - - public String toString() { - return \\"Passenger [\\" - + \\" passengerId: \\" + passengerId - + \\" rating: \\" + rating - + \\" lastName: \\" + lastName - + \\" firstName: \\" + firstName - + \\" ]\\"; - } - } - - public String getPaymentStatus() { - return paymentStatus; - } - - public PaymentCharged setPaymentStatus(String paymentStatus) { - this.paymentStatus = paymentStatus; - return this; - } - - - public String getInvoiceSystemId() { - return invoiceSystemId; - } - - public PaymentCharged setInvoiceSystemId(String invoiceSystemId) { - this.invoiceSystemId = invoiceSystemId; - return this; - } - - - public String getInformationSource() { - return informationSource; - } - - public PaymentCharged setInformationSource(String informationSource) { - this.informationSource = informationSource; - return this; - } - - - public String getTimestamp() { - return timestamp; - } - - public PaymentCharged setTimestamp(String timestamp) { - this.timestamp = timestamp; - return this; - } - - public String toString() { - return \\"PaymentCharged [\\" - + \\" rideId: \\" + rideId - + \\" entityType: \\" + entityType - + \\" amountCharged: \\" + amountCharged - + \\" driver: \\" + driver - + \\" paymentChargedId: \\" + paymentChargedId - + \\" passenger: \\" + passenger - + \\" paymentStatus: \\" + paymentStatus - + \\" invoiceSystemId: \\" + invoiceSystemId - + \\" informationSource: \\" + informationSource - + \\" timestamp: \\" + timestamp - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should generate one class for a schema with multiple references to it in the asyncapi document 5`] = ` -" - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class RideUpdated1 { - - public RideUpdated1 () { - } - - public RideUpdated1 ( - String rideId, - Integer heading, - java.math.BigDecimal latitude, - Integer passengerCount, - Integer pointIdx, - String informationSource, - Integer speed, - Driver driver, - Passenger passenger, - java.math.BigDecimal meterIncrement, - java.math.BigDecimal longitude, - String timestamp, - java.math.BigDecimal meterReading, - RideStatus rideStatus) { - this.rideId = rideId; - this.heading = heading; - this.latitude = latitude; - this.passengerCount = passengerCount; - this.pointIdx = pointIdx; - this.informationSource = informationSource; - this.speed = speed; - this.driver = driver; - this.passenger = passenger; - this.meterIncrement = meterIncrement; - this.longitude = longitude; - this.timestamp = timestamp; - this.meterReading = meterReading; - this.rideStatus = rideStatus; - } - - @JsonProperty(\\"ride_id\\") - private String rideId; - private Integer heading; - private java.math.BigDecimal latitude; - @JsonProperty(\\"passenger_count\\") - private Integer passengerCount; - @JsonProperty(\\"point_idx\\") - private Integer pointIdx; - @JsonProperty(\\"information_source\\") - private String informationSource; - private Integer speed; - private Driver driver; - private Passenger passenger; - @JsonProperty(\\"meter_increment\\") - private java.math.BigDecimal meterIncrement; - private java.math.BigDecimal longitude; - private String timestamp; - @JsonProperty(\\"meter_reading\\") - private java.math.BigDecimal meterReading; - @JsonProperty(\\"ride_status\\") - private RideStatus rideStatus; - public String getRideId() { - return rideId; - } - - public RideUpdated1 setRideId(String rideId) { - this.rideId = rideId; - return this; - } - - - public Integer getHeading() { - return heading; - } - - public RideUpdated1 setHeading(Integer heading) { - this.heading = heading; - return this; - } - - - public java.math.BigDecimal getLatitude() { - return latitude; - } - - public RideUpdated1 setLatitude(java.math.BigDecimal latitude) { - this.latitude = latitude; - return this; - } - - - public Integer getPassengerCount() { - return passengerCount; - } - - public RideUpdated1 setPassengerCount(Integer passengerCount) { - this.passengerCount = passengerCount; - return this; - } - - - public Integer getPointIdx() { - return pointIdx; - } - - public RideUpdated1 setPointIdx(Integer pointIdx) { - this.pointIdx = pointIdx; - return this; - } - - - public String getInformationSource() { - return informationSource; - } - - public RideUpdated1 setInformationSource(String informationSource) { - this.informationSource = informationSource; - return this; - } - - - public Integer getSpeed() { - return speed; - } - - public RideUpdated1 setSpeed(Integer speed) { - this.speed = speed; - return this; - } - - - public Driver getDriver() { - return driver; - } - - public RideUpdated1 setDriver(Driver driver) { - this.driver = driver; - return this; - } - - - - @JsonInclude(JsonInclude.Include.NON_NULL) - public static class Driver { - - public Driver () { - } - - public Driver ( - Integer driverId, - java.math.BigDecimal rating, - String lastName, - String carClass, - String firstName) { - this.driverId = driverId; - this.rating = rating; - this.lastName = lastName; - this.carClass = carClass; - this.firstName = firstName; - } - - @JsonProperty(\\"driver_id\\") - private Integer driverId; - private java.math.BigDecimal rating; - @JsonProperty(\\"last_name\\") - private String lastName; - @JsonProperty(\\"car_class\\") - private String carClass; - @JsonProperty(\\"first_name\\") - private String firstName; - public Integer getDriverId() { - return driverId; - } - - public Driver setDriverId(Integer driverId) { - this.driverId = driverId; - return this; - } - - - public java.math.BigDecimal getRating() { - return rating; - } - - public Driver setRating(java.math.BigDecimal rating) { - this.rating = rating; - return this; - } - - - public String getLastName() { - return lastName; - } - - public Driver setLastName(String lastName) { - this.lastName = lastName; - return this; - } - - - public String getCarClass() { - return carClass; - } - - public Driver setCarClass(String carClass) { - this.carClass = carClass; - return this; - } - - - public String getFirstName() { - return firstName; - } - - public Driver setFirstName(String firstName) { - this.firstName = firstName; - return this; - } - - public String toString() { - return \\"Driver [\\" - + \\" driverId: \\" + driverId - + \\" rating: \\" + rating - + \\" lastName: \\" + lastName - + \\" carClass: \\" + carClass - + \\" firstName: \\" + firstName - + \\" ]\\"; - } - } - - public Passenger getPassenger() { - return passenger; - } - - public RideUpdated1 setPassenger(Passenger passenger) { - this.passenger = passenger; - return this; - } - - - - @JsonInclude(JsonInclude.Include.NON_NULL) - public static class Passenger { - - public Passenger () { - } - - public Passenger ( - Integer passengerId, - java.math.BigDecimal rating, - String lastName, - String firstName) { - this.passengerId = passengerId; - this.rating = rating; - this.lastName = lastName; - this.firstName = firstName; - } - - @JsonProperty(\\"passenger_id\\") - private Integer passengerId; - private java.math.BigDecimal rating; - @JsonProperty(\\"last_name\\") - private String lastName; - @JsonProperty(\\"first_name\\") - private String firstName; - public Integer getPassengerId() { - return passengerId; - } - - public Passenger setPassengerId(Integer passengerId) { - this.passengerId = passengerId; - return this; - } - - - public java.math.BigDecimal getRating() { - return rating; - } - - public Passenger setRating(java.math.BigDecimal rating) { - this.rating = rating; - return this; - } - - - public String getLastName() { - return lastName; - } - - public Passenger setLastName(String lastName) { - this.lastName = lastName; - return this; - } - - - public String getFirstName() { - return firstName; - } - - public Passenger setFirstName(String firstName) { - this.firstName = firstName; - return this; - } - - public String toString() { - return \\"Passenger [\\" - + \\" passengerId: \\" + passengerId - + \\" rating: \\" + rating - + \\" lastName: \\" + lastName - + \\" firstName: \\" + firstName - + \\" ]\\"; - } - } - - public java.math.BigDecimal getMeterIncrement() { - return meterIncrement; - } - - public RideUpdated1 setMeterIncrement(java.math.BigDecimal meterIncrement) { - this.meterIncrement = meterIncrement; - return this; - } - - - public java.math.BigDecimal getLongitude() { - return longitude; - } - - public RideUpdated1 setLongitude(java.math.BigDecimal longitude) { - this.longitude = longitude; - return this; - } - - - public String getTimestamp() { - return timestamp; - } - - public RideUpdated1 setTimestamp(String timestamp) { - this.timestamp = timestamp; - return this; - } - - - public java.math.BigDecimal getMeterReading() { - return meterReading; - } - - public RideUpdated1 setMeterReading(java.math.BigDecimal meterReading) { - this.meterReading = meterReading; - return this; - } - - - public RideStatus getRideStatus() { - return rideStatus; - } - - public RideUpdated1 setRideStatus(RideStatus rideStatus) { - this.rideStatus = rideStatus; - return this; - } - - - public static enum RideStatus { accepted,pickup,enroute,dropoff } public String toString() { - return \\"RideUpdated1 [\\" - + \\" rideId: \\" + rideId - + \\" heading: \\" + heading - + \\" latitude: \\" + latitude - + \\" passengerCount: \\" + passengerCount - + \\" pointIdx: \\" + pointIdx - + \\" informationSource: \\" + informationSource - + \\" speed: \\" + speed - + \\" driver: \\" + driver - + \\" passenger: \\" + passenger - + \\" meterIncrement: \\" + meterIncrement - + \\" longitude: \\" + longitude - + \\" timestamp: \\" + timestamp - + \\" meterReading: \\" + meterReading - + \\" rideStatus: \\" + rideStatus - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should generate schemas with nested arrays 1`] = ` -" - -import java.util.function.Consumer; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.stream.function.StreamBridge; -import org.springframework.context.annotation.Bean; -import org.springframework.messaging.Message; -import org.springframework.messaging.support.MessageBuilder; - -@SpringBootApplication -public class Application { - - private static final Logger logger = LoggerFactory.getLogger(Application.class); - - @Autowired - private StreamBridge streamBridge; - - public static void main(String[] args) { - SpringApplication.run(Application.class); - } - - @Bean - public Consumer companyCustomerCompanyDebtorDebtorIdDossierDossierIdCreatedConsumer() { - return data -> { - // Add business logic here. - logger.info(data.toString()); - }; - } - - @Bean - public Consumer companyCustomerCompanyDebtorDebtorIdCreatedConsumer() { - return data -> { - // Add business logic here. - logger.info(data.toString()); - }; - } - - - - public void sendCompanyCustomerCompanyDebtorCreate( - Debtor payload, String customerCompany - ) { - String topic = String.format(\\"Company/%s/debtor/create\\", - customerCompany); - streamBridge.send(topic, payload); - } - public void sendCompanyCustomerCompanyDebtorDebtorIdDossierCreate( - Dossier payload, String customerCompany, String debtorId - ) { - String topic = String.format(\\"Company/%s/debtor/%s/Dossier/create\\", - customerCompany, debtorId); - streamBridge.send(topic, payload); - } -} -" -`; - -exports[`template integration tests using the generator should generate schemas with nested arrays 2`] = ` -" - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class Dossier { - - public Dossier () { - } - - public Dossier ( - java.math.BigDecimal premium, - java.math.BigDecimal appliedDiscount, - String productId, - Options[] options, - String id, - String clientId) { - this.premium = premium; - this.appliedDiscount = appliedDiscount; - this.productId = productId; - this.options = options; - this.id = id; - this.clientId = clientId; - } - - private java.math.BigDecimal premium; - @JsonProperty(\\"applied_discount\\") - private java.math.BigDecimal appliedDiscount; - @JsonProperty(\\"product_id\\") - private String productId; - private Options[] options; - private String id; - @JsonProperty(\\"client_id\\") - private String clientId; - public java.math.BigDecimal getPremium() { - return premium; - } - - public Dossier setPremium(java.math.BigDecimal premium) { - this.premium = premium; - return this; - } - - - public java.math.BigDecimal getAppliedDiscount() { - return appliedDiscount; - } - - public Dossier setAppliedDiscount(java.math.BigDecimal appliedDiscount) { - this.appliedDiscount = appliedDiscount; - return this; - } - - - public String getProductId() { - return productId; - } - - public Dossier setProductId(String productId) { - this.productId = productId; - return this; - } - - - public Options[] getOptions() { - return options; - } - - public Dossier setOptions(Options[] options) { - this.options = options; - return this; - } - - - - @JsonInclude(JsonInclude.Include.NON_NULL) - public static class Options { - - public Options () { - } - public Options ( - String name, - String id) { - this.name = name; - this.id = id; - } - - - private String name; - private String id; - public String getName() { - return name; - } - - public Options setName(String name) { - this.name = name; - return this; - } - - - public String getId() { - return id; - } - - public Options setId(String id) { - this.id = id; - return this; - } - - public String toString() { - return \\"Options [\\" - + \\" name: \\" + name - + \\" id: \\" + id - + \\" ]\\"; - } - } - - public String getId() { - return id; - } - - public Dossier setId(String id) { - this.id = id; - return this; - } - - - public String getClientId() { - return clientId; - } - - public Dossier setClientId(String clientId) { - this.clientId = clientId; - return this; - } - - public String toString() { - return \\"Dossier [\\" - + \\" premium: \\" + premium - + \\" appliedDiscount: \\" + appliedDiscount - + \\" productId: \\" + productId - + \\" options: \\" + options - + \\" id: \\" + id - + \\" clientId: \\" + clientId - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should generate schemas with nested arrays 3`] = ` -" - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class Debtor { - - public Debtor () { - } - - public Debtor ( - Emails[] emails, - String birthdate, - Address address, - String lastName, - Phones[] phones, - String id, - String firstName, - BankAccount bankAccount) { - this.emails = emails; - this.birthdate = birthdate; - this.address = address; - this.lastName = lastName; - this.phones = phones; - this.id = id; - this.firstName = firstName; - this.bankAccount = bankAccount; - } - - private Emails[] emails; - private String birthdate; - private Address address; - @JsonProperty(\\"last_name\\") - private String lastName; - private Phones[] phones; - private String id; - @JsonProperty(\\"first_name\\") - private String firstName; - @JsonProperty(\\"bank_account\\") - private BankAccount bankAccount; - public Emails[] getEmails() { - return emails; - } - - public Debtor setEmails(Emails[] emails) { - this.emails = emails; - return this; - } - - - - @JsonInclude(JsonInclude.Include.NON_NULL) - public static class Emails { - - public Emails () { - } - public Emails ( - String type, - String email, - Boolean preferred) { - this.type = type; - this.email = email; - this.preferred = preferred; - } - - - private String type; - private String email; - private Boolean preferred; - public String getType() { - return type; - } - - public Emails setType(String type) { - this.type = type; - return this; - } - - - public String getEmail() { - return email; - } - - public Emails setEmail(String email) { - this.email = email; - return this; - } - - - public Boolean getPreferred() { - return preferred; - } - - public Emails setPreferred(Boolean preferred) { - this.preferred = preferred; - return this; - } - - public String toString() { - return \\"Emails [\\" - + \\" type: \\" + type - + \\" email: \\" + email - + \\" preferred: \\" + preferred - + \\" ]\\"; - } - } - - public String getBirthdate() { - return birthdate; - } - - public Debtor setBirthdate(String birthdate) { - this.birthdate = birthdate; - return this; - } - - - public Address getAddress() { - return address; - } - - public Debtor setAddress(Address address) { - this.address = address; - return this; - } - - - - @JsonInclude(JsonInclude.Include.NON_NULL) - public static class Address { - - public Address () { - } - - public Address ( - String countryCode, - String city, - String street, - String postalCode) { - this.countryCode = countryCode; - this.city = city; - this.street = street; - this.postalCode = postalCode; - } - - @JsonProperty(\\"country_code\\") - private String countryCode; - private String city; - private String street; - @JsonProperty(\\"postal_code\\") - private String postalCode; - public String getCountryCode() { - return countryCode; - } - - public Address setCountryCode(String countryCode) { - this.countryCode = countryCode; - return this; - } - - - public String getCity() { - return city; - } - - public Address setCity(String city) { - this.city = city; - return this; - } - - - public String getStreet() { - return street; - } - - public Address setStreet(String street) { - this.street = street; - return this; - } - - - public String getPostalCode() { - return postalCode; - } - - public Address setPostalCode(String postalCode) { - this.postalCode = postalCode; - return this; - } - - public String toString() { - return \\"Address [\\" - + \\" countryCode: \\" + countryCode - + \\" city: \\" + city - + \\" street: \\" + street - + \\" postalCode: \\" + postalCode - + \\" ]\\"; - } - } - - public String getLastName() { - return lastName; - } - - public Debtor setLastName(String lastName) { - this.lastName = lastName; - return this; - } - - - public Phones[] getPhones() { - return phones; - } - - public Debtor setPhones(Phones[] phones) { - this.phones = phones; - return this; - } - - - - @JsonInclude(JsonInclude.Include.NON_NULL) - public static class Phones { - - public Phones () { - } - public Phones ( - String phone, - String type, - Boolean preferred) { - this.phone = phone; - this.type = type; - this.preferred = preferred; - } - - - private String phone; - private String type; - private Boolean preferred; - public String getPhone() { - return phone; - } - - public Phones setPhone(String phone) { - this.phone = phone; - return this; - } - - - public String getType() { - return type; - } - - public Phones setType(String type) { - this.type = type; - return this; - } - - - public Boolean getPreferred() { - return preferred; - } - - public Phones setPreferred(Boolean preferred) { - this.preferred = preferred; - return this; - } - - public String toString() { - return \\"Phones [\\" - + \\" phone: \\" + phone - + \\" type: \\" + type - + \\" preferred: \\" + preferred - + \\" ]\\"; - } - } - - public String getId() { - return id; - } - - public Debtor setId(String id) { - this.id = id; - return this; - } - - - public String getFirstName() { - return firstName; - } - - public Debtor setFirstName(String firstName) { - this.firstName = firstName; - return this; - } - - - public BankAccount getBankAccount() { - return bankAccount; - } - - public Debtor setBankAccount(BankAccount bankAccount) { - this.bankAccount = bankAccount; - return this; - } - - - - @JsonInclude(JsonInclude.Include.NON_NULL) - public static class BankAccount { - - public BankAccount () { - } - - public BankAccount ( - String iban, - String bic) { - this.iban = iban; - this.bic = bic; - } - - @JsonProperty(\\"IBAN\\") - private String iban; - @JsonProperty(\\"BIC\\") - private String bic; - public String getIban() { - return iban; - } - - public BankAccount setIban(String iban) { - this.iban = iban; - return this; - } - - - public String getBic() { - return bic; - } - - public BankAccount setBic(String bic) { - this.bic = bic; - return this; - } - - public String toString() { - return \\"BankAccount [\\" - + \\" iban: \\" + iban - + \\" bic: \\" + bic - + \\" ]\\"; - } - } - public String toString() { - return \\"Debtor [\\" - + \\" emails: \\" + emails - + \\" birthdate: \\" + birthdate - + \\" address: \\" + address - + \\" lastName: \\" + lastName - + \\" phones: \\" + phones - + \\" id: \\" + id - + \\" firstName: \\" + firstName - + \\" bankAccount: \\" + bankAccount - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should not populate application yml with functions that are not beans 1`] = ` -"spring: - cloud: - function: - definition: '' - stream: - bindings: {} -logging: - level: - root: info - org: - springframework: info - -" -`; - -exports[`template integration tests using the generator should package and import schemas in another avro namespace 1`] = ` -" - -import java.util.function.Consumer; -import java.util.function.Supplier; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; -import com.example.api.jobOrder.JobOrder; -import com.example.api.jobAck.JobAcknowledge; - -@SpringBootApplication -public class Application { - - private static final Logger logger = LoggerFactory.getLogger(Application.class); - - public static void main(String[] args) { - SpringApplication.run(Application.class); - } - - @Bean - public Supplier testJobsOrderSupplier() { - return () -> { - // Add business logic here. - return new JobOrder(); - }; - } - - @Bean - public Consumer testJobsAckConsumer() { - return data -> { - // Add business logic here. - logger.info(data.toString()); - }; - } - -} -" -`; - -exports[`template integration tests using the generator should package and import schemas in another avro namespace 2`] = ` -"package com.example.api.jobOrder; - - -import com.fasterxml.jackson.annotation.JsonInclude; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class JobOrder { - - public JobOrder () { - } - - public JobOrder ( - String jobOrderId, - String jobOrderDescription, - String jobOrderLongDescription, - String jobOrderNumber, - Boolean isActive, - String status, - Integer statuscode) { - this.jobOrderId = jobOrderId; - this.jobOrderDescription = jobOrderDescription; - this.jobOrderLongDescription = jobOrderLongDescription; - this.jobOrderNumber = jobOrderNumber; - this.isActive = isActive; - this.status = status; - this.statuscode = statuscode; - } - - private String jobOrderId; - private String jobOrderDescription; - private String jobOrderLongDescription; - private String jobOrderNumber; - private Boolean isActive; - private String status; - private Integer statuscode; - public String getJobOrderId() { - return jobOrderId; - } - - public JobOrder setJobOrderId(String jobOrderId) { - this.jobOrderId = jobOrderId; - return this; - } - - - public String getJobOrderDescription() { - return jobOrderDescription; - } - - public JobOrder setJobOrderDescription(String jobOrderDescription) { - this.jobOrderDescription = jobOrderDescription; - return this; - } - - - public String getJobOrderLongDescription() { - return jobOrderLongDescription; - } - - public JobOrder setJobOrderLongDescription(String jobOrderLongDescription) { - this.jobOrderLongDescription = jobOrderLongDescription; - return this; - } - - - public String getJobOrderNumber() { - return jobOrderNumber; - } - - public JobOrder setJobOrderNumber(String jobOrderNumber) { - this.jobOrderNumber = jobOrderNumber; - return this; - } - - - public Boolean getIsActive() { - return isActive; - } - - public JobOrder setIsActive(Boolean isActive) { - this.isActive = isActive; - return this; - } - - - public String getStatus() { - return status; - } - - public JobOrder setStatus(String status) { - this.status = status; - return this; - } - - - public Integer getStatuscode() { - return statuscode; - } - - public JobOrder setStatuscode(Integer statuscode) { - this.statuscode = statuscode; - return this; - } - - public String toString() { - return \\"JobOrder [\\" - + \\" jobOrderId: \\" + jobOrderId - + \\" jobOrderDescription: \\" + jobOrderDescription - + \\" jobOrderLongDescription: \\" + jobOrderLongDescription - + \\" jobOrderNumber: \\" + jobOrderNumber - + \\" isActive: \\" + isActive - + \\" status: \\" + status - + \\" statuscode: \\" + statuscode - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should package and import schemas in another avro namespace 3`] = ` -"package com.example.api.jobAck; - - -import com.fasterxml.jackson.annotation.JsonInclude; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class JobAcknowledge { - - public JobAcknowledge () { - } - - public JobAcknowledge ( - String jobAckId) { - this.jobAckId = jobAckId; - } - - private String jobAckId; - public String getJobAckId() { - return jobAckId; - } - - public JobAcknowledge setJobAckId(String jobAckId) { - this.jobAckId = jobAckId; - return this; - } - - public String toString() { - return \\"JobAcknowledge [\\" - + \\" jobAckId: \\" + jobAckId - + \\" ]\\"; - } -} -" -`; - -exports[`template integration tests using the generator should place the topic variables in the correct order 1`] = ` -" - - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.stream.function.StreamBridge; -import org.springframework.messaging.Message; -import org.springframework.messaging.support.MessageBuilder; - -@SpringBootApplication -public class Application { - - private static final Logger logger = LoggerFactory.getLogger(Application.class); - - @Autowired - private StreamBridge streamBridge; - - public static void main(String[] args) { - SpringApplication.run(Application.class); - } - - - public void sendAcmeBillingReceiptsReceiptIdCreatedVersionRegionsRegionChargifyRideId( - RideReceipt payload, String receiptId, String version, String region, String rideId - ) { - String topic = String.format(\\"acme/billing/receipts/%s/created/%s/regions/%s/chargify/%s\\", - receiptId, version, region, rideId); - streamBridge.send(topic, payload); - } -} -" -`; - -exports[`template integration tests using the generator should return object when avro union type is used specifying many possible types 1`] = ` -"package com.example.api.jobOrder; - - -import com.fasterxml.jackson.annotation.JsonInclude; - - - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class JobOrder { - - public JobOrder () { - } - - public JobOrder ( - String jobOrderId, - Object jobOrderDescription, - Object jobOrderLongDescription) { - this.jobOrderId = jobOrderId; - this.jobOrderDescription = jobOrderDescription; - this.jobOrderLongDescription = jobOrderLongDescription; - } - - private String jobOrderId; - private Object jobOrderDescription; - private Object jobOrderLongDescription; - public String getJobOrderId() { - return jobOrderId; - } - - public JobOrder setJobOrderId(String jobOrderId) { - this.jobOrderId = jobOrderId; - return this; - } - - - public Object getJobOrderDescription() { - return jobOrderDescription; - } - - public JobOrder setJobOrderDescription(Object jobOrderDescription) { - this.jobOrderDescription = jobOrderDescription; - return this; - } - - - public Object getJobOrderLongDescription() { - return jobOrderLongDescription; - } - - public JobOrder setJobOrderLongDescription(Object jobOrderLongDescription) { - this.jobOrderLongDescription = jobOrderLongDescription; - return this; - } - - public String toString() { - return \\"JobOrder [\\" - + \\" jobOrderId: \\" + jobOrderId - + \\" jobOrderDescription: \\" + jobOrderDescription.toString() - + \\" jobOrderLongDescription: \\" + jobOrderLongDescription.toString() - + \\" ]\\"; - } -} -" -`; diff --git a/test/compile_output.sh b/test/compile_output.sh new file mode 100755 index 00000000..659f1e15 --- /dev/null +++ b/test/compile_output.sh @@ -0,0 +1,276 @@ +#!/bin/bash + +# Script to compile Maven projects in output directory +# Usage: ./compile_output.sh [-d project-name] [-default] [-h|--help] +# -default: Compile all Maven projects in output directory +# -d project-name: Compile only that specific project +# -h, --help: Show this help message +# If no options are provided, shows this help message + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +OUTPUT_DIR="$SCRIPT_DIR/output" + +# Function to show help +show_help() { + echo "Usage: $0 [-d project-name] [-default] [-h|--help]" + echo "" + echo "Options:" + echo " -default Compile all Maven projects in output directory" + echo " -d project-name Compile only that specific Maven project" + echo " -h, --help Show this help message" + echo "" + echo "Examples:" + echo " $0 -default # Compile all Maven projects in output directory" + echo " $0 -d animals # Compile only the 'animals' project" + echo " $0 --help # Show this help message" + echo "" + echo "Default Directories:" + echo " Output Directory: $OUTPUT_DIR" + echo " Script Location: $SCRIPT_DIR" + echo "" +} + +# Parse command line arguments +SPECIFIED_PROJECT="" +DEFAULT_MODE=false + +while [[ $# -gt 0 ]]; do + case $1 in + -d) + if [[ -n "$2" && "$2" != -* ]]; then + SPECIFIED_PROJECT="$2" + shift 2 + else + echo "Error: -d requires a project name argument" + exit 1 + fi + ;; + -default) + DEFAULT_MODE=true + shift + ;; + -h|--help) + show_help + exit 0 + ;; + *) + echo "Error: Unknown option $1" + echo "Use -h or --help for usage information" + exit 1 + ;; + esac +done + +# If no options provided, show help +if [ -z "$SPECIFIED_PROJECT" ] && [ "$DEFAULT_MODE" = false ]; then + echo "No options specified. Use -default to compile all projects or -d to specify a project." + echo "" + show_help + exit 0 +fi + +# Check if output directory exists +if [ ! -d "$OUTPUT_DIR" ]; then + echo "Error: Output directory '$OUTPUT_DIR' does not exist!" + exit 1 +fi + +cd "$OUTPUT_DIR" + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +if [ -n "$SPECIFIED_PROJECT" ]; then + # Check if the specified project exists and has pom.xml + if [ ! -d "$SPECIFIED_PROJECT" ]; then + echo -e "${RED}Error: Project directory '$SPECIFIED_PROJECT' not found in output directory!${NC}" + echo -e "${YELLOW}Available projects in $OUTPUT_DIR:${NC}" + for folder in */; do + folder_name="${folder%/}" + if [ -f "$folder_name/pom.xml" ]; then + echo " - $folder_name (Maven project)" + else + echo " - $folder_name (non-Maven folder)" + fi + done + exit 1 + fi + + if [ ! -f "$SPECIFIED_PROJECT/pom.xml" ]; then + echo -e "${RED}Error: Project '$SPECIFIED_PROJECT' does not contain a pom.xml file!${NC}" + exit 1 + fi + + echo -e "${BLUE}=== Maven Compilation Script ===${NC}" + echo -e "${BLUE}Compiling specific project: $SPECIFIED_PROJECT${NC}" + echo "" + + # Process only the specified project + maven_projects=("$SPECIFIED_PROJECT") + non_maven_folders=() +elif [ "$DEFAULT_MODE" = true ]; then + echo -e "${BLUE}=== Maven Compilation Script ===${NC}" + echo -e "${BLUE}Compiling all Maven projects in output directory${NC}" + echo "" + + # Find all directories with pom.xml files + maven_projects=() + non_maven_folders=() + + for folder in */; do + # Remove trailing slash + folder_name="${folder%/}" + + # Skip the verified directory + if [[ "$folder_name" == "verified" ]]; then + continue + fi + + # Check if folder contains pom.xml + if [ -f "$folder_name/pom.xml" ]; then + maven_projects+=("$folder_name") + else + non_maven_folders+=("$folder_name") + fi + done +else + echo "Error: No valid operation specified" + exit 1 +fi + +echo -e "${YELLOW}Maven projects to compile (${#maven_projects[@]}):${NC}" +if [ ${#maven_projects[@]} -gt 0 ]; then + printf '%s\n' "${maven_projects[@]}" +else + echo "None" +fi +echo "" + +if [ "$DEFAULT_MODE" = true ] && [ ${#non_maven_folders[@]} -gt 0 ]; then + echo -e "${YELLOW}Non-Maven folders (${#non_maven_folders[@]}):${NC}" + printf '%s\n' "${non_maven_folders[@]}" + echo "" +fi + +# Compile each Maven project +compilations_attempted=0 +compilations_successful=0 +compilations_failed=0 +failed_projects=() + +for project in "${maven_projects[@]}"; do + echo -e "${GREEN}Compiling Maven project: '$project'...${NC}" + echo -e "${YELLOW}Executing: mvn compile in '$project'${NC}" + + # Record start time + start_time=$(date +%s) + + # Perform Maven compilation + cd "$project" + mvn_output=$(mvn compile 2>&1) + mvn_status=$? + cd .. + + # Calculate execution time + end_time=$(date +%s) + execution_time=$((end_time - start_time)) + + if [ $mvn_status -eq 0 ]; then + echo -e "${GREEN}βœ“ Compilation successful for '$project' (${execution_time}s)${NC}" + ((compilations_successful++)) + else + echo -e "${RED}βœ— Compilation failed for '$project' (${execution_time}s)${NC}" + echo -e "${RED}Error details:${NC}" + echo "$mvn_output" | tail -20 # Show last 20 lines of error + failed_projects+=("$project") + ((compilations_failed++)) + fi + + echo "----------------------------------------" + ((compilations_attempted++)) +done + +# Summary +echo "" +echo -e "${BLUE}=== Compilation Summary ===${NC}" +if [ "$DEFAULT_MODE" = true ]; then + echo -e "Total folders found: $((${#maven_projects[@]} + ${#non_maven_folders[@]}))" + echo -e "Maven projects found: ${#maven_projects[@]}" + echo -e "Non-Maven folders: ${#non_maven_folders[@]}" +else + echo -e "Project compiled: $SPECIFIED_PROJECT" +fi +echo -e "Compilations attempted: $compilations_attempted" +echo -e "Successful compilations: $compilations_successful" +echo -e "Failed compilations: $compilations_failed" + +if [ $compilations_failed -eq 0 ] && [ $compilations_attempted -gt 0 ]; then + echo -e "${GREEN}All Maven projects compiled successfully! βœ“${NC}" +elif [ $compilations_failed -gt 0 ]; then + echo -e "${RED}Failed projects:${NC}" + printf '%s\n' "${failed_projects[@]}" +fi + +echo "" + +# Optional: Create a detailed report (only for batch processing) +if [ "$DEFAULT_MODE" = true ]; then + read -p "Generate detailed compilation report to file? (y/N): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + report_file="$SCRIPT_DIR/compilation_report_$(date +%Y%m%d_%H%M%S).txt" + echo "Generating detailed report: $report_file" + + { + echo "=== MAVEN COMPILATION REPORT ===" + echo "Generated: $(date)" + echo "Directory: $OUTPUT_DIR" + echo "" + echo "=== SUMMARY ===" + echo "Total folders found: $((${#maven_projects[@]} + ${#non_maven_folders[@]}))" + echo "Maven projects found: ${#maven_projects[@]}" + echo "Non-Maven folders: ${#non_maven_folders[@]}" + echo "Compilations attempted: $compilations_attempted" + echo "Successful compilations: $compilations_successful" + echo "Failed compilations: $compilations_failed" + echo "" + + if [ ${#maven_projects[@]} -gt 0 ]; then + echo "=== MAVEN PROJECTS ===" + printf '%s\n' "${maven_projects[@]}" + echo "" + fi + + if [ ${#non_maven_folders[@]} -gt 0 ]; then + echo "=== NON-MAVEN FOLDERS ===" + printf '%s\n' "${non_maven_folders[@]}" + echo "" + fi + + if [ ${#failed_projects[@]} -gt 0 ]; then + echo "=== FAILED PROJECTS ===" + for project in "${failed_projects[@]}"; do + echo "=== Compilation output for '$project' ===" + cd "$project" + mvn compile 2>&1 + cd .. + echo "" + done + fi + + } > "$report_file" + + echo -e "${GREEN}Report saved to: $report_file${NC}" + fi +fi + +# Exit with appropriate code +if [ $compilations_failed -gt 0 ]; then + exit 1 +else + exit 0 +fi \ No newline at end of file diff --git a/test/generate_code_for_mocks.js b/test/generate_code_for_mocks.js new file mode 100644 index 00000000..85bc6e7a --- /dev/null +++ b/test/generate_code_for_mocks.js @@ -0,0 +1,163 @@ +const path = require('path'); +const Generator = require('@asyncapi/generator'); +const { rmdirSync, existsSync, readdirSync } = require('fs'); +const { logger } = require('../utils/logger'); +const Module = require('module'); + +// Patch require.resolve to fake 'npm' for @asyncapi/generator +const originalResolve = Module._resolveFilename; +Module._resolveFilename = function(request, parent, isMain, options) { + if (request === 'npm') { + // Return a dummy path, as the generator only uses it for a path string + return '/usr/local/lib/node_modules/npm/lib/npm.js'; + } + return originalResolve.apply(this, arguments); +}; + +// Get command line arguments +const args = process.argv.slice(2); +const specifiedFile = args[0]; + +// Get custom output directory from environment variable, or use default +const customOutputDir = process.env.OUTPUT_DIR; +const defaultOutputDir = path.join(__dirname, 'output'); +const baseOutputDir = customOutputDir || defaultOutputDir; + +// Dynamically read all .yaml files from mocks directory +const dirName = 'mocks'; +const mocksDir = path.join(__dirname, dirName); +const allFileNames = readdirSync(mocksDir) + .filter(file => file.endsWith('.yaml') || file.endsWith('.yml') || file.endsWith('.json')) + .sort(); + +// Determine which files to process +let fileNames; +if (specifiedFile) { + if (allFileNames.includes(specifiedFile)) { + fileNames = [specifiedFile]; + console.log(`🎯 Processing specified file: ${specifiedFile}`); + } else { + console.error(`❌ File '${specifiedFile}' not found in mocks directory.`); + console.log('πŸ“ Available files:', allFileNames); + process.exit(1); + } +} else { + fileNames = allFileNames; + console.log(`πŸš€ Processing all ${fileNames.length} AsyncAPI documents...`); +} + +const templatePath = path.resolve(__dirname, '../'); + +const runGenerator = async (fileName, idx, total) => { + const dummySpecPath = path.join(__dirname, `${dirName}/${fileName}`); + const baseFileName = path.basename(fileName, path.extname(fileName)); + const outputDir = path.resolve(baseOutputDir, baseFileName); + + // Force immediate output for file header + console.log(`\n===============================================================`); + console.log(`[${idx + 1}/${total}] Processing: ${fileName}`); + console.log(`πŸ“ Output: ${outputDir}`); + console.log(`===============================================================`); + process.stdout.write(''); // Force flush + + // Clean up existing output directory + if (existsSync(outputDir)) { + rmdirSync(outputDir, { recursive: true, force: true }); + } + + let resultMsg = ''; + let success = false; + try { + const generator = new Generator(templatePath, outputDir, { + forceWrite: true, + debug: process.env.DEBUG === 'true' || process.env.LOG_LEVEL === 'DEBUG', + templateParams: { + binder: 'solace' + } + }); + + // Store the original file path in the generator context for post-process hook + generator.originalAsyncApiFilePath = dummySpecPath; + await generator.generateFromFile(dummySpecPath); + + if (existsSync(outputDir)) { + const files = readdirSync(outputDir, { recursive: true }); + const fileCount = files.length; + resultMsg = `βœ… SUCCESS: Generated ${fileCount} files for ${fileName}`; + success = true; + } else { + resultMsg = `⚠️ WARNING: No output directory created for ${fileName}`; + } + } catch (error) { + resultMsg = `❌ FAILED: ${fileName} - ${error.message}`; + if (process.env.LOG_LEVEL === 'DEBUG') { + logger.debug('Stack trace:', error.stack); + } + } + + // Summary and separator - force immediate output + console.log(resultMsg); + console.log('────────────────────────────────────────────────────────────────'); + process.stdout.write(''); // Force flush + return success; +}; + +const runAllTests = async () => { + console.log(`\nπŸ§ͺ Starting AsyncAPI code generation tests...`); + console.log(`πŸ“‚ Template: ${templatePath}`); + console.log(`πŸ“ Source: ${mocksDir}`); + console.log(`πŸ“ Output: ${baseOutputDir}`); + console.log(`πŸ“‹ Files to process: ${fileNames.length}\n`); + + const startTime = Date.now(); + let successCount = 0; + let failureCount = 0; + const successfulFiles = []; + const failedFiles = []; + + for (let i = 0; i < fileNames.length; i++) { + const fileName = fileNames[i]; + const success = await runGenerator(fileName, i, fileNames.length); + if (success) { + successCount++; + successfulFiles.push(fileName); + } else { + failureCount++; + failedFiles.push(fileName); + } + } + + const endTime = Date.now(); + const duration = ((endTime - startTime) / 1000).toFixed(2); + + console.log(`\nπŸ“Š Test Results:`); + console.log(` βœ… Successful: ${successCount}`); + console.log(` ❌ Failed: ${failureCount}`); + console.log(` ⏱️ Duration: ${duration}s`); + + if (failedFiles.length > 0) { + console.log(`\n❌ Failed Files:`); + failedFiles.forEach(file => { + console.log(` - ${file}`); + }); + } + + if (successfulFiles.length > 0) { + console.log(`\nβœ… Successful Files:`); + successfulFiles.forEach(file => { + console.log(` - ${file}`); + }); + } + + console.log(`\nπŸ“ Generated code available in: ${baseOutputDir}`); + + // Exit with appropriate code + process.exit(failureCount > 0 ? 1 : 0); +}; + +// Run the tests +runAllTests().catch(error => { + console.error('❌ Unexpected error:', error); + process.exit(1); +}); + diff --git a/test/generate_output.sh b/test/generate_output.sh new file mode 100755 index 00000000..ea1f58ed --- /dev/null +++ b/test/generate_output.sh @@ -0,0 +1,287 @@ +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +MOCKS_DIR="$SCRIPT_DIR/mocks" +DEFAULT_OUTPUT_DIR="$SCRIPT_DIR/output" +TEST_JS="$SCRIPT_DIR/generate_code_for_mocks.js" + +# Script to generate code for AsyncAPI files +# Usage: ./generate_output.sh [-f filename] [-o output-dir] [-default] [-h|--help] +# -default: Generate code for all files in mocks directory +# -f filename: Generate code for a specific file (can include full path) +# -o output-dir: Specify output directory for generated code (default: test/output) +# -h, --help: Show this help message +# If no options are provided, shows this help message + +# Function to show help +show_help() { + echo "Usage: $0 [-f filename] [-o output-dir] [-default] [-h|--help]" + echo "" + echo "Options:" + echo " -default Generate code for all files in mocks directory" + echo " -f filename Generate code for a specific AsyncAPI file (can include full path)" + echo " -o output-dir Specify output directory for generated code (default: test/output)" + echo " -h, --help Show this help message" + echo "" + echo "Examples:" + echo " $0 -default # Generate code for all files in mocks directory" + echo " $0 -f /temp/animals.yaml # Generate code for animals.yaml" + echo " $0 -f file.yaml -o /output # Generate specific file to custom output" + echo " $0 -default -o /custom/output # Generate all files to custom output" + echo " $0 --help # Show this help message" + echo "" + echo "Default Directories:" + echo " Mocks Directory: $MOCKS_DIR" + echo " Default Output: $DEFAULT_OUTPUT_DIR" + echo " Test Script: $TEST_JS" + echo "" +} + +# Parse command line arguments +SPECIFIED_FILE="" +OUTPUT_DIR="$DEFAULT_OUTPUT_DIR" +DEFAULT_MODE=false + +while [[ $# -gt 0 ]]; do + case $1 in + -f) + if [[ -n "$2" && "$2" != -* ]]; then + SPECIFIED_FILE="$2" + shift 2 + else + echo "Error: -f requires a filename argument" + exit 1 + fi + ;; + -o) + if [[ -n "$2" && "$2" != -* ]]; then + OUTPUT_DIR="$2" + shift 2 + else + echo "Error: -o requires an output directory argument" + exit 1 + fi + ;; + -default) + DEFAULT_MODE=true + shift + ;; + -h|--help) + show_help + exit 0 + ;; + *) + echo "Error: Unknown option $1" + echo "Use -h or --help for usage information" + exit 1 + ;; + esac +done + +# If no options provided, show help +if [ -z "$SPECIFIED_FILE" ] && [ "$DEFAULT_MODE" = false ]; then + echo "No options specified. Use -default to process all files or -f to specify a file." + echo "" + show_help + exit 0 +fi + +# Check if mocks directory exists (only needed for batch processing) +if [ ! -d "$MOCKS_DIR" ]; then + echo "Error: Mocks directory '$MOCKS_DIR' does not exist!" + exit 1 +fi + +# Check if code generation script exists +if [ ! -f "$TEST_JS" ]; then + echo "Error: '$TEST_JS' does not exist!" + exit 1 +fi + +# Create output directory if it doesn't exist +if [ ! -d "$OUTPUT_DIR" ]; then + echo "Creating output directory: $OUTPUT_DIR" + mkdir -p "$OUTPUT_DIR" +fi + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +cd "$SCRIPT_DIR" + +if [ -n "$SPECIFIED_FILE" ]; then + # Check if the specified file exists (can be any path) + if [ ! -f "$SPECIFIED_FILE" ]; then + echo -e "${RED}Error: File '$SPECIFIED_FILE' not found!${NC}" + exit 1 + fi + + # Get just the filename for processing (without path) + FILENAME=$(basename "$SPECIFIED_FILE") + + echo -e "${BLUE}=== Code Generation Script ===${NC}" + echo -e "${BLUE}Generating code for specific file: $SPECIFIED_FILE${NC}" + echo -e "${BLUE}Output directory: $OUTPUT_DIR${NC}" + echo "" + + # Process only the specified file + mock_files=("$FILENAME") + + # Create a temporary copy in mocks directory for processing + TEMP_COPY="$MOCKS_DIR/$FILENAME" + cp "$SPECIFIED_FILE" "$TEMP_COPY" + echo -e "${YELLOW}Copied file to temporary location: $TEMP_COPY${NC}" + echo "" +elif [ "$DEFAULT_MODE" = true ]; then + echo -e "${BLUE}=== Code Generation Script ===${NC}" + echo -e "${BLUE}Generating code for all files in mocks directory${NC}" + echo -e "${BLUE}Output directory: $OUTPUT_DIR${NC}" + echo "" + + # Find all files in mocks directory + mock_files=() + + cd "$MOCKS_DIR" + for file in *; do + # Skip directories and hidden files + if [ -f "$file" ] && [[ ! "$file" == .* ]]; then + mock_files+=("$file") + fi + done + + cd "$SCRIPT_DIR" +else + echo "Error: No valid operation specified" + exit 1 +fi + +echo -e "${YELLOW}Files to process (${#mock_files[@]}):${NC}" +printf '%s\n' "${mock_files[@]}" +echo "" + +# Process each mock file +generations_attempted=0 +generations_successful=0 +generations_failed=0 +failed_files=() + +echo -e "${BLUE}=== Generating Code ===${NC}" + +for file in "${mock_files[@]}"; do + echo -e "${GREEN}Processing mock file: '$file'...${NC}" + echo -e "${YELLOW}Executing: node "$TEST_JS" "$file"${NC}" + + # Execute the code generation + start_time=$(date +%s) + output=$(OUTPUT_DIR="$OUTPUT_DIR" node "$TEST_JS" "$file" 2>&1) + exit_status=$? + end_time=$(date +%s) + duration=$((end_time - start_time)) + + if [ $exit_status -eq 0 ]; then + echo -e "${GREEN}βœ“ Successfully generated code for '$file' (${duration}s)${NC}" + ((generations_successful++)) + else + echo -e "${RED}βœ— Failed to generate code for '$file' (${duration}s):${NC}" + echo "$output" + failed_files+=("$file") + ((generations_failed++)) + fi + + echo "----------------------------------------" + ((generations_attempted++)) +done + +# Clean up temporary copy if it was created +if [ -n "$SPECIFIED_FILE" ] && [ -f "$TEMP_COPY" ]; then + rm "$TEMP_COPY" + echo -e "${YELLOW}Cleaned up temporary file: $TEMP_COPY${NC}" + echo "" +fi + +# Summary +echo "" +echo -e "${BLUE}=== Summary ===${NC}" +echo -e "Files processed: ${#mock_files[@]}" +echo -e "Generations attempted: $generations_attempted" +echo -e "Generations successful: $generations_successful" +echo -e "Generations failed: $generations_failed" +echo -e "Output directory: $OUTPUT_DIR" + +if [ $generations_failed -eq 0 ]; then + echo -e "${GREEN}All code generations completed successfully! βœ“${NC}" +else + echo -e "${RED}Failed to generate code for $generations_failed file(s) βœ—${NC}" + echo -e "${YELLOW}Failed files:${NC}" + printf '%s\n' "${failed_files[@]}" +fi + +echo "" + +# Optional: Create a detailed report (only for batch processing) +if [ "$DEFAULT_MODE" = true ]; then + read -p "Generate detailed generation report to file? (y/N): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + report_file="$SCRIPT_DIR/generation_report_$(date +%Y%m%d_%H%M%S).txt" + echo "Generating detailed report: $report_file" + + { + echo "=== CODE GENERATION REPORT ===" + echo "Generated: $(date)" + echo "Mocks Directory: $MOCKS_DIR" + echo "Output Directory: $OUTPUT_DIR" + echo "Test Script: $TEST_JS" + echo "" + echo "Summary:" + echo " Files processed: ${#mock_files[@]}" + echo " Generations attempted: $generations_attempted" + echo " Generations successful: $generations_successful" + echo " Generations failed: $generations_failed" + echo "" + + # List all mock files + echo "=== FILES PROCESSED ===" + for file in "${mock_files[@]}"; do + echo " - $file" + done + echo "" + + # Failed files details + if [ $generations_failed -gt 0 ]; then + echo "=== FAILED GENERATIONS ===" + for file in "${failed_files[@]}"; do + echo "=== Failed: $file ===" + echo "Command: node $TEST_JS $file" + node "$TEST_JS" "$file" 2>&1 || true + echo "" + done + fi + + # List generated output directories + echo "=== GENERATED OUTPUT DIRECTORIES ===" + if [ -d "$OUTPUT_DIR" ]; then + cd "$OUTPUT_DIR" + for dir in */; do + if [ -d "$dir" ]; then + dir_name="${dir%/}" + echo " - $dir_name" + fi + done + fi + + } > "$report_file" + + echo -e "${GREEN}Report saved to: $report_file${NC}" + fi +fi + +# Exit with appropriate code +if [ $generations_failed -gt 0 ]; then + exit 1 +else + exit 0 +fi diff --git a/test/integration.test.js b/test/integration.test.js index 42728cbf..492fd01a 100644 --- a/test/integration.test.js +++ b/test/integration.test.js @@ -1,243 +1,527 @@ const path = require('path'); +const fs = require('fs').promises; const Generator = require('@asyncapi/generator'); -const { readFile } = require('fs').promises; -const crypto = require('crypto'); - -const TEST_SUITE_NAME = 'template integration tests using the generator'; -// Constants not overridden per test -const TEST_FOLDER_NAME = 'test'; -const MAIN_TEST_RESULT_PATH = path.join(TEST_FOLDER_NAME, 'temp', 'integrationTestResult'); - -// Unfortunately, the test suite name must be a hard coded string -describe('template integration tests using the generator', () => { - jest.setTimeout(30000); - - // Constants that may be overridden per test - const DEFAULT_PACKAGE = 'com.acme'; - const DEFAULT_PACKAGE_PATH = path.join(...DEFAULT_PACKAGE.split('.')); +const TEST_SUITE_NAME = 'Comprehensive Integration Tests - ALL AsyncAPI Files Validation'; + +// Constants for folder identification +const MOCKS_FOLDER = path.join('test', 'mocks'); +const OUTPUT_FOLDER = path.join('test', 'output'); +const TEMP_OUTPUT_FOLDER = path.join('test', 'temp', 'comprehensiveIntegrationTestResult'); + +// ALL AsyncAPI files in the mocks directory +const ALL_ASYNCAPI_FILES = [ + // Basic test files + 'animals.yaml', + 'animals-same-function-name.yaml', + 'simple-test.yaml', + 'function-name-test.yaml', + 'error-reporter.yaml', + 'no-payload-message.yaml', + 'primitive-types-test.yaml', + 'parameters-to-headers-test.yaml', + + // Complex schema files + 'nested-arrays.yaml', + 'schema-with-array-of-objects.yaml', + 'schemas-with-duplicate-$ids.yaml', + 'multivariable-topic.yaml', + 'multivariable-topic-2.6.yaml', + 'dynamic-topic-same-function-name.yaml', + + // Avro schema files + 'avro-complex-test.yaml', + 'avro-union-object.yaml', + 'avro-schema-namespace.yaml', + 'kafka-avro.yaml', + + // Solace application files + 'solace-test-app.yaml', + 'smarty-lighting-streetlights.yaml', + 'smarty-lighting-streetlights-check.yaml', + + // Large Solace JSON files + 'solace-smart-shelf-inventory-control.json', + 'solace-point-of-sale-system.json', + 'solace-payment-processor.json', + 'solace-order-management-v2.json', + 'solace-order-management-v1.json', + 'solace-loyalty-program-manager.json', + 'solace-logistics.json', + 'solace-in-store-fulfillment-mobile-application.json', + 'solace-data-product-real-time-customer-sentiment.json', + 'solace-data-product-daily-store-sales-summary.json', + 'solace-customer-loyalty-management.json', + 'solace-customer-fraud-prevention.json', + 'solace-customer-facing-mobile-app-v2.json', + 'solace-customer-facing-mobile-app-v1.json', + 'solace-core-banking-v2.json', + 'solace-core-banking-v1.json' +]; + +describe(TEST_SUITE_NAME, () => { let outputDirectory; - const generateFolderName = () => { - // we always want to generate to new directory to make sure test runs in clear environment - const testName = expect.getState().currentTestName.substring(TEST_SUITE_NAME.length + 1); - return path.resolve(MAIN_TEST_RESULT_PATH, `${testName } - ${ crypto.randomBytes(4).toString('hex')}`); + // Helper function to generate code from AsyncAPI file + const generate = async (asyncApiFilePath, params = {}) => { + // Use the same template parameters as the work script for consistency, but without view: provider + const defaultParams = { + binder: 'solace', + ...params + }; + + const generator = new Generator( + path.normalize('./'), + outputDirectory, + { forceWrite: true, templateParams: defaultParams } + ); + return generator.generateFromFile(path.resolve(MOCKS_FOLDER, asyncApiFilePath)); }; - const generate = (asyncApiFilePath, params) => { - const generator = new Generator(path.normalize('./'), outputDirectory, { forceWrite: true, templateParams: params }); - return generator.generateFromFile(path.resolve(TEST_FOLDER_NAME, asyncApiFilePath)); + // Helper function to check if file exists + const assertFileExists = async (filePath) => { + const fullPath = path.join(outputDirectory, filePath); + try { + await fs.access(fullPath); + return true; + } catch (error) { + return false; + } }; - const assertExpectedFiles = async (expectedFiles) => { - for (const index in expectedFiles) { - const file = await readFile(path.join(outputDirectory, expectedFiles[index]), 'utf8'); - expect(file).toMatchSnapshot(); - } + // Helper function to read file content + const readFileContent = async (filePath) => { + const fullPath = path.join(outputDirectory, filePath); + return await fs.readFile(fullPath, 'utf8'); }; beforeEach(() => { - outputDirectory = generateFolderName(); + outputDirectory = path.join(TEMP_OUTPUT_FOLDER, `test-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`); }); - it('should generate application files using the solace binder', async () => { - const params = { - binder: 'solace', - javaPackage: DEFAULT_PACKAGE, - host: 'testVmrUri', - username: 'user', - password: 'test', //NOSONAR - msgVpn: 'vpnName', - artifactId: 'asyncApiFileName' - }; - - await generate('mocks/solace-test-app.yaml', params); - - const validatedFiles = [ - 'pom.xml', - 'README.md', - `src/main/java/${DEFAULT_PACKAGE_PATH}/Application.java`, - `src/main/java/${DEFAULT_PACKAGE_PATH}/MySchema.java`, - 'src/main/resources/application.yml' - ]; - await assertExpectedFiles(validatedFiles); - }); - - it('should generate a consumer and return a payload when using x-scs-function-name and dynamic topic binding', async () => { - await generate('mocks/scs-function-name/dynamic-topic-same-function-name.yaml'); + // ============================================================================ + // COMPREHENSIVE FILE STRUCTURE VALIDATION FOR ALL ASYNCAPI FILES + // ============================================================================ - const validatedFiles = [ - 'src/main/java/Application.java' - ]; - await assertExpectedFiles(validatedFiles); - }); - - it('should generate a function and return a payload when using x-scs-function-name and a static topic', async () => { - await generate('mocks/scs-function-name/animals-same-function-name.yaml'); - - const validatedFiles = [ - 'src/main/java/Application.java' - ]; - await assertExpectedFiles(validatedFiles); + describe('Comprehensive File Structure Validation', () => { + it('should generate essential Maven project structure for ALL AsyncAPI files', async () => { + console.log(`Testing ${ALL_ASYNCAPI_FILES.length} AsyncAPI files for essential structure...`); + + for (let i = 0; i < ALL_ASYNCAPI_FILES.length; i++) { + const testFile = ALL_ASYNCAPI_FILES[i]; + console.log(`[${i + 1}/${ALL_ASYNCAPI_FILES.length}] Testing: ${testFile}`); + + try { + await generate(testFile); + + // Essential files that must always be generated + const essentialFiles = [ + 'pom.xml', + 'README.md', + 'src/main/java/com/company/Application.java', + 'src/main/resources/application.yml' + ]; + + for (const file of essentialFiles) { + const exists = await assertFileExists(file); + expect(exists).toBe(true); + } + + console.log(`βœ“ ${testFile} - Essential structure validated`); + } catch (error) { + console.error(`βœ— ${testFile} - Failed:`, error.message); + throw error; + } + } + }, 600000); // 10 minutes timeout for all files }); - it('should generate extra config when using the paramatersToHeaders parameter', async () => { - const params = { - binder: 'solace', - javaPackage: DEFAULT_PACKAGE, - host: 'testVmrUri', - username: 'user', - password: 'test', //NOSONAR - msgVpn: 'vpnName', - artifactId: 'asyncApiFileName', - parametersToHeaders: true - }; - - await generate('mocks/solace-test-app.yaml', params); - - const validatedFiles = [ - `src/main/java/${DEFAULT_PACKAGE_PATH}/Application.java`, - 'src/main/resources/application.yml' - ]; - await assertExpectedFiles(validatedFiles); - }); - - it('should generate a comment for a consumer receiving multiple messages', async () => { - await generate('mocks/animals.yaml'); - - const validatedFiles = [ - 'src/main/java/Application.java' - ]; - await assertExpectedFiles(validatedFiles); - }); - - it('avro schemas should appear in a package based on their namespace, if any.', async () => { - // Note that this file has 2 Avro schemas named User, but one has the namespace 'userpublisher.' - const AVRO_PACKAGE_PATH = 'userpublisher'; - const params = { - binder: 'kafka', - javaPackage: DEFAULT_PACKAGE, - artifactId: 'asyncApiFileName' - }; - await generate('mocks/kafka-avro.yaml', params); - - const validatedFiles = [ - `src/main/java/${DEFAULT_PACKAGE_PATH}/User.java`, - `src/main/java/${AVRO_PACKAGE_PATH}/User.java`, - ]; - await assertExpectedFiles(validatedFiles); - }); - - it('should generate a model subclass when it sees an allOf', async () => { - const params = { - javaPackage: DEFAULT_PACKAGE, - artifactId: 'asyncApiFileName' - }; - await generate('mocks/error-reporter.yaml', params); - - const validatedFiles = [ - `src/main/java/${DEFAULT_PACKAGE_PATH}/ExtendedErrorModel.java` - ]; - await assertExpectedFiles(validatedFiles); + // ============================================================================ + // POM.XML VALIDATION FOR ALL FILES + // ============================================================================ + + describe('POM.XML Validation for All Files', () => { + it('should generate valid pom.xml with correct dependencies for ALL AsyncAPI files', async () => { + console.log(`Testing ${ALL_ASYNCAPI_FILES.length} AsyncAPI files for pom.xml validation...`); + + for (let i = 0; i < ALL_ASYNCAPI_FILES.length; i++) { + const testFile = ALL_ASYNCAPI_FILES[i]; + console.log(`[${i + 1}/${ALL_ASYNCAPI_FILES.length}] Testing pom.xml for: ${testFile}`); + + try { + await generate(testFile); + const pomXml = await readFileContent('pom.xml'); + + // Essential Maven structure validation + expect(pomXml).toContain(''); + expect(pomXml).toContain('com.company'); + expect(pomXml).toContain('project-name'); + // Version can be any valid Maven version format + expect(pomXml).toMatch(/[^<]+<\/version>/); + expect(pomXml).toContain(''); + expect(pomXml).toContain(''); + expect(pomXml).toContain(''); + + // Check for Spring Boot parent + expect(pomXml).toContain('spring-boot-starter-parent'); + + // Check for Solace dependency + expect(pomXml).toContain('spring-cloud-starter-stream-solace'); + + // Check for dependency management + expect(pomXml).toContain('spring-cloud-dependencies'); + expect(pomXml).toContain('solace-spring-cloud-bom'); + + // Check for Spring Boot Maven plugin + expect(pomXml).toContain('spring-boot-maven-plugin'); + + console.log(`βœ“ ${testFile} - pom.xml validated`); + } catch (error) { + console.error(`βœ— ${testFile} - pom.xml validation failed:`, error.message); + throw error; + } + } + }, 600000); // 10 minutes timeout for all files }); - it('should generate schemas with nested arrays', async () => { - await generate('mocks/nested-arrays.yaml'); - - const validatedFiles = [ - 'src/main/java/Application.java', - 'src/main/java/Dossier.java', - 'src/main/java/Debtor.java' - ]; - await assertExpectedFiles(validatedFiles); + // ============================================================================ + // APPLICATION.YML VALIDATION FOR ALL FILES + // ============================================================================ + + describe('Application.YML Validation for All Files', () => { + it('should generate valid application.yml with Solace configuration for ALL AsyncAPI files', async () => { + console.log(`Testing ${ALL_ASYNCAPI_FILES.length} AsyncAPI files for application.yml validation...`); + + for (let i = 0; i < ALL_ASYNCAPI_FILES.length; i++) { + const testFile = ALL_ASYNCAPI_FILES[i]; + console.log(`[${i + 1}/${ALL_ASYNCAPI_FILES.length}] Testing application.yml for: ${testFile}`); + + try { + await generate(testFile); + const appYml = await readFileContent('src/main/resources/application.yml'); + + // Essential Spring Cloud Stream configuration validation + expect(appYml).toContain('spring:'); + expect(appYml).toContain('cloud:'); + expect(appYml).toContain('function:'); + expect(appYml).toContain('stream:'); + expect(appYml).toContain('bindings:'); + expect(appYml).toContain('binders:'); + + // Check for function definition + expect(appYml).toContain('definition:'); + + // Check for Solace binder configuration + expect(appYml).toContain('solace-binder:'); + expect(appYml).toContain('type: solace'); + + // Check for Solace environment configuration + expect(appYml).toContain('environment:'); + expect(appYml).toContain('solace:'); + expect(appYml).toContain('java:'); + expect(appYml).toContain('host:'); + expect(appYml).toContain('msgVpn:'); + expect(appYml).toContain('clientUsername:'); + expect(appYml).toContain('clientPassword:'); + + // Check for logging configuration + expect(appYml).toContain('logging:'); + expect(appYml).toContain('level:'); + + console.log(`βœ“ ${testFile} - application.yml validated`); + } catch (error) { + console.error(`βœ— ${testFile} - application.yml validation failed:`, error.message); + throw error; + } + } + }, 600000); // 10 minutes timeout for all files }); - it('should generate code from the smarty lighting streetlights example', async () => { - await generate('mocks/smarty-lighting-streetlights.yaml'); - - const validatedFiles = [ - 'src/main/java/Application.java', - 'src/main/java/DimLightPayload.java', - 'src/main/java/LightMeasuredPayload.java', - 'src/main/java/SentAt.java', - 'src/main/java/TurnOnOffPayload.java', - 'src/main/java/SubObject.java' - ]; - await assertExpectedFiles(validatedFiles); + // ============================================================================ + // APPLICATION.JAVA VALIDATION FOR ALL FILES + // ============================================================================ + + describe('Application.Java Validation for All Files', () => { + it('should generate valid Application.java with proper Spring Boot structure for ALL AsyncAPI files', async () => { + console.log(`Testing ${ALL_ASYNCAPI_FILES.length} AsyncAPI files for Application.java validation...`); + + for (let i = 0; i < ALL_ASYNCAPI_FILES.length; i++) { + const testFile = ALL_ASYNCAPI_FILES[i]; + console.log(`[${i + 1}/${ALL_ASYNCAPI_FILES.length}] Testing Application.java for: ${testFile}`); + + try { + await generate(testFile); + const appJava = await readFileContent('src/main/java/com/company/Application.java'); + + // Essential Spring Boot structure validation + expect(appJava).toContain('package com.company;'); + expect(appJava).toContain('import org.springframework.boot.SpringApplication;'); + expect(appJava).toContain('import org.springframework.boot.autoconfigure.SpringBootApplication;'); + expect(appJava).toContain('@SpringBootApplication'); + expect(appJava).toContain('public class Application'); + expect(appJava).toContain('public static void main(String[] args)'); + expect(appJava).toContain('SpringApplication.run(Application.class'); + + // Check for logger + expect(appJava).toContain('LoggerFactory.getLogger(Application.class)'); + + // Check for balanced braces + const openBraces = (appJava.match(/\{/g) || []).length; + const closeBraces = (appJava.match(/\}/g) || []).length; + expect(openBraces).toBe(closeBraces); + + console.log(`βœ“ ${testFile} - Application.java validated`); + } catch (error) { + console.error(`βœ— ${testFile} - Application.java validation failed:`, error.message); + throw error; + } + } + }, 600000); // 10 minutes timeout for all files }); - it('should package and import schemas in another avro namespace', async () => { - await generate('mocks/avro-schema-namespace.yaml'); - - const validatedFiles = [ - 'src/main/java/Application.java', - 'src/main/java/com/example/api/jobOrder/JobOrder.java', - 'src/main/java/com/example/api/jobAck/JobAcknowledge.java' - ]; - await assertExpectedFiles(validatedFiles); + // ============================================================================ + // SPECIFIC PATTERN VALIDATION FOR SELECTED FILES + // ============================================================================ + + describe('Specific Pattern Validation for Key Files', () => { + it('should validate specific patterns for key AsyncAPI files', async () => { + const keyTestFiles = [ + { file: 'animals.yaml', patterns: ['Supplier', 'Consumer', 'Message'] }, + { file: 'function-name-test.yaml', patterns: ['Function', 'Order', 'Result'] }, + { file: 'multivariable-topic.yaml', patterns: ['StreamBridge', 'Region', 'enum'] }, + { file: 'avro-complex-test.yaml', patterns: ['ComplexJobOrder', 'Consumer'] }, + { file: 'nested-arrays.yaml', patterns: ['Dossier', 'Debtor', 'StreamBridge'] }, + { file: 'error-reporter.yaml', patterns: ['ExtendedErrorModel', 'Supplier'] } + ]; + + for (const testCase of keyTestFiles) { + console.log(`Testing specific patterns for: ${testCase.file}`); + + try { + await generate(testCase.file); + const appJava = await readFileContent('src/main/java/com/company/Application.java'); + + for (const pattern of testCase.patterns) { + expect(appJava).toContain(pattern); + } + + console.log(`βœ“ ${testCase.file} - Specific patterns validated`); + } catch (error) { + console.error(`βœ— ${testCase.file} - Specific pattern validation failed:`, error.message); + throw error; + } + } + }, 300000); // 5 minutes timeout for key files }); - it('should return object when avro union type is used specifying many possible types', async () => { - await generate('mocks/avro-union-object.yaml'); - - const validatedFiles = [ - 'src/main/java/com/example/api/jobOrder/JobOrder.java' - ]; - await assertExpectedFiles(validatedFiles); + // ============================================================================ + // MODEL CLASS VALIDATION FOR FILES WITH SCHEMAS + // ============================================================================ + + describe('Model Class Validation for Files with Schemas', () => { + it('should generate model classes for files with defined schemas', async () => { + const schemaTestFiles = [ + { file: 'animals.yaml', expectedClasses: ['Cat.java', 'Dog.java'] }, + { file: 'function-name-test.yaml', expectedClasses: ['Order.java', 'Result.java', 'Data.java'] }, + { file: 'nested-arrays.yaml', expectedClasses: ['Debtor.java', 'Dossier.java'] }, + { file: 'error-reporter.yaml', expectedClasses: ['ExtendedErrorModel.java'] } + ]; + + for (const testCase of schemaTestFiles) { + console.log(`Testing model classes for: ${testCase.file}`); + + try { + await generate(testCase.file); + + for (const expectedClass of testCase.expectedClasses) { + const classPath = `src/main/java/com/company/${expectedClass}`; + const exists = await assertFileExists(classPath); + expect(exists).toBe(true); + + // Validate basic class structure + const classContent = await readFileContent(classPath); + expect(classContent).toContain('package com.company;'); + expect(classContent).toContain('public class'); + expect(classContent).toContain('@JsonInclude'); + } + + console.log(`βœ“ ${testCase.file} - Model classes validated`); + } catch (error) { + console.error(`βœ— ${testCase.file} - Model class validation failed:`, error.message); + throw error; + } + } + }, 300000); // 5 minutes timeout for schema files }); - it('should place the topic variables in the correct order', async () => { - // For a topic of test/{var1}/{var2}, the listed params in the asyncapi document can be in any order - await generate('mocks/multivariable-topic.yaml'); - - const validatedFiles = [ - 'src/main/java/Application.java' - ]; - await assertExpectedFiles(validatedFiles); + // ============================================================================ + // EMPTY OBJECT SCHEMA VALIDATION + // ============================================================================ + + describe('Empty Object Schema Validation', () => { + it('should handle empty object schemas correctly', async () => { + // Test files that might have empty object schemas + const emptyObjectTestFiles = [ + 'multivariable-topic.yaml', // Has RideReceipt schema + 'simple-test.yaml', + 'no-payload-message.yaml' + ]; + + for (const testFile of emptyObjectTestFiles) { + console.log(`Testing empty object schema handling for: ${testFile}`); + + try { + await generate(testFile); + const appJava = await readFileContent('src/main/java/com/company/Application.java'); + + // Should generate valid Java code regardless of empty schemas + expect(appJava).toContain('@SpringBootApplication'); + expect(appJava).toContain('public static void main(String[] args)'); + + // Check for balanced braces + const openBraces = (appJava.match(/\{/g) || []).length; + const closeBraces = (appJava.match(/\}/g) || []).length; + expect(openBraces).toBe(closeBraces); + + console.log(`βœ“ ${testFile} - Empty object schema handling validated`); + } catch (error) { + console.error(`βœ— ${testFile} - Empty object schema validation failed:`, error.message); + throw error; + } + } + }, 300000); // 5 minutes timeout }); - it('should not populate application yml with functions that are not beans', async () => { - // If the function is a supplier or using a stream bridge, the function isn't a bean and shouldnt be in application.yml - await generate('mocks/multivariable-topic.yaml'); - - const validatedFiles = [ - 'src/main/resources/application.yml' - ]; - await assertExpectedFiles(validatedFiles); + // ============================================================================ + // AVRO SCHEMA VALIDATION + // ============================================================================ + + describe('Avro Schema Validation', () => { + it('should handle all Avro schema patterns correctly', async () => { + const avroTestFiles = [ + 'avro-complex-test.yaml', + 'avro-union-object.yaml', + 'avro-schema-namespace.yaml', + 'kafka-avro.yaml' + ]; + + for (const testFile of avroTestFiles) { + console.log(`Testing Avro schema handling for: ${testFile}`); + + try { + await generate(testFile); + const appJava = await readFileContent('src/main/java/com/company/Application.java'); + + // Should generate valid Java code for Avro schemas + expect(appJava).toContain('@SpringBootApplication'); + expect(appJava).toContain('public static void main(String[] args)'); + + // Check for balanced braces + const openBraces = (appJava.match(/\{/g) || []).length; + const closeBraces = (appJava.match(/\}/g) || []).length; + expect(openBraces).toBe(closeBraces); + + console.log(`βœ“ ${testFile} - Avro schema handling validated`); + } catch (error) { + console.error(`βœ— ${testFile} - Avro schema validation failed:`, error.message); + throw error; + } + } + }, 300000); // 5 minutes timeout }); - it('should generate a class for a schema property that is an array of objects', async () => { - // Tests that a schema with the items keyword correctly maps the name of the parent to the content within the items - // and the anonymous schema within items doesnt have a class name derived from it. - await generate('mocks/schema-with-array-of-objects.yaml'); - - const validatedFiles = [ - 'src/main/java/Application.java', - 'src/main/java/ChargeAdjustments.java', - 'src/main/java/RideReceipt.java', - 'src/main/java/TestObject.java' - ]; - await assertExpectedFiles(validatedFiles); + // ============================================================================ + // MESSAGE PAYLOAD TYPE VALIDATION + // ============================================================================ + + describe('Message Payload Type Validation', () => { + it('should validate message payload types for different scenarios', async () => { + const payloadTestFiles = [ + { file: 'animals.yaml', expectedTypes: ['Message', 'Cat', 'Dog'] }, + { file: 'function-name-test.yaml', expectedTypes: ['Order', 'Result', 'Data'] }, + { file: 'avro-complex-test.yaml', expectedTypes: ['ComplexJobOrder'] }, + { file: 'error-reporter.yaml', expectedTypes: ['ExtendedErrorModel'] }, + { file: 'nested-arrays.yaml', expectedTypes: ['Dossier', 'Debtor'] } + ]; + + for (const testCase of payloadTestFiles) { + console.log(`Testing message payload types for: ${testCase.file}`); + + try { + await generate(testCase.file); + const appJava = await readFileContent('src/main/java/com/company/Application.java'); + + // Should contain appropriate payload types + for (const expectedType of testCase.expectedTypes) { + expect(appJava).toContain(expectedType); + } + + console.log(`βœ“ ${testCase.file} - Message payload types validated`); + } catch (error) { + console.error(`βœ— ${testCase.file} - Message payload type validation failed:`, error.message); + throw error; + } + } + }, 300000); // 5 minutes timeout }); - it('should generate one class for a schema with multiple references to it in the asyncapi document', async () => { - /* - For this test, there's duplicate schemas in the asyncapi document. - Calling allSchemas() yeilds unique results (deduplicated) based on either $id or x-parser-schema-id in that order. - The $id needs to be changed because the generator will write file names and such based on it which will always be faulty for this code generator. - Changing the $id of one schema will change the $id only for the one instance, leaving the duplicates behind with the $id they've always had. - This means if we started with 10 schemas, 5 being duplicates with one other schema (15 total; 10 unique), we would end up with 15 unique and 15 total if we changed the schema's $id. - This test ensures all schemas and their duplicates have their $ids renamed to generate the correct file name among other things. - */ - await generate('mocks/schemas-with-duplicate-$ids.yaml'); - - const validatedFiles = [ - 'src/main/java/Application.java', - 'src/main/java/Driver.java', - 'src/main/java/Passenger.java', - 'src/main/java/PaymentCharged.java', - 'src/main/java/RideUpdated1.java' - ]; - await assertExpectedFiles(validatedFiles); + // ============================================================================ + // COMPILATION VALIDATION + // ============================================================================ + + describe('Compilation Validation', () => { + it('should generate compilable Java code for key AsyncAPI files', async () => { + const compilationTestFiles = [ + 'animals.yaml', + 'function-name-test.yaml', + 'error-reporter.yaml', + 'simple-test.yaml' + ]; + + for (const testFile of compilationTestFiles) { + console.log(`Testing compilation for: ${testFile}`); + + try { + await generate(testFile); + + // Validate that essential files exist + const essentialFiles = [ + 'pom.xml', + 'src/main/java/com/company/Application.java', + 'src/main/resources/application.yml' + ]; + + for (const file of essentialFiles) { + const exists = await assertFileExists(file); + expect(exists).toBe(true); + } + + // Validate Java syntax by checking for balanced braces and proper structure + const appJava = await readFileContent('src/main/java/com/company/Application.java'); + + // Check for balanced braces + const openBraces = (appJava.match(/\{/g) || []).length; + const closeBraces = (appJava.match(/\}/g) || []).length; + expect(openBraces).toBe(closeBraces); + + // Check for balanced parentheses + const openParens = (appJava.match(/\(/g) || []).length; + const closeParens = (appJava.match(/\)/g) || []).length; + expect(openParens).toBe(closeParens); + + // Check for proper Java structure + expect(appJava).toContain('package com.company;'); + expect(appJava).toContain('@SpringBootApplication'); + expect(appJava).toContain('public class Application'); + expect(appJava).toContain('public static void main(String[] args)'); + + console.log(`βœ“ ${testFile} - Compilation validation passed`); + } catch (error) { + console.error(`βœ— ${testFile} - Compilation validation failed:`, error.message); + throw error; + } + } + }, 300000); // 5 minutes timeout }); }); diff --git a/test/mocks/scs-function-name/animals-same-function-name.yaml b/test/mocks/animals-same-function-name.yaml similarity index 97% rename from test/mocks/scs-function-name/animals-same-function-name.yaml rename to test/mocks/animals-same-function-name.yaml index 04acadae..a3d9e4e5 100644 --- a/test/mocks/scs-function-name/animals-same-function-name.yaml +++ b/test/mocks/animals-same-function-name.yaml @@ -35,4 +35,4 @@ asyncapi: 2.0.0 info: description: Testing oneOf title: animals - version: 0.0.1 + version: 0.0.1 \ No newline at end of file diff --git a/test/mocks/avro-complex-test.yaml b/test/mocks/avro-complex-test.yaml new file mode 100644 index 00000000..b05899ce --- /dev/null +++ b/test/mocks/avro-complex-test.yaml @@ -0,0 +1,63 @@ +--- +components: + schemas: {} + messages: + ComplexJobOrder: + payload: + name: "ComplexJobOrder" + namespace: "com.example.api.complex" + doc: "Complex Job Order with various Avro types" + type: "record" + fields: + - name: "jobId" + doc: "Job ID" + type: "string" + - name: "optionalDescription" + doc: "Optional description" + type: ["null", "string"] + - name: "tags" + doc: "Job tags" + type: + type: "array" + items: "string" + - name: "metadata" + doc: "Job metadata" + type: + type: "map" + values: "string" + - name: "priority" + doc: "Job priority" + type: + type: "enum" + name: "Priority" + symbols: ["LOW", "MEDIUM", "HIGH"] + - name: "createdAt" + doc: "Creation timestamp" + type: + type: "long" + logicalType: "timestamp-millis" + - name: "amount" + doc: "Job amount" + type: + type: "bytes" + logicalType: "decimal" + precision: 10 + scale: 2 + schemaFormat: "application/vnd.apache.avro+json;version=1.9.0" + contentType: "application/vnd.apache.avro+json" +servers: + production: + protocol: "kafka" + url: "pkc-ymrq7.us-east-2.aws.confluent.cloud:9092" +channels: + test.complex.jobs: + subscribe: + message: + $ref: "#/components/messages/ComplexJobOrder" +asyncapi: "2.0.0" +info: + x-generated-time: "2022-02-24 01:18 UTC" + description: "" + title: "Complex Job Events" + x-view: "provider" + version: "1" \ No newline at end of file diff --git a/test/mocks/scs-function-name/dynamic-topic-same-function-name.yaml b/test/mocks/dynamic-topic-same-function-name.yaml similarity index 100% rename from test/mocks/scs-function-name/dynamic-topic-same-function-name.yaml rename to test/mocks/dynamic-topic-same-function-name.yaml diff --git a/test/mocks/function-name-test.yaml b/test/mocks/function-name-test.yaml new file mode 100644 index 00000000..f5680a37 --- /dev/null +++ b/test/mocks/function-name-test.yaml @@ -0,0 +1,72 @@ +asyncapi: 2.6.0 +info: + title: Function Name Test + version: 1.0.0 + description: Testing x-scs-function-name extension + x-view: "provider" + +channels: + input-topic: + subscribe: + operationId: receiveOrder + x-scs-function-name: processOrder + message: + $ref: '#/components/messages/OrderMessage' + + output-topic: + publish: + operationId: sendResult + x-scs-function-name: processOrder + message: + $ref: '#/components/messages/ResultMessage' + + simple-supplier: + subscribe: + operationId: generateData + x-scs-function-name: customSupplier + message: + $ref: '#/components/messages/DataMessage' + + simple-consumer: + publish: + operationId: consumeData + x-scs-function-name: customConsumer + message: + $ref: '#/components/messages/DataMessage' + +components: + messages: + OrderMessage: + payload: + $ref: '#/components/schemas/Order' + + ResultMessage: + payload: + $ref: '#/components/schemas/Result' + + DataMessage: + payload: + $ref: '#/components/schemas/Data' + + schemas: + Order: + type: object + properties: + orderId: + type: string + amount: + type: number + + Result: + type: object + properties: + orderId: + type: string + status: + type: string + + Data: + type: object + properties: + message: + type: string diff --git a/test/mocks/multivariable-topic-2.6.yaml b/test/mocks/multivariable-topic-2.6.yaml new file mode 100644 index 00000000..f7d1c7cd --- /dev/null +++ b/test/mocks/multivariable-topic-2.6.yaml @@ -0,0 +1,79 @@ +asyncapi: 2.6.0 +id: 'urn:expense-reporting-integration' +info: + title: ExpenseReportingIntegrationApplication + version: 0.0.1 + description: >- + Application for handling expense reporting integration with multivariable + topics + contact: + name: API Support + url: 'https://example.com/support' + email: support@example.com + license: + name: MIT + url: 'https://opensource.org/licenses/MIT' +servers: + development: + url: 'localhost:8080' + protocol: http + description: Development server +defaultContentType: application/json +tags: + - name: billing + description: Billing related operations + - name: receipts + description: Receipt management operations +components: + schemas: + RideReceipt: + type: object + title: This schema is irrelevant + properties: + id: + type: string + amount: + type: number + currency: + type: string + required: + - id + - amount + messages: + BillingReceiptCreated: + payload: + $ref: '#/components/schemas/RideReceipt' + schemaFormat: application/vnd.aai.asyncapi+json;version=2.0.0 + contentType: application/json +channels: + 'acme/billing/receipts/{receipt_id}/created/{version}/regions/{region}/chargify/{ride_id}': + subscribe: + operationId: receiveBillingReceipt + bindings: + solace: + bindingVersion: 0.1.0 + destinations: + - destinationType: topic + message: + payload: + $ref: '#/components/schemas/RideReceipt' + schemaFormat: application/vnd.aai.asyncapi+json;version=2.0.0 + contentType: application/json + parameters: + version: + schema: + type: string + receipt_id: + schema: + type: string + ride_id: + schema: + type: string + region: + schema: + type: string + enum: + - US + - UK + - CA + - MX diff --git a/test/mocks/multivariable-topic.yaml b/test/mocks/multivariable-topic.yaml index 2ba8ba7c..e9424f44 100644 --- a/test/mocks/multivariable-topic.yaml +++ b/test/mocks/multivariable-topic.yaml @@ -1,3 +1,23 @@ +asyncapi: 2.3.0 +info: + title: ExpenseReportingIntegrationApplication + version: 0.0.1 + description: Testing multivariable topics + contact: + name: API Support + email: support@example.com + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0.html +defaultContentType: application/json +servers: + production: + url: https://api.example.com + protocol: https + description: Production server +tags: + - name: billing + description: Billing related operations components: schemas: RideReceipt: @@ -6,7 +26,7 @@ components: title: This schema is irrelevant $id: 'http://example.com/root.json' messages: - Billing Receipt Created: + BillingReceiptCreated: payload: $ref: '#/components/schemas/RideReceipt' schemaFormat: application/vnd.aai.asyncapi+json;version=2.0.0 @@ -14,13 +34,17 @@ components: channels: 'acme/billing/receipts/{receipt_id}/created/{version}/regions/{region}/chargify/{ride_id}': subscribe: + operationId: receiveBillingReceipt bindings: solace: bindingVersion: 0.1.0 destinations: - destinationType: topic message: - $ref: '#/components/messages/Billing Receipt Created' + payload: + $ref: '#/components/schemas/RideReceipt' + schemaFormat: application/vnd.aai.asyncapi+json;version=2.0.0 + contentType: application/json parameters: version: schema: @@ -39,7 +63,3 @@ channels: - UK - CA - MX -asyncapi: 2.0.0 -info: - title: ExpenseReportingIntegrationApplication - version: 0.0.1 diff --git a/test/mocks/no-payload-message.yaml b/test/mocks/no-payload-message.yaml new file mode 100644 index 00000000..da718a80 --- /dev/null +++ b/test/mocks/no-payload-message.yaml @@ -0,0 +1,34 @@ +asyncapi: 2.6.0 +info: + title: No Payload Message Test + version: 1.0.0 + description: Test AsyncAPI with messages that have no payload + +channels: + test/notification: + subscribe: + message: + # This message has no payload - it's just a notification + description: A simple notification message with no payload + contentType: application/json + # No payload field means no schema + + test/event: + publish: + message: + # This message has a payload + description: An event message with payload + contentType: application/json + payload: + $ref: '#/components/schemas/Event' + +components: + schemas: + Event: + type: object + properties: + id: + type: string + timestamp: + type: string + format: date-time \ No newline at end of file diff --git a/test/mocks/parameters-to-headers-test.yaml b/test/mocks/parameters-to-headers-test.yaml new file mode 100644 index 00000000..e2a5e22b --- /dev/null +++ b/test/mocks/parameters-to-headers-test.yaml @@ -0,0 +1,100 @@ +asyncapi: '2.0.0' +info: + title: Parameters To Headers Test API + version: '1.0.0' + description: Test API for parametersToHeaders functionality + x-view: provider + +servers: + production: + url: tcp://localhost:55554 + protocol: solace + +channels: + 'orders/{orderId}/status/{status}/region/{region}': + parameters: + orderId: + description: The order ID + schema: + type: string + status: + description: The order status + schema: + type: string + enum: + - pending + - confirmed + - shipped + - delivered + region: + description: The region code + schema: + type: string + subscribe: + operationId: processOrderUpdate + message: + $ref: '#/components/messages/OrderUpdate' + + 'notifications/{userId}/type/{notificationType}': + parameters: + userId: + description: The user ID + schema: + type: string + notificationType: + description: Type of notification + schema: + type: string + enum: + - email + - sms + - push + subscribe: + operationId: handleNotification + message: + $ref: '#/components/messages/Notification' + +components: + messages: + OrderUpdate: + name: OrderUpdate + title: Order Update + contentType: application/json + payload: + $ref: '#/components/schemas/OrderUpdatePayload' + + Notification: + name: Notification + title: Notification + contentType: application/json + payload: + $ref: '#/components/schemas/NotificationPayload' + + schemas: + OrderUpdatePayload: + type: object + properties: + orderId: + type: string + status: + type: string + timestamp: + type: string + format: date-time + details: + type: string + + NotificationPayload: + type: object + properties: + message: + type: string + timestamp: + type: string + format: date-time + priority: + type: string + enum: + - low + - medium + - high diff --git a/test/mocks/primitive-types-test.yaml b/test/mocks/primitive-types-test.yaml new file mode 100644 index 00000000..c33ec613 --- /dev/null +++ b/test/mocks/primitive-types-test.yaml @@ -0,0 +1,39 @@ +asyncapi: 2.6.0 +info: + title: Primitive Types Test + version: 1.0.0 + description: Test all primitive types + +channels: + string-topic: + publish: + message: + payload: + type: string + + integer-topic: + publish: + message: + payload: + type: integer + + number-topic: + publish: + message: + payload: + type: number + + boolean-topic: + publish: + message: + payload: + type: boolean + + date-topic: + publish: + message: + payload: + type: string + format: date-time + +components: {} diff --git a/test/mocks/schema-with-array-of-objects.yaml b/test/mocks/schema-with-array-of-objects.yaml index 2e9cc758..032b40f9 100644 --- a/test/mocks/schema-with-array-of-objects.yaml +++ b/test/mocks/schema-with-array-of-objects.yaml @@ -116,7 +116,7 @@ components: $id: '#/properties/currency_code' $id: 'http://example.com/root.json' messages: - Billing Receipt Created: + Billing_Receipt_Created: payload: $ref: '#/components/schemas/RideReceipt' description: >- @@ -133,7 +133,7 @@ channels: destinations: - destinationType: topic message: - $ref: '#/components/messages/Billing Receipt Created' + $ref: '#/components/messages/Billing_Receipt_Created' parameters: ride_id: schema: diff --git a/test/mocks/schemas-with-duplicate-$ids.yaml b/test/mocks/schemas-with-duplicate-$ids.yaml index 646d0227..6f6d2e69 100644 --- a/test/mocks/schemas-with-duplicate-$ids.yaml +++ b/test/mocks/schemas-with-duplicate-$ids.yaml @@ -1,28 +1,7 @@ components: schemas: PaymentCharged: - default: {} $schema: 'http://json-schema.org/draft-07/schema' - examples: - - ride_id: 2345234 - entity_type: Driver - amount_charged: 12.32 - driver: - driver_id: 1234132 - rating: 4 - last_name: Smith - car_class: SUV - first_name: Frank - payment_charged_id: '23232323' - passenger: - passenger_id: 2345243 - rating: 2 - last_name: Menning - first_name: Jesse - payment_status: accepted - invoice_system_id: PSG-32923 - information_source: ProcessPayment - timestamp: '2020-06-03T16:51:47.29612-04:00' description: The root schema comprises the entire JSON document. additionalProperties: true type: object @@ -215,7 +194,6 @@ components: $id: '#/properties/timestamp' $id: 'http://example.com/example.json' RideUpdated-1: - default: {} $schema: 'http://json-schema.org/draft-07/schema' examples: - ride_id: 545496c5-a334-4344-9662-efde68c0b98a @@ -311,7 +289,6 @@ components: minimum: 0 $id: '#/properties/speed' driver: - default: {} examples: - driver_id: 1234132 rating: 4.73 @@ -378,7 +355,6 @@ components: $id: '#/properties/driver/properties/first_name' $id: '#/properties/driver' passenger: - default: {} examples: - passenger_id: 2345243 rating: 2.25 diff --git a/test/mocks/simple-test.yaml b/test/mocks/simple-test.yaml new file mode 100644 index 00000000..74c810d5 --- /dev/null +++ b/test/mocks/simple-test.yaml @@ -0,0 +1,14 @@ +asyncapi: 2.1.0 +info: + title: Simple Test + version: 1.0.0 + description: Simple test for import cleanup + +channels: + simple-topic: + publish: + message: + payload: + type: string + +components: {} diff --git a/test/mocks/smarty-lighting-streetlights-check.yaml b/test/mocks/smarty-lighting-streetlights-check.yaml new file mode 100644 index 00000000..a3120da5 --- /dev/null +++ b/test/mocks/smarty-lighting-streetlights-check.yaml @@ -0,0 +1,229 @@ +asyncapi: '2.0.0' +info: + title: Streetlights API + version: '1.0.0' + description: | + The Smartylighting Streetlights API allows you to remotely manage the city lights. + + ### Check out its awesome features: + + * Turn a specific streetlight on/off πŸŒƒ + * Dim a specific streetlight 😎 + * Receive real-time information about environmental lighting conditions πŸ“ˆ + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0 + +servers: + production: + url: test.mosquitto.org:{port} + protocol: mqtt + description: Test broker + variables: + port: + description: Secure connection (TLS) is available through port 8883. + default: '1883' + enum: + - '1883' + - '8883' + security: + - apiKey: [] + - supportedOauthFlows: + - streetlights:on + - streetlights:off + - streetlights:dim + - openIdConnectWellKnown: [] + +defaultContentType: application/json + +channels: + smartylighting/streetlights/1/0/event/{streetlightId}/lighting/measured: + description: The topic on which measured values may be produced and consumed. + parameters: + streetlightId: + $ref: '#/components/parameters/streetlightId' + publish: + summary: Inform about environmental lighting conditions of a particular streetlight. + operationId: receiveLightMeasurement + traits: + - $ref: '#/components/operationTraits/kafka' + message: + $ref: '#/components/messages/lightMeasured' + + smartylighting/streetlights/1/0/event/{streetlightId}/lighting/measured-check: + description: The topic on which measured values may be produced and consumed. + parameters: + streetlightId: + $ref: '#/components/parameters/streetlightId' + publish: + summary: Inform about environmental lighting conditions of a particular streetlight. + operationId: receiveLightMeasurementCheck + traits: + - $ref: '#/components/operationTraits/kafka' + message: + $ref: '#/components/messages/lightMeasured' + + smartylighting/streetlights/1/0/action/{streetlightId}/turn/on: + parameters: + streetlightId: + $ref: '#/components/parameters/streetlightId' + subscribe: + operationId: turnOn + traits: + - $ref: '#/components/operationTraits/kafka' + message: + $ref: '#/components/messages/turnOnOff' + + smartylighting/streetlights/1/0/action/{streetlightId}/turn/off: + parameters: + streetlightId: + $ref: '#/components/parameters/streetlightId' + subscribe: + operationId: turnOff + traits: + - $ref: '#/components/operationTraits/kafka' + message: + $ref: '#/components/messages/turnOnOff' + + smartylighting/streetlights/1/0/action/{streetlightId}/dim: + parameters: + streetlightId: + $ref: '#/components/parameters/streetlightId' + subscribe: + operationId: dimLight + traits: + - $ref: '#/components/operationTraits/kafka' + message: + $ref: '#/components/messages/dimLight' + +components: + messages: + lightMeasured: + name: lightMeasured + title: Light measured + summary: Inform about environmental lighting conditions of a particular streetlight. + contentType: application/json + traits: + - $ref: '#/components/messageTraits/commonHeaders' + payload: + $ref: "#/components/schemas/lightMeasuredPayload" + turnOnOff: + name: turnOnOff + title: Turn on/off + summary: Command a particular streetlight to turn the lights on or off. + traits: + - $ref: '#/components/messageTraits/commonHeaders' + payload: + $ref: "#/components/schemas/turnOnOffPayload" + dimLight: + name: dimLight + title: Dim light + summary: Command a particular streetlight to dim the lights. + traits: + - $ref: '#/components/messageTraits/commonHeaders' + payload: + $ref: "#/components/schemas/dimLightPayload" + + schemas: + lightMeasuredPayload: + type: object + properties: + lumens: + type: integer + minimum: 0 + description: Light intensity measured in lumens. + sentAt: + $ref: "#/components/schemas/sentAt" + turnOnOffPayload: + type: object + properties: + command: + type: string + enum: + - on + - off + description: Whether to turn on or off the light. + sentAt: + $ref: "#/components/schemas/sentAt" + dimLightPayload: + type: object + properties: + percentage: + type: integer + description: Percentage to which the light should be dimmed to. + minimum: 0 + maximum: 100 + sentAt: + $ref: "#/components/schemas/sentAt" + sentAt: + type: object + properties: + propertySubobject: + $ref: "#/components/schemas/subObject" + subObject: + type: object + properties: + propertyA: + type: string + + + securitySchemes: + apiKey: + type: apiKey + in: user + description: Provide your API key as the user and leave the password empty. + supportedOauthFlows: + type: oauth2 + description: Flows to support OAuth 2.0 + flows: + implicit: + authorizationUrl: 'https://authserver.example/auth' + scopes: + 'streetlights:on': Ability to switch lights on + 'streetlights:off': Ability to switch lights off + 'streetlights:dim': Ability to dim the lights + password: + tokenUrl: 'https://authserver.example/token' + scopes: + 'streetlights:on': Ability to switch lights on + 'streetlights:off': Ability to switch lights off + 'streetlights:dim': Ability to dim the lights + clientCredentials: + tokenUrl: 'https://authserver.example/token' + scopes: + 'streetlights:on': Ability to switch lights on + 'streetlights:off': Ability to switch lights off + 'streetlights:dim': Ability to dim the lights + authorizationCode: + authorizationUrl: 'https://authserver.example/auth' + tokenUrl: 'https://authserver.example/token' + refreshUrl: 'https://authserver.example/refresh' + scopes: + 'streetlights:on': Ability to switch lights on + 'streetlights:off': Ability to switch lights off + 'streetlights:dim': Ability to dim the lights + openIdConnectWellKnown: + type: openIdConnect + openIdConnectUrl: 'https://authserver.example/.well-known' + + parameters: + streetlightId: + description: The ID of the streetlight. + schema: + type: string + + messageTraits: + commonHeaders: + headers: + type: object + properties: + my-app-header: + type: integer + minimum: 0 + maximum: 100 + + operationTraits: + kafka: + bindings: + kafka: + clientId: my-app-id diff --git a/test/mocks/solace-core-banking-v1.json b/test/mocks/solace-core-banking-v1.json new file mode 100644 index 00000000..df2b2dc8 --- /dev/null +++ b/test/mocks/solace-core-banking-v1.json @@ -0,0 +1,483 @@ +{ + "components": { + "schemas": { + "Transaction": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "3c6nmm3zzxj", + "$schema": "https://json-schema.org/draft/2019-09/schema", + "description": "A transaction conducted by an account.", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "Transaction", + "title": "Transaction", + "type": "object", + "x-ep-application-domain-id": "5vcmgn3847n", + "required": [ + "transactionNum", + "accountNum", + "transactionType", + "amount", + "currency", + "timestamp" + ], + "x-ep-schema-version-displayname": "0.1.0", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-schema-state-id": "2", + "x-ep-schema-id": "1rz7z6ebfh7", + "properties": { + "transactionType": { + "description": "The transaction type.", + "type": "string" + }, + "amount": { + "description": "The transaction amount.", + "type": "number" + }, + "transactionNum": { + "description": "The unique identifier of the transaction.", + "type": "integer" + }, + "accountNum": { + "description": "The unique identifer of an account.", + "type": "integer" + }, + "currency": { + "description": "The currency of the transaction.", + "type": "string" + }, + "timestamp": { + "description": "The time stamp of the event.", + "type": "string" + } + }, + "$id": "https://example.com/transaction.schema.json" + }, + "Account_Action": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "67ihs752wcx", + "$schema": "https://json-schema.org/draft/2019-09/schema", + "description": "An action to be taken on a customer account", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "Account Action", + "title": "Account Action", + "type": "object", + "x-ep-application-domain-id": "5vcmgn3847n", + "required": [ + "accountNum", + "accountAction", + "timestamp" + ], + "x-ep-schema-version-displayname": "0.1.0", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-schema-state-id": "2", + "x-ep-schema-id": "pp3fbnec1w1", + "properties": { + "accountAction": { + "description": "An action to be taken on an account.", + "type": "string" + }, + "accountNum": { + "description": "The unique identifer of an account.", + "type": "integer" + }, + "timestamp": { + "description": "The time stamp of the event.", + "type": "string" + } + }, + "$id": "https://example.com/account-action.schema.json" + } + }, + "messages": { + "Deposit": { + "x-ep-event-id": "nwf0ka5u0y3", + "x-ep-event-version-displayname": "0.1.1", + "description": "Deposit made either via ATM, teller, mobile, or electronic transfer.\nv0.1.2 - Using local schema", + "x-ep-application-domain-id": "5vcmgn3847n", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.0.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-event-version-id": "iufcxfxnvst", + "payload": { + "$ref": "#/components/schemas/Transaction" + }, + "x-ep-event-version": "0.1.2", + "x-ep-event-name": "Deposit", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Account_Resumed": { + "x-ep-event-id": "g9zuefi7tac", + "x-ep-event-version-displayname": "0.1.1", + "description": "An account is no longer suspended and may resume its use.\nv0.1.1 - Using local schema", + "x-ep-application-domain-id": "5vcmgn3847n", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.0.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-event-version-id": "5fn8p3f7soc", + "payload": { + "$ref": "#/components/schemas/Account_Action" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Account Resumed", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Credit_Card_Paid": { + "x-ep-event-id": "7f2y84edkbc", + "x-ep-event-version-displayname": "0.1.1", + "description": "Payment issued by an account holder.\nv0.1.1 - Using local schema", + "x-ep-application-domain-id": "5vcmgn3847n", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.0.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-event-version-id": "tosig0f13p3", + "payload": { + "$ref": "#/components/schemas/Transaction" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Credit Card Paid", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Withdrawal": { + "x-ep-event-id": "n7giqzbrcsh", + "x-ep-event-version-displayname": "0.1.1", + "description": "Account holder withdraws from an account.\nv0.1.1 - Using local schema", + "x-ep-application-domain-id": "5vcmgn3847n", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.0.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-event-version-id": "5hk0vw7ndvz", + "payload": { + "$ref": "#/components/schemas/Transaction" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Withdrawal", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Account_Suspended": { + "x-ep-event-id": "36cg1j6g0tp", + "x-ep-event-version-displayname": "0.1.1", + "description": "An account has been suspended due to fraud, limit, or by customer request.\nv0.1.1 - Using local schema", + "x-ep-application-domain-id": "5vcmgn3847n", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.0.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-event-version-id": "u7bmfe4z4fe", + "payload": { + "$ref": "#/components/schemas/Account_Action" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Account Suspended", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Transfer": { + "x-ep-event-id": "xk0b6s1ba7y", + "x-ep-event-version-displayname": "0.1.1", + "description": "Transfering money between two accounts of the same holder.\nv0.1.1 - Using local schema", + "x-ep-application-domain-id": "5vcmgn3847n", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.0.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-event-version-id": "yflfrv5u9fu", + "payload": { + "$ref": "#/components/schemas/Transaction" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Transfer", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Account_Opened": { + "x-ep-event-id": "3ok12h6e2av", + "x-ep-event-version-displayname": "0.1.1", + "description": "An account has been opened for a customer.\nv0.1.1 - Using local schema", + "x-ep-application-domain-id": "5vcmgn3847n", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.0.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-event-version-id": "tdhodbtmhtb", + "payload": { + "$ref": "#/components/schemas/Account_Action" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Account Opened", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Loan_Paid": { + "x-ep-event-id": "jtwzw8aw7p2", + "x-ep-event-version-displayname": "0.1.1", + "description": "Payment to loan by an account holder.\nv0.1.1 - Using local schema", + "x-ep-application-domain-id": "5vcmgn3847n", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.0.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-event-version-id": "b6k6ld0k4ih", + "payload": { + "$ref": "#/components/schemas/Transaction" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Loan Paid", + "contentType": "application/json", + "x-ep-event-state-id": "1" + } + } + }, + "channels": { + "acmebank/solace/core/deposit/v1/{currency}/{amount}/{transactionID}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Deposit" + } + }, + "parameters": { + "amount": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "amount" + }, + "currency": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "currency" + }, + "transactionID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "transactionID" + } + } + }, + "acmebank/solace/account/suspended/v1/{accountID}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "coreBanking.accounts", + "topicSubscriptions": [ + "acmebank/solace/account/*/v1/*" + ] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Account_Suspended" + } + }, + "parameters": { + "accountID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "accountID" + } + } + }, + "acmebank/solace/core/payment/creditCard/paid/v1/{currency}/{amount}/{transactionID}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Credit_Card_Paid" + } + }, + "parameters": { + "amount": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "amount" + }, + "currency": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "currency" + }, + "transactionID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "transactionID" + } + } + }, + "acmebank/solace/account/opened/v1/{accountID}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "coreBanking.accounts", + "topicSubscriptions": [ + "acmebank/solace/account/*/v1/*" + ] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Account_Opened" + } + }, + "parameters": { + "accountID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "accountID" + } + } + }, + "acmebank/solace/core/withdrawal/v1/{currency}/{amount}/{transactionID}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Withdrawal" + } + }, + "parameters": { + "amount": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "amount" + }, + "currency": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "currency" + }, + "transactionID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "transactionID" + } + } + }, + "acmebank/solace/core/payment/loan/paid/v1/{currency}/{amount}/{transactionID}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Loan_Paid" + } + }, + "parameters": { + "amount": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "amount" + }, + "currency": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "currency" + }, + "transactionID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "transactionID" + } + } + }, + "acmebank/solace/core/transfer/v1/{currency}/{amount}/{transactionID}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Transfer" + } + }, + "parameters": { + "amount": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "amount" + }, + "currency": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "currency" + }, + "transactionID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "transactionID" + } + } + }, + "acmebank/solace/account/resumed/v1/{accountID}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "coreBanking.accounts", + "topicSubscriptions": [ + "acmebank/solace/account/*/v1/*" + ] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Account_Resumed" + } + }, + "parameters": { + "accountID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "accountID" + } + } + } + }, + "asyncapi": "2.5.0", + "info": { + "x-ep-application-version": "0.1.2", + "x-ep-application-version-id": "boql6p6bhi0", + "x-ep-application-id": "51l0dh6m71k", + "description": "Application for supporting core banking activities. Added support for paying loans. \nv0.1.1 - Added Pubs\nv0.1.2 - Added Consumers", + "x-ep-displayname": "0.1.2", + "x-ep-state-name": "DRAFT", + "title": "Core Banking", + "x-ep-application-domain-id": "5vcmgn3847n", + "version": "0.1.2", + "x-ep-state-id": "1", + "x-ep-application-domain-name": "ACME Bank" + } +} \ No newline at end of file diff --git a/test/mocks/solace-core-banking-v2.json b/test/mocks/solace-core-banking-v2.json new file mode 100644 index 00000000..7f83d638 --- /dev/null +++ b/test/mocks/solace-core-banking-v2.json @@ -0,0 +1,435 @@ +{ + "components": { + "schemas": { + "Transaction": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "3c6nmm3zzxj", + "$schema": "https://json-schema.org/draft/2019-09/schema", + "description": "A transaction conducted by an account.", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "Transaction", + "title": "Transaction", + "type": "object", + "x-ep-application-domain-id": "5vcmgn3847n", + "required": [ + "transactionNum", + "accountNum", + "transactionType", + "amount", + "currency", + "timestamp" + ], + "x-ep-schema-version-displayname": "0.1.0", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-schema-state-id": "2", + "x-ep-schema-id": "1rz7z6ebfh7", + "properties": { + "transactionType": { + "description": "The transaction type.", + "type": "string" + }, + "amount": { + "description": "The transaction amount.", + "type": "number" + }, + "transactionNum": { + "description": "The unique identifier of the transaction.", + "type": "integer" + }, + "accountNum": { + "description": "The unique identifer of an account.", + "type": "integer" + }, + "currency": { + "description": "The currency of the transaction.", + "type": "string" + }, + "timestamp": { + "description": "The time stamp of the event.", + "type": "string" + } + }, + "$id": "https://example.com/transaction.schema.json" + }, + "Account_Action": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "67ihs752wcx", + "$schema": "https://json-schema.org/draft/2019-09/schema", + "description": "An action to be taken on a customer account", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "Account Action", + "title": "Account Action", + "type": "object", + "x-ep-application-domain-id": "5vcmgn3847n", + "required": [ + "accountNum", + "accountAction", + "timestamp" + ], + "x-ep-schema-version-displayname": "0.1.0", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-schema-state-id": "2", + "x-ep-schema-id": "pp3fbnec1w1", + "properties": { + "accountAction": { + "description": "An action to be taken on an account.", + "type": "string" + }, + "accountNum": { + "description": "The unique identifer of an account.", + "type": "integer" + }, + "timestamp": { + "description": "The time stamp of the event.", + "type": "string" + } + }, + "$id": "https://example.com/account-action.schema.json" + } + }, + "messages": { + "Deposit": { + "x-ep-event-id": "nwf0ka5u0y3", + "x-ep-event-version-displayname": "0.1.1", + "description": "Deposit made either via ATM, teller, mobile, or electronic transfer.\nv0.1.2 - Using local schema", + "x-ep-application-domain-id": "5vcmgn3847n", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.0.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-event-version-id": "iufcxfxnvst", + "payload": { + "$ref": "#/components/schemas/Transaction" + }, + "x-ep-event-version": "0.1.2", + "x-ep-event-name": "Deposit", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Account_Resumed": { + "x-ep-event-id": "g9zuefi7tac", + "x-ep-event-version-displayname": "0.1.1", + "description": "An account is no longer suspended and may resume its use.\nv0.1.1 - Using local schema", + "x-ep-application-domain-id": "5vcmgn3847n", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.0.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-event-version-id": "5fn8p3f7soc", + "payload": { + "$ref": "#/components/schemas/Account_Action" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Account Resumed", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Credit_Card_Paid": { + "x-ep-event-id": "7f2y84edkbc", + "x-ep-event-version-displayname": "0.1.1", + "description": "Payment issued by an account holder.\nv0.1.1 - Using local schema", + "x-ep-application-domain-id": "5vcmgn3847n", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.0.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-event-version-id": "tosig0f13p3", + "payload": { + "$ref": "#/components/schemas/Transaction" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Credit Card Paid", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Withdrawal": { + "x-ep-event-id": "n7giqzbrcsh", + "x-ep-event-version-displayname": "0.1.1", + "description": "Account holder withdraws from an account.\nv0.1.1 - Using local schema", + "x-ep-application-domain-id": "5vcmgn3847n", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.0.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-event-version-id": "5hk0vw7ndvz", + "payload": { + "$ref": "#/components/schemas/Transaction" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Withdrawal", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Account_Suspended": { + "x-ep-event-id": "36cg1j6g0tp", + "x-ep-event-version-displayname": "0.1.1", + "description": "An account has been suspended due to fraud, limit, or by customer request.\nv0.1.1 - Using local schema", + "x-ep-application-domain-id": "5vcmgn3847n", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.0.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-event-version-id": "u7bmfe4z4fe", + "payload": { + "$ref": "#/components/schemas/Account_Action" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Account Suspended", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Transfer": { + "x-ep-event-id": "xk0b6s1ba7y", + "x-ep-event-version-displayname": "0.1.1", + "description": "Transfering money between two accounts of the same holder.\nv0.1.1 - Using local schema", + "x-ep-application-domain-id": "5vcmgn3847n", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.0.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-event-version-id": "yflfrv5u9fu", + "payload": { + "$ref": "#/components/schemas/Transaction" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Transfer", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Account_Opened": { + "x-ep-event-id": "3ok12h6e2av", + "x-ep-event-version-displayname": "0.1.1", + "description": "An account has been opened for a customer.\nv0.1.1 - Using local schema", + "x-ep-application-domain-id": "5vcmgn3847n", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.0.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-event-version-id": "tdhodbtmhtb", + "payload": { + "$ref": "#/components/schemas/Account_Action" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Account Opened", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Loan_Paid": { + "x-ep-event-id": "jtwzw8aw7p2", + "x-ep-event-version-displayname": "0.1.1", + "description": "Payment to loan by an account holder.\nv0.1.1 - Using local schema", + "x-ep-application-domain-id": "5vcmgn3847n", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.0.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "ACME Bank", + "x-ep-event-version-id": "b6k6ld0k4ih", + "payload": { + "$ref": "#/components/schemas/Transaction" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Loan Paid", + "contentType": "application/json", + "x-ep-event-state-id": "1" + } + } + }, + "channels": { + "acmebank/solace/core/deposit/v1/{currency}/{amount}/{transactionID}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Deposit" + } + }, + "parameters": { + "amount": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "amount" + }, + "currency": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "currency" + }, + "transactionID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "transactionID" + } + } + }, + "acmebank/solace/account/suspended/v1/{accountID}": { + "publish": { + "message": { + "$ref": "#/components/messages/Account_Suspended" + } + }, + "parameters": { + "accountID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "accountID" + } + } + }, + "acmebank/solace/core/payment/creditCard/paid/v1/{currency}/{amount}/{transactionID}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Credit_Card_Paid" + } + }, + "parameters": { + "amount": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "amount" + }, + "currency": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "currency" + }, + "transactionID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "transactionID" + } + } + }, + "acmebank/solace/account/opened/v1/{accountID}": { + "publish": { + "message": { + "$ref": "#/components/messages/Account_Opened" + } + }, + "parameters": { + "accountID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "accountID" + } + } + }, + "acmebank/solace/core/withdrawal/v1/{currency}/{amount}/{transactionID}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Withdrawal" + } + }, + "parameters": { + "amount": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "amount" + }, + "currency": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "currency" + }, + "transactionID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "transactionID" + } + } + }, + "acmebank/solace/core/payment/loan/paid/v1/{currency}/{amount}/{transactionID}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Loan_Paid" + } + }, + "parameters": { + "amount": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "amount" + }, + "currency": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "currency" + }, + "transactionID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "transactionID" + } + } + }, + "acmebank/solace/core/transfer/v1/{currency}/{amount}/{transactionID}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Transfer" + } + }, + "parameters": { + "amount": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "amount" + }, + "currency": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "currency" + }, + "transactionID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "transactionID" + } + } + }, + "acmebank/solace/account/resumed/v1/{accountID}": { + "publish": { + "message": { + "$ref": "#/components/messages/Account_Resumed" + } + }, + "parameters": { + "accountID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "accountID" + } + } + } + }, + "asyncapi": "2.5.0", + "info": { + "x-ep-application-version": "0.1.2", + "x-ep-application-version-id": "boql6p6bhi0", + "x-ep-application-id": "51l0dh6m71k", + "description": "Application for supporting core banking activities. Added support for paying loans. \nv0.1.1 - Added Pubs\nv0.1.2 - Added Consumers", + "x-ep-displayname": "0.1.2", + "x-ep-state-name": "DRAFT", + "title": "Core Banking", + "x-ep-application-domain-id": "5vcmgn3847n", + "version": "0.1.2", + "x-ep-state-id": "1", + "x-ep-application-domain-name": "ACME Bank" + } +} \ No newline at end of file diff --git a/test/mocks/solace-customer-facing-mobile-app-v1.json b/test/mocks/solace-customer-facing-mobile-app-v1.json new file mode 100644 index 00000000..bc6939cd --- /dev/null +++ b/test/mocks/solace-customer-facing-mobile-app-v1.json @@ -0,0 +1,341 @@ +{ + "components": { + "schemas": { + "CustomerJson": { + "x-ep-schema-version": "0.1.1", + "x-ep-schema-version-id": "r3jiwn9nyya", + "$schema": "https://json-schema.org/draft/2019-09/schema", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "CustomerJson", + "title": "Person", + "type": "object", + "x-ep-application-domain-id": "u2x73phaqbj", + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Human Relationships", + "x-ep-schema-state-id": "2", + "x-ep-schema-id": "ek90axpw2bq", + "properties": { + "firstName": { + "description": "The person's first name.", + "type": "string" + }, + "lastName": { + "description": "The person's last name.", + "type": "string" + }, + "zipCode": { + "description": "Person's zip code", + "type": "string" + }, + "streetAddress": { + "description": "Person's street address", + "type": "string" + }, + "birthdayDate": { + "description": "Birthday in CCYY-MM-DD format", + "type": "string", + "minimum": 0 + }, + "customerId": { + "description": "Persons's Id", + "type": "string" + } + }, + "$id": "https://example.com/person.schema.json" + }, + "Retail_Order": { + "x-ep-schema-version": "0.1.3", + "x-ep-schema-state-id": "2", + "x-ep-schema-version-id": "da6twwdzwyb", + "x-ep-schema-id": "9xw7jd923hf", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "Retail Order", + "type": "object", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "properties": { + "price": { + "type": "number", + "minimum": 0 + }, + "billTo": { + "type": "object", + "properties": { + "zip": { + "type": "string" + }, + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "type": "string" + } + } + }, + "name": { + "type": "string" + }, + "sku": { + "type": "string" + }, + "shipTo": { + "type": "object", + "properties": { + "zip": { + "type": "string" + }, + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "type": "string" + } + } + } + }, + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + } + }, + "messages": { + "Customer": { + "x-ep-event-id": "v0ys18dt3r7", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "customerid", + "description": "", + "x-ep-application-domain-id": "u2x73phaqbj", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Human Relationships", + "x-ep-event-version-id": "76vbk0mj80e", + "payload": { + "$ref": "#/components/schemas/CustomerJson" + }, + "x-ep-event-version": "1.0.1", + "x-ep-event-name": "Customer", + "x-ep-custom-attr-confidentiality": "internal", + "contentType": "application/json", + "x-ep-event-state-id": "2" + }, + "Retail_Order": { + "x-ep-event-id": "jcbnyrt7dtx", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "pci", + "description": "State change information about a single product order, from birth (regardless if from a store, mobile application or 3rd party) until fulfillment.\n\nA single product order typically contain multiple products.", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Store Operations", + "x-ep-event-version-id": "f5wignab3df", + "payload": { + "$ref": "#/components/schemas/Retail_Order" + }, + "x-ep-event-version": "0.1.2", + "x-ep-event-name": "Retail Order", + "x-ep-custom-attr-confidentiality": "internal", + "contentType": "application/json", + "x-ep-event-state-id": "2" + } + } + }, + "channels": { + "acmeRetail/hr/customer/{customerVerb}/v1/{customerId}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "customerMobileApp.retailOrder.all", + "topicSubscriptions": [ + "acmeRetail/storeOps/retailOrder/*/v1/*/*/*" + ] + } + }, + { + "destinationType": "queue", + "queue": { + "name": "customerMobileApp.customer.updatePw", + "topicSubscriptions": [ + "acmeRetail/hr/customer/*/v1/*" + ] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Customer" + } + }, + "parameters": { + "customerVerb": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerVerb" + }, + "customerId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerId" + } + } + }, + "acmeRetail/storeOps/retailOrder/{retailOrderVerb}/v1/{storeLocation}/{customerId}/{orderId}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Retail_Order" + } + }, + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "customerMobileApp.retailOrder.all", + "topicSubscriptions": [ + "acmeRetail/storeOps/retailOrder/*/v1/*/*/*" + ] + } + }, + { + "destinationType": "queue", + "queue": { + "name": "customerMobileApp.customer.updatePw", + "topicSubscriptions": [ + "acmeRetail/hr/customer/*/v1/*" + ] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Retail_Order" + } + }, + "parameters": { + "retailOrderVerb": { + "schema": { + "type": "string", + "enum": [ + "customerInitiated", + "customerCancelled", + "customerCompleted", + "customerPaid", + "onlineInitiated", + "onlineCancelled", + "onlineCompleted", + "onlinePaid", + "onlineFulfilled" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Retail Order Verbs", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "x-ep-enum-version-id": "uyef7go9jg1", + "x-ep-enum-id": "kj01k3vfspr", + "x-ep-shared": "true", + "x-ep-parameter-name": "retailOrderVerb", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + }, + "storeLocation": { + "schema": { + "type": "string", + "enum": [ + "3487", + "3488", + "3489", + "3490", + "3491", + "3492", + "3493", + "3494", + "3495", + "3496", + "3497", + "3498", + "3499", + "3500", + "3501", + "3502", + "3503", + "3504", + "3505", + "3506", + "3507", + "3508", + "3509", + "3555", + "Mobile Application", + "Test Data Generation", + "Inhouse Traffic", + "Partner" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Store Locations", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "x-ep-enum-version-id": "fdolp49969n", + "x-ep-enum-id": "4xdj8kaz1le", + "x-ep-shared": "true", + "x-ep-parameter-name": "storeLocation", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "customerId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerId" + } + } + } + }, + "asyncapi": "2.5.0", + "info": { + "x-ep-application-version": "0.1.6", + "x-ep-application-version-id": "zanth3t0zs5", + "x-ep-application-id": "28a372rrk0s", + "description": "acme-retail's innovative mobile application lets customers purchase any product available in our stores online, and have it either shipped, delivered via service like Shipt, or have it ready for pickup at any of our brick and mortar stores. Customers get real-time updates on their orders via the app as wel. ", + "x-ep-state-name": "DRAFT", + "title": "Customer Facing Mobile Application", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "version": "0.1.6", + "x-ep-state-id": "1", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + } +} \ No newline at end of file diff --git a/test/mocks/solace-customer-facing-mobile-app-v2.json b/test/mocks/solace-customer-facing-mobile-app-v2.json new file mode 100644 index 00000000..418c0507 --- /dev/null +++ b/test/mocks/solace-customer-facing-mobile-app-v2.json @@ -0,0 +1,331 @@ +{ + "components": { + "schemas": { + "CustomerJson": { + "x-ep-schema-version": "0.1.1", + "x-ep-schema-version-id": "r3jiwn9nyya", + "$schema": "https://json-schema.org/draft/2019-09/schema", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "CustomerJson", + "title": "Person", + "type": "object", + "x-ep-application-domain-id": "u2x73phaqbj", + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Human Relationships", + "x-ep-schema-state-id": "2", + "x-ep-schema-id": "ek90axpw2bq", + "properties": { + "firstName": { + "description": "The person's first name.", + "type": "string" + }, + "lastName": { + "description": "The person's last name.", + "type": "string" + }, + "zipCode": { + "description": "Person's zip code", + "type": "string" + }, + "streetAddress": { + "description": "Person's street address", + "type": "string" + }, + "birthdayDate": { + "description": "Birthday in CCYY-MM-DD format", + "type": "string", + "minimum": 0 + }, + "customerId": { + "description": "Persons's Id", + "type": "string" + } + }, + "$id": "https://example.com/person.schema.json" + }, + "Retail_Order": { + "x-ep-schema-version": "0.1.3", + "x-ep-schema-state-id": "2", + "x-ep-schema-version-id": "da6twwdzwyb", + "x-ep-schema-id": "9xw7jd923hf", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "Retail Order", + "type": "object", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "properties": { + "price": { + "type": "number", + "minimum": 0 + }, + "billTo": { + "type": "object", + "properties": { + "zip": { + "type": "string" + }, + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "type": "string" + } + } + }, + "name": { + "type": "string" + }, + "sku": { + "type": "string" + }, + "shipTo": { + "type": "object", + "properties": { + "zip": { + "type": "string" + }, + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "type": "string" + } + } + } + }, + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + } + }, + "messages": { + "Customer": { + "x-ep-event-id": "v0ys18dt3r7", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "customerid", + "description": "", + "x-ep-application-domain-id": "u2x73phaqbj", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Human Relationships", + "x-ep-event-version-id": "76vbk0mj80e", + "payload": { + "$ref": "#/components/schemas/CustomerJson" + }, + "x-ep-event-version": "1.0.1", + "x-ep-event-name": "Customer", + "x-ep-custom-attr-confidentiality": "internal", + "contentType": "application/json", + "x-ep-event-state-id": "2" + }, + "Retail_Order": { + "x-ep-event-id": "jcbnyrt7dtx", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "pci", + "description": "State change information about a single product order, from birth (regardless if from a store, mobile application or 3rd party) until fulfillment.\n\nA single product order typically contain multiple products.", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Store Operations", + "x-ep-event-version-id": "f5wignab3df", + "payload": { + "$ref": "#/components/schemas/Retail_Order" + }, + "x-ep-event-version": "0.1.2", + "x-ep-event-name": "Retail Order", + "x-ep-custom-attr-confidentiality": "internal", + "contentType": "application/json", + "x-ep-event-state-id": "2" + } + } + }, + "channels": { + "acmeRetail/hr/customer/{customerVerb}/v1/{customerId}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "customerMobileApp.retailOrder.all", + "topicSubscriptions": ["acmeRetail/storeOps/retailOrder/*/v1/*/*/*"] + } + }, { + "destinationType": "queue", + "queue": { + "name": "customerMobileApp.customer.updatePw", + "topicSubscriptions": ["acmeRetail/hr/customer/*/v1/*"] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Customer" + } + }, + "parameters": { + "customerVerb": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerVerb" + }, + "customerId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerId" + } + } + }, + "acmeRetail/storeOps/retailOrder/{retailOrderVerb}/v1/{storeLocation}/{customerId}/{orderId}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Retail_Order" + } + }, + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "customerMobileApp.retailOrder.all", + "topicSubscriptions": ["acmeRetail/storeOps/retailOrder/*/v1/*/*/*"] + } + }, { + "destinationType": "queue", + "queue": { + "name": "customerMobileApp.customer.updatePw", + "topicSubscriptions": ["acmeRetail/hr/customer/*/v1/*"] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Retail_Order" + } + }, + "parameters": { + "retailOrderVerb": { + "schema": { + "type": "string", + "enum": [ + "customerInitiated", + "customerCancelled", + "customerCompleted", + "customerPaid", + "onlineInitiated", + "onlineCancelled", + "onlineCompleted", + "onlinePaid", + "onlineFulfilled" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Retail Order Verbs", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "x-ep-enum-version-id": "uyef7go9jg1", + "x-ep-enum-id": "kj01k3vfspr", + "x-ep-shared": "true", + "x-ep-parameter-name": "retailOrderVerb", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + }, + "storeLocation": { + "schema": { + "type": "string", + "enum": [ + "3487", + "3488", + "3489", + "3490", + "3491", + "3492", + "3493", + "3494", + "3495", + "3496", + "3497", + "3498", + "3499", + "3500", + "3501", + "3502", + "3503", + "3504", + "3505", + "3506", + "3507", + "3508", + "3509", + "3555", + "Mobile Application", + "Test Data Generation", + "Inhouse Traffic", + "Partner" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Store Locations", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "x-ep-enum-version-id": "fdolp49969n", + "x-ep-enum-id": "4xdj8kaz1le", + "x-ep-shared": "true", + "x-ep-parameter-name": "storeLocation", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "customerId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerId" + } + } + } + }, + "asyncapi": "2.5.0", + "info": { + "x-ep-application-version": "0.1.6", + "x-ep-application-version-id": "zanth3t0zs5", + "x-ep-application-id": "28a372rrk0s", + "description": "acme-retail's innovative mobile application lets customers purchase any product available in our stores online, and have it either shipped, delivered via service like Shipt, or have it ready for pickup at any of our brick and mortar stores. Customers get real-time updates on their orders via the app as wel. ", + "x-ep-state-name": "DRAFT", + "title": "Customer Facing Mobile Application", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "version": "0.1.6", + "x-ep-state-id": "1", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + } +} \ No newline at end of file diff --git a/test/mocks/solace-customer-fraud-prevention.json b/test/mocks/solace-customer-fraud-prevention.json new file mode 100644 index 00000000..154a6d0c --- /dev/null +++ b/test/mocks/solace-customer-fraud-prevention.json @@ -0,0 +1,123 @@ +{ + "components": { + "schemas": { + "CustomerJson": { + "x-ep-schema-version": "0.1.1", + "x-ep-schema-version-id": "r3jiwn9nyya", + "$schema": "https://json-schema.org/draft/2019-09/schema", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "CustomerJson", + "title": "Person", + "type": "object", + "x-ep-application-domain-id": "u2x73phaqbj", + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Human Relationships", + "x-ep-schema-state-id": "2", + "x-ep-schema-id": "ek90axpw2bq", + "properties": { + "firstName": { + "description": "The person's first name.", + "type": "string" + }, + "lastName": { + "description": "The person's last name.", + "type": "string" + }, + "zipCode": { + "description": "Person's zip code", + "type": "string" + }, + "streetAddress": { + "description": "Person's street address", + "type": "string" + }, + "birthdayDate": { + "description": "Birthday in CCYY-MM-DD format", + "type": "string", + "minimum": 0 + }, + "customerId": { + "description": "Persons's Id", + "type": "string" + } + }, + "$id": "https://example.com/person.schema.json" + } + }, + "messages": { + "Customer": { + "x-ep-event-id": "v0ys18dt3r7", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "customerid", + "description": "", + "x-ep-application-domain-id": "u2x73phaqbj", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Human Relationships", + "x-ep-event-version-id": "76vbk0mj80e", + "payload": { + "$ref": "#/components/schemas/CustomerJson" + }, + "x-ep-event-version": "1.0.1", + "x-ep-event-name": "Customer", + "x-ep-custom-attr-confidentiality": "internal", + "contentType": "application/json", + "x-ep-event-state-id": "2" + } + } + }, + "channels": { + "acmeRetail/hr/customer/{customerVerb}/v1/{customerId}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "Customer Unusual Behavior", + "topicSubscriptions": [ + "acmeRetail/hr/customer/behavedUnusual/v1/*" + ] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Customer" + } + }, + "parameters": { + "customerVerb": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerVerb" + }, + "customerId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerId" + } + } + } + }, + "asyncapi": "2.5.0", + "info": { + "x-ep-application-version": "1.1.2", + "x-ep-application-version-id": "vc91cjeb86o", + "x-ep-application-id": "pd8wbk7fa4t", + "description": "This application analyzes unusual behavior from customers and uses machine learning to determine if there is a possibility of future fraud with that customer. The application publishes fraud events with a futurePossibility sub type.\n\nWe now support multiple Customer event versions in this application", + "x-ep-state-name": "RELEASED", + "title": "Customer Fraud Prevention", + "x-ep-application-domain-id": "u2x73phaqbj", + "version": "1.1.2", + "x-ep-state-id": "2", + "x-ep-application-domain-name": "AcmeRetail - Human Relationships" + } +} \ No newline at end of file diff --git a/test/mocks/solace-customer-loyalty-management.json b/test/mocks/solace-customer-loyalty-management.json new file mode 100644 index 00000000..3f009c7d --- /dev/null +++ b/test/mocks/solace-customer-loyalty-management.json @@ -0,0 +1,392 @@ +{ + "components": { + "schemas": { + "CustomerJson": { + "x-ep-schema-version": "0.1.1", + "x-ep-schema-version-id": "r3jiwn9nyya", + "$schema": "https://json-schema.org/draft/2019-09/schema", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "CustomerJson", + "title": "Person", + "type": "object", + "x-ep-application-domain-id": "u2x73phaqbj", + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Human Relationships", + "x-ep-schema-state-id": "2", + "x-ep-schema-id": "ek90axpw2bq", + "properties": { + "firstName": { + "description": "The person's first name.", + "type": "string" + }, + "lastName": { + "description": "The person's last name.", + "type": "string" + }, + "zipCode": { + "description": "Person's zip code", + "type": "string" + }, + "streetAddress": { + "description": "Person's street address", + "type": "string" + }, + "birthdayDate": { + "description": "Birthday in CCYY-MM-DD format", + "type": "string", + "minimum": 0 + }, + "customerId": { + "description": "Persons's Id", + "type": "string" + } + }, + "$id": "https://example.com/person.schema.json" + }, + "FraudJson": { + "x-ep-schema-version": "1.0.1", + "x-ep-schema-version-id": "bzoqz01b1o8", + "$schema": "https://json-schema.org/draft/2019-09/schema", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "FraudJson", + "title": "Fraud", + "type": "object", + "x-ep-application-domain-id": "u2x73phaqbj", + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Human Relationships", + "x-ep-schema-state-id": "2", + "x-ep-schema-id": "ujhuu0nvmgx", + "properties": { + "fraudSubtype": { + "type": "string" + }, + "fraudType": { + "type": "string" + }, + "customerId": { + "description": "Persons's Id", + "type": "string" + }, + "description": { + "description": "Description", + "type": "string" + }, + "location": { + "type": "string" + }, + "fraudDate": { + "description": "day in CCYY-MM-DD format", + "type": "string", + "minimum": 0 + } + }, + "$id": "https://example.com/person.schema.json" + }, + "Retail_Order": { + "x-ep-schema-version": "0.1.3", + "x-ep-schema-state-id": "2", + "x-ep-schema-version-id": "da6twwdzwyb", + "x-ep-schema-id": "9xw7jd923hf", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "Retail Order", + "type": "object", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "properties": { + "price": { + "type": "number", + "minimum": 0 + }, + "billTo": { + "type": "object", + "properties": { + "zip": { + "type": "string" + }, + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "type": "string" + } + } + }, + "name": { + "type": "string" + }, + "sku": { + "type": "string" + }, + "shipTo": { + "type": "object", + "properties": { + "zip": { + "type": "string" + }, + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "type": "string" + } + } + } + }, + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + } + }, + "messages": { + "Customer": { + "x-ep-event-id": "v0ys18dt3r7", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "customerid", + "description": "", + "x-ep-application-domain-id": "u2x73phaqbj", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Human Relationships", + "x-ep-event-version-id": "76vbk0mj80e", + "payload": { + "$ref": "#/components/schemas/CustomerJson" + }, + "x-ep-event-version": "1.0.1", + "x-ep-event-name": "Customer", + "x-ep-custom-attr-confidentiality": "internal", + "contentType": "application/json", + "x-ep-event-state-id": "2" + }, + "Fraud": { + "x-ep-event-id": "di607yh2uxf", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "customerid", + "description": "**Real Time Data Product**\n\nThe result of constant data analysis of sales, behavioral and historical data, the Fraud event indicates when there is a high likelihood of fraud occuring. ", + "x-ep-application-domain-id": "u2x73phaqbj", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Human Relationships", + "x-ep-event-version-id": "giur277ig2n", + "payload": { + "$ref": "#/components/schemas/FraudJson" + }, + "x-ep-event-version": "1.0.0", + "x-ep-event-name": "Fraud", + "x-ep-custom-attr-confidentiality": "internal", + "contentType": "application/json", + "x-ep-event-state-id": "2" + }, + "Retail_Order": { + "x-ep-event-id": "jcbnyrt7dtx", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "pci", + "description": "State change information about a single product order, from birth (regardless if from a store, mobile application or 3rd party) until fulfillment.\n\nA single product order typically contain multiple products.", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Store Operations", + "x-ep-event-version-id": "f5wignab3df", + "payload": { + "$ref": "#/components/schemas/Retail_Order" + }, + "x-ep-event-version": "0.1.2", + "x-ep-event-name": "Retail Order", + "x-ep-custom-attr-confidentiality": "internal", + "contentType": "application/json", + "x-ep-event-state-id": "2" + } + } + }, + "channels": { + "acmeRetail/hr/fraud/{fraudVerbs}/v1/{fraudSubtype}/{fraudId}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Fraud" + } + }, + "parameters": { + "fraudSubtype": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "fraudSubtype" + }, + "fraudVerbs": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "fraudVerbs" + }, + "fraudId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "fraudId" + } + } + }, + "acmeRetail/hr/customer/{customerVerb}/v1/{customerId}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Customer" + } + }, + "parameters": { + "customerVerb": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerVerb" + }, + "customerId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerId" + } + } + }, + "acmeRetail/storeOps/retailOrder/{retailOrderVerb}/v1/{storeLocation}/{customerId}/{orderId}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "customerLoyalty.retailOrder.customerPaid", + "topicSubscriptions": [ + "acmeRetail/storeOps/retailOrder/customerPaid/v1/*/*/*" + ] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Retail_Order" + } + }, + "parameters": { + "retailOrderVerb": { + "schema": { + "type": "string", + "enum": [ + "customerInitiated", + "customerCancelled", + "customerCompleted", + "customerPaid", + "onlineInitiated", + "onlineCancelled", + "onlineCompleted", + "onlinePaid", + "onlineFulfilled" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Retail Order Verbs", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "x-ep-enum-version-id": "uyef7go9jg1", + "x-ep-enum-id": "kj01k3vfspr", + "x-ep-shared": "true", + "x-ep-parameter-name": "retailOrderVerb", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + }, + "storeLocation": { + "schema": { + "type": "string", + "enum": [ + "3487", + "3488", + "3489", + "3490", + "3491", + "3492", + "3493", + "3494", + "3495", + "3496", + "3497", + "3498", + "3499", + "3500", + "3501", + "3502", + "3503", + "3504", + "3505", + "3506", + "3507", + "3508", + "3509", + "3555", + "Mobile Application", + "Test Data Generation", + "Inhouse Traffic", + "Partner" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Store Locations", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "x-ep-enum-version-id": "fdolp49969n", + "x-ep-enum-id": "4xdj8kaz1le", + "x-ep-shared": "true", + "x-ep-parameter-name": "storeLocation", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "customerId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerId" + } + } + } + }, + "asyncapi": "2.5.0", + "info": { + "x-ep-application-version": "1.0.2", + "x-ep-custom-attr-PUBLISH_DESTINATIONS": "three", + "x-ep-application-version-id": "ji7l8c4j1l6", + "x-ep-custom-attr-CustomAttr1": "one", + "description": "Outputs customer ranking in this version, which is needed for customer facing mobile application\n\nStores information about each individual consumer to allow for targetted marketing and loyalty rewards, as well as indications of fraudulent behavior.", + "x-ep-state-name": "RELEASED", + "x-ep-custom-attr-Owner": "two", + "title": "Customer Loyalty Management", + "x-ep-application-domain-id": "u2x73phaqbj", + "version": "1.0.2", + "x-ep-application-domain-name": "AcmeRetail - Human Relationships", + "x-ep-application-id": "n5o41k2fh62", + "x-ep-state-id": "2" + } +} \ No newline at end of file diff --git a/test/mocks/solace-data-product-daily-store-sales-summary.json b/test/mocks/solace-data-product-daily-store-sales-summary.json new file mode 100644 index 00000000..ce81bac9 --- /dev/null +++ b/test/mocks/solace-data-product-daily-store-sales-summary.json @@ -0,0 +1,218 @@ +{ + "components": { + "schemas": { + "Retail_Order": { + "x-ep-schema-version": "0.1.3", + "x-ep-schema-state-id": "2", + "x-ep-schema-version-id": "da6twwdzwyb", + "x-ep-schema-id": "9xw7jd923hf", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "Retail Order", + "type": "object", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "properties": { + "price": { + "type": "number", + "minimum": 0 + }, + "billTo": { + "type": "object", + "properties": { + "zip": { + "type": "string" + }, + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "type": "string" + } + } + }, + "name": { + "type": "string" + }, + "sku": { + "type": "string" + }, + "shipTo": { + "type": "object", + "properties": { + "zip": { + "type": "string" + }, + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "type": "string" + } + } + } + }, + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + } + }, + "messages": { + "Retail_Order": { + "x-ep-event-id": "jcbnyrt7dtx", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "pci", + "description": "State change information about a single product order, from birth (regardless if from a store, mobile application or 3rd party) until fulfillment.\n\nA single product order typically contain multiple products.", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Store Operations", + "x-ep-event-version-id": "f5wignab3df", + "payload": { + "$ref": "#/components/schemas/Retail_Order" + }, + "x-ep-event-version": "0.1.2", + "x-ep-event-name": "Retail Order", + "x-ep-custom-attr-confidentiality": "internal", + "contentType": "application/json", + "x-ep-event-state-id": "2" + } + } + }, + "channels": { + "acmeRetail/storeOps/retailOrder/{retailOrderVerb}/v1/{storeLocation}/{customerId}/{orderId}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "dailyStoreSales.retailOrder.customerPaid", + "topicSubscriptions": [ + "acmeRetail/storeOps/retailOrder/customerPaid/v1/*/*/*" + ] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Retail_Order" + } + }, + "parameters": { + "retailOrderVerb": { + "schema": { + "type": "string", + "enum": [ + "customerInitiated", + "customerCancelled", + "customerCompleted", + "customerPaid", + "onlineInitiated", + "onlineCancelled", + "onlineCompleted", + "onlinePaid", + "onlineFulfilled" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Retail Order Verbs", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "x-ep-enum-version-id": "uyef7go9jg1", + "x-ep-enum-id": "kj01k3vfspr", + "x-ep-shared": "true", + "x-ep-parameter-name": "retailOrderVerb", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + }, + "storeLocation": { + "schema": { + "type": "string", + "enum": [ + "3487", + "3488", + "3489", + "3490", + "3491", + "3492", + "3493", + "3494", + "3495", + "3496", + "3497", + "3498", + "3499", + "3500", + "3501", + "3502", + "3503", + "3504", + "3505", + "3506", + "3507", + "3508", + "3509", + "3555", + "Mobile Application", + "Test Data Generation", + "Inhouse Traffic", + "Partner" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Store Locations", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "x-ep-enum-version-id": "fdolp49969n", + "x-ep-enum-id": "4xdj8kaz1le", + "x-ep-shared": "true", + "x-ep-parameter-name": "storeLocation", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "customerId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerId" + } + } + } + }, + "asyncapi": "2.5.0", + "info": { + "x-ep-application-version": "0.1.3", + "x-ep-application-version-id": "iw8hf4o1cf9", + "x-ep-application-id": "7djj14mtil5", + "description": "**Event-Driven Data Product **\n\nThis application receives all orders for the stores and produces a summarized file of the days sales complete with colorful graphs, which due to its size is placed on a shared drive for executive consumption.", + "x-ep-state-name": "RELEASED", + "title": "Data Product - Daily Store Sales Summary", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "version": "0.1.3", + "x-ep-state-id": "2", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + } +} \ No newline at end of file diff --git a/test/mocks/solace-data-product-real-time-customer-sentiment.json b/test/mocks/solace-data-product-real-time-customer-sentiment.json new file mode 100644 index 00000000..db9de6d6 --- /dev/null +++ b/test/mocks/solace-data-product-real-time-customer-sentiment.json @@ -0,0 +1,412 @@ +{ + "components": { + "schemas": { + "Product": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "pypi5my6jgi", + "$schema": "http://json-schema.org/draft-06/schema#", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "Product", + "type": "object", + "x-ep-application-domain-id": "n85j0k6rt5i", + "required": [ + "description", + "sku", + "quantity", + "price", + "currency" + ], + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance", + "x-ep-schema-state-id": "2", + "x-ep-schema-id": "tgqm04d0udj", + "properties": { + "quantity": { + "type": "integer" + }, + "price": { + "type": "number" + }, + "description": { + "type": "string" + }, + "currency": { + "type": "string" + }, + "sku": { + "type": "string" + } + } + }, + "Retail_Order": { + "x-ep-schema-version": "0.1.3", + "x-ep-schema-state-id": "2", + "x-ep-schema-version-id": "da6twwdzwyb", + "x-ep-schema-id": "9xw7jd923hf", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "Retail Order", + "type": "object", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "properties": { + "price": { + "type": "number", + "minimum": 0 + }, + "billTo": { + "type": "object", + "properties": { + "zip": { + "type": "string" + }, + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "type": "string" + } + } + }, + "name": { + "type": "string" + }, + "sku": { + "type": "string" + }, + "shipTo": { + "type": "object", + "properties": { + "zip": { + "type": "string" + }, + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "type": "string" + } + } + } + }, + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + } + }, + "messages": { + "Analysis": { + "x-ep-event-id": "mip0bxd6mo3", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "customerid", + "description": "", + "x-ep-application-domain-id": "n85j0k6rt5i", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance", + "x-ep-event-version-id": "pd8me6932o6", + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Analysis", + "x-ep-custom-attr-confidentiality": "internal", + "x-ep-event-state-id": "2" + }, + "Product": { + "x-ep-event-id": "5jwdbycqaq9", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "none", + "description": "An item for sale in the Acme-Retail store. Can be used for inventory updates, or price changes distribution.", + "x-ep-application-domain-id": "n85j0k6rt5i", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance", + "x-ep-event-version-id": "0kd3gdt9n45", + "payload": { + "$ref": "#/components/schemas/Product" + }, + "x-ep-event-version": "0.1.2", + "x-ep-event-name": "Product", + "x-ep-custom-attr-confidentiality": "none", + "contentType": "application/json", + "x-ep-event-state-id": "2" + }, + "Retail_Order": { + "x-ep-event-id": "jcbnyrt7dtx", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "pci", + "description": "State change information about a single product order, from birth (regardless if from a store, mobile application or 3rd party) until fulfillment.\n\nA single product order typically contain multiple products.", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Store Operations", + "x-ep-event-version-id": "f5wignab3df", + "payload": { + "$ref": "#/components/schemas/Retail_Order" + }, + "x-ep-event-version": "0.1.2", + "x-ep-event-name": "Retail Order", + "x-ep-custom-attr-confidentiality": "internal", + "contentType": "application/json", + "x-ep-event-state-id": "2" + } + } + }, + "channels": { + "acmeRetail/eeg/analysis/{analysisVerb}/v1/{reportType}/{reportId}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Analysis" + } + }, + "parameters": { + "reportType": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "reportType" + }, + "reportId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "reportId" + }, + "analysisVerb": { + "schema": { + "type": "string", + "enum": [ + "produced", + "amended" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Analysis Verbs", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "n85j0k6rt5i", + "x-ep-enum-version-id": "f49f6ge4spb", + "x-ep-enum-id": "xf9x56zchie", + "x-ep-shared": "true", + "x-ep-parameter-name": "analysisVerb", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance" + } + } + }, + "acmeRetail/eeg/product/{productVerb}/v1/{department}/{upcCode}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "customerSentiment.multipleStreams", + "topicSubscriptions": [ + "acmeRetail/eeg/product/added/v1/*/*", + "acmeRetail/storeOps/retailOrder/*/v1/*/*/*", + "acmeRetail/storeOps/store/*/v1/*/*" + ] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Product" + } + }, + "parameters": { + "productVerb": { + "schema": { + "type": "string", + "enum": [ + "added", + "priceUpdated", + "removed", + "tempUnavail" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Product Verbs", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "n85j0k6rt5i", + "x-ep-enum-version-id": "sbgfh22woe2", + "x-ep-enum-id": "8waaoc9581r", + "x-ep-shared": "true", + "x-ep-parameter-name": "productVerb", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance" + }, + "department": { + "schema": { + "type": "string", + "enum": [ + "100", + "110", + "120", + "130", + "200", + "300" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Store Department", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "n85j0k6rt5i", + "x-ep-enum-version-id": "0f2dilcb9lt", + "x-ep-enum-id": "3q8ds0j3i2g", + "x-ep-shared": "true", + "x-ep-parameter-name": "department", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance" + }, + "upcCode": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "upcCode" + } + } + }, + "acmeRetail/storeOps/retailOrder/{retailOrderVerb}/v1/{storeLocation}/{customerId}/{orderId}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "customerSentiment.multipleStreams", + "topicSubscriptions": [ + "acmeRetail/eeg/product/added/v1/*/*", + "acmeRetail/storeOps/retailOrder/*/v1/*/*/*", + "acmeRetail/storeOps/store/*/v1/*/*" + ] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Retail_Order" + } + }, + "parameters": { + "retailOrderVerb": { + "schema": { + "type": "string", + "enum": [ + "customerInitiated", + "customerCancelled", + "customerCompleted", + "customerPaid", + "onlineInitiated", + "onlineCancelled", + "onlineCompleted", + "onlinePaid", + "onlineFulfilled" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Retail Order Verbs", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "x-ep-enum-version-id": "uyef7go9jg1", + "x-ep-enum-id": "kj01k3vfspr", + "x-ep-shared": "true", + "x-ep-parameter-name": "retailOrderVerb", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + }, + "storeLocation": { + "schema": { + "type": "string", + "enum": [ + "3487", + "3488", + "3489", + "3490", + "3491", + "3492", + "3493", + "3494", + "3495", + "3496", + "3497", + "3498", + "3499", + "3500", + "3501", + "3502", + "3503", + "3504", + "3505", + "3506", + "3507", + "3508", + "3509", + "3555", + "Mobile Application", + "Test Data Generation", + "Inhouse Traffic", + "Partner" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Store Locations", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "x-ep-enum-version-id": "fdolp49969n", + "x-ep-enum-id": "4xdj8kaz1le", + "x-ep-shared": "true", + "x-ep-parameter-name": "storeLocation", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "customerId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerId" + } + } + } + }, + "asyncapi": "2.5.0", + "info": { + "x-ep-application-version": "0.1.3", + "x-ep-application-version-id": "eyxkegqs6ub", + "x-ep-application-id": "6k0e40a76al", + "x-ep-state-name": "RELEASED", + "title": "Data Product - Real-time Customer Sentiment", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "version": "0.1.3", + "x-ep-state-id": "2", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + } +} \ No newline at end of file diff --git a/test/mocks/solace-in-store-fulfillment-mobile-application.json b/test/mocks/solace-in-store-fulfillment-mobile-application.json new file mode 100644 index 00000000..ca20077c --- /dev/null +++ b/test/mocks/solace-in-store-fulfillment-mobile-application.json @@ -0,0 +1,342 @@ +{ + "components": { + "schemas": { + "Product": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "pypi5my6jgi", + "$schema": "http://json-schema.org/draft-06/schema#", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "Product", + "type": "object", + "x-ep-application-domain-id": "n85j0k6rt5i", + "required": [ + "description", + "sku", + "quantity", + "price", + "currency" + ], + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance", + "x-ep-schema-state-id": "2", + "x-ep-schema-id": "tgqm04d0udj", + "properties": { + "quantity": { + "type": "integer" + }, + "price": { + "type": "number" + }, + "description": { + "type": "string" + }, + "currency": { + "type": "string" + }, + "sku": { + "type": "string" + } + } + }, + "Retail_Order": { + "x-ep-schema-version": "0.1.3", + "x-ep-schema-state-id": "2", + "x-ep-schema-version-id": "da6twwdzwyb", + "x-ep-schema-id": "9xw7jd923hf", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "Retail Order", + "type": "object", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "properties": { + "price": { + "type": "number", + "minimum": 0 + }, + "billTo": { + "type": "object", + "properties": { + "zip": { + "type": "string" + }, + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "type": "string" + } + } + }, + "name": { + "type": "string" + }, + "sku": { + "type": "string" + }, + "shipTo": { + "type": "object", + "properties": { + "zip": { + "type": "string" + }, + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "type": "string" + } + } + } + }, + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + } + }, + "messages": { + "Product": { + "x-ep-event-id": "5jwdbycqaq9", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "none", + "description": "An item for sale in the Acme-Retail store. Can be used for inventory updates, or price changes distribution.", + "x-ep-application-domain-id": "n85j0k6rt5i", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance", + "x-ep-event-version-id": "0kd3gdt9n45", + "payload": { + "$ref": "#/components/schemas/Product" + }, + "x-ep-event-version": "0.1.2", + "x-ep-event-name": "Product", + "x-ep-custom-attr-confidentiality": "none", + "contentType": "application/json", + "x-ep-event-state-id": "2" + }, + "Retail_Order": { + "x-ep-event-id": "jcbnyrt7dtx", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "pci", + "description": "State change information about a single product order, from birth (regardless if from a store, mobile application or 3rd party) until fulfillment.\n\nA single product order typically contain multiple products.", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Store Operations", + "x-ep-event-version-id": "f5wignab3df", + "payload": { + "$ref": "#/components/schemas/Retail_Order" + }, + "x-ep-event-version": "0.1.2", + "x-ep-event-name": "Retail Order", + "x-ep-custom-attr-confidentiality": "internal", + "contentType": "application/json", + "x-ep-event-state-id": "2" + } + } + }, + "channels": { + "acmeRetail/eeg/product/{productVerb}/v1/{department}/{upcCode}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Product" + } + }, + "parameters": { + "productVerb": { + "schema": { + "type": "string", + "enum": [ + "added", + "priceUpdated", + "removed", + "tempUnavail" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Product Verbs", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "n85j0k6rt5i", + "x-ep-enum-version-id": "sbgfh22woe2", + "x-ep-enum-id": "8waaoc9581r", + "x-ep-shared": "true", + "x-ep-parameter-name": "productVerb", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance" + }, + "department": { + "schema": { + "type": "string", + "enum": [ + "100", + "110", + "120", + "130", + "200", + "300" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Store Department", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "n85j0k6rt5i", + "x-ep-enum-version-id": "0f2dilcb9lt", + "x-ep-enum-id": "3q8ds0j3i2g", + "x-ep-shared": "true", + "x-ep-parameter-name": "department", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance" + }, + "upcCode": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "upcCode" + } + } + }, + "acmeRetail/storeOps/retailOrder/{retailOrderVerb}/v1/{storeLocation}/{customerId}/{orderId}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Retail_Order" + } + }, + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "inStoreFulfillment.retailOrder.onlinePaid", + "topicSubscriptions": [ + "acmeRetail/storeOps/retailOrder/onlinePaid/v1/*/*/*" + ] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Retail_Order" + } + }, + "parameters": { + "retailOrderVerb": { + "schema": { + "type": "string", + "enum": [ + "customerInitiated", + "customerCancelled", + "customerCompleted", + "customerPaid", + "onlineInitiated", + "onlineCancelled", + "onlineCompleted", + "onlinePaid", + "onlineFulfilled" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Retail Order Verbs", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "x-ep-enum-version-id": "uyef7go9jg1", + "x-ep-enum-id": "kj01k3vfspr", + "x-ep-shared": "true", + "x-ep-parameter-name": "retailOrderVerb", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + }, + "storeLocation": { + "schema": { + "type": "string", + "enum": [ + "3487", + "3488", + "3489", + "3490", + "3491", + "3492", + "3493", + "3494", + "3495", + "3496", + "3497", + "3498", + "3499", + "3500", + "3501", + "3502", + "3503", + "3504", + "3505", + "3506", + "3507", + "3508", + "3509", + "3555", + "Mobile Application", + "Test Data Generation", + "Inhouse Traffic", + "Partner" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Store Locations", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "x-ep-enum-version-id": "fdolp49969n", + "x-ep-enum-id": "4xdj8kaz1le", + "x-ep-shared": "true", + "x-ep-parameter-name": "storeLocation", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "customerId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerId" + } + } + } + }, + "asyncapi": "2.5.0", + "info": { + "x-ep-application-version": "0.2.1", + "x-ep-application-version-id": "0beolrcgr5w", + "x-ep-application-id": "p85tywvzwoh", + "description": "Mobile application used by personnel in stores for fulfillment of orders (mobile, website or partner) and for restocking shelves.\n\n\n---> Added Consumer Subscription\n\n", + "x-ep-state-name": "RELEASED", + "title": "In-Store Fulfillment Mobile Application", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "version": "0.2.1", + "x-ep-state-id": "2", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + } +} \ No newline at end of file diff --git a/test/mocks/solace-logistics.json b/test/mocks/solace-logistics.json new file mode 100644 index 00000000..576cf948 --- /dev/null +++ b/test/mocks/solace-logistics.json @@ -0,0 +1,716 @@ +{ + "components": { + "schemas": { + "Shipment_Exception": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "6jocy5vvaq0", + "$schema": "http://json-schema.org/draft-07/schema#", + "x-ep-schema-state-name": "DRAFT", + "x-ep-schema-name": "Shipment Exception", + "title": "Shipment Exception Event", + "type": "object", + "x-ep-application-domain-id": "bex7ddi7ke5", + "required": [ + "eventType", "timestamp", "shipmentId", "exceptionType", "description" + ], + "x-ep-schema-version-displayname": "0.1.0", + "x-ep-shared": "true", + "x-ep-application-domain-name": "Acme Retail - Supply Chain Optimisation", + "x-ep-schema-state-id": "1", + "x-ep-schema-id": "rrrnq5enok0", + "properties": { + "exceptionType": { + "type": "string" + }, + "shipmentId": { + "type": "string" + }, + "description": { + "type": "string" + }, + "eventType": { + "type": "string", + "enum": ["ShipmentException"] + }, + "timestamp": { + "format": "date-time", + "type": "string" + } + } + }, + "Inventory_Level_Changed": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "774vppaic4d", + "$schema": "http://json-schema.org/draft-07/schema#", + "x-ep-schema-state-name": "DRAFT", + "x-ep-schema-name": "Inventory Level Changed", + "type": "object", + "x-ep-application-domain-id": "bex7ddi7ke5", + "required": [ + "eventType", + "timestamp", + "productId", + "locationId", + "quantity", + "changeType" + ], + "x-ep-schema-version-displayname": "0.1.0", + "x-ep-shared": "true", + "x-ep-application-domain-name": "Acme Retail - Supply Chain Optimisation", + "x-ep-schema-state-id": "1", + "x-ep-schema-id": "lpfayzi7rxu", + "properties": { + "quantity": { + "type": "integer" + }, + "productId": { + "type": "string" + }, + "locationId": { + "type": "string" + }, + "changeType": { + "type": "string", + "enum": ["increase", "decrease"] + }, + "eventType": { + "const": "inventoryLevelChanged", + "type": "string" + }, + "timestamp": { + "format": "date-time", + "type": "string" + } + } + }, + "Shipment_Delayed": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "9v033035ypi", + "$schema": "http://json-schema.org/draft-07/schema#", + "x-ep-schema-state-name": "DRAFT", + "x-ep-schema-name": "Shipment Delayed", + "title": "Shipment Delay Event", + "type": "object", + "x-ep-application-domain-id": "bex7ddi7ke5", + "required": [ + "eventType", "timestamp", "shipmentId", "reason", "expectedDelay" + ], + "x-ep-schema-version-displayname": "0.1.0", + "x-ep-shared": "true", + "x-ep-application-domain-name": "Acme Retail - Supply Chain Optimisation", + "x-ep-schema-state-id": "1", + "x-ep-schema-id": "hxb72cfd2wc", + "properties": { + "reason": { + "type": "string" + }, + "shipmentId": { + "type": "string" + }, + "eventType": { + "type": "string", + "enum": ["ShipmentDelay"] + }, + "expectedDelay": { + "type": "integer" + }, + "timestamp": { + "format": "date-time", + "type": "string" + } + } + }, + "Shipment_Delivered": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "71z23hakdfb", + "$schema": "http://json-schema.org/draft-07/schema#", + "x-ep-schema-state-name": "DRAFT", + "x-ep-schema-name": "Shipment Delivered", + "title": "Shipment Delivered Event", + "type": "object", + "x-ep-application-domain-id": "bex7ddi7ke5", + "required": [ + "eventType", "timestamp", "shipmentId", "deliveryLocation", "deliveryTime" + ], + "x-ep-schema-version-displayname": "0.1.0", + "x-ep-shared": "true", + "x-ep-application-domain-name": "Acme Retail - Supply Chain Optimisation", + "x-ep-schema-state-id": "1", + "x-ep-schema-id": "0rgjjhbhtmg", + "properties": { + "deliveryLocation": { + "type": "string" + }, + "deliveryTime": { + "format": "date-time", + "type": "string" + }, + "shipmentId": { + "type": "string" + }, + "eventType": { + "type": "string", + "enum": ["ShipmentDelivered"] + }, + "timestamp": { + "format": "date-time", + "type": "string" + } + } + }, + "Shipment_Moved": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "ecbvtv8cdlb", + "$schema": "http://json-schema.org/draft-07/schema#", + "x-ep-schema-state-name": "DRAFT", + "x-ep-schema-name": "Shipment Moved", + "title": "Shipment Tracking Event", + "type": "object", + "x-ep-application-domain-id": "bex7ddi7ke5", + "required": [ + "eventType", "timestamp", "shipmentId", "location", "status" + ], + "x-ep-schema-version-displayname": "0.1.0", + "x-ep-shared": "true", + "x-ep-application-domain-name": "Acme Retail - Supply Chain Optimisation", + "x-ep-schema-state-id": "1", + "x-ep-schema-id": "m3j2fywhx78", + "properties": { + "shipmentId": { + "type": "string" + }, + "location": { + "type": "string" + }, + "eventType": { + "type": "string", + "enum": ["ShipmentTracking"] + }, + "timestamp": { + "format": "date-time", + "type": "string" + }, + "status": { + "type": "string" + } + } + }, + "Shipment_Created": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "v8hzfhizv60", + "$schema": "http://json-schema.org/draft-07/schema#", + "description": "A JSON representation of a Shipment Creation event", + "x-ep-schema-state-name": "DRAFT", + "x-ep-schema-name": "Shipment Created", + "type": "object", + "x-ep-application-domain-id": "bex7ddi7ke5", + "required": [ + "eventType", + "shipmentId", + "orderId", + "customerId", + "shipmentDate", + "shippingAddress", + "items" + ], + "x-ep-schema-version-displayname": "0.1.0", + "x-ep-shared": "true", + "x-ep-application-domain-name": "Acme Retail - Supply Chain Optimisation", + "x-ep-schema-state-id": "1", + "x-ep-schema-id": "0c1x09ebpt5", + "properties": { + "orderId": { + "description": "Unique identifier for the order associated with this shipment", + "type": "string" + }, + "shipmentId": { + "description": "Unique identifier for the shipment", + "type": "string" + }, + "customerId": { + "description": "Unique identifier for the customer associated with this shipment", + "type": "string" + }, + "shippingAddress": { + "description": "The shipping address for the shipment", + "type": "object", + "properties": { + "country": { + "description": "The country of the shipment destination", + "type": "string" + }, + "city": { + "description": "The city of the shipment destination", + "type": "string" + }, + "street": { + "description": "The street address of the shipment destination", + "type": "string" + }, + "postalCode": { + "description": "The postal code of the shipment destination", + "type": "string" + }, + "name": { + "description": "The name of the person the shipment is being sent to", + "type": "string" + }, + "state": { + "description": "The state or province of the shipment destination", + "type": "string" + } + }, + "required": [ + "name", + "street", + "city", + "state", + "postalCode", + "country" + ] + }, + "eventType": { + "description": "Indicates that this is a Shipment Creation event", + "type": "string", + "enum": ["ShipmentCreation"] + }, + "shipmentDate": { + "format": "date-time", + "description": "The date and time that the shipment was created", + "type": "string" + }, + "items": { + "description": "A list of items being shipped as part of this shipment", + "type": "array", + "items": { + "description": "Information about an item being shipped", + "type": "object", + "properties": { + "itemId": { + "description": "The unique identifier for the item being shipped", + "type": "string" + }, + "quantity": { + "description": "The quantity of the item being shipped", + "type": "integer" + } + }, + "required": ["itemId", "quantity"] + } + } + } + } + }, + "messages": { + "Shipment_Exception": { + "x-ep-event-id": "b8cb70hi3po", + "x-ep-event-version-displayname": "0.1.0", + "description": "The Shipment Exception event contains information such as the timestamp of the event, the shipment identifier, the type of exception, and a description of the exception.", + "x-ep-application-domain-id": "bex7ddi7ke5", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "Acme Retail - Supply Chain Optimisation", + "x-ep-event-version-id": "ufk8no1xzqc", + "payload": { + "$ref": "#/components/schemas/Shipment_Exception" + }, + "x-ep-event-version": "0.1.0", + "x-ep-event-name": "Shipment Exception", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Inventory_Level_Changed": { + "x-ep-event-id": "2yr6an1dlrp", + "x-ep-event-version-displayname": "0.1.0", + "description": "An event generated when inventory levels of a certain item drop below a pre-defined threshold.", + "x-ep-application-domain-id": "bex7ddi7ke5", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "Acme Retail - Supply Chain Optimisation", + "x-ep-event-version-id": "xxryey8e8ke", + "payload": { + "$ref": "#/components/schemas/Inventory_Level_Changed" + }, + "x-ep-event-version": "0.1.0", + "x-ep-event-name": "Inventory Level Changed", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Shipment_Delayed": { + "x-ep-event-id": "20erefpccke", + "x-ep-event-version-displayname": "0.1.0", + "description": "The **Shipment Delayed** event contains information such as the timestamp of the event, the shipment identifier, the reason for the delay, and the expected length of the delay in minutes.", + "x-ep-application-domain-id": "bex7ddi7ke5", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "Acme Retail - Supply Chain Optimisation", + "x-ep-event-version-id": "nemrq9ueee8", + "payload": { + "$ref": "#/components/schemas/Shipment_Delayed" + }, + "x-ep-event-version": "0.1.0", + "x-ep-event-name": "Shipment Delayed", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Shipment_Delivered": { + "x-ep-event-id": "40qftjn2x6g", + "x-ep-event-version-displayname": "0.1.1", + "description": "This event is generated when a shipment is delivered to its destination, usually triggered by a delivery driver scanning a delivery confirmation code.\n\nThe topic has been updated to include orderID and customerID.", + "x-ep-application-domain-id": "bex7ddi7ke5", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "Acme Retail - Supply Chain Optimisation", + "x-ep-event-version-id": "g291nv2nq6p", + "payload": { + "$ref": "#/components/schemas/Shipment_Delivered" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Shipment Delivered", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Shipment_Moved": { + "x-ep-event-id": "rv35c3yit71", + "x-ep-event-version-displayname": "0.1.1", + "description": "This event is generated when a shipment is tracked, providing real-time updates on the shipment's location and status. \n\nThe topic has been updated to include orderID and customerID.", + "x-ep-application-domain-id": "bex7ddi7ke5", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "false", + "x-ep-application-domain-name": "Acme Retail - Supply Chain Optimisation", + "x-ep-event-version-id": "dxf2jjdjlji", + "payload": { + "$ref": "#/components/schemas/Shipment_Moved" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Shipment Moved", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "Shipment_Created": { + "x-ep-event-id": "weynbdjhqyc", + "x-ep-event-version-displayname": "0.1.1", + "description": "This event is generated when a shipment is created, usually triggered by an order from a customer.\n\nThe topic has been updated to include orderID and customerID.", + "x-ep-application-domain-id": "bex7ddi7ke5", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "Acme Retail - Supply Chain Optimisation", + "x-ep-event-version-id": "7y53ovvm82i", + "payload": { + "$ref": "#/components/schemas/Shipment_Created" + }, + "x-ep-event-version": "0.1.1", + "x-ep-event-name": "Shipment Created", + "contentType": "application/json", + "x-ep-event-state-id": "1" + } + } + }, + "channels": { + "acmeRetail/sc/logistics/shipment/exception/v1/{shipmentID}/{orderID}/{customerID}/{lat}/{lon}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Shipment_Exception" + } + }, + "parameters": { + "orderID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderID" + }, + "shipmentID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "shipmentID" + }, + "customerID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerID" + }, + "lon": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "lon" + }, + "lat": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "lat" + } + } + }, + "acmeRetail/sc/logistics/shipment/delayed/v1/{shipmentID}/{orderID}/{customerID}/{delayReason}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Shipment_Delayed" + } + }, + "parameters": { + "orderID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderID" + }, + "shipmentID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "shipmentID" + }, + "customerID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerID" + }, + "delayReason": { + "schema": { + "type": "string", + "enum": [ + "traffic", + "weather", + "mechanical", + "customs", + "strike", + "congestion", + "demand", + "technical", + "political" + ] + }, + "x-ep-enum-state-name": "DRAFT", + "x-ep-enum-version-displayname": "0.1.0", + "x-ep-enum-version": "0.1.0", + "x-ep-enum-name": "Shipment Delay Reason", + "x-ep-enum-state-id": "1", + "x-ep-application-domain-id": "bex7ddi7ke5", + "x-ep-enum-version-id": "4zt40u8pnm2", + "x-ep-enum-id": "nswy5f64s1v", + "x-ep-shared": "true", + "x-ep-parameter-name": "delayReason", + "x-ep-application-domain-name": "Acme Retail - Supply Chain Optimisation" + } + } + }, + "acmeRetail/sc/logistics/shipment/moved/v1/{shipmentID}/{orderID}/{customerID}/{lat}/{lon}/{shipmentStatus}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Shipment_Moved" + } + }, + "parameters": { + "orderID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderID" + }, + "shipmentID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "shipmentID" + }, + "customerID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerID" + }, + "lon": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "lon" + }, + "lat": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "lat" + }, + "shipmentStatus": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "shipmentStatus" + } + } + }, + "acmeRetail/sc/logistics/shipment/delivered/v1/{shipmentID}/{orderID}/{customerID}/{lat}/{lon}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Shipment_Delivered" + } + }, + "parameters": { + "orderID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderID" + }, + "shipmentID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "shipmentID" + }, + "customerID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerID" + }, + "lon": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "lon" + }, + "lat": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "lat" + } + } + }, + "acmeRetail/sc/logistics/shipment/created/v1/{shipmentID}/{orderID}/{customerID}/{lat}/{lon}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Shipment_Created" + } + }, + "parameters": { + "orderID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderID" + }, + "shipmentID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "shipmentID" + }, + "customerID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerID" + }, + "lon": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "lon" + }, + "lat": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "lat" + } + } + }, + "acmeRetail/sc/inventory/levelChanged/v1/{inventoryLevel}/{sku}/{amount}/{direction}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "logistics.inventory.levelChanged", + "topicSubscriptions": ["acmeRetail/sc/inventory/levelChanged/v1/*/*/*/*"] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Inventory_Level_Changed" + } + }, + "parameters": { + "amount": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "amount" + }, + "inventoryLevel": { + "schema": { + "type": "string", + "enum": ["low", "optimal", "high"] + }, + "x-ep-enum-state-name": "DRAFT", + "x-ep-enum-version-displayname": "0.1.0", + "x-ep-enum-version": "0.1.0", + "x-ep-enum-name": "Inventory Level", + "x-ep-enum-state-id": "1", + "x-ep-application-domain-id": "bex7ddi7ke5", + "x-ep-enum-version-id": "lgkl4jf92vc", + "x-ep-enum-id": "vk5ur2ciaof", + "x-ep-shared": "true", + "x-ep-parameter-name": "inventoryLevel", + "x-ep-application-domain-name": "Acme Retail - Supply Chain Optimisation" + }, + "sku": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "sku" + }, + "direction": { + "schema": { + "type": "string", + "enum": ["up", "down"] + }, + "x-ep-enum-state-name": "DRAFT", + "x-ep-enum-version-displayname": "0.1.0", + "x-ep-enum-version": "0.1.0", + "x-ep-enum-name": "Inventory Level Direction", + "x-ep-enum-state-id": "1", + "x-ep-application-domain-id": "bex7ddi7ke5", + "x-ep-enum-version-id": "470aohv07dc", + "x-ep-enum-id": "gnts55zrq2h", + "x-ep-shared": "true", + "x-ep-parameter-name": "direction", + "x-ep-application-domain-name": "Acme Retail - Supply Chain Optimisation" + } + } + } + }, + "asyncapi": "2.5.0", + "info": { + "x-ep-application-version": "0.1.0", + "x-ep-application-version-id": "j61g6fbiglx", + "x-ep-application-id": "f5mbmu2teop", + "description": "This system involves moving products from suppliers and manufacturers to distribution centers and stores, and then to customers.", + "x-ep-displayname": "0.1.0", + "x-ep-state-name": "DRAFT", + "title": "Logistics", + "x-ep-application-domain-id": "bex7ddi7ke5", + "version": "0.1.0", + "x-ep-state-id": "1", + "x-ep-application-domain-name": "Acme Retail - Supply Chain Optimisation" + } +} \ No newline at end of file diff --git a/test/mocks/solace-loyalty-program-manager.json b/test/mocks/solace-loyalty-program-manager.json new file mode 100644 index 00000000..57b123f4 --- /dev/null +++ b/test/mocks/solace-loyalty-program-manager.json @@ -0,0 +1,221 @@ +{ + "components": { + "schemas": {}, + "messages": { + "LoyaltyTierUpdated": { + "x-ep-event-id": "macf8z3kutj", + "x-ep-event-version-id": "5j8uvk5539d", + "x-ep-event-version": "0.0.1", + "x-ep-event-name": "LoyaltyTierUpdated", + "description": "An event that indicates a change in a customer's loyalty program tier based on accumulated points and engagement metrics.", + "x-ep-application-domain-id": "mwceysx5mzo", + "x-ep-event-state-id": "1", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "(AI-Designer - kfWQ3tkm) Transaction Payments" + }, + "LoyaltyPointsAwarded": { + "x-ep-event-id": "l9dvepy8jf0", + "x-ep-event-version-id": "bhgdvrrh5d8", + "x-ep-event-version": "0.0.1", + "x-ep-event-name": "LoyaltyPointsAwarded", + "description": "An event fired when loyalty points are awarded to a customer based on their transaction history and engagement.", + "x-ep-application-domain-id": "mwceysx5mzo", + "x-ep-event-state-id": "1", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "(AI-Designer - kfWQ3tkm) Transaction Payments" + }, + "PaymentInitiated": { + "x-ep-event-id": "wzm2iwdhrva", + "x-ep-event-version-id": "n4smo9o3ovf", + "x-ep-event-version": "0.0.1", + "x-ep-event-name": "PaymentInitiated", + "description": "An event that is fired when a payment transaction is initiated by a customer or the bank's system. This includes direct transfers, bill payments, and other monetary transactions.", + "x-ep-application-domain-id": "mwceysx5mzo", + "x-ep-event-state-id": "1", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "(AI-Designer - kfWQ3tkm) Transaction Payments" + }, + "AuthenticationSucceeded": { + "x-ep-event-id": "3mq6kadn5cx", + "x-ep-event-version-id": "q71366z4vl8", + "x-ep-event-version": "0.0.1", + "x-ep-event-name": "AuthenticationSucceeded", + "description": "An event that confirms successful authentication of a transaction, allowing it to proceed for further processing.", + "x-ep-application-domain-id": "mwceysx5mzo", + "x-ep-event-state-id": "1", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "(AI-Designer - kfWQ3tkm) Transaction Payments" + }, + "LoyaltyBenefitsRedeemed": { + "x-ep-event-id": "it1fnq7ve49", + "x-ep-event-version-id": "acyeydgs7xk", + "x-ep-event-version": "0.0.1", + "x-ep-event-name": "LoyaltyBenefitsRedeemed", + "description": "An event generated when a customer redeems benefits from their loyalty program, such as discounts or exclusive offers.", + "x-ep-application-domain-id": "mwceysx5mzo", + "x-ep-event-state-id": "1", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "true", + "x-ep-application-domain-name": "(AI-Designer - kfWQ3tkm) Transaction Payments" + } + } + }, + "channels": { + "evertrustBank/operations/loyalty/tierUpdated/v1/{customerID}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/LoyaltyTierUpdated" + } + }, + "parameters": { + "customerID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerID" + } + } + }, + "evertrustBank/operations/loyalty/benefitsRedeemed/v1/{customerID}/{benefitID}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/LoyaltyBenefitsRedeemed" + } + }, + "parameters": { + "customerID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerID" + }, + "benefitID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "benefitID" + } + } + }, + "evertrustBank/operations/loyalty/pointsAwarded/v1/{customerID}/{transactionID}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/LoyaltyPointsAwarded" + } + }, + "parameters": { + "customerID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerID" + }, + "transactionID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "transactionID" + } + } + }, + "evertrustBank/operations/payment/initiated/v1/{transactionID}/{customerID}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "LoyaltyProgramManager_PaymentInitiated", + "topicSubscriptions": ["evertrustBank/operations/payment/initiated/v1/*/*"] + } + }, { + "destinationType": "queue", + "queue": { + "name": "LoyaltyProgramManager_AuthenticationSucceeded", + "topicSubscriptions": ["evertrustBank/operations/authentication/succeeded/v1/*/*"] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/PaymentInitiated" + } + }, + "parameters": { + "customerID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerID" + }, + "transactionID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "transactionID" + } + } + }, + "evertrustBank/operations/authentication/succeeded/v1/{transactionID}/{customerID}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "LoyaltyProgramManager_PaymentInitiated", + "topicSubscriptions": ["evertrustBank/operations/payment/initiated/v1/*/*"] + } + }, { + "destinationType": "queue", + "queue": { + "name": "LoyaltyProgramManager_AuthenticationSucceeded", + "topicSubscriptions": ["evertrustBank/operations/authentication/succeeded/v1/*/*"] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/AuthenticationSucceeded" + } + }, + "parameters": { + "customerID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerID" + }, + "transactionID": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "transactionID" + } + } + } + }, + "asyncapi": "2.5.0", + "info": { + "x-ep-application-version": "0.0.1", + "x-ep-application-version-id": "dg8bz3wotgi", + "x-ep-application-id": "1go2dmkz5kd", + "description": "This application manages the bank's customer loyalty programs. It tracks transaction histories and customer interactions to award loyalty points and benefits. By analyzing customer behavior and engagement, the application helps enhance customer satisfaction and retention, fostering long-term relationships with clients.", + "x-ep-state-name": "DRAFT", + "title": "LoyaltyProgramManager", + "x-ep-application-domain-id": "mwceysx5mzo", + "version": "0.0.1", + "x-ep-state-id": "1", + "x-ep-application-domain-name": "(AI-Designer - kfWQ3tkm) Transaction Payments" + } +} \ No newline at end of file diff --git a/test/mocks/solace-order-management-v1.json b/test/mocks/solace-order-management-v1.json new file mode 100644 index 00000000..c095361a --- /dev/null +++ b/test/mocks/solace-order-management-v1.json @@ -0,0 +1,576 @@ +{ + "components": { + "schemas": { + "CoffeeShop-Order_Details": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "tkuii1g2aj9", + "$schema": "http://json-schema.org/draft-07/schema#", + "x-ep-schema-state-name": "DRAFT", + "x-ep-schema-name": "CoffeeShop-Order Details", + "title": "Generated schema for Root", + "type": "object", + "x-ep-application-domain-id": "77jhw5yw9oy", + "required": [ + "orderId", "country", "items", "pickupTime", "specialInstructions" + ], + "x-ep-schema-version-displayname": "", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-schema-state-id": "1", + "x-ep-schema-id": "nvklogeamt0", + "properties": { + "country": { + "type": "string" + }, + "pickupTime": { + "type": "string" + }, + "orderId": { + "type": "number" + }, + "requestId": { + "type": "number" + }, + "specialInstructions": { + "type": "string" + }, + "source": { + "type": "string" + }, + "storeId": { + "type": "number" + }, + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "quantity": { + "type": "number" + }, + "productID": { + "type": "string" + }, + "size": { + "type": "string" + }, + "options": { + "type": "array", + "items": { + "type": "string" + } + }, + "productName": { + "type": "string" + } + }, + "required": ["productID", "productName", "quantity"] + } + } + } + }, + "CoffeeShop-Order_ETA_": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "ssvjv64c9kc", + "$schema": "http://json-schema.org/draft-07/schema#", + "x-ep-schema-state-name": "DRAFT", + "x-ep-schema-name": "CoffeeShop-Order ETA ", + "title": "Generated schema for Root", + "type": "object", + "x-ep-application-domain-id": "77jhw5yw9oy", + "required": [ + "orderID", "eta" + ], + "x-ep-schema-version-displayname": "", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-schema-state-id": "1", + "x-ep-schema-id": "s1jrd2r9m1c", + "properties": { + "country": { + "type": "string" + }, + "eta": { + "type": "string" + }, + "orderId": { + "type": "number" + }, + "requestId": { + "type": "number" + }, + "source": { + "type": "string" + }, + "storeId": { + "type": "number" + } + } + }, + "CoffeeShop-Order_Status": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "iv4cav7w59o", + "$schema": "http://json-schema.org/draft-07/schema#", + "x-ep-schema-state-name": "DRAFT", + "x-ep-schema-name": "CoffeeShop-Order Status", + "title": "Generated schema for Root", + "type": "object", + "x-ep-application-domain-id": "77jhw5yw9oy", + "required": [ + "requestId", "orderID", "status" + ], + "x-ep-schema-version-displayname": "", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-schema-state-id": "1", + "x-ep-schema-id": "0ezxe429cly", + "properties": { + "country": { + "type": "string" + }, + "orderId": { + "type": "number" + }, + "requestId": { + "type": "number" + }, + "source": { + "type": "string" + }, + "storeId": { + "type": "number" + }, + "status": { + "type": "string" + } + } + }, + "CoffeeShop-Inventory": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "taenw9b9d48", + "$schema": "http://json-schema.org/draft-07/schema#", + "x-ep-schema-state-name": "DRAFT", + "x-ep-schema-name": "CoffeeShop-Inventory", + "title": "Generated schema for Order Status", + "type": "object", + "x-ep-application-domain-id": "77jhw5yw9oy", + "required": [ + "orderId", "status" + ], + "x-ep-schema-version-displayname": "", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-schema-state-id": "1", + "x-ep-schema-id": "rz2zy8oqgha", + "properties": { + "country": { + "type": "string" + }, + "orderId": { + "type": "number" + }, + "requestId": { + "type": "number" + }, + "source": { + "type": "string" + }, + "storeId": { + "type": "number" + }, + "status": { + "type": "string", + "enum": ["low", "medium", "high"] + } + } + }, + "CoffeeShop-Order_Ready": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "o5cs3132rp3", + "$schema": "http://json-schema.org/draft-07/schema#", + "x-ep-schema-state-name": "DRAFT", + "x-ep-schema-name": "CoffeeShop-Order Ready", + "title": "Generated schema for Root", + "type": "object", + "x-ep-application-domain-id": "77jhw5yw9oy", + "required": [ + "requestId", "orderID" + ], + "x-ep-schema-version-displayname": "", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-schema-state-id": "1", + "x-ep-schema-id": "fah0coceiyg", + "properties": { + "country": { + "type": "string" + }, + "orderId": { + "type": "number" + }, + "requestId": { + "type": "number" + }, + "source": { + "type": "string" + }, + "storeId": { + "type": "number" + } + } + } + }, + "messages": { + "Order_Completed": { + "x-ep-event-id": "bqhx79m24o6", + "x-ep-event-version-displayname": "", + "description": "", + "x-ep-application-domain-id": "77jhw5yw9oy", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-event-version-id": "rgxa25wjrvl", + "payload": { + "$ref": "#/components/schemas/CoffeeShop-Order_Status" + }, + "x-ep-event-version": "0.1.0", + "x-ep-event-name": "Order Completed", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "OM-Order_Details": { + "x-ep-event-id": "h2y7mkf9k4k", + "x-ep-event-version-displayname": "", + "description": "", + "x-ep-application-domain-id": "77jhw5yw9oy", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-event-version-id": "9jopjbyz2gf", + "payload": { + "$ref": "#/components/schemas/CoffeeShop-Order_Details" + }, + "x-ep-event-version": "0.1.0", + "x-ep-event-name": "OM-Order Details", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "KF-Order_Prep_Started": { + "x-ep-event-id": "lpujb4hinyh", + "x-ep-event-version-displayname": "", + "description": "", + "x-ep-application-domain-id": "77jhw5yw9oy", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-event-version-id": "95gut5tca16", + "payload": { + "$ref": "#/components/schemas/CoffeeShop-Order_ETA_" + }, + "x-ep-event-version": "0.1.0", + "x-ep-event-name": "KF-Order Prep Started", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "KF-Order_Ready": { + "x-ep-event-id": "yrnq9p1kgpp", + "x-ep-event-version-displayname": "", + "description": "", + "x-ep-application-domain-id": "77jhw5yw9oy", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-event-version-id": "ebt4fa0k0il", + "payload": { + "$ref": "#/components/schemas/CoffeeShop-Order_Ready" + }, + "x-ep-event-version": "0.1.0", + "x-ep-event-name": "KF-Order Ready", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "KF-Order_OutOfStock": { + "x-ep-event-id": "6rict1ymqpd", + "x-ep-event-version-displayname": "", + "description": "", + "x-ep-application-domain-id": "77jhw5yw9oy", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-event-version-id": "98y026200hh", + "payload": { + "$ref": "#/components/schemas/CoffeeShop-Inventory" + }, + "x-ep-event-version": "0.1.0", + "x-ep-event-name": "KF-Order OutOfStock", + "contentType": "application/json", + "x-ep-event-state-id": "1" + } + } + }, + "servers": {}, + "channels": { + "coffeeshop/order/status/v1/ready/{source}/{country}/{storeId}/{orderId}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "BS:Order Status", + "topicSubscriptions": ["coffeeshop/order/status/v1/inprogress/*/*/*/*", "coffeeshop/order/status/v1/outofstock/*/*/*/*", "coffeeshop/order/status/v1/ready/*/*/*/*"] + } + }, { + "destinationType": "queue", + "queue": { + "name": "BS:New Orders", + "topicSubscriptions": ["coffeeshop/order/details/v1/*/*/*/*"] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/KF-Order_Ready" + } + }, + "parameters": { + "country": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "country" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "source": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "source" + }, + "storeId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "storeId" + } + } + }, + "coffeeshop/order/status/v1/inprogress/{source}/{country}/{storeId}/{orderId}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "BS:Order Status", + "topicSubscriptions": ["coffeeshop/order/status/v1/inprogress/*/*/*/*", "coffeeshop/order/status/v1/outofstock/*/*/*/*", "coffeeshop/order/status/v1/ready/*/*/*/*"] + } + }, { + "destinationType": "queue", + "queue": { + "name": "BS:New Orders", + "topicSubscriptions": ["coffeeshop/order/details/v1/*/*/*/*"] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/KF-Order_Prep_Started" + } + }, + "parameters": { + "country": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "country" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "source": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "source" + }, + "storeId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "storeId" + } + } + }, + "coffeeshop/order/status/v1/completed/{source}/{country}/{storeId}/{orderId}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Order_Completed" + } + }, + "parameters": { + "country": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "country" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "source": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "source" + }, + "storeId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "storeId" + } + } + }, + "coffeeshop/order/details/v1/{source}/{country}/{storeId}/{orderId}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "BS:Order Status", + "topicSubscriptions": ["coffeeshop/order/status/v1/inprogress/*/*/*/*", "coffeeshop/order/status/v1/outofstock/*/*/*/*", "coffeeshop/order/status/v1/ready/*/*/*/*"] + } + }, { + "destinationType": "queue", + "queue": { + "name": "BS:New Orders", + "topicSubscriptions": ["coffeeshop/order/details/v1/*/*/*/*"] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/OM-Order_Details" + } + }, + "parameters": { + "country": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "country" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "source": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "source" + }, + "storeId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "storeId" + } + } + }, + "coffeeshop/order/status/v1/outofstock/{source}/{country}/{storeId}/{orderId}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "BS:Order Status", + "topicSubscriptions": ["coffeeshop/order/status/v1/inprogress/*/*/*/*", "coffeeshop/order/status/v1/outofstock/*/*/*/*", "coffeeshop/order/status/v1/ready/*/*/*/*"] + } + }, { + "destinationType": "queue", + "queue": { + "name": "BS:New Orders", + "topicSubscriptions": ["coffeeshop/order/details/v1/*/*/*/*"] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/KF-Order_OutOfStock" + } + }, + "parameters": { + "country": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "country" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "source": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "source" + }, + "storeId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "storeId" + } + } + } + }, + "asyncapi": "2.5.0", + "info": { + "x-ep-application-version": "0.1.0", + "x-ep-application-version-id": "b55tickeudb", + "x-ep-application-id": "a52ad55ngst", + "x-ep-state-name": "DRAFT", + "title": "Barista Station", + "x-ep-application-domain-id": "77jhw5yw9oy", + "version": "0.1.0", + "x-ep-state-id": "1", + "x-ep-application-domain-name": "CoffeeShop - Order Management" + } +} \ No newline at end of file diff --git a/test/mocks/solace-order-management-v2.json b/test/mocks/solace-order-management-v2.json new file mode 100644 index 00000000..b7d724bd --- /dev/null +++ b/test/mocks/solace-order-management-v2.json @@ -0,0 +1,587 @@ +{ + "components": { + "schemas": { + "CoffeeShop-Order_Details": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "tkuii1g2aj9", + "$schema": "http://json-schema.org/draft-07/schema#", + "x-ep-schema-state-name": "DRAFT", + "x-ep-schema-name": "CoffeeShop-Order Details", + "title": "Generated schema for Root", + "type": "object", + "x-ep-application-domain-id": "77jhw5yw9oy", + "required": [ + "orderId", "country", "items", "pickupTime", "specialInstructions" + ], + "x-ep-schema-version-displayname": "", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-schema-state-id": "1", + "x-ep-schema-id": "nvklogeamt0", + "properties": { + "country": { + "type": "string" + }, + "pickupTime": { + "type": "string" + }, + "orderId": { + "type": "number" + }, + "requestId": { + "type": "number" + }, + "specialInstructions": { + "type": "string" + }, + "source": { + "type": "string" + }, + "storeId": { + "type": "number" + }, + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "quantity": { + "type": "number" + }, + "productID": { + "type": "string" + }, + "size": { + "type": "string" + }, + "options": { + "type": "object", + "properties": { + "quantity": { + "type": "number" + }, + "productID": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "productName": { + "type": "string" + } + }, + "required": ["productID", "productName", "quantity"] + } + } + } + }, + "CoffeeShop-Order_ETA_": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "ssvjv64c9kc", + "$schema": "http://json-schema.org/draft-07/schema#", + "x-ep-schema-state-name": "DRAFT", + "x-ep-schema-name": "CoffeeShop-Order ETA ", + "title": "Generated schema for Root", + "type": "object", + "x-ep-application-domain-id": "77jhw5yw9oy", + "required": [ + "orderID", "eta" + ], + "x-ep-schema-version-displayname": "", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-schema-state-id": "1", + "x-ep-schema-id": "s1jrd2r9m1c", + "properties": { + "country": { + "type": "string" + }, + "eta": { + "type": "string" + }, + "orderId": { + "type": "number" + }, + "requestId": { + "type": "number" + }, + "source": { + "type": "string" + }, + "storeId": { + "type": "number" + } + } + }, + "CoffeeShop-Order_Status": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "iv4cav7w59o", + "$schema": "http://json-schema.org/draft-07/schema#", + "x-ep-schema-state-name": "DRAFT", + "x-ep-schema-name": "CoffeeShop-Order Status", + "title": "Generated schema for Root", + "type": "object", + "x-ep-application-domain-id": "77jhw5yw9oy", + "required": [ + "requestId", "orderID", "status" + ], + "x-ep-schema-version-displayname": "", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-schema-state-id": "1", + "x-ep-schema-id": "0ezxe429cly", + "properties": { + "country": { + "type": "string" + }, + "orderId": { + "type": "number" + }, + "requestId": { + "type": "number" + }, + "source": { + "type": "string" + }, + "storeId": { + "type": "number" + }, + "status": { + "type": "string" + } + } + }, + "CoffeeShop-Inventory": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "taenw9b9d48", + "$schema": "http://json-schema.org/draft-07/schema#", + "x-ep-schema-state-name": "DRAFT", + "x-ep-schema-name": "CoffeeShop-Inventory", + "title": "Generated schema for Order Status", + "type": "object", + "x-ep-application-domain-id": "77jhw5yw9oy", + "required": [ + "orderId", "status" + ], + "x-ep-schema-version-displayname": "", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-schema-state-id": "1", + "x-ep-schema-id": "rz2zy8oqgha", + "properties": { + "country": { + "type": "string" + }, + "orderId": { + "type": "number" + }, + "requestId": { + "type": "number" + }, + "source": { + "type": "string" + }, + "storeId": { + "type": "number" + }, + "status": { + "type": "string", + "enum": ["low", "medium", "high"] + } + } + }, + "CoffeeShop-Order_Ready": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "o5cs3132rp3", + "$schema": "http://json-schema.org/draft-07/schema#", + "x-ep-schema-state-name": "DRAFT", + "x-ep-schema-name": "CoffeeShop-Order Ready", + "title": "Generated schema for Root", + "type": "object", + "x-ep-application-domain-id": "77jhw5yw9oy", + "required": [ + "requestId", "orderID" + ], + "x-ep-schema-version-displayname": "", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-schema-state-id": "1", + "x-ep-schema-id": "fah0coceiyg", + "properties": { + "country": { + "type": "string" + }, + "orderId": { + "type": "number" + }, + "requestId": { + "type": "number" + }, + "source": { + "type": "string" + }, + "storeId": { + "type": "number" + } + } + } + }, + "messages": { + "Order_Completed": { + "x-ep-event-id": "bqhx79m24o6", + "x-ep-event-version-displayname": "", + "description": "", + "x-ep-application-domain-id": "77jhw5yw9oy", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-event-version-id": "rgxa25wjrvl", + "payload": { + "$ref": "#/components/schemas/CoffeeShop-Order_Status" + }, + "x-ep-event-version": "0.1.0", + "x-ep-event-name": "Order Completed", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "OM-Order_Details": { + "x-ep-event-id": "h2y7mkf9k4k", + "x-ep-event-version-displayname": "", + "description": "", + "x-ep-application-domain-id": "77jhw5yw9oy", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-event-version-id": "9jopjbyz2gf", + "payload": { + "$ref": "#/components/schemas/CoffeeShop-Order_Details" + }, + "x-ep-event-version": "0.1.0", + "x-ep-event-name": "OM-Order Details", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "KF-Order_Prep_Started": { + "x-ep-event-id": "lpujb4hinyh", + "x-ep-event-version-displayname": "", + "description": "", + "x-ep-application-domain-id": "77jhw5yw9oy", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-event-version-id": "95gut5tca16", + "payload": { + "$ref": "#/components/schemas/CoffeeShop-Order_ETA_" + }, + "x-ep-event-version": "0.1.0", + "x-ep-event-name": "KF-Order Prep Started", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "KF-Order_Ready": { + "x-ep-event-id": "yrnq9p1kgpp", + "x-ep-event-version-displayname": "", + "description": "", + "x-ep-application-domain-id": "77jhw5yw9oy", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-event-version-id": "ebt4fa0k0il", + "payload": { + "$ref": "#/components/schemas/CoffeeShop-Order_Ready" + }, + "x-ep-event-version": "0.1.0", + "x-ep-event-name": "KF-Order Ready", + "contentType": "application/json", + "x-ep-event-state-id": "1" + }, + "KF-Order_OutOfStock": { + "x-ep-event-id": "6rict1ymqpd", + "x-ep-event-version-displayname": "", + "description": "", + "x-ep-application-domain-id": "77jhw5yw9oy", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "DRAFT", + "x-ep-shared": "false", + "x-ep-application-domain-name": "CoffeeShop - Order Management", + "x-ep-event-version-id": "98y026200hh", + "payload": { + "$ref": "#/components/schemas/CoffeeShop-Inventory" + }, + "x-ep-event-version": "0.1.0", + "x-ep-event-name": "KF-Order OutOfStock", + "contentType": "application/json", + "x-ep-event-state-id": "1" + } + } + }, + "servers": {}, + "channels": { + "coffeeshop/order/status/v1/ready/{source}/{country}/{storeId}/{orderId}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "BS:Order Status", + "topicSubscriptions": ["coffeeshop/order/status/v1/inprogress/*/*/*/*", "coffeeshop/order/status/v1/outofstock/*/*/*/*", "coffeeshop/order/status/v1/ready/*/*/*/*"] + } + }, { + "destinationType": "queue", + "queue": { + "name": "BS:New Orders", + "topicSubscriptions": ["coffeeshop/order/details/v1/*/*/*/*"] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/KF-Order_Ready" + } + }, + "parameters": { + "country": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "country" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "source": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "source" + }, + "storeId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "storeId" + } + } + }, + "coffeeshop/order/status/v1/inprogress/{source}/{country}/{storeId}/{orderId}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "BS:Order Status", + "topicSubscriptions": ["coffeeshop/order/status/v1/inprogress/*/*/*/*", "coffeeshop/order/status/v1/outofstock/*/*/*/*", "coffeeshop/order/status/v1/ready/*/*/*/*"] + } + }, { + "destinationType": "queue", + "queue": { + "name": "BS:New Orders", + "topicSubscriptions": ["coffeeshop/order/details/v1/*/*/*/*"] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/KF-Order_Prep_Started" + } + }, + "parameters": { + "country": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "country" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "source": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "source" + }, + "storeId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "storeId" + } + } + }, + "coffeeshop/order/status/v1/completed/{source}/{country}/{storeId}/{orderId}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Order_Completed" + } + }, + "parameters": { + "country": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "country" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "source": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "source" + }, + "storeId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "storeId" + } + } + }, + "coffeeshop/order/details/v1/{source}/{country}/{storeId}/{orderId}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "BS:Order Status", + "topicSubscriptions": ["coffeeshop/order/status/v1/inprogress/*/*/*/*", "coffeeshop/order/status/v1/outofstock/*/*/*/*", "coffeeshop/order/status/v1/ready/*/*/*/*"] + } + }, { + "destinationType": "queue", + "queue": { + "name": "BS:New Orders", + "topicSubscriptions": ["coffeeshop/order/details/v1/*/*/*/*"] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/OM-Order_Details" + } + }, + "parameters": { + "country": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "country" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "source": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "source" + }, + "storeId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "storeId" + } + } + }, + "coffeeshop/order/status/v1/outofstock/{source}/{country}/{storeId}/{orderId}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "BS:Order Status", + "topicSubscriptions": ["coffeeshop/order/status/v1/inprogress/*/*/*/*", "coffeeshop/order/status/v1/outofstock/*/*/*/*", "coffeeshop/order/status/v1/ready/*/*/*/*"] + } + }, { + "destinationType": "queue", + "queue": { + "name": "BS:New Orders", + "topicSubscriptions": ["coffeeshop/order/details/v1/*/*/*/*"] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/KF-Order_OutOfStock" + } + }, + "parameters": { + "country": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "country" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "source": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "source" + }, + "storeId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "storeId" + } + } + } + }, + "asyncapi": "2.5.0", + "info": { + "x-ep-application-version": "0.1.0", + "x-ep-application-version-id": "b55tickeudb", + "x-ep-application-id": "a52ad55ngst", + "x-ep-state-name": "DRAFT", + "title": "Barista Station", + "x-ep-application-domain-id": "77jhw5yw9oy", + "version": "0.1.0", + "x-ep-state-id": "1", + "x-ep-application-domain-name": "CoffeeShop - Order Management" + } +} \ No newline at end of file diff --git a/test/mocks/solace-payment-processor.json b/test/mocks/solace-payment-processor.json new file mode 100644 index 00000000..0340e66f --- /dev/null +++ b/test/mocks/solace-payment-processor.json @@ -0,0 +1 @@ +{"components":{"schemas":{},"messages":{"PaymentInitiated":{"x-ep-event-id":"wzm2iwdhrva","x-ep-event-version-id":"n4smo9o3ovf","x-ep-event-version":"0.0.1","x-ep-event-name":"PaymentInitiated","description":"An event that is fired when a payment transaction is initiated by a customer or the bank's system. This includes direct transfers, bill payments, and other monetary transactions.","x-ep-application-domain-id":"mwceysx5mzo","x-ep-event-state-id":"1","x-ep-event-state-name":"DRAFT","x-ep-shared":"true","x-ep-application-domain-name":"(AI-Designer - kfWQ3tkm) Transaction Payments"},"AuthenticationSucceeded":{"x-ep-event-id":"3mq6kadn5cx","x-ep-event-version-id":"q71366z4vl8","x-ep-event-version":"0.0.1","x-ep-event-name":"AuthenticationSucceeded","description":"An event that confirms successful authentication of a transaction, allowing it to proceed for further processing.","x-ep-application-domain-id":"mwceysx5mzo","x-ep-event-state-id":"1","x-ep-event-state-name":"DRAFT","x-ep-shared":"true","x-ep-application-domain-name":"(AI-Designer - kfWQ3tkm) Transaction Payments"}}},"channels":{"evertrustBank/operations/payment/initiated/v1/{transactionID}/{customerID}":{"subscribe":{"message":{"$ref":"#/components/messages/PaymentInitiated"}},"parameters":{"customerID":{"schema":{"type":"string"},"x-ep-parameter-name":"customerID"},"transactionID":{"schema":{"type":"string"},"x-ep-parameter-name":"transactionID"}}},"evertrustBank/operations/authentication/succeeded/v1/{transactionID}/{customerID}":{"publish":{"bindings":{"solace":{"destinations":[{"destinationType":"queue","queue":{"name":"PaymentProcessor_AuthenticationSucceeded","topicSubscriptions":["evertrustBank/operations/authentication/succeeded/v1/*/*"]}}],"bindingVersion":"0.3.0"}},"message":{"$ref":"#/components/messages/AuthenticationSucceeded"}},"parameters":{"customerID":{"schema":{"type":"string"},"x-ep-parameter-name":"customerID"},"transactionID":{"schema":{"type":"string"},"x-ep-parameter-name":"transactionID"}}}},"asyncapi":"2.5.0","info":{"x-ep-application-version":"0.0.1","x-ep-application-version-id":"7sv6c2qnooe","x-ep-application-id":"7ht9rih558h","description":"A critical application responsible for managing and executing various types of payment transactions, including direct transfers and bill payments. It ensures secure, efficient, and reliable handling of monetary transactions between the bank and its clients. The application also integrates with other banking services to provide seamless transaction flows.","x-ep-state-name":"DRAFT","title":"PaymentProcessor","x-ep-application-domain-id":"mwceysx5mzo","version":"0.0.1","x-ep-state-id":"1","x-ep-application-domain-name":"(AI-Designer - kfWQ3tkm) Transaction Payments"}} \ No newline at end of file diff --git a/test/mocks/solace-point-of-sale-system.json b/test/mocks/solace-point-of-sale-system.json new file mode 100644 index 00000000..ab75eaa9 --- /dev/null +++ b/test/mocks/solace-point-of-sale-system.json @@ -0,0 +1,458 @@ +{ + "components": { + "schemas": { + "FraudJson": { + "x-ep-schema-version": "1.0.1", + "x-ep-schema-version-id": "bzoqz01b1o8", + "$schema": "https://json-schema.org/draft/2019-09/schema", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "FraudJson", + "title": "Fraud", + "type": "object", + "x-ep-application-domain-id": "u2x73phaqbj", + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Human Relationships", + "x-ep-schema-state-id": "2", + "x-ep-schema-id": "ujhuu0nvmgx", + "properties": { + "fraudSubtype": { + "type": "string" + }, + "fraudType": { + "type": "string" + }, + "customerId": { + "description": "Persons's Id", + "type": "string" + }, + "description": { + "description": "Description", + "type": "string" + }, + "location": { + "type": "string" + }, + "fraudDate": { + "description": "day in CCYY-MM-DD format", + "type": "string", + "minimum": 0 + } + }, + "$id": "https://example.com/person.schema.json" + }, + "Product": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "pypi5my6jgi", + "$schema": "http://json-schema.org/draft-06/schema#", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "Product", + "type": "object", + "x-ep-application-domain-id": "n85j0k6rt5i", + "required": [ + "description", + "sku", + "quantity", + "price", + "currency" + ], + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance", + "x-ep-schema-state-id": "2", + "x-ep-schema-id": "tgqm04d0udj", + "properties": { + "quantity": { + "type": "integer" + }, + "price": { + "type": "number" + }, + "description": { + "type": "string" + }, + "currency": { + "type": "string" + }, + "sku": { + "type": "string" + } + } + }, + "Retail_Order": { + "x-ep-schema-version": "0.1.3", + "x-ep-schema-state-id": "2", + "x-ep-schema-version-id": "da6twwdzwyb", + "x-ep-schema-id": "9xw7jd923hf", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "Retail Order", + "type": "object", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "properties": { + "price": { + "type": "number", + "minimum": 0 + }, + "billTo": { + "type": "object", + "properties": { + "zip": { + "type": "string" + }, + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "type": "string" + } + } + }, + "name": { + "type": "string" + }, + "sku": { + "type": "string" + }, + "shipTo": { + "type": "object", + "properties": { + "zip": { + "type": "string" + }, + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "type": "string" + } + } + } + }, + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + } + }, + "messages": { + "Product": { + "x-ep-event-id": "5jwdbycqaq9", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "none", + "description": "An item for sale in the Acme-Retail store. Can be used for inventory updates, or price changes distribution.", + "x-ep-application-domain-id": "n85j0k6rt5i", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance", + "x-ep-event-version-id": "0kd3gdt9n45", + "payload": { + "$ref": "#/components/schemas/Product" + }, + "x-ep-event-version": "0.1.2", + "x-ep-event-name": "Product", + "x-ep-custom-attr-confidentiality": "none", + "contentType": "application/json", + "x-ep-event-state-id": "2" + }, + "Fraud": { + "x-ep-event-id": "di607yh2uxf", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "customerid", + "description": "**Real Time Data Product**\n\nThe result of constant data analysis of sales, behavioral and historical data, the Fraud event indicates when there is a high likelihood of fraud occuring. ", + "x-ep-application-domain-id": "u2x73phaqbj", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Human Relationships", + "x-ep-event-version-id": "giur277ig2n", + "payload": { + "$ref": "#/components/schemas/FraudJson" + }, + "x-ep-event-version": "1.0.0", + "x-ep-event-name": "Fraud", + "x-ep-custom-attr-confidentiality": "internal", + "contentType": "application/json", + "x-ep-event-state-id": "2" + }, + "Retail_Order": { + "x-ep-event-id": "jcbnyrt7dtx", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "pci", + "description": "State change information about a single product order, from birth (regardless if from a store, mobile application or 3rd party) until fulfillment.\n\nA single product order typically contain multiple products.", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Store Operations", + "x-ep-event-version-id": "f5wignab3df", + "payload": { + "$ref": "#/components/schemas/Retail_Order" + }, + "x-ep-event-version": "0.1.2", + "x-ep-event-name": "Retail Order", + "x-ep-custom-attr-confidentiality": "internal", + "contentType": "application/json", + "x-ep-event-state-id": "2" + } + } + }, + "channels": { + "acmeRetail/hr/fraud/{fraudVerbs}/v1/{fraudSubtype}/{fraudId}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "pointOfSale.fraud.detected", + "topicSubscriptions": [ + "acmeRetail/hr/fraud/detected/v1/*/*" + ] + } + }, + { + "destinationType": "queue", + "queue": { + "name": "pointOfSale.product.added", + "topicSubscriptions": [ + "acmeRetail/eeg/product/added/v1/*/*" + ] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Fraud" + } + }, + "parameters": { + "fraudSubtype": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "fraudSubtype" + }, + "fraudVerbs": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "fraudVerbs" + }, + "fraudId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "fraudId" + } + } + }, + "acmeRetail/eeg/product/{productVerb}/v1/{department}/{upcCode}": { + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "pointOfSale.fraud.detected", + "topicSubscriptions": [ + "acmeRetail/hr/fraud/detected/v1/*/*" + ] + } + }, + { + "destinationType": "queue", + "queue": { + "name": "pointOfSale.product.added", + "topicSubscriptions": [ + "acmeRetail/eeg/product/added/v1/*/*" + ] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Product" + } + }, + "parameters": { + "productVerb": { + "schema": { + "type": "string", + "enum": [ + "added", + "priceUpdated", + "removed", + "tempUnavail" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Product Verbs", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "n85j0k6rt5i", + "x-ep-enum-version-id": "sbgfh22woe2", + "x-ep-enum-id": "8waaoc9581r", + "x-ep-shared": "true", + "x-ep-parameter-name": "productVerb", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance" + }, + "department": { + "schema": { + "type": "string", + "enum": [ + "100", + "110", + "120", + "130", + "200", + "300" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Store Department", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "n85j0k6rt5i", + "x-ep-enum-version-id": "0f2dilcb9lt", + "x-ep-enum-id": "3q8ds0j3i2g", + "x-ep-shared": "true", + "x-ep-parameter-name": "department", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance" + }, + "upcCode": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "upcCode" + } + } + }, + "acmeRetail/storeOps/retailOrder/{retailOrderVerb}/v1/{storeLocation}/{customerId}/{orderId}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Retail_Order" + } + }, + "parameters": { + "retailOrderVerb": { + "schema": { + "type": "string", + "enum": [ + "customerInitiated", + "customerCancelled", + "customerCompleted", + "customerPaid", + "onlineInitiated", + "onlineCancelled", + "onlineCompleted", + "onlinePaid", + "onlineFulfilled" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Retail Order Verbs", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "x-ep-enum-version-id": "uyef7go9jg1", + "x-ep-enum-id": "kj01k3vfspr", + "x-ep-shared": "true", + "x-ep-parameter-name": "retailOrderVerb", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + }, + "storeLocation": { + "schema": { + "type": "string", + "enum": [ + "3487", + "3488", + "3489", + "3490", + "3491", + "3492", + "3493", + "3494", + "3495", + "3496", + "3497", + "3498", + "3499", + "3500", + "3501", + "3502", + "3503", + "3504", + "3505", + "3506", + "3507", + "3508", + "3509", + "3555", + "Mobile Application", + "Test Data Generation", + "Inhouse Traffic", + "Partner" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Store Locations", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "x-ep-enum-version-id": "fdolp49969n", + "x-ep-enum-id": "4xdj8kaz1le", + "x-ep-shared": "true", + "x-ep-parameter-name": "storeLocation", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + }, + "orderId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "orderId" + }, + "customerId": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "customerId" + } + } + } + }, + "asyncapi": "2.5.0", + "info": { + "x-ep-application-version": "0.1.5", + "x-ep-application-version-id": "y9vvclnp39p", + "x-ep-application-id": "arohf0gw73c", + "description": "Commercial off-the-shelf (COTS) Point of Sale (PoS) system that serves checkout areas for all stores within acme-retail. Receives Product events from supply chain management domain to allow for price updates and restrictions on purchases. Emits Retail Order events that allow for analytics and supply chain management decisions.", + "x-ep-state-name": "RELEASED", + "title": "Point of Sale System", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "version": "0.1.5", + "x-ep-state-id": "2", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + } +} \ No newline at end of file diff --git a/test/mocks/solace-smart-shelf-inventory-control.json b/test/mocks/solace-smart-shelf-inventory-control.json new file mode 100644 index 00000000..8029ef14 --- /dev/null +++ b/test/mocks/solace-smart-shelf-inventory-control.json @@ -0,0 +1,164 @@ +{ + "components": { + "schemas": { + "Product": { + "x-ep-schema-version": "0.1.0", + "x-ep-schema-version-id": "pypi5my6jgi", + "$schema": "http://json-schema.org/draft-06/schema#", + "x-ep-schema-state-name": "RELEASED", + "x-ep-schema-name": "Product", + "type": "object", + "x-ep-application-domain-id": "n85j0k6rt5i", + "required": [ + "description", + "sku", + "quantity", + "price", + "currency" + ], + "x-ep-schema-version-displayname": "", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance", + "x-ep-schema-state-id": "2", + "x-ep-schema-id": "tgqm04d0udj", + "properties": { + "quantity": { + "type": "integer" + }, + "price": { + "type": "number" + }, + "description": { + "type": "string" + }, + "currency": { + "type": "string" + }, + "sku": { + "type": "string" + } + } + } + }, + "messages": { + "Product": { + "x-ep-event-id": "5jwdbycqaq9", + "x-ep-event-version-displayname": "", + "x-ep-custom-attr-sensitivity": "none", + "description": "An item for sale in the Acme-Retail store. Can be used for inventory updates, or price changes distribution.", + "x-ep-application-domain-id": "n85j0k6rt5i", + "schemaFormat": "application/vnd.aai.asyncapi+json;version=2.5.0", + "x-ep-event-state-name": "RELEASED", + "x-ep-shared": "true", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance", + "x-ep-event-version-id": "0kd3gdt9n45", + "payload": { + "$ref": "#/components/schemas/Product" + }, + "x-ep-event-version": "0.1.2", + "x-ep-event-name": "Product", + "x-ep-custom-attr-confidentiality": "none", + "contentType": "application/json", + "x-ep-event-state-id": "2" + } + } + }, + "channels": { + "acmeRetail/eeg/product/{productVerb}/v1/{department}/{upcCode}": { + "subscribe": { + "message": { + "$ref": "#/components/messages/Product" + } + }, + "publish": { + "bindings": { + "solace": { + "destinations": [ + { + "destinationType": "queue", + "queue": { + "name": "smartShelf.products.addedchanged", + "topicSubscriptions": [ + "acmeRetail/eeg/product/added/v1/*/*", + "acmeRetail/eeg/product/priceUpdated/v1/*/*" + ] + } + } + ], + "bindingVersion": "0.3.0" + } + }, + "message": { + "$ref": "#/components/messages/Product" + } + }, + "parameters": { + "productVerb": { + "schema": { + "type": "string", + "enum": [ + "added", + "priceUpdated", + "removed", + "tempUnavail" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Product Verbs", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "n85j0k6rt5i", + "x-ep-enum-version-id": "sbgfh22woe2", + "x-ep-enum-id": "8waaoc9581r", + "x-ep-shared": "true", + "x-ep-parameter-name": "productVerb", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance" + }, + "department": { + "schema": { + "type": "string", + "enum": [ + "100", + "110", + "120", + "130", + "200", + "300" + ] + }, + "x-ep-enum-state-name": "RELEASED", + "x-ep-enum-version-displayname": "", + "x-ep-enum-version": "0.1.1", + "x-ep-enum-name": "Store Department", + "x-ep-enum-state-id": "2", + "x-ep-application-domain-id": "n85j0k6rt5i", + "x-ep-enum-version-id": "0f2dilcb9lt", + "x-ep-enum-id": "3q8ds0j3i2g", + "x-ep-shared": "true", + "x-ep-parameter-name": "department", + "x-ep-application-domain-name": "AcmeRetail - Enterprise Governance" + }, + "upcCode": { + "schema": { + "type": "string" + }, + "x-ep-parameter-name": "upcCode" + } + } + } + }, + "asyncapi": "2.5.0", + "info": { + "x-ep-application-version": "0.1.2", + "x-ep-application-version-id": "obneb6skhm7", + "x-ep-application-id": "g6kk89b73fh", + "description": "The Smart Shelf is installed in selected markets and continually updates information on what products are being removed from shelves, in an effort to analyze customer trends, as well as forecast fraud.\n\n**Emits:** Product events with Removed verb when items removed from shelf\n**Consumes**: Product events with Restocked/Returned verbs when item returned to shelf", + "x-ep-state-name": "RELEASED", + "title": "Smart Shelf Inventory Control", + "x-ep-application-domain-id": "9n3oj6yfxm3", + "version": "0.1.2", + "x-ep-state-id": "2", + "x-ep-application-domain-name": "AcmeRetail - Store Operations" + } +} \ No newline at end of file diff --git a/utils/asyncApiProcessor.js b/utils/asyncApiProcessor.js new file mode 100644 index 00000000..479357f5 --- /dev/null +++ b/utils/asyncApiProcessor.js @@ -0,0 +1,6 @@ +const { processAsyncApi } = require('./coreProcessor'); + +// Re-export the main function for backward compatibility +module.exports = { + processAsyncApi +}; \ No newline at end of file diff --git a/utils/avroProcessor/avroProcessor.js b/utils/avroProcessor/avroProcessor.js new file mode 100644 index 00000000..368dc5f2 --- /dev/null +++ b/utils/avroProcessor/avroProcessor.js @@ -0,0 +1,918 @@ +const { logger } = require('../logger'); + +/** + * Extract Avro schemas from message payloads + * Uses AsyncAPI library functions and handles both native Avro and JSON Schema representations + */ +function extractAvroSchemasFromMessages(asyncapi) { + const schemas = []; + + try { + if (!asyncapi) { + logger.warn('extractAvroSchemasFromMessages: asyncapi parameter is null or undefined'); + return schemas; + } + + const messages = asyncapi.components().messages(); + if (!messages) { + return schemas; + } + + // Simple iteration over messages + if (typeof messages.forEach === 'function') { + messages.forEach((message, messageName) => { + try { + if (!message) { + logger.warn(`extractAvroSchemasFromMessages: message ${messageName} is null or undefined`); + return; + } + + const payload = message.payload && message.payload(); + const schemaFormat = message.schemaFormat && message.schemaFormat(); + + // Check if this is an Avro schema + if (payload && schemaFormat && schemaFormat.includes('avro')) { + logger.debug(`Found Avro schema in message ${messageName}`); + + // Get the actual Avro schema data from the payload + const avroData = payload._json; + + // Extract namespace and class name from x-parser-schema-id + const schemaId = avroData && avroData['x-parser-schema-id']; + if (!schemaId) { + logger.warn(`extractAvroSchemasFromMessages: no x-parser-schema-id found in Avro schema for message ${messageName}`); + return; + } + + if (!schemaId.includes('.')) { + logger.warn(`extractAvroSchemasFromMessages: schema ID ${schemaId} does not contain namespace separator for message ${messageName}`); + return; + } + + const lastDotIndex = schemaId.lastIndexOf('.'); + const namespace = schemaId.substring(0, lastDotIndex); + const className = schemaId.substring(lastDotIndex + 1); + + if (!namespace || !className) { + logger.warn(`extractAvroSchemasFromMessages: invalid namespace or className extracted from ${schemaId} for message ${messageName}`); + return; + } + + // Get properties from the Avro fields using robust Avro schema processing + const properties = []; + const required = []; + + // For Avro schemas, properties are in the 'fields' array (Avro style) or 'properties' (JSON Schema style) + // Try to use AsyncAPI library functions first, then fall back to direct access + let avroFields = null; + let avroProperties = null; + let avroRequired = null; + + // Try to get fields using AsyncAPI library functions + if (payload.fields && typeof payload.fields === 'function') { + avroFields = payload.fields(); + } else if (avroData && avroData.fields) { + avroFields = avroData.fields; + } + + // Try to get properties using AsyncAPI library functions + if (payload.properties && typeof payload.properties === 'function') { + const props = payload.properties(); + if (props && typeof props.values === 'function') { + avroProperties = Array.from(props.values()); + } + } else if (avroData && avroData.properties) { + avroProperties = avroData.properties; + } + + // Try to get required fields using AsyncAPI library functions + if (payload.required && typeof payload.required === 'function') { + avroRequired = payload.required(); + } else if (avroData && avroData.required) { + avroRequired = avroData.required; + } + + if (Array.isArray(avroFields)) { + avroFields.forEach(field => { + try { + if (!field || !field.name) { + logger.warn(`extractAvroSchemasFromMessages: field is missing or has no name in schema ${namespace}.${className}`); + return; + } + + const fieldInfo = processAvroFieldType(field); + + properties.push({ + name: field.name, + type: fieldInfo.javaType, + description: field.doc || '', + required: fieldInfo.required, + schema: fieldInfo.schema, + enumClassName: fieldInfo.enumClassName, + enumSymbols: fieldInfo.enumSymbols + }); + + if (fieldInfo.required) { + required.push(field.name); + } + } catch (error) { + logger.debug(`Error processing field ${field?.name || 'unknown'} in schema ${namespace}.${className}:`, error.message); + } + }); + } else if (avroProperties && typeof avroProperties === 'object') { + // Fallback: treat JSON Schema properties as Avro fields, recursively process + Object.entries(avroProperties).forEach(([propName, propSchema]) => { + try { + // Compose a pseudo-field for Avro logic + const pseudoField = { + name: propName, + ...propSchema, + type: propSchema.type, + doc: propSchema.description || '', + }; + + // Mark as required if in required array + const isRequired = Array.isArray(avroRequired) ? avroRequired.includes(propName) : true; + + // Recursively process the property schema for Avro features + const fieldInfo = processAvroFieldType({ ...pseudoField, required: isRequired }); + + properties.push({ + name: propName, + type: fieldInfo.javaType, + description: pseudoField.doc, + required: isRequired, + schema: fieldInfo.schema, + enumClassName: fieldInfo.enumClassName, + enumSymbols: fieldInfo.enumSymbols + }); + + if (isRequired) { + required.push(propName); + } + } catch (error) { + logger.debug(`Error processing property ${propName} in schema ${namespace}.${className}:`, error.message); + } + }); + } else { + logger.warn(`extractAvroSchemasFromMessages: no fields or properties found in Avro schema for message ${messageName}`); + } + + // Create schema object + const avroSchema = { + id: () => `${namespace}.${className}`, + extensions: () => ({ + get: (key) => { + if (key === 'x-ep-schema-name') { + return { value: () => className }; + } + if (key === 'x-parser-schema-id') { + return { value: () => `${namespace}.${className}` }; + } + return null; + } + }), + _json: { + name: className, + namespace: namespace, + type: 'record', + // Include processed fields with correct type information + fields: properties.map(prop => ({ + name: prop.name, + type: prop.type, // Use the processed Java type instead of simplified type + doc: prop.description + })) + }, + properties: () => { + const propMap = new Map(); + properties.forEach(prop => { + propMap.set(prop.name, { + id: () => prop.name, + type: () => prop.type, // Use the processed Java type + description: () => prop.description, + required: () => prop.required, + _json: { + type: prop.type, // Use the processed Java type + description: prop.description + } + }); + }); + return propMap; + }, + // Add properties array directly to schema object for template detection + properties: properties, + required: () => required, + description: () => payload.description ? payload.description() : '' + }; + + // Process the Avro schema + const avroInfo = extractAvroNamespaceInfo(avroSchema, `${namespace}.${className}`); + + // Check if a schema with this name already exists (avoid duplicates) + const existingSchemaIndex = schemas.findIndex(s => s.name === `${namespace}.${className}`); + if (existingSchemaIndex >= 0) { + logger.debug(`Replacing existing schema with Avro schema: ${namespace}.${className}`); + schemas[existingSchemaIndex] = { + name: `${namespace}.${className}`, + properties: properties, + required: required, + description: payload.description ? payload.description() : '', + extendsClass: null, + schema: avroSchema, + isAvro: true, + namespace: avroInfo.namespace, + packagePath: avroInfo.packagePath, + className: avroInfo.className + }; + } else { + schemas.push({ + name: `${namespace}.${className}`, + properties: properties, + required: required, + description: payload.description ? payload.description() : '', + extendsClass: null, + schema: avroSchema, + isAvro: true, + namespace: avroInfo.namespace, + packagePath: avroInfo.packagePath, + className: avroInfo.className + }); + } + } + } catch (error) { + logger.warn(`Error processing message ${messageName}:`, error.message); + } + }); + } + } catch (error) { + logger.warn('Error extracting Avro schemas from messages:', error.message); + } + + return schemas; +} + +/** + * Process Avro field type and convert to Java type with schema information + * Handles unions, arrays, maps, enums, logical types, and nested records + */ +function processAvroFieldType(field) { + const fieldType = field.type; + const fieldName = field.name; + + // Handle union types (e.g., ["null", "string"] for optional fields) + if (Array.isArray(fieldType)) { + return processAvroUnionType(fieldType, fieldName, field); + } + + // Handle oneOf structures (JSON Schema representation of Avro unions) + // Simplify: just return Object for union types + if (field.oneOf && Array.isArray(field.oneOf)) { + return { + javaType: 'Object', + required: false, // Union types are typically optional + schema: { + _json: { type: 'object', description: field.doc || '' }, + type: () => 'object', + description: () => field.doc || '', + required: () => false + } + }; + } + + // Handle logical types (must check before other types) + if (field.logicalType) { + switch (field.logicalType) { + case 'timestamp-millis': + case 'timestamp-micros': + return { + javaType: 'java.time.Instant', + required: true, + schema: { _json: field, type: () => 'long', description: () => field.doc || '', required: () => true } + }; + case 'decimal': + return { + javaType: 'java.math.BigDecimal', + required: true, + schema: { _json: field, type: () => 'bytes', description: () => field.doc || '', required: () => true } + }; + // Add more logical types as needed + } + } + + // Handle arrays + if (fieldType === 'array' && field.items) { + const itemResult = processAvroFieldType(typeof field.items === 'object' ? { ...field.items, name: fieldName + 'Item' } : { name: fieldName + 'Item', type: field.items }); + return { + javaType: itemResult.javaType + '[]', + required: true, + schema: { _json: field, type: () => 'array', description: () => field.doc || '', required: () => true } + }; + } + + // Handle maps (JSON Schema format: type=object with additionalProperties) + if (fieldType === 'object' && field.additionalProperties) { + const valueType = field.additionalProperties.type || 'Object'; + const valueResult = processAvroFieldType({ name: fieldName + 'Value', type: valueType }); + return { + javaType: `Map`, + required: true, + schema: { _json: field, type: () => 'map', description: () => field.doc || '', required: () => true } + }; + } + + // Handle enums (JSON Schema format: type=string with enum array) + if (fieldType === 'string' && field && field.enum && Array.isArray(field.enum)) { + const enumClassName = fieldName.charAt(0).toUpperCase() + fieldName.slice(1); + return { + javaType: enumClassName, + required: true, + enumClassName: enumClassName, + enumSymbols: field && field.enum ? field.enum : [], + schema: { _json: field, type: () => 'enum', description: () => field.doc || '', required: () => true, enum: () => field && field.enum ? field.enum : [] } + }; + } + + // Handle Avro enum types (type object with type: "enum") + if (typeof fieldType === 'object' && fieldType !== null && fieldType.type === 'enum') { + const enumClassName = fieldType.name || (fieldName.charAt(0).toUpperCase() + fieldName.slice(1)); + return { + javaType: enumClassName, + required: true, + enumClassName: enumClassName, + enumSymbols: fieldType.symbols || [], + schema: { _json: field, type: () => 'enum', description: () => field.doc || '', required: () => true, enum: () => fieldType.symbols } + }; + } + + // Handle logical types (check for pattern or other indicators) + if (fieldType === 'string' && field.pattern && field.pattern.includes('[\u0000-ΓΏ]*')) { + return { + javaType: 'java.math.BigDecimal', + required: true, + schema: { _json: field, type: () => 'bytes', description: () => field.doc || '', required: () => true } + }; + } + + // Handle records (nested objects) + if (fieldType === 'record' && field.fields) { + const nestedClassName = field.name || (fieldName.charAt(0).toUpperCase() + fieldName.slice(1)); + return { + javaType: nestedClassName, + required: true, + schema: { _json: field, type: () => 'record', description: () => field.doc || '', required: () => true } + }; + } + + // Handle object types (legacy, type: {type: ...}) + if (typeof fieldType === 'object' && fieldType !== null && fieldType.type) { + // Recursively process as a full field + return processAvroFieldType({ ...fieldType, name: fieldName }); + } + + // Handle primitive types with logical types + if (typeof fieldType === 'string') { + // Check for logical types on the field itself + if (field.logicalType) { + switch (field.logicalType) { + case 'timestamp-millis': + case 'timestamp-micros': + return { + javaType: 'java.time.Instant', + required: true, + schema: { _json: field, type: () => 'long', description: () => field.doc || '', required: () => true } + }; + case 'decimal': + return { + javaType: 'java.math.BigDecimal', + required: true, + schema: { _json: field, type: () => 'bytes', description: () => field.doc || '', required: () => true } + }; + // Add more logical types as needed + } + } + } + + // Handle primitive types + // Check if this is a 'long' type that got normalized to 'integer' + // Long types have minimum/maximum values that exceed 32-bit integer bounds + let actualType = fieldType; + if (fieldType === 'integer' && field.minimum !== undefined && field.maximum !== undefined) { + // Check if the bounds exceed 32-bit integer limits + const int32Min = -2147483648; // -2^31 + const int32Max = 2147483647; // 2^31 - 1 + if (field.minimum < int32Min || field.maximum > int32Max) { + logger.debug(`Found 'long' type (bounds: ${field.minimum} to ${field.maximum}) normalized to 'integer' for field ${fieldName}, correcting to 'long'`); + actualType = 'long'; + } + } + + const javaType = convertAvroTypeToJavaTypeInline(actualType); + const required = true; // Primitive types are required unless in union with null + + // Create schema object for the field + const fieldSchema = { + _json: { + type: fieldType, + description: field.doc || '' + }, + type: () => fieldType, + description: () => field.doc || '', + required: () => required + }; + + return { + javaType, + required, + schema: fieldSchema + }; +} + +/** + * Process Avro union types (e.g., ["null", "string"] for optional fields) + */ +function processAvroUnionType(unionTypes, fieldName, field) { + // Check if this is an optional field (union with "null") + const hasNull = unionTypes.includes('null'); + const nonNullTypes = unionTypes.filter(t => t !== 'null'); + + if (hasNull && nonNullTypes.length === 1) { + // Optional field: ["null", "string"] -> String (nullable) + const nonNullType = nonNullTypes[0]; + const javaType = convertAvroTypeToJavaTypeInline(nonNullType); + + const fieldSchema = { + _json: { + type: nonNullType, + description: field.doc || '' + }, + type: () => nonNullType, + description: () => field.doc || '', + required: () => false + }; + + return { + javaType, + required: false, + schema: fieldSchema + }; + } else { + // Complex union: use Object for now + const fieldSchema = { + _json: { + type: 'object', + description: field.doc || '' + }, + type: () => 'object', + description: () => field.doc || '', + required: () => true + }; + + return { + javaType: 'Object', + required: true, + schema: fieldSchema + }; + } +} + +/** + * Process Avro object types (nested records, enums, arrays, maps) + */ +function processAvroObjectType(objType, fieldName, field) { + const avroType = objType.type; + + // Handle arrays + if (avroType === 'array') { + return processAvroArrayType(objType, fieldName, field); + } + + // Handle maps + if (avroType === 'map') { + return processAvroMapType(objType, fieldName, field); + } + + // Handle enums + if (avroType === 'enum') { + return processAvroEnumType(objType, fieldName, field); + } + + // Handle nested records + if (avroType === 'record') { + return processAvroRecordType(objType, fieldName, field); + } + + // Handle fixed types + if (avroType === 'fixed') { + return { + javaType: 'byte[]', + required: true, + schema: { + _json: { type: 'fixed', description: field.doc || '' }, + type: () => 'fixed', + description: () => field.doc || '', + required: () => true + } + }; + } + + // Default to Object for unknown object types + return { + javaType: 'Object', + required: true, + schema: { + _json: { type: 'object', description: field.doc || '' }, + type: () => 'object', + description: () => field.doc || '', + required: () => true + } + }; +} + +/** + * Process Avro array types + */ +function processAvroArrayType(arrayType, fieldName, field) { + const itemsType = arrayType.items; + let itemJavaType = 'Object'; + + if (typeof itemsType === 'string') { + itemJavaType = convertAvroTypeToJavaTypeInline(itemsType); + } else if (Array.isArray(itemsType)) { + // Union type in array + const nonNullTypes = itemsType.filter(t => t !== 'null'); + if (nonNullTypes.length > 0) { + itemJavaType = convertAvroTypeToJavaTypeInline(nonNullTypes[0]); + } + } else if (typeof itemsType === 'object' && itemsType !== null) { + // Complex type in array + if (itemsType.type === 'record') { + itemJavaType = processAvroRecordType(itemsType, fieldName, field).javaType; + } else { + itemJavaType = convertAvroTypeToJavaTypeInline(itemsType.type || 'object'); + } + } + + const fieldSchema = { + _json: { + type: 'array', + items: itemsType, + description: field.doc || '' + }, + type: () => 'array', + description: () => field.doc || '', + required: () => true + }; + + return { + javaType: `${itemJavaType}[]`, + required: true, + schema: fieldSchema + }; +} + +/** + * Process Avro map types + */ +function processAvroMapType(mapType, fieldName, field) { + const valuesType = mapType.values || field.additionalProperties; + let valueJavaType = 'Object'; + + if (typeof valuesType === 'string') { + valueJavaType = convertAvroTypeToJavaTypeInline(valuesType); + } else if (Array.isArray(valuesType)) { + // Union type in map values + const nonNullTypes = valuesType.filter(t => t !== 'null'); + if (nonNullTypes.length > 0) { + valueJavaType = convertAvroTypeToJavaTypeInline(nonNullTypes[0]); + } + } else if (typeof valuesType === 'object' && valuesType !== null) { + // Recursively process value type for Avro features + valueJavaType = processAvroFieldType({ ...valuesType, name: fieldName + 'Value' }).javaType; + } + + const fieldSchema = { + _json: { + type: 'map', + values: valuesType, + description: field.doc || '' + }, + type: () => 'map', + description: () => field.doc || '', + required: () => true + }; + + return { + javaType: `Map`, + required: true, + schema: fieldSchema + }; +} + +/** + * Process Avro enum types + */ +function processAvroEnumType(enumType, fieldName, field) { + // Generate enum class name from field name + const enumClassName = fieldName.charAt(0).toUpperCase() + fieldName.slice(1).replace(/_([a-z])/g, (match, letter) => letter.toUpperCase()); + + const fieldSchema = { + _json: { + type: 'enum', + symbols: enumType.symbols || [], + description: field.doc || '' + }, + type: () => 'enum', + description: () => field.doc || '', + required: () => true, + enum: () => enumType.symbols || [] + }; + + return { + javaType: enumClassName, + required: true, + schema: fieldSchema + }; +} + +/** + * Process Avro record types (nested records) + */ +function processAvroRecordType(recordType, fieldName, field) { + // Generate nested class name from field name + const nestedClassName = fieldName.charAt(0).toUpperCase() + fieldName.slice(1).replace(/_([a-z])/g, (match, letter) => letter.toUpperCase()); + + const fieldSchema = { + _json: { + type: 'record', + name: nestedClassName, + fields: recordType.fields || [], + description: field.doc || '' + }, + type: () => 'record', + description: () => field.doc || '', + required: () => true + }; + + return { + javaType: nestedClassName, + required: true, + schema: fieldSchema + }; +} + +/** + * Convert Avro type to Java type (inline helper function) + * Enhanced to handle logical types and improve Java compatibility + */ +function convertAvroTypeToJavaTypeInline(avroType) { + if (typeof avroType === 'string') { + switch (avroType.toLowerCase()) { + case 'string': + return 'String'; + case 'int': + case 'integer': + return 'Integer'; + case 'long': + return 'Long'; + case 'float': + return 'Float'; + case 'double': + return 'Double'; + case 'boolean': + return 'Boolean'; + case 'bytes': + return 'byte[]'; + case 'null': + return 'Object'; + case 'enum': + return 'String'; + case 'record': + return 'Object'; + case 'array': + return 'Object[]'; + case 'map': + return 'Map'; + case 'fixed': + return 'byte[]'; + default: + return 'String'; + } + } else if (Array.isArray(avroType)) { + const nonNullTypes = avroType.filter(t => t !== 'null'); + if (nonNullTypes.length > 0) { + return convertAvroTypeToJavaTypeInline(nonNullTypes[0]); + } + return 'Object'; + } else if (typeof avroType === 'object' && avroType !== null) { + const baseType = avroType.type; + const logicalType = avroType.logicalType; + if (logicalType) { + switch (logicalType) { + case 'date': + return 'java.time.LocalDate'; + case 'time-millis': + return 'java.time.LocalTime'; + case 'time-micros': + return 'java.time.LocalTime'; + case 'timestamp-millis': + return 'java.time.Instant'; + case 'timestamp-micros': + return 'java.time.Instant'; + case 'local-timestamp-millis': + return 'java.time.LocalDateTime'; + case 'local-timestamp-micros': + return 'java.time.LocalDateTime'; + case 'uuid': + return 'java.util.UUID'; + case 'decimal': + return 'java.math.BigDecimal'; + default: + return convertAvroTypeToJavaTypeInline(baseType); + } + } + return convertAvroTypeToJavaTypeInline(baseType); + } + return 'String'; +} + +/** + * Extract Avro namespace information from schema + */ +function extractAvroNamespaceInfo(schema, schemaName) { + try { + let namespace = null; + let className = null; + + // First, try to get namespace from schema data + const schemaData = schema._json; + if (schemaData && schemaData.namespace) { + namespace = schemaData.namespace; + className = schemaData.name || schemaName; + } + + // Fallback: extract from schema ID if it contains dots + if (!namespace) { + const schemaId = schema.id(); + if (schemaId && schemaId.includes('.')) { + const lastDotIndex = schemaId.lastIndexOf('.'); + namespace = schemaId.substring(0, lastDotIndex); + className = schemaId.substring(lastDotIndex + 1); + } + } + + // Fallback: extract from schema name if it contains dots + if (!namespace && schemaName && schemaName.includes('.')) { + const lastDotIndex = schemaName.lastIndexOf('.'); + namespace = schemaName.substring(0, lastDotIndex); + className = schemaName.substring(lastDotIndex + 1); + } + + // Ensure we have valid values + if (!namespace || !className) { + logger.warn('Could not extract Avro namespace info for schema:', schemaName); + return { + namespace: null, + packagePath: null, + className: schemaName + }; + } + + // Convert namespace to package path + const packagePath = namespace.replace(/\./g, '/'); + + // Ensure className is a valid Java class name (preserve camel case for Avro) + className = convertAvroSchemaNameToJavaClassName(className); + + logger.debug(`Extracted Avro namespace info: ${namespace}.${className}`); + + return { + namespace, + packagePath, + className + }; + } catch (error) { + logger.warn('Error extracting Avro namespace info:', error.message); + return { + namespace: null, + packagePath: null, + className: schemaName + }; + } +} + +/** + * Convert Avro schema name to Java class name (preserve camel case, handle underscores) + */ +function convertAvroSchemaNameToJavaClassName(schemaName) { + if (!schemaName) { + return 'UnknownSchema'; + } + // Split by underscores, capitalize each part, and join + return schemaName + .split('_') + .map(part => part.charAt(0).toUpperCase() + part.slice(1)) + .join(''); +} + +/** + * Create Avro schema map for function generation + */ +function createAvroSchemaMap(schemas) { + const avroSchemaMap = new Map(); + + schemas.forEach(schema => { + if (schema.isAvro) { + avroSchemaMap.set(schema.name, schema); + } + }); + + return avroSchemaMap; +} + +/** + * Get message payload type for Avro schemas + */ +function getAvroMessagePayload(operation, avroSchemaMap = new Map()) { + const messages = operation.messages(); + if (!messages || messages.length === 0) { + return 'String'; + } + + // For now, return the first message's payload type + const firstMessage = messages[0]; + if (firstMessage && firstMessage.payload) { + const payload = firstMessage.payload(); + if (payload) { + // Check if this is an Avro schema + const schemaFormat = firstMessage.schemaFormat ? firstMessage.schemaFormat() : null; + if (schemaFormat && schemaFormat.includes('avro')) { + // For Avro schemas, try to get the class name from the schema + const schemaId = payload._json && payload._json['x-parser-schema-id']; + if (schemaId && avroSchemaMap.has(schemaId)) { + const avroSchema = avroSchemaMap.get(schemaId); + return avroSchema.className || 'Object'; + } + } + // For non-Avro schemas, delegate to the main processor + return null; // Signal to use default processing + } + } + + return 'String'; +} + +/** + * Get Avro schema import + */ +function getAvroSchemaImport(schemaName, avroSchemaMap = new Map()) { + if (!schemaName) { + return null; + } + + // Check if this is an Avro schema + if (avroSchemaMap.has(schemaName)) { + const avroSchema = avroSchemaMap.get(schemaName); + if (avroSchema.namespace) { + return `${avroSchema.namespace}.${avroSchema.className}`; + } + } + + // For non-Avro schemas, return null to use default processing + return null; +} + +/** + * Get Avro simple class name + */ +function getAvroSimpleClassName(schemaName, avroSchemaMap = new Map()) { + if (!schemaName) { + return 'Unknown'; + } + + // Check if this is an Avro schema + if (avroSchemaMap.has(schemaName)) { + const avroSchema = avroSchemaMap.get(schemaName); + return avroSchema.className || schemaName; + } + + // For non-Avro schemas, return null to use default processing + return null; +} + +module.exports = { + extractAvroSchemasFromMessages, + processAvroFieldType, + processAvroUnionType, + processAvroObjectType, + processAvroArrayType, + processAvroMapType, + processAvroEnumType, + processAvroRecordType, + convertAvroTypeToJavaTypeInline, + extractAvroNamespaceInfo, + convertAvroSchemaNameToJavaClassName, + createAvroSchemaMap, + getAvroMessagePayload, + getAvroSchemaImport, + getAvroSimpleClassName +}; \ No newline at end of file diff --git a/utils/avroProcessor/avroSchemaModel.js b/utils/avroProcessor/avroSchemaModel.js new file mode 100644 index 00000000..ae2b7d6f --- /dev/null +++ b/utils/avroProcessor/avroSchemaModel.js @@ -0,0 +1,317 @@ +const _ = require('lodash'); +const { logger } = require('../logger'); +const { stripPackageName } = require('../typeUtils'); + +class SchemaModel { + constructor() { + this.superClassMap = new Map(); + this.anonymousSchemaToSubClassMap = new Map(); + this.modelClassMap = new Map(); + this.nameToSchemaMap = new Map(); + this.javaKeywords = this.initReservedWords(); + } + + /** + * Initialize Java reserved words set + */ + initReservedWords() { + const keywords = new Set([ + 'abstract', 'assert', 'boolean', 'break', 'byte', 'case', 'catch', 'char', 'class', 'const', + 'continue', 'default', 'do', 'double', 'else', 'enum', 'extends', 'final', 'finally', 'float', + 'for', 'if', 'goto', 'implements', 'import', 'instanceof', 'int', 'interface', 'long', 'native', + 'new', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'strictfp', + 'super', 'switch', 'synchronized', 'this', 'throw', 'throws', 'transient', 'try', 'void', 'volatile', 'while' + ]); + return keywords; + } + + /** + * Get model class for a schema + */ + getModelClass({ schema, schemaName }) { + logger.debug(`schemaModel.js: getModelClass() - Getting model class for ${schemaName}`); + + let modelClass; + if (schema) { + const parserSchemaName = schema.extensions && schema.extensions().get('x-parser-schema-id')?.value(); + // Try to use x-parser-schema-id as key + modelClass = this.modelClassMap.get(parserSchemaName); + if (modelClass && modelClass.getClassName().startsWith('Anonymous')) { + // If we translated this schema from the map using an anonymous schema key, we have no idea what the name should be, so we use the one provided directly from the source - not the generator. + // Otherwise, if we translated this schema from the map using a known schema (the name of the schema was picked out correctly by the generator), use that name. + modelClass.setClassName(_.upperFirst(this.isAnonymousSchema(parserSchemaName) ? schemaName : parserSchemaName)); + } + } + // Using x-parser-schema-id didn't work for us, fall back to trying to get at least something using the provided name. + if (!modelClass) { + modelClass = this.modelClassMap.get(schemaName) || this.modelClassMap.get(_.camelCase(schemaName)); + } + + logger.debug(`schemaModel.js: getModelClass() - Returning model class for ${schemaName}`); + return modelClass; + } + + /** + * Setup super class map for inheritance relationships + */ + setupSuperClassMap(asyncapi) { + if (this.superClassMap.size > 0) { + return; + } + + logger.debug('schemaModel.js: setupSuperClassMap() - Setting up inheritance relationships'); + + const allSchemas = asyncapi.allSchemas().all(); + if (!allSchemas) return; + + // allSchemas is a Map, so we need to iterate over entries properly + allSchemas.forEach((schema, schemaName) => { + if (typeof schemaName !== 'string') { + // logger.debug(`Skipping non-string schema key: ${schemaName}`); + return; + } + logger.debug(`schemaModel.js: setupSuperClassMap() - Processing schema: ${schemaName}`); + + // Check for allOf inheritance + if (schema.allOf && typeof schema.allOf === 'function') { + const allOf = schema.allOf(); + if (allOf && allOf.length > 0) { + this.handleAllOfSchema(schema, schemaName, allOf); + } + } + }); + + logger.debug('schemaModel.js: setupSuperClassMap() - Super class map:', this.superClassMap); + } + + /** + * Handle allOf schema inheritance + */ + handleAllOfSchema(schema, schemaName, allOfArray) { + logger.debug(`schemaModel.js: handleAllOfSchema() - Handling allOf for ${schemaName}`); + + let anonymousSchema = null; + let namedSchema = null; + + allOfArray.forEach(innerSchema => { + const name = innerSchema.extensions && innerSchema.extensions().get('x-parser-schema-id')?.value(); + if (this.isAnonymousSchema(name)) { + anonymousSchema = name; + } else { + namedSchema = name; + } + }); + + if (!anonymousSchema || !namedSchema) { + logger.warn(`schemaModel.js: handleAllOfSchema() - Unable to find both an anonymous and a named schema in allOf for ${schemaName}`); + return; + } + + // Set up inheritance relationships + this.superClassMap.set(anonymousSchema, namedSchema); + this.anonymousSchemaToSubClassMap.set(anonymousSchema, schemaName); + this.superClassMap.set(schemaName, namedSchema); + this.anonymousSchemaToSubClassMap.set(schemaName, anonymousSchema); + + logger.debug(`schemaModel.js: handleAllOfSchema() - Set up inheritance: ${schemaName} extends ${namedSchema}`); + } + + /** + * Setup model class map + */ + setupModelClassMap(asyncapi) { + if (this.modelClassMap.size > 0) { + return; + } + + logger.debug('schemaModel.js: setupModelClassMap() - Setting up model class map'); + + const allSchemas = asyncapi.allSchemas().all() + if (!allSchemas || allSchemas.length === 0) return; + + // Register all schemas recursively as a flat map of name -> ModelClass + // allSchemas is a Map, so we need to iterate over entries properly + allSchemas.forEach((schema, schemaName) => { + // Handle both string and numeric schema keys + let name; + if (typeof schemaName === 'string') { + name = schema.extensions().get('x-ep-schema-name')?.value() || schema.id(); + } else { + // For numeric keys, try to get name from schema extensions or id + name = schema.extensions().get('x-ep-schema-name')?.value() || schema.id(); + + if (!name) { + logger.debug(`Skipping schema with numeric key ${schemaName} and no identifiable name`); + return; + } + } + logger.debug(`schemaModel.js: setupModelClassMap() - Processing schema: ${name}, type: ${schema.type ? schema.type() : 'unknown'}`); + this.registerSchemaNameToModelClass(schema, name, asyncapi); + this.nameToSchemaMap.set(name, schema); + }); + + logger.debug('schemaModel.js: setupModelClassMap() - Model class map size:', this.modelClassMap.size); + } + + /** + * Check if schema name is anonymous + */ + isAnonymousSchema(schemaName) { + return schemaName && schemaName.startsWith('<'); + } + + /** + * Register schema name to model class + */ + registerSchemaNameToModelClass(schema, schemaName, asyncapi) { + let modelClass = this.modelClassMap.get(schemaName); + if (!modelClass) { + modelClass = new ModelClass(); + } + + if (this.isAnonymousSchema(schemaName)) { + this.handleAnonymousSchemaForAllOf(modelClass, schemaName); + } + + // Check if this is a top-level schema (not an inner class) + let nonInnerClassSchemas = []; + if (asyncapi.components && typeof asyncapi.components === 'function') { + const schemasObj = asyncapi.components().schemas(); + if (schemasObj && typeof schemasObj === 'object') { + nonInnerClassSchemas = Array.from(schemasObj.keys()); + } + } + if (nonInnerClassSchemas.includes(schemaName)) { + modelClass.setCanBeInnerClass(false); + } + + const classNameAndLocation = stripPackageName(schemaName); + let className = classNameAndLocation.className; + const javaPackage = classNameAndLocation.javaPackage; + + if (schema.extensions && schema.extensions().get('x-ep-schema-name')) { + className = schema.extensions().get('x-ep-schema-name').value(); + } + + modelClass.setJavaPackage(javaPackage); + modelClass.setClassName(className); + modelClass.setOriginalName(schemaName); // NEW: store original schema name + + logger.debug(`schemaModel.js: registerSchemaNameToModelClass() - Schema: ${schemaName}, Class: ${modelClass.getClassName()}, Super: ${modelClass.getSuperClassName()}, Package: ${javaPackage}`); + + this.modelClassMap.set(schemaName, modelClass); + } + + /** + * Get anonymous schema for reference + */ + getAnonymousSchemaForRef(realSchemaName) { + // During our allOf parsing, we found this real schema to anon-schema association + const anonSchema = this.anonymousSchemaToSubClassMap.get(realSchemaName); + return anonSchema ? this.nameToSchemaMap.get(anonSchema) : undefined; + } + + /** + * Handle anonymous schema for allOf + */ + handleAnonymousSchemaForAllOf(modelClass, schemaName) { + const subclassName = this.anonymousSchemaToSubClassMap.get(schemaName); + if (subclassName) { + modelClass.setSuperClassName(this.superClassMap.get(schemaName)); + // Be sure the anonymous modelClass and the named modelClass are updated with the superclass information + // We dont want the anonymous schema because the class name won't be correct if it's a $ref, so if the modelClass exists, update that one, if it doesn't we'll make it + const existingModelClass = this.modelClassMap.get(subclassName); + if (existingModelClass) { + existingModelClass.setSuperClassName(this.superClassMap.get(schemaName)); + } + return subclassName; + } + return schemaName; + } + + /** + * Reset all maps (for testing) + */ + reset() { + this.superClassMap.clear(); + this.anonymousSchemaToSubClassMap.clear(); + this.modelClassMap.clear(); + this.nameToSchemaMap.clear(); + } +} + +/** + * ModelClass for representing Java class information + */ +class ModelClass { + constructor() { + this.innerClass = true; + this.className = null; + this.originalName = null; // NEW: store original schema name + this.superClassName = null; + this.javaPackage = null; + } + + getClassName() { + return this.className; + } + + setClassName(originalName) { + this.className = this.fixClassName(originalName); + } + + getOriginalName() { // NEW: getter for original name + return this.originalName; + } + + setOriginalName(originalName) { // NEW: setter for original name + this.originalName = originalName; + } + + getSuperClassName() { + return this.superClassName; + } + + setSuperClassName(originalName) { + this.superClassName = this.fixClassName(originalName); + } + + getJavaPackage() { + return this.javaPackage; + } + + setJavaPackage(javaPackage) { + this.javaPackage = javaPackage; + } + + isSubClass() { + return this.superClassName !== undefined; + } + + fixClassName(originalName) { + // For AVRO schemas, the originalName should already be the class name part (e.g., "JobOrder" from "com.example.api.jobOrder.JobOrder") + if (!originalName) return 'UnknownSchema'; + + // If the name contains dots, it's a full schema name, so we need to extract the class name + if (originalName.includes('.')) { + const lastDotIndex = originalName.lastIndexOf('.'); + originalName = originalName.substring(lastDotIndex + 1); + } + + // Remove special characters and convert to PascalCase + let className = originalName.replace(/[^a-zA-Z0-9]/g, ''); + className = className.charAt(0).toUpperCase() + className.slice(1); + + return className; + } + + setCanBeInnerClass(innerClass) { + this.innerClass = innerClass; + } + + canBeInnerClass() { + return this.innerClass; + } +} + +module.exports = { SchemaModel, ModelClass }; \ No newline at end of file diff --git a/utils/avroProcessor/index.js b/utils/avroProcessor/index.js new file mode 100644 index 00000000..22d606a4 --- /dev/null +++ b/utils/avroProcessor/index.js @@ -0,0 +1,516 @@ +const { logger } = require('../logger'); +const { SchemaModel } = require('./avroSchemaModel'); +const { + getEnhancedType, + checkPropertyNames, + getIdentifierName, + fixType, + stripPackageName +} = require('../typeUtils'); +const { + getSampleArg, + getMultipleMessageComment, + getMessagePayloadType, + getPayloadClass +} = require('../functionUtils'); + +const { processAvroFieldType } = require('./avroProcessor'); + +// Initialize schema model instance +const schemaModel = new SchemaModel(); + +/** + * Detect if AsyncAPI document contains Avro schemas + */ +function detectAvroSchemas(asyncapi) { + logger.debug('avroProcessor.js: detectAvroSchemas() - Detecting Avro schemas'); + + // Check for Avro schemas in components.schemas + const componentsSchemas = asyncapi.components().schemas(); + if (componentsSchemas) { + for (const [schemaName, schema] of componentsSchemas.entries()) { + if (isAvroSchema(schema)) { + logger.debug(`avroProcessor: Found Avro schema: ${schemaName}`); + return true; + } + } + } + + // Check for Avro schemas in messages + const channels = asyncapi.channels(); + for (const channel of channels.values()) { + const channelName = channel.id(); + // Get all operations for this channel + const operations = channel.operations && typeof channel.operations === 'function' + ? Array.from(channel.operations().values()) + : []; + + // Find publish and subscribe operations + const publishOperation = operations.find(op => op.action && op.action() === 'publish'); + const subscribeOperation = operations.find(op => op.action && op.action() === 'subscribe'); + + if (publishOperation) { + const messages = publishOperation.messages(); + if (messages && messages.length > 0) { + const message = messages[0]; + if (message && isAvroMessage(message)) { + logger.debug(`avroProcessor: Found Avro message in publish channel: ${channelName}`); + return true; + } + } + } + + if (subscribeOperation) { + const messages = subscribeOperation.messages(); + if (messages && messages.length > 0) { + const message = messages[0]; + if (message && isAvroMessage(message)) { + logger.debug(`avroProcessor: Found Avro message in subscribe channel: ${channelName}`); + return true; + } + } + } + } + + return false; +} + +/** + * Check if a schema is an Avro schema + */ +function isAvroSchema(schema) { + if (!schema) return false; + + // Check for Avro-specific extensions + if (schema.extensions) { + const extensions = schema.extensions(); + if (extensions.get('x-avro-schema') || extensions.get('x-avro-namespace')) { + return true; + } + } + + // Check for Avro namespace in schema name + const schemaName = schema.extensions && schema.extensions().get('x-parser-schema-id')?.value() || schema.id(); + if (schemaName && schemaName.includes('.')) { + return true; + } + + return false; +} + +/** + * Check if a message is an Avro message + */ +function isAvroMessage(message) { + if (!message) return false; + + const payload = message.payload(); + if (!payload) return false; + + return isAvroSchema(payload); +} + +/** + * Extract Avro schemas from messages using new schema model + */ +function extractAvroSchemasFromMessages(asyncapi) { + logger.debug('avroProcessor.js: extractAvroSchemasFromMessages() - Extracting Avro schemas with new schema model'); + + // Initialize schema model with AsyncAPI document + schemaModel.setupSuperClassMap(asyncapi); + schemaModel.setupModelClassMap(asyncapi); + + const schemas = []; + const processedSchemaNames = new Set(); + + // Extract schemas from components.schemas + const componentsSchemas = asyncapi.components().schemas(); + if (componentsSchemas) { + for (const [schemaName, schema] of componentsSchemas.entries()) { + if (isAvroSchema(schema) && !processedSchemaNames.has(schemaName)) { + const processedSchema = processAvroSchema(schema, schemaName); + if (processedSchema) { + schemas.push(processedSchema); + processedSchemaNames.add(schemaName); + } + } + } + } + + // Extract schemas from messages + const channels = asyncapi.channels(); + for (const channel of channels.values()) { + const channelName = channel.id(); + logger.debug(`avroProcessor.js: extractAvroSchemasFromMessages() - Processing channel: ${channelName}`); + + // Get all operations for this channel + const operations = channel.operations && typeof channel.operations === 'function' + ? Array.from(channel.operations().values()) + : []; + + // Find publish and subscribe operations + const publishOperation = operations.find(op => op.action && op.action() === 'publish'); + const subscribeOperation = operations.find(op => op.action && op.action() === 'subscribe'); + + // Check publish messages + if (publishOperation) { + const messages = publishOperation.messages(); + if (messages && messages.length > 0) { + const message = messages[0]; + if (message) { + const payload = message.payload(); + if (payload && isAvroSchema(payload)) { + const schemaName = payload.extensions && payload.extensions().get('x-parser-schema-id')?.value() || payload.id(); + if (schemaName && !processedSchemaNames.has(schemaName)) { + const processedSchema = processAvroSchema(payload, schemaName); + if (processedSchema) { + schemas.push(processedSchema); + processedSchemaNames.add(schemaName); + } + } + } + } + } + } + + // Check subscribe messages + if (subscribeOperation) { + const messages = subscribeOperation.messages(); + if (messages && messages.length > 0) { + const message = messages[0]; + if (message) { + const payload = message.payload(); + if (payload && isAvroSchema(payload)) { + const schemaName = payload.extensions && payload.extensions().get('x-parser-schema-id')?.value() || payload.id(); + if (schemaName && !processedSchemaNames.has(schemaName)) { + const processedSchema = processAvroSchema(payload, schemaName); + if (processedSchema) { + schemas.push(processedSchema); + processedSchemaNames.add(schemaName); + } + } + } + } + } + } + } + + logger.debug(`avroProcessor: Extracted ${schemas.length} Avro schemas`); + return schemas; +} + +/** + * Process an individual Avro schema using new schema model + */ +function processAvroSchema(schema, schemaName) { + logger.debug(`avroProcessor.js: processAvroSchema() - Processing Avro schema: ${schemaName}`); + + // Get model class from schema model + const modelClass = schemaModel.getModelClass({ schema, schemaName }); + if (!modelClass) { + logger.warn(`No model class found for Avro schema: ${schemaName}`); + return null; + } + + // Get schema for reference (handles allOf inheritance) + const schemaForRef = schemaModel.getAnonymousSchemaForRef(schemaName); + const actualSchema = schemaForRef || schema; + + // Extract namespace and class name + const { javaPackage, className } = stripPackageName(schemaName); + const packagePath = javaPackage ? javaPackage.replace(/\./g, '/') : null; + const namespace = javaPackage; + + // Process properties + const properties = []; + const required = actualSchema.required && typeof actualSchema.required === 'function' ? actualSchema.required() : []; + let schemaProperties = null; + + // Try multiple ways to get schema properties + if (actualSchema.properties && typeof actualSchema.properties === 'function') { + schemaProperties = actualSchema.properties(); + } + + if (schemaProperties && typeof schemaProperties.values === 'function') { + const propertyArray = Array.from(schemaProperties.values()); + propertyArray.forEach(prop => { + const propertyName = prop.id(); + const isRequired = Array.isArray(required) ? required.includes(propertyName) : false; + + // Use comprehensive Avro field processing + const processedField = processAvroFieldType({ + name: propertyName, + type: prop.type ? prop.type() : 'object', + doc: prop.description ? prop.description() : '', + logicalType: prop.logicalType ? (typeof prop.logicalType === 'function' ? prop.logicalType() : prop.logicalType) : undefined, + items: prop.items ? prop.items() : undefined, + additionalProperties: prop.additionalProperties ? prop.additionalProperties() : undefined, + enum: prop.enum ? prop.enum() : undefined, + oneOf: prop.oneOf ? (typeof prop.oneOf === 'function' ? prop.oneOf() : prop.oneOf) : undefined, + minimum: prop.minimum ? prop.minimum() : undefined, + maximum: prop.maximum ? prop.maximum() : undefined, + pattern: prop.pattern ? prop.pattern() : undefined, + fields: prop.fields ? prop.fields() : undefined + }); + + properties.push({ + name: propertyName, + type: processedField, // Use the processed field object with javaType + description: prop.description ? prop.description() : '', + required: processedField.required, + schemaName: prop.extensions && prop.extensions().get('x-parser-schema-id')?.value(), + format: prop.format ? prop.format() : undefined, + enum: processedField.enum ? processedField.enum : undefined, + items: prop.items ? prop.items() : undefined, + defaultValue: prop.default ? prop.default() : undefined + }); + }); + } else if (schemaProperties && typeof schemaProperties.forEach === 'function') { + // Try forEach method + schemaProperties.forEach((prop, propName) => { + const isRequired = Array.isArray(required) ? required.includes(propName) : false; + + // Use comprehensive Avro field processing + const processedField = processAvroFieldType({ + name: propName, + type: prop.type ? prop.type() : 'object', + doc: prop.description ? prop.description() : '', + logicalType: prop.logicalType ? (typeof prop.logicalType === 'function' ? prop.logicalType() : prop.logicalType) : undefined, + items: prop.items ? prop.items() : undefined, + additionalProperties: prop.additionalProperties ? prop.additionalProperties() : undefined, + enum: prop.enum ? prop.enum() : undefined, + oneOf: prop.oneOf ? (typeof prop.oneOf === 'function' ? prop.oneOf() : prop.oneOf) : undefined, + minimum: prop.minimum ? prop.minimum() : undefined, + maximum: prop.maximum ? prop.maximum() : undefined, + pattern: prop.pattern ? prop.pattern() : undefined, + fields: prop.fields ? prop.fields() : undefined + }); + + properties.push({ + name: propName, + type: processedField, // Use the processed field object with javaType + description: prop.description ? prop.description() : '', + required: processedField.required, + schemaName: prop.extensions && prop.extensions().get('x-parser-schema-id')?.value(), + format: prop.format ? prop.format() : undefined, + enum: processedField.enum ? processedField.enum : undefined, + items: prop.items ? prop.items() : undefined, + defaultValue: prop.default ? prop.default() : undefined + }); + }); + } else if (schemaProperties && typeof schemaProperties === 'object') { + // Handle plain object with property names as keys using Object.entries + Object.entries(schemaProperties).forEach(([propName, prop]) => { + const isRequired = Array.isArray(required) ? required.includes(propName) : false; + + // Use comprehensive Avro field processing + const processedField = processAvroFieldType({ + name: propName, + type: prop.type ? prop.type() : 'object', + doc: prop.description ? prop.description() : '', + logicalType: prop.logicalType ? (typeof prop.logicalType === 'function' ? prop.logicalType() : prop.logicalType) : undefined, + items: prop.items ? prop.items() : undefined, + additionalProperties: prop.additionalProperties ? prop.additionalProperties() : undefined, + enum: prop.enum ? prop.enum() : undefined, + oneOf: prop.oneOf ? prop.oneOf() : undefined, + minimum: prop.minimum ? prop.minimum() : undefined, + maximum: prop.maximum ? prop.maximum() : undefined, + pattern: prop.pattern ? prop.pattern() : undefined, + fields: prop.fields ? prop.fields() : undefined + }); + + properties.push({ + name: propName, + type: processedField, // Use the processed field object with javaType + description: prop.description ? prop.description() : '', + required: processedField.required, + schemaName: prop.extensions && prop.extensions().get('x-parser-schema-id')?.value(), + format: prop.format ? prop.format() : undefined, + enum: processedField.enum ? processedField.enum : undefined, + items: prop.items ? prop.items() : undefined, + defaultValue: prop.default ? prop.default() : undefined + }); + }); + } + + // Check if this schema needs JsonProperty imports + const needsJsonPropertyInclude = checkPropertyNames(schemaName, actualSchema); + + // Add inheritance info + const extendsClass = modelClass.getSuperClassName(); + + return { + name: schemaName, // This is the original schema name from AsyncAPI spec + className: className, // Use the extracted class name (not the full schema name) + packagePath: packagePath, + namespace: namespace, + properties: properties, + isAvro: true, + isAvroSchema: true, + needsJsonPropertyInclude: needsJsonPropertyInclude, + extendsClass: extendsClass, + canBeInnerClass: modelClass.canBeInnerClass(), + modelClass: modelClass + }; +} + +/** + * Get Avro schema type using enhanced type utilities + */ +function getAvroSchemaType(schema) { + logger.debug('avroProcessor.js: getAvroSchemaType() - Getting Avro schema type'); + + if (!schema) return 'object'; + + const type = schema.type ? schema.type() : null; + const format = schema.format ? schema.format() : null; + + if (type === 'array') { + const items = schema.items(); + if (items) { + const itemType = items.type ? items.type() : null; + if (!itemType || itemType === 'object') { + return 'array-object'; + } else { + return `array-${itemType}`; + } + } + return 'array'; + } + + if (!type || type === 'object') { + const schemaName = schema.extensions && schema.extensions().get('x-parser-schema-id')?.value(); + if (schemaName) { + return `object-${schemaName}`; + } + return 'object'; + } + + return type; +} + +/** + * Convert Avro schema name to Java class name + */ +function convertAvroSchemaNameToJavaClassName(schemaName) { + logger.debug(`avroProcessor.js: convertAvroSchemaNameToJavaClassName() - Converting: ${schemaName}`); + + if (!schemaName) { + return 'UnknownSchema'; + } + + const { className } = stripPackageName(schemaName); + + // Convert to PascalCase + const pascalCase = className.replace(/[_\s]/g, ' ') + .split(' ') + .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) + .join(''); + + return pascalCase; +} + +/** + * Determine extra includes for Avro schemas + */ +function determineAvroExtraIncludes(functions, schemas) { + logger.debug('avroProcessor.js: determineAvroExtraIncludes() - Determining extra includes for Avro schemas'); + logger.debug(`avroProcessor.js: determineAvroExtraIncludes() - Functions count: ${functions.length}`); + logger.debug(`avroProcessor.js: determineAvroExtraIncludes() - Schemas count: ${schemas.length}`); + + const extraIncludes = new Set(); + + // Get the default application package (usually com.company) + const defaultPackage = 'com.company'; + + // For each function, check if it uses a payload type that's in a different package + functions.forEach((func, index) => { + logger.debug(`avroProcessor.js: determineAvroExtraIncludes() - Function ${index}: ${func.name}, payloadType: ${func.payloadType}`); + const payloadType = func.payloadType; + if (payloadType && payloadType !== 'Message' && payloadType !== 'Object') { + // Find the schema that corresponds to this payload type + const schema = schemas.find(s => { + const match1 = s.className === payloadType; + const match2 = stripPackageName(s.name) === payloadType; + logger.debug(`avroProcessor.js: determineAvroExtraIncludes() - Checking schema ${s.name}: className=${s.className}, match1=${match1}, match2=${match2}`); + return match1 || match2; + }); + if (schema) { + logger.debug(`avroProcessor.js: determineAvroExtraIncludes() - Found matching schema: ${schema.name}`); + // Extract namespace from schema name (e.g., "userpublisher.User" -> "userpublisher") + const schemaName = schema.name; + const lastDotIndex = schemaName.lastIndexOf('.'); + if (lastDotIndex > 0) { + const namespace = schemaName.substring(0, lastDotIndex); + const className = schemaName.substring(lastDotIndex + 1); + + logger.debug(`avroProcessor.js: determineAvroExtraIncludes() - Extracted namespace: ${namespace}, className: ${className}`); + // If the namespace is different from the default package, add import + if (namespace !== defaultPackage) { + const importStatement = `${namespace}.${className}`; + extraIncludes.add(importStatement); + logger.debug(`avroProcessor.js: determineAvroExtraIncludes() - Added import: ${importStatement}`); + } else { + logger.debug(`avroProcessor.js: determineAvroExtraIncludes() - Namespace ${namespace} matches default package ${defaultPackage}, skipping import`); + } + } else { + logger.debug(`avroProcessor.js: determineAvroExtraIncludes() - No namespace found in schema name: ${schemaName}`); + } + } else { + logger.debug(`avroProcessor.js: determineAvroExtraIncludes() - No matching schema found for payloadType: ${payloadType}`); + } + } + }); + + logger.debug(`avroProcessor.js: determineAvroExtraIncludes() - Final extraIncludes: ${Array.from(extraIncludes)}`); + return Array.from(extraIncludes); +} + +/** + * Determine imports for Avro schemas + */ +function determineAvroImports(functions, schemas) { + logger.debug('avroProcessor.js: determineAvroImports() - Determining imports for Avro schemas'); + + // For now, return empty array as imports are handled via extraIncludes + return []; +} + +/** + * Main entry point for Avro processor - matches interface expected by asyncApiProcessor + */ +function processAsyncApi(asyncapi, params) { + logger.debug('avroProcessor.js: processAsyncApi() - Starting Avro processing'); + + // Initialize schema model with AsyncAPI document + schemaModel.setupSuperClassMap(asyncapi); + schemaModel.setupModelClassMap(asyncapi); + + const schemas = extractAvroSchemasFromMessages(asyncapi); + + // Import and use the core processor's function extraction + const coreProcessor = require('../coreProcessor'); + const functions = coreProcessor.extractFunctions(asyncapi, params, schemas); + + const extraIncludes = determineAvroExtraIncludes(functions, schemas); + const imports = determineAvroImports(functions, schemas); + const appProperties = {}; // Avro processor doesn't generate app properties + + return { + schemas, + functions, + extraIncludes, + imports, + appProperties + }; +} + +module.exports = { + detectAvroSchemas, + extractAvroSchemasFromMessages, + getAvroSchemaType, + convertAvroSchemaNameToJavaClassName, + isAvroSchema, + isAvroMessage, + processAsyncApi +}; \ No newline at end of file diff --git a/utils/coreProcessor.js b/utils/coreProcessor.js new file mode 100644 index 00000000..f29f7ec0 --- /dev/null +++ b/utils/coreProcessor.js @@ -0,0 +1,1433 @@ +const _ = require('lodash'); +const { logger } = require('./logger'); +const { processJsonSchemas } = require('./jsonProcessor/index'); +const { extractAvroSchemasFromMessages, isAvroSchema, isAvroMessage } = require('./avroProcessor'); +const { toPascalCase, toCamelCase, getSchemaType } = require('./typeUtils'); +const { getFunctionName, getMultipleMessageComment, sortParametersUsingChannelName, getFunctionPayloadType } = require('./functionUtils'); +const { getPackageName } = require('../components/Application'); +/** + * Main processor for AsyncAPI documents + * Orchestrates schema extraction, function generation, and configuration + */ +function processAsyncApi(asyncapi, params) { + const schemas = extractSchemas(asyncapi); + const functions = extractFunctions(asyncapi, params, schemas); + + // Consolidate functions for queue-based consumers with multiple message types + const { consolidateQueueFunctions } = require('./functionUtils'); + const consolidatedFunctions = consolidateQueueFunctions(functions); + + // Get package name from params + const packageName = getPackageName(params, asyncapi); + + const extraIncludes = determineExtraIncludes(consolidatedFunctions); + const imports = determineImports(consolidatedFunctions, extraIncludes, schemas, packageName); + const appProperties = generateAppProperties(asyncapi, params); + + return { + schemas, + functions: consolidatedFunctions, + extraIncludes, + imports, + appProperties + }; +} + +/** + * Extract and process schemas from AsyncAPI document + * Handles both Avro and JSON schemas with proper deduplication + */ +function extractSchemas(asyncapi) { + const schemas = []; + + // Detect what types of schemas exist in the document + const hasAvroSchemas = detectAvroSchemas(asyncapi); + const hasJsonSchemas = detectJsonSchemas(asyncapi); + + // Process Avro schemas from message payloads (if any exist) + if (hasAvroSchemas) { + const avroSchemas = extractAvroSchemasFromMessages(asyncapi); + schemas.push(...avroSchemas); + + // Create a set of Avro schema names to avoid duplicates + const avroSchemaNames = new Set(avroSchemas.map(s => s.name)); + + // Also create a set of Avro class names (without namespace) for deduplication + const avroClassNames = new Set(avroSchemas.map(s => { + const lastDotIndex = s.name.lastIndexOf('.'); + return lastDotIndex > 0 ? s.name.substring(lastDotIndex + 1) : s.name; + })); + + // Process JSON schemas from components.schemas (skip any that are already Avro schemas) + if (hasJsonSchemas) { + const jsonSchemas = processJsonSchemas(asyncapi, avroSchemaNames, avroClassNames); + schemas.push(...jsonSchemas); + } + } else if (hasJsonSchemas) { + // Only JSON schemas exist, no need to check for duplicates + const jsonSchemas = processJsonSchemas(asyncapi, new Set()); + schemas.push(...jsonSchemas); + } + + if (schemas.length === 0) { + logger.debug('No schemas found in AsyncAPI document. Skipping model class generation.'); + } + + // Filter out schemas that are empty, undefined, or do not have a valid properties array + logger.debug(`coreProcessor: Before filtering - ${schemas.length} schemas:`, schemas.map(s => ({ + name: s?.name, + hasProperties: s?.properties ? 'yes' : 'no', + propertiesType: Array.isArray(s?.properties) ? 'array' : typeof s?.properties, + propertiesLength: s?.properties?.length, + hasAllOf: s?.allOf ? 'yes' : 'no' + }))); + + const filteredSchemas = schemas.filter(s => { + // Keep schemas that have properties OR should have inheritance (detected from schema structure) + const hasValidProperties = s && Array.isArray(s.properties) && s.properties.length > 0; + const shouldHaveInheritance = s && s.name && typeof s.name === 'string' && !s.name.startsWith(' { + try { + const schemaFormat = message.schemaFormat && message.schemaFormat(); + if (schemaFormat && schemaFormat.includes('avro')) { + logger.debug(`coreProcessor: Found Avro schema in components.messages: ${messageName}`); + hasAvro = true; + } + } catch (error) { + logger.warn(`Error checking message ${messageName} for Avro schema:`, error.message); + } + }); + } + + // Also check for Avro schemas in channel operations (inline messages) + if (!hasAvro) { + const channels = asyncapi.channels(); + if (channels && typeof channels.values === 'function') { + for (const channel of channels.values()) { + const channelName = channel.id(); + + // Get all operations for this channel + const operations = channel.operations && typeof channel.operations === 'function' + ? Array.from(channel.operations().values()) + : []; + + // Check all operations for Avro messages + for (const operation of operations) { + try { + const messages = operation.messages && typeof operation.messages === 'function' + ? Array.from(operation.messages().values()) + : []; + + for (const message of messages) { + const schemaFormat = message.schemaFormat && message.schemaFormat(); + if (schemaFormat && schemaFormat.includes('avro')) { + logger.debug(`coreProcessor: Found Avro schema in channel operation: ${channelName}`); + hasAvro = true; + break; + } + } + + if (hasAvro) break; + } catch (error) { + logger.warn(`Error checking channel ${channelName} operation for Avro schema:`, error.message); + } + } + + if (hasAvro) break; + } + } + } + + return hasAvro; +} + +/** + * Detect if AsyncAPI document contains JSON schemas + */ +function detectJsonSchemas(asyncapi) { + const componentsSchemas = asyncapi.components().schemas(); + return componentsSchemas && + ((typeof componentsSchemas.size === 'number' && componentsSchemas.size > 0) || + (typeof componentsSchemas === 'object' && Object.keys(componentsSchemas).length > 0)); +} + +/** + * Extract functions from AsyncAPI document + * Generates consumer, supplier, and send functions based on channel operations + */ +function extractFunctions(asyncapi, params, processedSchemas = []) { + const functionMap = new Map(); + const usedFunctionNames = new Set(); + const { reactive = false, dynamicType = 'streamBridge', binder = 'solace', parametersToHeaders = false } = params; + const channels = asyncapi.channels(); + + logger.debug('extractFunctions: Starting function extraction'); + logger.debug(`extractFunctions: channels = ${channels ? 'exists' : 'null'}`); + + if (!channels || typeof channels.values !== 'function') { + logger.warn('extractFunctions: No channels found or channels.values is not a function'); + return []; + } + + // Determine view (provider/client) + const info = asyncapi.info(); + // Priority: AsyncAPI x-view extension > params.view > undefined + const xViewExtension = info.extensions && info.extensions().get('x-view') ? info.extensions().get('x-view').value() : undefined; + const view = xViewExtension || params.view; + const isProvider = view === 'provider'; + + logger.debug(`extractFunctions: view = ${view}, isProvider = ${isProvider}`); + + // Create a map of Avro schemas for quick lookup + const avroSchemaMap = new Map(); + processedSchemas.forEach(schema => { + if (schema.isAvro || schema.isAvroSchema) { + avroSchemaMap.set(schema.name, schema); + } + }); + + const channelArray = Array.from(channels.values()); + logger.debug(`extractFunctions: Found ${channelArray.length} channels`); + + const functions = []; + const consumerGroups = new Map(); + + channelArray.forEach((channel, index) => { + const channelName = channel.id(); + logger.debug(`extractFunctions: Processing channel ${index + 1}/${channelArray.length}: ${channelName}`); + const parameters = extractChannelParameters(channel); + + // Get all operations for this channel + const operations = channel.operations && typeof channel.operations === 'function' + ? Array.from(channel.operations().values()) + : []; + const publishOperation = operations.find(op => op.action() === 'publish') || null; + const subscribeOperation = operations.find(op => op.action() === 'subscribe') || null; + + // View-based mapping + const realPublisher = isProvider ? publishOperation : subscribeOperation; + const realSubscriber = isProvider ? subscribeOperation : publishOperation; + + logger.debug(`coreProcessor.js: extractFunctions() - Channel: ${channelName}`); + logger.debug(`coreProcessor.js: extractFunctions() - isProvider: ${isProvider}`); + logger.debug(`coreProcessor.js: extractFunctions() - publishOperation: ${publishOperation ? publishOperation.action() : 'null'}`); + logger.debug(`coreProcessor.js: extractFunctions() - subscribeOperation: ${subscribeOperation ? subscribeOperation.action() : 'null'}`); + logger.debug(`coreProcessor.js: extractFunctions() - realPublisher: ${realPublisher ? realPublisher.action() : 'null'}`); + logger.debug(`coreProcessor.js: extractFunctions() - realSubscriber: ${realSubscriber ? realSubscriber.action() : 'null'}`); + + // --- Handle Real Publisher Operations (following Nunjucks reference project pattern) --- + if (realPublisher) { + const payloadType = getFunctionPayloadType(realPublisher, avroSchemaMap); + const channelInfo = getChannelInfo(channel, realPublisher, parameters); + const messageName = extractMessageName(realPublisher); + const isDynamicTopic = parameters.length > 0; + + logger.debug(`coreProcessor.js: extractFunctions() - Processing real publisher: ${channelName}, isDynamic: ${isDynamicTopic}`); + + if (isDynamicTopic) { + // Dynamic channel β†’ Send function (using StreamBridge) + // Generate unique send method name with priority: operationId > messageName > channel parts + let sendMethodName; + const existingMethodNames = functions.map(f => f.sendMethodName || f.name); + + // Priority 1: Try operationId first + if (realPublisher.operationId && realPublisher.operationId()) { + sendMethodName = `send${toPascalCase(realPublisher.operationId())}`; + if (!existingMethodNames.includes(sendMethodName)) { + logger.debug(`coreProcessor.js: Using operationId for send method name: ${sendMethodName}`); + } + } + + // Priority 2: Try message name from ref if operationId not available or conflicts + if (!sendMethodName) { + const messageName = extractMessageName(realPublisher); + if (messageName) { + sendMethodName = `send${toPascalCase(messageName)}`; + if (!existingMethodNames.includes(sendMethodName)) { + logger.debug(`coreProcessor.js: Using message name for send method name: ${sendMethodName}`); + } + } + } + + // Priority 3: Use channel parts if previous methods conflict or not available + if (!sendMethodName) { + const channelPathParts = channelName.split('/'); + sendMethodName = `send${toCamelCase(channelPathParts[0])}${channelPathParts.slice(1).toPascalCase().join('')}`; + logger.debug(`coreProcessor.js: Using channel parts for send method name: ${sendMethodName}`); + } + + // Handle remaining conflicts by adding a unique suffix + if (existingMethodNames.includes(sendMethodName)) { + let counter = 1; + let baseName = sendMethodName; + while (existingMethodNames.includes(sendMethodName)) { + sendMethodName = `${baseName}${counter}`; + counter++; + } + logger.debug(`coreProcessor.js: Resolved conflict by adding suffix: ${sendMethodName}`); + } + logger.debug(`coreProcessor.js: extractFunctions() - Creating send function: ${sendMethodName}`); + functions.push({ + name: getFunctionName(channelName, realPublisher, false), + type: 'send', + sendMethodName: sendMethodName, + publishPayload: payloadType, + dynamic: true, + dynamicType, + reactive, + isPublisher: true, + hasParams: true, + parameters, + channelInfo, + operation: realPublisher, + messageName: messageName, + multipleMessageComment: getMultipleMessageComment(realPublisher) + }); + } else { + // Static channel β†’ Supplier function + logger.debug(`coreProcessor.js: extractFunctions() - Creating supplier function: ${channelName}`); + functions.push({ + name: getFunctionName(channelName, realPublisher, false), + type: 'supplier', + publishPayload: payloadType, + dynamic: false, + dynamicType, + reactive, + isPublisher: true, + hasParams: false, + parameters: [], + channelInfo, + operation: realPublisher, + messageName: messageName, + multipleMessageComment: getMultipleMessageComment(realPublisher) + }); + } + } + + // --- Handle SUBSCRIBE operations --- + if (realSubscriber) { + const payloadType = getFunctionPayloadType(realSubscriber, avroSchemaMap); + const channelInfo = getChannelInfoForConsumer(channel, realSubscriber, parameters, isProvider); + + // Extract message name from the operation + const messageName = extractMessageName(realSubscriber); + + // Check if this is a queue-based subscription + logger.debug(`coreProcessor.js: extractFunctions() - ChannelInfo for ${channelName}: allQueueInfos=${channelInfo.allQueueInfos ? channelInfo.allQueueInfos.length : 'null'}, queueName=${channelInfo.queueName}`); + + if (channelInfo.allQueueInfos && channelInfo.allQueueInfos.length > 0) { + // Handle multiple destinations - create separate consumer for each queue + channelInfo.allQueueInfos.forEach((queueInfo, index) => { + // Include channel name in queue key to allow separate functions for each channel + const queueKey = `${channelName}::${queueInfo.queueName}::${(queueInfo.topicSubscriptions||[]).join(',')}`; + + if (!consumerGroups.has(queueKey)) { + // Create a unique consumer name for each destination + const baseName = toConsumerBeanName(queueInfo.queueName); + const consumerName = index === 0 ? baseName : `${baseName}${index + 1}`; + + // Detect if channel has enum parameters for better Message signature + const hasEnumParameters = channelInfo.parameters && channelInfo.parameters.length > 0 && + channelInfo.parameters.some(param => param.hasEnum); + + consumerGroups.set(queueKey, { + name: consumerName, + type: 'consumer', + subscribePayload: payloadType, + dynamic: channelInfo.hasParams || false, + dynamicType, + reactive, + parametersToHeaders, + isSubscriber: true, + isPublisher: false, + hasParams: channelInfo.hasParams || false, + parameters: channelInfo.parameters || [], + channelInfo: { + ...channelInfo, + queueName: queueInfo.queueName, + topicSubscriptions: queueInfo.topicSubscriptions + }, + group: queueInfo.queueName + '-group', + isQueueWithSubscription: true, + queueName: queueInfo.queueName, + topicSubscriptions: queueInfo.topicSubscriptions, + subscribeChannel: channelInfo.subscribeChannel, + publishChannel: channelInfo.publishChannel, + operation: realSubscriber, + messageName: messageName, + hasEnumParameters: hasEnumParameters + }); + } + }); + } else if (channelInfo.queueName) { + // Handle single destination (backward compatibility) + const queueKey = `${channelInfo.queueName}::${(channelInfo.topicSubscriptions||[]).join(',')}`; + + if (!consumerGroups.has(queueKey)) { + // Detect if channel has enum parameters for better Message signature + const hasEnumParameters = channelInfo.parameters && channelInfo.parameters.length > 0 && + channelInfo.parameters.some(param => param.hasEnum); + + consumerGroups.set(queueKey, { + name: toConsumerBeanName(channelInfo.queueName), + type: 'consumer', + subscribePayload: payloadType, + dynamic: channelInfo.hasParams || false, + dynamicType, + reactive, + parametersToHeaders, + isSubscriber: true, + isPublisher: false, + hasParams: channelInfo.hasParams || false, + parameters: channelInfo.parameters || [], + channelInfo, + group: channelInfo.queueName + '-group', + isQueueWithSubscription: true, + queueName: channelInfo.queueName, + topicSubscriptions: channelInfo.topicSubscriptions, + subscribeChannel: channelInfo.subscribeChannel, + publishChannel: channelInfo.publishChannel, + operation: realSubscriber, + messageName: messageName, + hasEnumParameters: hasEnumParameters + }); + } + } else { + // Regular consumer (not queue-based) + // Detect if channel has enum parameters for better Message signature + const hasEnumParameters = channelInfo.parameters && channelInfo.parameters.length > 0 && + channelInfo.parameters.some(param => param.hasEnum); + + functions.push({ + // name: getFunctionName(realSubscriber, channelName, true), + name: getFunctionName(channelName, realSubscriber, true), + type: 'consumer', + subscribePayload: payloadType, + dynamic: channelInfo.hasParams || false, + dynamicType, + reactive, + parametersToHeaders, + isSubscriber: true, + isPublisher: false, + hasParams: channelInfo.hasParams || false, + parameters: channelInfo.parameters || [], + channelInfo, + operation: realSubscriber, + messageName: messageName, + multipleMessageComment: getMultipleMessageComment(realSubscriber), + hasEnumParameters: hasEnumParameters + }); + } + } + }); + + // Add grouped consumers + functions.push(...Array.from(consumerGroups.values())); + + // Process x-scs-function-name grouping for Function type creation + const processedFunctions = processXScsFunctionNameGrouping(functions, isProvider); + + logger.debug(`extractFunctions: Extracted ${processedFunctions.length} functions total (after x-scs-function-name processing)`); + return processedFunctions; +} + + +/** + * Convert queue name to consumer bean name + * Handles dot-separated names (e.g., 'coreBanking.accounts' -> 'CoreBankingaccounts') + */ +function toConsumerBeanName(str) { + if (!str) return ''; + + // Remove curly braces first + let cleaned = str.replace(/([{}:,])/g, ''); + + // Special case for consumer bean names with dots (matching reference) + if (cleaned.includes('.')) { + const parts = cleaned.split('.'); + cleaned = toCamelCase(parts[0]) + parts.slice(1).map(part => toPascalCase(part)).join(''); + } + + // For other cases, use standard PascalCase + return toCamelCase(cleaned); +} + +/** + * Extract message name from an operation + */ +function extractMessageName(operation) { + try { + if (!operation) { + logger.debug(`extractMessageName: operation is null`); + return null; + } + + const messages = operation.messages(); + if (!messages || typeof messages.values !== 'function') { + logger.debug(`extractMessageName: No messages or values function`); + return null; + } + + const messageArray = Array.from(messages.values()); + logger.debug(`extractMessageName: Found ${messageArray.length} messages`); + if (messageArray.length === 0) { + logger.debug(`extractMessageName: No messages in array`); + return null; + } + + // Take the first message + const message = messageArray[0]; + logger.debug(`extractMessageName: Processing first message`); + + // Try to get the message name using AsyncAPI library functions + if (message.name && typeof message.name === 'function') { + const messageName = message.name(); + logger.debug(`extractMessageName: message.name() returned: ${messageName}`); + if (messageName) { + return messageName; + } + } + + // Try to get from operation's message binding + logger.debug(`extractMessageName: Checking operation message binding - exists: ${!!operation.message}, type: ${typeof operation.message}`); + if (operation.message && typeof operation.message === 'function') { + const operationMessage = operation.message(); + logger.debug(`extractMessageName: operation.message() returned: ${operationMessage ? 'exists' : 'null'}`); + if (operationMessage && operationMessage.name && typeof operationMessage.name === 'function') { + const operationMessageName = operationMessage.name(); + logger.debug(`extractMessageName: operationMessage.name() returned: ${operationMessageName}`); + if (operationMessageName) { + return operationMessageName; + } + } + } + + // Try to get from message extensions + if (message.extensions && typeof message.extensions === 'function') { + const extensions = message.extensions(); + if (extensions) { + const eventName = extensions.get('x-ep-event-name'); + if (eventName && eventName.value) { + logger.debug(`extractMessageName: Found x-ep-event-name: ${eventName.value()}`); + return eventName.value(); + } + } + } + + // Try to get from message reference + logger.debug(`extractMessageName: Checking message.ref - exists: ${!!message.ref}, type: ${typeof message.ref}`); + if (message.ref && typeof message.ref === 'function') { + const ref = message.ref(); + logger.debug(`extractMessageName: message.ref() returned: ${ref}`); + if (ref) { + // Extract the message name from "#/components/messages/MessageName" + const match = ref.match(/#\/components\/messages\/(.+)$/); + if (match) { + logger.debug(`extractMessageName: Extracted message name from ref: ${match[1]}`); + return match[1]; + } + } + } + + // Try to get from message object's internal structure + logger.debug(`extractMessageName: Checking message object properties`); + if (message._json) { + logger.debug(`extractMessageName: message._json exists`); + // Try to get the message name from the internal JSON structure + const messageJson = message._json; + logger.debug(`extractMessageName: message._json keys: ${Object.keys(messageJson).join(', ')}`); + + // Check if there's a messageId or similar property + if (messageJson.messageId) { + logger.debug(`extractMessageName: Found messageId: ${messageJson.messageId}`); + return messageJson.messageId; + } + + // Check if there's a name property + if (messageJson.name) { + logger.debug(`extractMessageName: Found name: ${messageJson.name}`); + return messageJson.name; + } + + // Check for x-parser-message-name property + if (messageJson['x-parser-message-name']) { + logger.debug(`extractMessageName: Found x-parser-message-name: ${messageJson['x-parser-message-name']}`); + return messageJson['x-parser-message-name']; + } + } + + return null; + } catch (error) { + logger.warn(`extractMessageName: Error extracting message name: ${error.message}`); + return null; + } +} + +/** + * Convert parameter name to camelCase + * Preserves camelCase patterns like 'transactionID' -> 'transactionID' + */ +function toParameterName(str) { + if (!str) return ''; + + // Remove curly braces first + let cleaned = str.replace(/([{}])/g, ''); + + // Preserve camelCase parameters (e.g., 'transactionID' -> 'transactionID') + if (cleaned.match(/^[a-z]+[A-Z][A-Z]/)) { + return cleaned; // Keep as is for camelCase like transactionID + } + + // Handle camelCase parameters with single capital letter (e.g., 'transactionID' -> 'transactionId') + if (cleaned.match(/^[a-z]+[A-Z][a-z]*$/)) { + return cleaned.charAt(0).toLowerCase() + cleaned.slice(1); + } + + // For simple parameters, just lowercase + return cleaned.toLowerCase(); +} + +/** + * Calculate the actual position of a parameter in the channel path + */ +function calculateParameterPosition(channelPath, parameterName) { + const segments = channelPath.split('/'); + const parameterPlaceholder = `{${parameterName}}`; + + for (let i = 0; i < segments.length; i++) { + if (segments[i] === parameterPlaceholder) { + return i; + } + } + + logger.warn(`Parameter ${parameterName} not found in channel path ${channelPath}`); + return -1; +} + +/** + * Extract channel parameters + */ +function extractChannelParameters(channel) { + const parameters = []; + const channelParameters = channel.parameters(); + const channelPath = channel.id(); + + if (channelParameters && typeof channelParameters.values === 'function') { + const paramArray = Array.from(channelParameters.values()); + paramArray.forEach((param, index) => { + try { + // Handle different ways the required property might be accessed + let isRequired = false; + if (typeof param.required === 'function') { + isRequired = param.required(); + } else if (typeof param.required === 'boolean') { + isRequired = param.required; + } else { + // Default to true for channel parameters + isRequired = true; + } + + const paramName = toParameterName(param.id()); + const actualPosition = calculateParameterPosition(channelPath, param.id()); + + // Check if parameter has enum values + const enumValues = getParameterEnumValues(param); + const hasEnum = enumValues && enumValues.length > 0; + + parameters.push({ + name: paramName, + type: getParameterType(param), + required: isRequired, + position: actualPosition, + enumValues: enumValues, + hasEnum: hasEnum + }); + } catch (error) { + logger.warn(`Error processing channel parameter ${param?.id() || 'unknown'}:`, error.message); + // Add a default parameter entry to avoid breaking the generation + parameters.push({ + name: param?.id() || 'unknown', + type: 'String', + required: true, + position: index + }); + } + }); + } + return sortParametersUsingChannelName(parameters, channel.id()); +} + +/** + * Get parameter enum values + */ +function getParameterEnumValues(param) { + try { + const schema = param.schema(); + + if (schema) { + // Check if schema has enum property + if (schema.enum && typeof schema.enum === 'function') { + const enumValues = schema.enum(); + if (Array.isArray(enumValues) && enumValues.length > 0) { + return enumValues; + } + } + + // Also check _json for enum values + if (schema._json && schema._json.enum && Array.isArray(schema._json.enum)) { + return schema._json.enum; + } + } + return null; + } catch (error) { + logger.warn(`Error getting parameter enum values for ${param?.id() || 'unknown'}:`, error.message); + return null; + } +} + +/** + * Get parameter type + */ +function getParameterType(param) { + try { + const schema = param.schema(); + if (schema) { + const schemaType = getSchemaType(schema); + // Convert schema type to Java type + switch (schemaType.toLowerCase()) { + case 'string': + return 'String'; + case 'integer': + return 'Integer'; + case 'number': + return 'Double'; + case 'boolean': + return 'Boolean'; + default: + return 'String'; // Default to String for unknown types + } + } + return 'String'; + } catch (error) { + logger.warn(`Error getting parameter type for ${param?.id() || 'unknown'}:`, error.message); + return 'String'; + } +} + +/** + * Determine extra includes based on functions + */ +function determineExtraIncludes(functions) { + const extraIncludes = { + needFunction: false, + needConsumer: false, + needSupplier: false, + needBean: false, + needMessage: false, + dynamic: false + }; + + functions.forEach(func => { + // Check for dynamic functions (functions with parameters) + if (func.dynamic) { + extraIncludes.dynamic = true; + } + + // Check for consumer functions + if (func.type === 'consumer') { + extraIncludes.needConsumer = true; + extraIncludes.needBean = true; + } + + // Check for supplier functions + if (func.type === 'supplier') { + extraIncludes.needSupplier = true; + extraIncludes.needBean = true; + } + + // Check for functions that need Message type + if (func.multipleMessages || func.dynamic) { + extraIncludes.needMessage = true; + } + + // Check for functions that need Function type (if any function uses Function) + if (func.type === 'function') { + extraIncludes.needFunction = true; + } + }); + + return extraIncludes; +} + +/** + * Determine imports based on functions and extra includes + */ +function determineImports(functions, extraIncludes, processedSchemas = [], packageName = null) { + const imports = new Set(); + + // Add schema imports + const schemaImports = determineSchemaImports(functions, processedSchemas, packageName); + schemaImports.forEach(importStr => imports.add(importStr)); + + return Array.from(imports); +} + +/** + * Determine schema imports based on functions and processed schemas + */ +function determineSchemaImports(functions, processedSchemas = [], currentPackage = null) { + const imports = new Set(); + + // Create a map of Avro schemas for quick lookup + const avroSchemaMap = new Map(); + processedSchemas.forEach(schema => { + if (schema.isAvro || schema.isAvroSchema) { + avroSchemaMap.set(schema.name, schema); + } + }); + + functions.forEach(func => { + // Add imports for subscribe payload types + let subscribePayloadType = func.subscribePayload; + if (subscribePayloadType && typeof subscribePayloadType === 'object' && subscribePayloadType.javaType) { + subscribePayloadType = subscribePayloadType.javaType; + } + if (subscribePayloadType && typeof subscribePayloadType === 'string' && subscribePayloadType !== 'String' && subscribePayloadType !== 'Message' && subscribePayloadType !== 'Object') { + const importStr = getSchemaImport(subscribePayloadType, avroSchemaMap, currentPackage); + if (importStr) { + imports.add(importStr); + } + } + // Add imports for publish payload types + let publishPayloadType = func.publishPayload; + if (publishPayloadType && typeof publishPayloadType === 'object' && publishPayloadType.javaType) { + publishPayloadType = publishPayloadType.javaType; + } + if (publishPayloadType && typeof publishPayloadType === 'string' && publishPayloadType !== 'String' && publishPayloadType !== 'Message' && publishPayloadType !== 'Object') { + const importStr = getSchemaImport(publishPayloadType, avroSchemaMap, currentPackage); + if (importStr) { + imports.add(importStr); + } + } + }); + + return Array.from(imports); +} + +/** + * Get schema import for a given schema name + */ +function getSchemaImport(schemaName, avroSchemaMap = new Map(), currentPackage = null) { + if (!schemaName || schemaName === 'String' || schemaName === 'Message') { + return null; + } + + // Handle generic types like List + if (schemaName.includes('<') && schemaName.includes('>')) { + // Extract the generic type (e.g., "List" -> "Customer") + const match = schemaName.match(/<([^>]+)>/); + if (match) { + const innerType = match[1]; + // Recursively get import for the inner type + const innerImport = getSchemaImport(innerType, avroSchemaMap); + return innerImport; // Return the import for the inner type, not the generic + } + } + + // Check if it's a Java primitive type - don't add import + const javaPrimitiveTypes = [ + 'String', 'Integer', 'Long', 'Float', 'Double', 'Boolean', + 'java.time.OffsetDateTime', 'java.time.LocalDate', 'java.time.LocalTime', + 'java.time.LocalDateTime', 'java.time.Instant', 'java.math.BigDecimal', + 'byte[]', 'Object' + ]; + + if (javaPrimitiveTypes.includes(schemaName)) { + return null; // No import needed for primitive types + } + + // Check if it's an anonymous schema - don't add import + if (schemaName.includes(' "userpublisher") + const lastDotIndex = fullSchemaName.lastIndexOf('.'); + if (lastDotIndex > 0) { + const namespace = fullSchemaName.substring(0, lastDotIndex); + const className = avroSchema.className || schemaName; + logger.debug(`coreProcessor.js: getSchemaImport() - Found Avro schema ${schemaName} in namespace ${namespace}`); + return `${namespace}.${className}`; + } + } + } + + // For regular schemas, check if they're in the same package + if (currentPackage) { + // Check if this schema exists in the current package (same directory) + // If it's in the same package, don't generate an import + const schemaInCurrentPackage = `${currentPackage}.${schemaName}`; + logger.debug(`coreProcessor.js: getSchemaImport() - Schema ${schemaName} would be in current package: ${schemaInCurrentPackage}`); + // For now, assume all schemas are in the same package unless they have a specific package path + return null; // Don't import schemas in the same package + } + + // Fallback: assume they're in the default package (for backward compatibility) + return `com.company.${schemaName}`; +} + +/** + * Generate app properties + */ +function generateAppProperties(asyncapi, params) { + // Destructure parameters with defaults from package.json + const { + binder = 'kafka', + host, + username, + password, + msgVpn, + parametersToHeaders = false, + view: paramView + } = params; + + // Validate binder parameter + if (binder !== 'kafka' && binder !== 'rabbit' && binder !== 'solace') { + throw new Error('Please provide a parameter named \'binder\' with the value kafka, rabbit or solace.'); + } + + const properties = []; + const channels = asyncapi.channels(); + + if (!channels || typeof channels.values !== 'function') { + return properties; + } + + // Determine view (provider/client) + const info = asyncapi.info(); + const view = paramView || (info.extensions && info.extensions().get('x-view') ? info.extensions().get('x-view').value() : undefined); + const isProvider = view === 'provider'; + + Array.from(channels.values()).forEach(channel => { + const channelName = channel.id(); + + // Handle publish operations + const publishOperation = channel.publish ? channel.publish() : null; + if (publishOperation) { + // const functionName = getFunctionName(publishOperation, channelName, false); + const functionName = getFunctionName(channelName, publishOperation, false); + const destination = getChannelDestination(channel, publishOperation); + + // Client view: publish operations become subscribers (consumers) + // Provider view: publish operations become publishers (suppliers) + const isPublisher = isProvider; + const bindingType = isPublisher ? 'out-0' : 'in-0'; + const operationType = isPublisher ? 'Supplier' : 'Consumer'; + + properties.push(`spring.cloud.stream.bindings.${functionName}-${bindingType}.destination=${destination}`); + + // Add binder-specific properties + if (binder === 'solace') { + properties.push(`spring.cloud.stream.bindings.${functionName}-${bindingType}.binder=solace`); + } + } + + // Handle subscribe operations + const subscribeOperation = channel.subscribe ? channel.subscribe() : null; + if (subscribeOperation) { + // const functionName = getFunctionName(subscribeOperation, channelName, true); + const functionName = getFunctionName(channelName, subscribeOperation, true); + const destination = getChannelDestination(channel, subscribeOperation); + + // Client view: subscribe operations become publishers (suppliers) + // Provider view: subscribe operations become subscribers (consumers) + const isPublisher = !isProvider; + const bindingType = isPublisher ? 'out-0' : 'in-0'; + const operationType = isPublisher ? 'Supplier' : 'Consumer'; + + properties.push(`spring.cloud.stream.bindings.${functionName}-${bindingType}.destination=${destination}`); + + // Add binder-specific properties + if (binder === 'solace') { + properties.push(`spring.cloud.stream.bindings.${functionName}-${bindingType}.binder=solace`); + } + } + }); + + return properties; +} + +/** + * Get channel destination for an operation + */ +function getChannelDestination(channel, operation) { + // Check for x-scs-destination extension on the operation + const extensions = operation.extensions(); + if (extensions && extensions.get('x-scs-destination')) { + return extensions.get('x-scs-destination').value(); + } + + // Default to channel name + return channel.id(); +} + +/** + * Get channel information for a function + */ +function getChannelInfo(channel, operation, parameters) { + // For send functions (subscribe operations in client view), we need to ensure publishChannel is set + let publishChannel = getPublishChannel(channel, operation); + + // If publishChannel is null but this is a send function (subscribe operation), + // we need to create the publish channel from the current channel + if (!publishChannel && operation.action() === 'subscribe') { + publishChannel = replaceChannelParametersWithFormatStrings(channel.id(), channel); + } + + const channelInfo = { + publishChannel: publishChannel, + subscribeChannel: getSubscribeChannel(channel, operation), + parameters + }; + + // Generate function parameter list and argument list for send functions + if (parameters && parameters.length > 0) { + const paramList = parameters.map(param => `${param.type} ${param.name}`).join(', '); + const argList = parameters.map(param => param.name).join(', '); + channelInfo.functionParamList = paramList; + channelInfo.functionArgList = argList; + } else { + channelInfo.functionParamList = ''; + channelInfo.functionArgList = ''; + } + + // Extract Solace queue information from bindings + const queueInfo = extractSolaceQueueInfo(channel, operation); + if (queueInfo) { + channelInfo.queueName = queueInfo.queueName; + channelInfo.topicSubscriptions = queueInfo.topicSubscriptions; + } + + return channelInfo; +} + +/** + * Get channel information for a consumer function, checking publish operation for Solace queue bindings + */ +function getChannelInfoForConsumer(channel, operation, parameters, isProvider) { + logger.debug(`coreProcessor.js: getChannelInfoForConsumer() - Operation action: ${operation.action()}`); + + // For consumer functions, we need to get the actual subscribe operation for subscribeChannel + // regardless of the view (provider/client) + const operations = channel.operations && typeof channel.operations === 'function' + ? Array.from(channel.operations().values()) + : []; + const subscribeOperation = operations.find(op => op.action() === 'subscribe') || null; + const publishOperation = operations.find(op => op.action() === 'publish') || null; + + logger.debug(`coreProcessor.js: getChannelInfoForConsumer() - subscribeOperation: ${subscribeOperation ? subscribeOperation.action() : 'null'}`); + logger.debug(`coreProcessor.js: getChannelInfoForConsumer() - publishOperation: ${publishOperation ? publishOperation.action() : 'null'}`); + + const channelInfo = { + publishChannel: getPublishChannel(channel, operation), + subscribeChannel: subscribeOperation ? getSubscribeChannel(channel, subscribeOperation) : replaceChannelParametersWithWildcards(channel.id(), channel), + parameters, + hasParams: parameters && parameters.length > 0 + }; + + // For consumer functions, check the publish operation for Solace queue bindings + // In client view: consumer functions come from publish operations + // In provider view: consumer functions come from subscribe operations + let queueOperation = operation; + if (!isProvider) { + // Client view: check publish operation for queue bindings + const publishOperation = channel.publish ? channel.publish() : null; + if (publishOperation) { + queueOperation = publishOperation; + } + } + + // Extract Solace queue information from bindings + const queueInfos = extractSolaceQueueInfo(channel, queueOperation); + if (queueInfos && queueInfos.length > 0) { + // For backward compatibility, use the first queue info for the main channelInfo + const firstQueueInfo = queueInfos[0]; + channelInfo.queueName = firstQueueInfo.queueName; + channelInfo.topicSubscriptions = firstQueueInfo.topicSubscriptions; + + // Store all queue infos for multiple destination handling + channelInfo.allQueueInfos = queueInfos; + } + + return channelInfo; +} + +/** + * Extract Solace queue information from channel bindings + * Returns an array of queue information for all destinations + */ +function extractSolaceQueueInfo(channel, operation) { + try { + logger.debug(`coreProcessor.js: extractSolaceQueueInfo() - Extracting queue info for channel: ${channel.id()}`); + + const bindings = operation.bindings(); + if (!bindings) { + logger.debug(`coreProcessor.js: extractSolaceQueueInfo() - No bindings found`); + return null; + } + + const solaceBinding = bindings.get('solace'); + if (!solaceBinding) { + logger.debug(`coreProcessor.js: extractSolaceQueueInfo() - No solace binding found`); + return null; + } + + // Access the raw JSON structure since the AsyncAPI library methods might not work as expected + const solaceBindingJson = solaceBinding._json || solaceBinding; + if (!solaceBindingJson || !solaceBindingJson.destinations) { + logger.debug(`coreProcessor.js: extractSolaceQueueInfo() - No destinations found in solace binding`); + return null; + } + + const destinations = solaceBindingJson.destinations; + if (!destinations || destinations.length === 0) { + logger.debug(`coreProcessor.js: extractSolaceQueueInfo() - No destinations array found`); + return null; + } + + logger.debug(`coreProcessor.js: extractSolaceQueueInfo() - Found ${destinations.length} destinations`); + + const queueInfos = []; + + destinations.forEach((destination, index) => { + logger.debug(`coreProcessor.js: extractSolaceQueueInfo() - Processing destination ${index}: ${JSON.stringify(destination)}`); + + if (destination.destinationType === 'queue') { + const queue = destination.queue; + if (queue) { + const queueName = queue.name; + const topicSubscriptions = queue.topicSubscriptions || []; + + logger.debug(`coreProcessor.js: extractSolaceQueueInfo() - Found queue: ${queueName} with ${topicSubscriptions.length} topic subscriptions`); + + queueInfos.push({ + queueName, + topicSubscriptions + }); + } + } + }); + + logger.debug(`coreProcessor.js: extractSolaceQueueInfo() - Returning ${queueInfos.length} queue infos`); + return queueInfos.length > 0 ? queueInfos : null; + } catch (error) { + logger.debug(`coreProcessor.js: extractSolaceQueueInfo() - Error: ${error.message}`); + return null; + } +} + +/** + * Get group name for a function + */ +function getGroupName(channel, operation, params) { + // Check for x-scs-group extension first + const extensions = operation.extensions(); + if (extensions && extensions.get('x-scs-group')) { + return extensions.get('x-scs-group').value(); + } + + // Only return a group name if explicitly defined in AsyncAPI + // Don't generate default group names + return null; +} + +/** + * Check if channel has queue with subscription + */ +function isQueueWithSubscription(channel, operation) { + // Check for x-scs-queue extension + const extensions = operation.extensions(); + if (extensions && extensions.get('x-scs-queue')) { + return true; + } + + // Check for x-scs-group extension (indicates queue-based consumer) + if (extensions && extensions.get('x-scs-group')) { + return true; + } + + return false; +} + +/** + * Get queue name for a function + */ +function getQueueName(channel, operation, params) { + // Check for x-scs-queue extension first + const extensions = operation.extensions(); + if (extensions && extensions.get('x-scs-queue')) { + return extensions.get('x-scs-queue').value(); + } + + // Check for x-scs-group extension + if (extensions && extensions.get('x-scs-group')) { + return extensions.get('x-scs-group').value(); + } + + // Generate queue name from channel and operation + const channelName = channel.id(); + const operationId = operation.id() || 'unknown'; + + return `${channelName}.${operationId}`; +} + +/** + * Get subscribe channel for a function + * Replaces parameter placeholders with wildcards for subscribe operations + */ +function getSubscribeChannel(channel, operation) { + let channelName = channel.id(); + + // For subscribe operations, use the channel name with wildcards + if (operation.action() === 'subscribe') { + return replaceChannelParametersWithWildcards(channelName, channel); + } + + // For publish operations, check if there's a subscribe operation on the same channel + const subscribeOperation = channel.subscribe ? channel.subscribe() : null; + if (subscribeOperation) { + return replaceChannelParametersWithWildcards(channelName, channel); + } + + return null; +} + +/** + * Get publish channel for a function + * Replaces parameter placeholders with format strings for publish operations + */ +function getPublishChannel(channel, operation) { + let channelName = channel.id(); + + // For publish operations, use the channel name with format strings + if (operation.action() === 'publish') { + return replaceChannelParametersWithFormatStrings(channelName, channel); + } + + // For subscribe operations, check if there's a publish operation on the same channel + const publishOperation = channel.publish ? channel.publish() : null; + if (publishOperation) { + return replaceChannelParametersWithFormatStrings(channelName, channel); + } + + return null; +} + +/** + * Replace channel parameters with wildcards for subscribe operations + */ +function replaceChannelParametersWithWildcards(channelName, channel) { + logger.debug(`coreProcessor.js: replaceChannelParametersWithWildcards() - Processing channel: ${channelName}`); + let result = channelName; + const channelParameters = channel.parameters(); + + if (channelParameters && typeof channelParameters.values === 'function') { + Array.from(channelParameters.values()).forEach(param => { + const paramName = param.id(); + const placeholder = `{${paramName}}`; + result = result.replace(placeholder, '*'); + logger.debug(`coreProcessor.js: replaceChannelParametersWithWildcards() - Replaced ${placeholder} with *`); + }); + } + + logger.debug(`coreProcessor.js: replaceChannelParametersWithWildcards() - Final result: ${result}`); + return result; +} + +/** + * Replace channel parameters with format strings for publish operations + */ +function replaceChannelParametersWithFormatStrings(channelName, channel) { + logger.debug(`coreProcessor.js: replaceChannelParametersWithFormatStrings() - Processing channel: ${channelName}`); + let result = channelName; + const channelParameters = channel.parameters(); + + if (channelParameters && typeof channelParameters.values === 'function') { + Array.from(channelParameters.values()).forEach(param => { + const paramName = param.id(); + const placeholder = `{${paramName}}`; + const schema = param.schema(); + + // Determine format string based on parameter type + let formatString = '%s'; // Default to string + if (schema) { + const type = schema.type(); + const format = schema.format(); + + if (type === 'integer') { + formatString = '%d'; + } else if (type === 'number') { + formatString = '%f'; + } else if (type === 'boolean') { + formatString = '%b'; + } + // For string and other types, use '%s' + } + + result = result.replace(placeholder, formatString); + logger.debug(`coreProcessor.js: replaceChannelParametersWithFormatStrings() - Replaced ${placeholder} with ${formatString}`); + }); + } + + logger.debug(`coreProcessor.js: replaceChannelParametersWithFormatStrings() - Final result: ${result}`); + return result; +} + +/** + * Process functions to group operations by matching x-scs-function-name and create Function types + */ +function processXScsFunctionNameGrouping(functions, isProvider = false) { + logger.debug('processXScsFunctionNameGrouping: Starting x-scs-function-name grouping'); + + // Group functions by their operation's x-scs-function-name extension + const functionNameGroups = new Map(); + const remainingFunctions = []; + + functions.forEach(func => { + const operation = func.operation; + if (operation && operation.extensions && operation.extensions().get('x-scs-function-name')) { + const customName = operation.extensions().get('x-scs-function-name').value(); + + if (!functionNameGroups.has(customName)) { + functionNameGroups.set(customName, []); + } + functionNameGroups.get(customName).push(func); + logger.debug(`processXScsFunctionNameGrouping: Grouped function ${func.name} under custom name: ${customName}`); + } else { + // Functions without x-scs-function-name remain as-is + remainingFunctions.push(func); + } + }); + + const processedFunctions = [...remainingFunctions]; + + // Process each group to create Function types where appropriate + functionNameGroups.forEach((groupedFunctions, customName) => { + if (groupedFunctions.length === 2) { + // Check if we have exactly one supplier and one consumer + const suppliers = groupedFunctions.filter(f => f.type === 'supplier'); + const consumers = groupedFunctions.filter(f => f.type === 'consumer'); + + if (suppliers.length === 1 && consumers.length === 1) { + // Create a Function type + const supplier = suppliers[0]; + const consumer = consumers[0]; + + // FIX: Handle view-aware input/output mapping for x-scs-function-name + // For x-scs-function-name, we want: subscribe operation = input, publish operation = output + let inputPayload, outputPayload, inputOperation, outputOperation; + + if (isProvider) { + // Provider view: consumer comes from subscribe (input), supplier comes from publish (output) + inputPayload = consumer.subscribePayload; + outputPayload = supplier.publishPayload; + inputOperation = consumer.operation; + outputOperation = supplier.operation; + } else { + // Client view: supplier comes from subscribe (input), consumer comes from publish (output) + inputPayload = supplier.publishPayload; + outputPayload = consumer.subscribePayload; + inputOperation = supplier.operation; + outputOperation = consumer.operation; + } + + const functionSpec = { + name: customName, // Use custom name without suffix + type: 'function', + subscribePayload: inputPayload, + publishPayload: outputPayload, + dynamic: consumer.dynamic || supplier.dynamic, + dynamicType: consumer.dynamicType || supplier.dynamicType, + reactive: consumer.reactive || supplier.reactive, + parametersToHeaders: consumer.parametersToHeaders || supplier.parametersToHeaders, + isSubscriber: false, + isPublisher: false, + hasParams: consumer.hasParams || supplier.hasParams, + parameters: consumer.parameters || supplier.parameters || [], + channelInfo: consumer.channelInfo || supplier.channelInfo, + operation: inputOperation, // Use input operation + messageName: consumer.messageName, + multipleMessageComment: consumer.multipleMessageComment, + // Additional properties for Function type + inputPayload: inputPayload, + outputPayload: outputPayload, + inputOperation: inputOperation, + outputOperation: outputOperation + }; + + processedFunctions.push(functionSpec); + logger.debug(`processXScsFunctionNameGrouping: Created Function type: ${customName} (${inputPayload} -> ${outputPayload}) [view: ${isProvider ? 'provider' : 'client'}]`); + } else { + // Invalid grouping - add functions individually + processedFunctions.push(...groupedFunctions); + logger.warn(`processXScsFunctionNameGrouping: Invalid grouping for ${customName}: ${suppliers.length} suppliers, ${consumers.length} consumers`); + } + } else if (groupedFunctions.length === 1) { + // Single function with custom name - use as-is + processedFunctions.push(groupedFunctions[0]); + logger.debug(`processXScsFunctionNameGrouping: Single function with custom name: ${customName}`); + } else { + // Invalid grouping (more than 2 functions with same name) + processedFunctions.push(...groupedFunctions); + logger.error(`processXScsFunctionNameGrouping: Too many functions (${groupedFunctions.length}) with same x-scs-function-name: ${customName}`); + } + }); + + logger.debug(`processXScsFunctionNameGrouping: Processed ${functions.length} -> ${processedFunctions.length} functions`); + return processedFunctions; +} + +module.exports = { + processAsyncApi, + extractSchemas, + extractFunctions +}; \ No newline at end of file diff --git a/utils/functionUtils.js b/utils/functionUtils.js new file mode 100644 index 00000000..9cd7d207 --- /dev/null +++ b/utils/functionUtils.js @@ -0,0 +1,1039 @@ +const _ = require('lodash'); +const { logger } = require('./logger'); +const { toPascalCase, toCamelCase, getSchemaType, stripPackageName, getEnhancedType } = require('./typeUtils'); + +/** + * Get Java primitive type for AsyncAPI schema type + * Following Nunjucks reference project type mapping logic + */ +function getPrimitiveJavaType(schemaType, payload) { + if (!schemaType) return null; + + // Get format if available + const format = payload && payload.format && typeof payload.format === 'function' + ? payload.format() + : null; + + switch (schemaType.toLowerCase()) { + case 'string': + // Handle string formats (following Nunjucks typeMap) + switch (format) { + case 'date-time': + return 'java.time.OffsetDateTime'; + case 'byte': + case 'binary': + return 'byte[]'; + default: + return 'String'; + } + case 'integer': + // Handle integer formats + switch (format) { + case 'int64': + return 'Long'; + case 'int32': + default: + return 'Integer'; + } + case 'number': + // Handle number formats + switch (format) { + case 'float': + return 'Float'; + case 'double': + return 'Double'; + default: + return 'java.math.BigDecimal'; + } + case 'boolean': + return 'Boolean'; + case 'null': + return 'String'; + default: + return null; // Not a primitive type + } +} + +/** + * Check if operation has multiple messages + */ +function hasMultipleMessages(operation) { + if (!operation || !operation.messages) { + return false; + } + + const messages = operation.messages(); + if (!messages || typeof messages.values !== 'function') { + return false; + } + + const messageArray = Array.from(messages.values()); + return messageArray.length > 1; +} + +/** + * Get the correct payload type for a function + * Extracts type information from operation messages + */ +function getFunctionPayloadType(operation, avroSchemaMap) { + logger.debug('coreProcessor.js: getFunctionPayloadType() - Getting function payload type'); + try { + if (!operation) { + logger.warn('getFunctionPayloadType: operation is null or undefined'); + return 'String'; + } + + const messages = operation.messages(); + if (!messages || typeof messages.values !== 'function') { + logger.debug('coreProcessor.js: getFunctionPayloadType() - No messages or values function'); + return 'String'; + } + + const messageArray = Array.from(messages.values()); + logger.debug(`coreProcessor.js: getFunctionPayloadType() - Found ${messageArray.length} messages`); + if (messageArray.length === 0) { + return 'String'; + } + + // Check for multiple messages (oneOf scenarios) + if (messageArray.length > 1) { + logger.debug(`getFunctionPayloadType: Multiple messages detected (${messageArray.length}), using Message`); + return 'Message'; + } + + // Single message case + const message = messageArray[0]; + + const payload = message.payload(); + logger.debug(`coreProcessor.js: getFunctionPayloadType() - Single message payload:`, payload ? 'exists' : 'null'); + + if (!payload) { + return 'String'; + } + + // Check for Event Name (x-ep-schema-name) + if (payload.extensions && typeof payload.extensions === 'function') { + const extensions = payload.extensions(); + if (extensions) { + const schemaName = extensions.get('x-ep-schema-name'); + if (schemaName && schemaName.value) { + logger.debug(`coreProcessor.js: getFunctionPayloadType() - Schema name from x-ep-schema-name: "${schemaName.value()}"`); + return toPascalCase(schemaName.value()); + } + } + } + + // Check if it's a reference to a schema + if (payload.hasRef && payload.hasRef()) { + const ref = payload.ref(); + logger.debug(`coreProcessor.js: getFunctionPayloadType() - Found ref: "${ref}"`); + if (ref) { + // Extract schema name from reference + const schemaName = ref.split('/').pop(); + logger.debug(`coreProcessor.js: getFunctionPayloadType() - Schema name from ref: "${schemaName}"`); + // Convert to Java class name (PascalCase) + const result = toPascalCase(schemaName); + logger.debug(`coreProcessor.js: getFunctionPayloadType() - toPascalCase result: "${result}"`); + return result; + } + } + + // FIRST: Check for primitive types (following Nunjucks reference pattern) + const schemaType = getSchemaType(payload); + logger.debug(`coreProcessor.js: getFunctionPayloadType() - Schema type: "${schemaType}"`); + + // For primitive types, use Java primitive types directly + if (schemaType && schemaType !== 'object') { + const primitiveType = getPrimitiveJavaType(schemaType, payload); + if (primitiveType) { + logger.debug(`coreProcessor.js: getFunctionPayloadType() - Using primitive type: "${primitiveType}"`); + return primitiveType; + } + } + + // Handle array types properly + if (schemaType === 'array') { + const items = payload.items && typeof payload.items === 'function' ? payload.items() : null; + if (items) { + const itemType = getSchemaType(items); + if (itemType === 'object') { + // Array of objects - check for schema name + let itemSchemaName = null; + if (items.extensions && typeof items.extensions === 'function') { + const extensions = items.extensions(); + if (extensions) { + const schemaId = extensions.get('x-parser-schema-id'); + if (schemaId && schemaId.value) { + itemSchemaName = schemaId.value(); + } + } + } + if (itemSchemaName && !itemSchemaName.startsWith('`; + logger.debug(`coreProcessor.js: getFunctionPayloadType() - Array of objects: "${result}"`); + return result; + } else { + // Anonymous schema or no schema name - use generic type + const result = 'List'; + logger.debug(`coreProcessor.js: getFunctionPayloadType() - Array of anonymous objects: "${result}"`); + return result; + } + } else { + // Array of primitives + const primitiveType = getPrimitiveJavaType(itemType, items); + if (primitiveType) { + const result = `List<${primitiveType}>`; + logger.debug(`coreProcessor.js: getFunctionPayloadType() - Array of primitives: "${result}"`); + return result; + } else { + const result = 'List'; + logger.debug(`coreProcessor.js: getFunctionPayloadType() - Array of unknown type: "${result}"`); + return result; + } + } + } + // Fallback for array without items + return 'List'; + } + + // THEN: Check if it's an object with schema info using AsyncAPI library functions + if (payload.extensions && typeof payload.extensions === 'function') { + const extensions = payload.extensions(); + if (extensions) { + const schemaId = extensions.get('x-parser-schema-id'); + if (schemaId && schemaId.value && !schemaId.value().includes('http')) { + const schemaName = schemaId.value().split('/').pop().replace('.schema.json', ''); + logger.debug(`coreProcessor.js: getFunctionPayloadType() - Schema name from x-parser-schema-id: "${schemaName}"`); + + // Check if it's an anonymous schema + if (schemaName.startsWith(' toPascalCase(segment)).join('')}`; + logger.debug(`functionUtils.js: getFunctionName() - Using channel name for complex channel: ${functionName}`); + } + + // Add suffix based on operation type (only if not using custom name) + if (hasCustomName) { + // Use x-scs-function-name as-is without suffix + return toCamelCase(functionName); + } else { + // Add suffix for generated names + if (isSubscriber) { + return `${toCamelCase(functionName)}Consumer`; + } else { + return `${toCamelCase(functionName)}Supplier`; + } + } +} + +/** + * Get channel info for publisher + */ +function getChannelInfo(params, channelName, channel) { + logger.debug(`functionUtils.js: getChannelInfo() - Getting channel info for: ${channelName}`); + + const channelInfo = { + channelName: channelName, + hasParams: false, + parameters: [], + publishChannel: channelName, + subscribeChannel: channelName, + functionArgList: '', + functionParamList: '' + }; + + // Extract parameters from channel name + const paramMatches = channelName.match(/\{([^}]+)\}/g); + if (paramMatches) { + channelInfo.hasParams = true; + + paramMatches.forEach((match, index) => { + const paramName = match.replace(/[{}]/g, ''); + const paramType = 'String'; // Default to String for path parameters + const sampleArg = getSampleArg({ type: paramType, name: paramName }); + + // Calculate actual position in channel path + const segments = channelName.split('/'); + let actualPosition = -1; + for (let i = 0; i < segments.length; i++) { + if (segments[i] === match) { + actualPosition = i; + break; + } + } + + const parameter = { + name: paramName, + type: paramType, + sampleArg: sampleArg, + position: actualPosition + }; + + channelInfo.parameters.push(parameter); + + // Build function argument and parameter lists + if (index > 0) { + channelInfo.functionArgList += ', '; + channelInfo.functionParamList += ', '; + } + channelInfo.functionArgList += paramName; + channelInfo.functionParamList += `${paramType} ${paramName}`; + logger.debug(`functionUtils.js: getChannelInfo() - Added parameter: ${paramType} ${paramName}`); + logger.debug(`functionUtils.js: getChannelInfo() - Current functionParamList: ${channelInfo.functionParamList}`); + }); + } + + logger.debug(`functionUtils.js: getChannelInfo() - Channel info:`, channelInfo); + return channelInfo; +} + +/** + * Get channel info for consumer + */ +function getChannelInfoForConsumer(params, channelName, channel) { + logger.debug(`functionUtils.js: getChannelInfoForConsumer() - Getting consumer channel info for: ${channelName}`); + + const channelInfo = getChannelInfo(params, channelName, channel); + + // For consumers, convert path parameters to wildcards in subscribe channel + if (channelInfo.hasParams) { + const wildcardChannel = channelName.replace(/\{[^}]+\}/g, '*'); + channelInfo.subscribeChannel = wildcardChannel; + logger.debug(`functionUtils.js: getChannelInfoForConsumer() - Converted subscribe channel to wildcard: ${channelInfo.subscribeChannel}`); + } + + return channelInfo; +} + +/** + * Get subscribe channel name + */ +function getSubscribeChannel(channelInfo) { + logger.debug(`functionUtils.js: getSubscribeChannel() - Getting subscribe channel`); + + return channelInfo.subscribeChannel || channelInfo.channelName; +} + +/** + * Get publish channel name + */ +function getPublishChannel(channelInfo) { + logger.debug(`functionUtils.js: getPublishChannel() - Getting publish channel`); + + return channelInfo.publishChannel || channelInfo.channelName; +} + +/** + * Consolidate supplier functions with same payload type + */ +function consolidateSupplierFunctions(functions) { + logger.debug(`functionUtils.js: consolidateSupplierFunctions() - Consolidating supplier functions`); + + const queueDestinationMap = new Map(); + const consolidatedFunctions = []; + + functions.forEach(func => { + if (func.type === 'supplier' && func.publishChannel) { + // Extract queue destination from publish channel or binding + let queueDestination = func.publishChannel; + + // If it's a queue-based supplier, extract queue name from bindings + if (func.isQueueWithSubscription && func.additionalSubscriptions && func.additionalSubscriptions.length > 0) { + // For queue-based suppliers, use the queue name from the binding + // This should be extracted from the AsyncAPI solace binding queue name + if (func.queueName) { + queueDestination = func.queueName; + } + } + + if (queueDestinationMap.has(queueDestination)) { + // Merge with existing supplier of same queue destination + const existing = queueDestinationMap.get(queueDestination); + logger.debug(`functionUtils.js: consolidateSupplierFunctions() - Merging supplier ${func.name} with existing ${existing.name} for queue destination ${queueDestination}`); + + // Add message name to existing function's message names + if (!existing.messageNames) { + existing.messageNames = [existing.messageName]; + } + if (func.messageName && !existing.messageNames.includes(func.messageName)) { + existing.messageNames.push(func.messageName); + } + + // Set multiple messages flag + existing.multipleMessages = existing.messageNames.length > 1; + existing.setMultipleMessages(true); + + // Update payload to handle multiple message types + existing.setPublishPayload('Message'); + + // Add multiple message comment + const comment = `// The message can be of type: ${existing.messageNames.join(', ')}`; + existing.setMultipleMessageComment(comment); + + logger.debug(`functionUtils.js: consolidateSupplierFunctions() - Consolidated suppliers for ${queueDestination}: ${existing.messageNames.join(', ')}`); + // DO NOT add the current function to consolidatedFunctions - it's already merged with existing + } else { + // First supplier of this queue destination + queueDestinationMap.set(queueDestination, func); + if (func.messageName) { + func.messageNames = [func.messageName]; + } + consolidatedFunctions.push(func); + } + } else { + consolidatedFunctions.push(func); + } + }); + + logger.debug(`functionUtils.js: consolidateSupplierFunctions() - Consolidated ${functions.length} functions to ${consolidatedFunctions.length}`); + return consolidatedFunctions; +} + +/** + * Consolidate queue functions (for Solace) + */ +function consolidateQueueFunctions(functions) { + logger.debug(`functionUtils.js: consolidateQueueFunctions() - Consolidating queue functions`); + + // First consolidate suppliers by queue destination + let consolidatedFunctions = consolidateSupplierFunctions(functions); + + // Then consolidate consumers by payload type + consolidatedFunctions = consolidateConsumerFunctions(consolidatedFunctions); + + const queueMap = new Map(); + const finalConsolidatedFunctions = []; + + consolidatedFunctions.forEach(func => { + if (func.isQueueWithSubscription && func.additionalSubscriptions) { + const queueKey = func.name; + + if (queueMap.has(queueKey)) { + // Merge subscriptions + const existing = queueMap.get(queueKey); + func.additionalSubscriptions.forEach(sub => { + if (!existing.additionalSubscriptions.includes(sub)) { + existing.additionalSubscriptions.push(sub); + } + }); + existing.multipleMessages = existing.additionalSubscriptions.length > 1; + } else { + queueMap.set(queueKey, func); + finalConsolidatedFunctions.push(func); + } + } else { + finalConsolidatedFunctions.push(func); + } + }); + + logger.debug(`functionUtils.js: consolidateQueueFunctions() - Final consolidation: ${functions.length} functions to ${finalConsolidatedFunctions.length}`); + return finalConsolidatedFunctions; +} + +/** + * Sort parameters using channel name + */ +function sortParametersUsingChannelName(parameters, channelName) { + logger.debug(`functionUtils.js: sortParametersUsingChannelName() - Sorting parameters for channel: ${channelName}`); + + if (!parameters || parameters.length === 0) { + return parameters; + } + + // Extract parameter names from channel name in order + const paramMatches = channelName.match(/\{([^}]+)\}/g); + if (!paramMatches) { + return parameters; + } + + const paramOrder = paramMatches.map(match => match.replace(/[{}]/g, '')); + + // Sort parameters based on their order in the channel name + return parameters.sort((a, b) => { + const aIndex = paramOrder.indexOf(a.name); + const bIndex = paramOrder.indexOf(b.name); + + if (aIndex === -1 && bIndex === -1) return 0; + if (aIndex === -1) return 1; + if (bIndex === -1) return -1; + + return aIndex - bIndex; + }); +} + +/** + * Get message name from operation + */ +function getMessageName(operation) { + logger.debug(`functionUtils.js: getMessageName() - Getting message name from operation`); + + if (!operation) { + logger.warn('getMessageName: operation is null or undefined'); + return 'Object'; + } + + try { + const messages = operation.messages(); + if (!messages || typeof messages.values !== 'function') { + return 'Object'; + } + + const messageArray = Array.from(messages.values()); + if (messageArray.length === 0) { + return 'Object'; + } + + // For multiple messages (oneOf, anyOf, allOf), return the first schema name + if (messageArray.length > 1) { + logger.debug(`functionUtils.js: getMessageName() - Multiple messages found: ${messageArray.length}`); + // Get the first message and extract its schema name + const firstMessage = messageArray[0]; + const schemaName = extractSchemaNameFromMessage(firstMessage); + if (schemaName) { + logger.debug(`functionUtils.js: getMessageName() - Using first schema name: ${schemaName}`); + return schemaName; + } + } + + // For single message, extract schema name + const message = messageArray[0]; + const schemaName = extractSchemaNameFromMessage(message); + if (schemaName) { + logger.debug(`functionUtils.js: getMessageName() - Extracted schema name: ${schemaName}`); + return schemaName; + } + + logger.warn('getMessageName: Could not extract schema name, using fallback'); + return 'Object'; + } catch (error) { + logger.warn(`getMessageName: Error getting message name: ${error.message}`); + return 'Object'; + } +} + +/** + * Extract schema name from message + */ +function extractSchemaNameFromMessage(message) { + logger.debug(`functionUtils.js: extractSchemaNameFromMessage() - Extracting schema name from message`); + try { + // Helper function to extract name from ref + const extractNameFromRef = (ref) => { + if (!ref) return null; + const refParts = ref.split('/'); + return refParts.length > 0 ? refParts[refParts.length - 1] : null; + }; + + // Helper function to get message property safely + const getMessageProperty = (message, propName) => { + if (message[propName] && typeof message[propName] === 'function') { + return message[propName](); + } + return null; + }; + + const messageName = message.extensions && message.extensions().get('x-parser-message-name')?.value(); + if (messageName) { + logger.debug(`functionUtils.js: extractSchemaNameFromMessage() - Extracted from message extensions: ${messageName}`); + return messageName; + } + + // 1. Try message $ref first + const messageRef = getMessageProperty(message, 'ref'); + if (messageRef) { + const messageName = extractNameFromRef(messageRef); + if (messageName && messageName.endsWith('Message')) { + const schemaName = messageName.replace('Message', ''); + logger.debug(`functionUtils.js: extractSchemaNameFromMessage() - Extracted from message ref: ${schemaName}`); + return schemaName; + } + } + + // 2. Try payload $ref + const payload = message.payload && typeof message.payload === 'function' ? message.payload() : message.payload; + if (payload) { + const payloadRef = getMessageProperty(payload, 'ref'); + if (payloadRef) { + const schemaName = extractNameFromRef(payloadRef); + if (schemaName) { + logger.debug(`functionUtils.js: extractSchemaNameFromMessage() - Extracted from payload ref: ${schemaName}`); + return schemaName; + } + } + + // 3. Try payload extensions + if (payload.extensions) { + const extensions = payload.extensions(); + const schemaId = extensions.get('x-parser-schema-id')?.value(); + if (schemaId && !schemaId.includes('://')) { + logger.debug(`functionUtils.js: extractSchemaNameFromMessage() - Extracted from extensions: ${schemaId}`); + return schemaId; + } + } + } + + // 4. Fallback to message properties + const fallbackNames = ['name', 'id']; + for (const propName of fallbackNames) { + const value = getMessageProperty(message, propName); + if (value) { + logger.debug(`functionUtils.js: extractSchemaNameFromMessage() - Fallback to message.${propName}(): ${value}`); + return value; + } + } + + logger.debug(`functionUtils.js: extractSchemaNameFromMessage() - Could not extract schema name`); + return null; + } catch (error) { + logger.warn(`extractSchemaNameFromMessage: Error extracting schema name: ${error.message}`); + return null; + } +} + +/** + * Get send function name based on message name, schema name, or channel name + */ +function getSendFunctionName(channelName, operation) { + logger.debug(`functionUtils.js: getSendFunctionName() - Getting send function name for channel: ${channelName}`); + + // Try to get message name/id from the operation + let messageName = null; + if (operation && typeof operation.messages === 'function') { + const messages = operation.messages(); + if (messages && messages.length > 0) { + const message = messages[0]; + if (message && message.extensions && typeof message.extensions === 'function') { + const extensions = message.extensions(); + messageName = extensions.get('x-parser-message-name')?.value(); + logger.debug(`functionUtils.js: getSendFunctionName() - Message name from extensions: ${messageName}`); + } + } + } + + if (messageName) { + // Handle anonymous message names (e.g., ) + if (messageName.startsWith('<') && messageName.endsWith('>')) { + // For anonymous messages, try to get schema name from payload instead + logger.debug(`functionUtils.js: getSendFunctionName() - Anonymous message name detected: ${messageName}, trying payload schema`); + // Continue to the next fallback method + } else { + // Convert message name to PascalCase for function name + const functionName = messageName.replace(/(^|_|\-|\s)(\w)/g, (_, __, c) => c ? c.toUpperCase() : '') + .replace(/^[a-z]/, c => c.toUpperCase()); + return `send${functionName}`; + } + } + + // Try to get message name using getMessageName function (fallback) + messageName = getMessageName(operation); + logger.debug(`functionUtils.js: getSendFunctionName() - Message name from getMessageName: ${messageName}`); + + if (messageName && messageName !== 'Object') { + // Convert message name to PascalCase for function name + const functionName = messageName.replace(/(^|_|\-|\s)(\w)/g, (_, __, c) => c ? c.toUpperCase() : '') + .replace(/^[a-z]/, c => c.toUpperCase()); + return `send${functionName}`; + } + + // Try to get schema name from payload + let schemaName = null; + if (operation && typeof operation.messages === 'function') { + const messages = operation.messages(); + if (messages && messages.length > 0) { + const message = messages[0]; + if (message && message.payload) { + const payload = typeof message.payload === 'function' ? message.payload() : message.payload; + if (payload && payload.extensions && typeof payload.extensions === 'function') { + const extensions = payload.extensions(); + schemaName = extensions.get('x-parser-schema-id')?.value(); + } + if (!schemaName && payload && payload.ref && typeof payload.ref === 'function') { + const payloadRef = payload.ref(); + if (payloadRef) { + const refParts = payloadRef.split('/'); + if (refParts.length > 0) { + schemaName = refParts[refParts.length - 1]; + } + } + } + } + } + } + logger.debug(`functionUtils.js: getSendFunctionName() - Schema name: ${schemaName}`); + if (schemaName) { + const functionName = schemaName.replace(/(^|_|\-|\s)(\w)/g, (_, __, c) => c ? c.toUpperCase() : '') + .replace(/^[a-z]/, c => c.toUpperCase()); + return `send${functionName}`; + } + + // Fallback: use channel name + const fallbackName = channelName.replace(/[^a-zA-Z0-9]/g, ' ') + .replace(/(^|_|\-|\s)(\w)/g, (_, __, c) => c ? c.toUpperCase() : '') + .replace(/^[a-z]/, c => c.toUpperCase()); + return `send${fallbackName}`; +} + +/** + * Get payload class for operation + */ +function getPayloadClass(pubOrSub, processedSchemas = []) { + logger.debug(`functionUtils.js: getPayloadClass() - Getting payload class for operation`); + + let ret; + + // Check for multiple messages using both methods + if (hasMultipleMessages(pubOrSub) || (pubOrSub.hasMultipleMessages && pubOrSub.hasMultipleMessages())) { + ret = 'Message'; + } else { + const messages = pubOrSub.messages(); + if (messages && messages.length > 0) { + const message = messages[0]; + if (message) { + ret = getMessagePayloadType(message, processedSchemas); + } + } + } + + logger.debug(`functionUtils.js: getPayloadClass() - Result: ${ret}`); + return ret; +} + +// getMessagePayloadType function moved to functionUtils.js - use that instead + +/** + * Get multiple message comment + */ +function getMultipleMessageComment(pubOrSub) { + logger.debug(`functionUtils.js: getMultipleMessageComment() - Getting comment for operation`); + + let ret = ''; + + // We deliberately leave out the last newline, because that makes it easier to use in the template. + // Otherwise it's really hard to get rid of an extra unwanted newline. + const messages = pubOrSub.messages(); + if (messages && typeof messages.values === 'function' && Array.from(messages.values()).length > 1) { + ret = '// The message can be of type:'; + if (messages) { + messages.forEach(m => { + ret += '\n\t// '; + ret += getMessagePayloadType(m); + }); + } + } + + logger.debug(`functionUtils.js: getMultipleMessageComment() - Generated comment: ${ret}`); + return ret; +} + +/** + * Consolidate consumer functions with same payload type + */ +function consolidateConsumerFunctions(functions) { + logger.debug(`functionUtils.js: consolidateConsumerFunctions() - Consolidating consumer functions`); + + const payloadTypeMap = new Map(); + const queueMap = new Map(); // New map for queue-based consolidation + const consolidatedFunctions = []; + + functions.forEach(func => { + if (func.type === 'consumer' && func.subscribePayload) { + logger.debug(`functionUtils.js: consolidateConsumerFunctions() - Processing consumer: ${func.name}, isQueueWithSubscription=${func.isQueueWithSubscription}, queueName=${func.queueName}, payload=${func.subscribePayload}`); + + // For queue-based consumers, consolidate by queue name instead of payload type + if (func.isQueueWithSubscription && func.queueName) { + const queueKey = func.queueName; + + if (queueMap.has(queueKey)) { + // Found existing consumer with same queue - merge them + const existing = queueMap.get(queueKey); + logger.debug(`functionUtils.js: consolidateConsumerFunctions() - Merging queue-based consumer ${func.name} with existing ${existing.name} for queue ${queueKey}`); + + // Add message name to existing function's message names + if (!existing.messageNames) { + existing.messageNames = [existing.messageName]; + } + if (func.messageName && !existing.messageNames.includes(func.messageName)) { + existing.messageNames.push(func.messageName); + } + + // Set multiple messages flag and use Message for queue-based consumers with multiple message types + if (existing.messageNames.length > 1) { + existing.multipleMessages = true; + existing.subscribePayload = 'Message'; + + // Add multiple message comment + const comment = `// The message can be of type: ${existing.messageNames.join(', ')}`; + existing.multipleMessageComment = comment; + } + + logger.debug(`functionUtils.js: consolidateConsumerFunctions() - Consolidated queue-based consumers for ${queueKey}: ${existing.messageNames ? existing.messageNames.join(', ') : 'unknown'}`); + } else { + // First consumer of this queue + queueMap.set(queueKey, func); + consolidatedFunctions.push(func); + } + } else { + // For non-queue consumers, keep them separate (no consolidation) + logger.debug(`functionUtils.js: consolidateConsumerFunctions() - Keeping non-queue consumer separate: ${func.name}`); + consolidatedFunctions.push(func); + } + } else { + // Non-consumer functions or consumers without payload type + consolidatedFunctions.push(func); + } + }); + + logger.debug(`functionUtils.js: consolidateConsumerFunctions() - Consolidated ${functions.length} functions to ${consolidatedFunctions.length}`); + return consolidatedFunctions; +} + + +/** + * Get sample argument for parameter (matching reference project) + */ +function getSampleArg(param) { + logger.debug(`functionUtils.js: getSampleArg() - Getting sample for parameter: ${param.name}`); + + if (!param || !param.type) { + return 'null'; + } + + const type = param.type; + const format = param.format; + + if (type === 'string') { + if (format === 'date') { + return '2000-12-31'; + } else if (format === 'date-time') { + return '2000-12-31T23:59:59+01:00'; + } else if (format === 'byte') { + return 'U3dhZ2dlciByb2Nrcw=='; + } else if (format === 'binary') { + return 'base64-encoded file contents'; + } else { + return '"string"'; + } + } else if (type === 'integer') { + if (format === 'int64') { + return '1L'; + } else { + return '1'; + } + } else if (type === 'number') { + if (format === 'float') { + return '1.1F'; + } else if (format === 'double') { + return '1.1'; + } else { + return '100.1'; + } + } else if (type === 'boolean') { + return 'true'; + } else if (type === 'null') { + return 'null'; + } + + return 'null'; +} + +// getMultipleMessageComment function moved to functionUtils.js - use that instead + +/** + * Get message payload type (matching reference project) + */ +function getMessagePayloadType(message) { + logger.debug(`functionUtils.js: getMessagePayloadType() - Getting payload type for message`); + + let ret; + const payload = message.payload(); + + if (payload) { + const type = payload.type(); + + if (!type || type === 'object') { + // First try to get schema ID from extensions + ret = payload.extensions && payload.extensions().get('x-parser-schema-id')?.value(); + + // If not found, try to get from $ref + if (!ret && payload.ref && typeof payload.ref === 'function') { + const ref = payload.ref(); + if (ref) { + // Extract schema name from $ref path like "#/components/schemas/Transaction" + const refParts = ref.split('/'); + if (refParts.length > 0) { + ret = refParts[refParts.length - 1]; + } + } + } + + if (ret) { + const { className } = stripPackageName(ret); + ret = _.upperFirst(_.camelCase(className)); + } + } else { + const typeInfo = getEnhancedType(type, payload.format ? payload.format() : undefined); + ret = typeInfo.javaType; + } + } + + logger.debug(`functionUtils.js: getMessagePayloadType() - Result: ${ret}`); + return ret || 'Object'; +} + + + +module.exports = { + hasMultipleMessages, + getFunctionPayloadType, + getFunctionName, + getChannelInfo, + getChannelInfoForConsumer, + getSubscribeChannel, + getPublishChannel, + consolidateSupplierFunctions, + consolidateQueueFunctions, + sortParametersUsingChannelName, + getMessageName, + extractSchemaNameFromMessage, + getSendFunctionName, + getPayloadClass, + getMessagePayloadType, + getMultipleMessageComment, + consolidateConsumerFunctions, + getSampleArg +}; diff --git a/utils/jsonProcessor/index.js b/utils/jsonProcessor/index.js new file mode 100644 index 00000000..2196efe1 --- /dev/null +++ b/utils/jsonProcessor/index.js @@ -0,0 +1,1015 @@ +const { logger } = require('../logger'); +const { SchemaModel } = require('./jsonSchemaModel'); +const { + getEnhancedType, + checkPropertyNames, + getIdentifierName, + fixType +} = require('../typeUtils'); +const { + stripPackageName, + getSampleArg, + getMultipleMessageComment, + getMessagePayloadType, + getPayloadClass +} = require('../functionUtils'); + + +// Initialize schema model instance +const schemaModel = new SchemaModel(); + +/** + * Enhanced type mapping for Java types (matching reference project) + */ +const stringMap = new Map(); +stringMap.set('date', {javaType: 'java.time.LocalDate', printFormat: '%s', sample: '2000-12-31'}); +stringMap.set('date-time', {javaType: 'java.time.OffsetDateTime', printFormat: '%s', sample: '2000-12-31T23:59:59+01:00'}); +stringMap.set('byte', {javaType: 'byte[]', printFormat: '%s', sample: 'U3dhZ2dlciByb2Nrcw=='}); +stringMap.set('binary', {javaType: 'byte[]', printFormat: '%s', sample: 'base64-encoded file contents'}); +stringMap.set(undefined, {javaType: 'String', printFormat: '%s', sample: '"string"'}); + +const integerMap = new Map(); +integerMap.set('int32', {javaType: 'Integer', printFormat: '%d', sample: '1'}); +integerMap.set('int64', {javaType: 'Long', printFormat: '%d', sample: '1L'}); +integerMap.set(undefined, {javaType: 'Integer', printFormat: '%d', sample: '1'}); + +const numberMap = new Map(); +numberMap.set('float', {javaType: 'Float', printFormat: '%f', sample: '1.1F'}); +numberMap.set('double', {javaType: 'Double', printFormat: '%f', sample: '1.1'}); +numberMap.set(undefined, {javaType: 'java.math.BigDecimal', printFormat: '%s', sample: '100.1'}); + +const booleanMap = new Map(); +booleanMap.set(undefined, {javaType: 'Boolean', printFormat: '%s', sample: 'true'}); + +const nullMap = new Map(); +nullMap.set(undefined, {javaType: 'String', printFormat: '%s', sample: 'null'}); + +const typeMap = new Map(); +typeMap.set('boolean', booleanMap); +typeMap.set('integer', integerMap); +typeMap.set('null', nullMap); +typeMap.set('number', numberMap); +typeMap.set('string', stringMap); + +/** + * Map schema ID to component name for inline schemas + * This handles cases like http://example.com/root.json -> RideReceipt + */ +function mapSchemaIdToComponentName(schemaId, asyncapi) { + logger.debug(`πŸ” DEBUG: mapSchemaIdToComponentName called with schemaId: ${schemaId}`); + + if (!schemaId || !schemaId.startsWith('http://')) { + logger.debug(`❌ DEBUG: schemaId ${schemaId} is not a valid URI ID`); + return null; + } + + // Check if this URI ID matches any component schema + // The AsyncAPI library sometimes returns numeric keys instead of component names + // So we need to access the original component names from the _json structure + const componentsSchemas = asyncapi.components().schemas(); + logger.debug(`πŸ” DEBUG: componentsSchemas type: ${typeof componentsSchemas}, forEach: ${typeof componentsSchemas?.forEach}`); + + if (componentsSchemas) { + if (typeof componentsSchemas.forEach === 'function') { + let foundComponentName = null; + componentsSchemas.forEach((schema, componentName) => { + // Check if this component schema has the same URI ID + const schemaJsonId = schema._json && schema._json.$id; + logger.debug(`πŸ” DEBUG: Component ${componentName} has $id: ${schemaJsonId}`); + if (schemaJsonId === schemaId) { + foundComponentName = componentName; + logger.debug(`βœ… DEBUG: Found match! ${schemaId} -> ${componentName}`); + } + }); + if (foundComponentName) { + logger.debug(`jsonProcessor: Mapped schema ID ${schemaId} to component name ${foundComponentName}`); + return foundComponentName; + } + } + } + + // If the library returned numeric keys, try to get the actual component names from _json + if (asyncapi._json && asyncapi._json.components && asyncapi._json.components.schemas) { + logger.debug(`πŸ” DEBUG: Trying to find component name from _json structure`); + let foundComponentName = null; + Object.keys(asyncapi._json.components.schemas).forEach(componentName => { + const schema = asyncapi._json.components.schemas[componentName]; + const schemaJsonId = schema.$id; + logger.debug(`πŸ” DEBUG: Component ${componentName} has $id: ${schemaJsonId}`); + if (schemaJsonId === schemaId) { + logger.debug(`βœ… DEBUG: Found match in _json! ${schemaId} -> ${componentName}`); + foundComponentName = componentName; + } + }); + if (foundComponentName) { + logger.debug(`jsonProcessor: Mapped schema ID ${schemaId} to component name ${foundComponentName}`); + return foundComponentName; + } + } + + logger.debug(`❌ DEBUG: No mapping found for schema ID ${schemaId}`); + return null; +} + +function isBasicTypeSchema(schema, schemaName) { + // Check if schema is a basic primitive type + const schemaType = schema.type ? schema.type() : null; + const schemaJson = schema._json || {}; + + // 0. Check for inheritance schemas (allOf, anyOf, oneOf) - these are NOT basic types + if (schemaJson.allOf || schemaJson.anyOf || schemaJson.oneOf) { + logger.debug(`[isBasicTypeSchema] ${schemaName}: Inheritance schema (allOf/anyOf/oneOf) - NOT basic type`); + return false; + } + + // 0.5. ENHANCED: Filter out anonymous schemas that are not referenced + const schemaId = schema.id && typeof schema.id === 'function' ? schema.id() : null; + const isAnonymousSchema = schemaId && schemaId.startsWith(' 0; + + if (!hasComplexProperties) { + logger.debug(`[isBasicTypeSchema] ${schemaName}: Basic primitive type (${schemaType})`); + return true; + } + } + + // 2. Check for simple string types with only basic attributes + if (schemaType === 'string') { + const hasOnlyBasicAttributes = !schemaJson.properties || Object.keys(schemaJson.properties).length === 0; + const hasOnlyStringAttributes = schemaJson.properties && + Object.values(schemaJson.properties).every(prop => + prop.type === 'string' || prop.type === 'number' || prop.type === 'integer' || prop.type === 'boolean' + ); + + if (hasOnlyBasicAttributes || hasOnlyStringAttributes) { + logger.debug(`[isBasicTypeSchema] ${schemaName}: Simple string type with basic attributes`); + return true; + } + } + + // 3. Check for schemas that are just aliases or simple types + const hasComplexStructure = schemaJson.properties && Object.keys(schemaJson.properties).length > 0; + const hasRequiredFields = schemaJson.required && schemaJson.required.length > 0; + const hasComplexNestedTypes = schemaJson.properties && + Object.values(schemaJson.properties).some(prop => + prop.type === 'object' || prop.type === 'array' || (prop.$ref && prop.$ref.includes('#')) + ); + + // If it's a simple type with no complex structure, it's basic + if (!hasComplexStructure && !hasRequiredFields && !hasComplexNestedTypes) { + logger.debug(`[isBasicTypeSchema] ${schemaName}: Simple type with no complex structure`); + return true; + } + + return false; +} + +/** + * Enhanced schema collection that includes inline schemas from channel operations + */ +function collectAllSchemas(asyncapi) { + logger.debug('jsonProcessor: collectAllSchemas() - Starting schema collection'); + // --- BEGIN: schema-extractor.js methodology --- + const allSchemas = new Map(); + const schemaMetadata = new Map(); // Track metadata for filtering + + // 1. Collect from components.schemas (prefer these names) + const componentsSchemas = asyncapi.components().schemas(); + logger.debug(`jsonProcessor: collectAllSchemas() - components.schemas() returned ${componentsSchemas ? 'object' : 'null'}`); + if (componentsSchemas && typeof componentsSchemas.forEach === 'function') { + componentsSchemas.forEach((schema, componentName) => { + logger.debug(`jsonProcessor: collectAllSchemas() - Processing component schema: ${componentName}`); + // The AsyncAPI library sometimes returns numeric keys instead of original component names + // We need to map them back to the original names using the _json structure + let originalComponentName = componentName; + const schemaId = schema.id && typeof schema.id === 'function' ? schema.id() : null; + + if (asyncapi._json && asyncapi._json.components && asyncapi._json.components.schemas) { + // FIXED: Prioritize x-ep-schema-name first, then fall back to ID-based mapping + const schemaNameFromExtensions = schema.extensions().get('x-ep-schema-name')?.value(); + + if (schemaNameFromExtensions) { + // If we have x-ep-schema-name, use it directly + originalComponentName = schemaNameFromExtensions; + logger.debug(`jsonProcessor: collectAllSchemas() - Using x-ep-schema-name: ${originalComponentName}`); + } else { + // Fall back to ID-based mapping for backward compatibility + Object.keys(asyncapi._json.components.schemas).forEach(jsonKey => { + const jsonSchema = asyncapi._json.components.schemas[jsonKey]; + if (jsonSchema.$id === schemaId || jsonSchema['x-parser-schema-id'] === schemaId) { + originalComponentName = jsonKey; + logger.debug(`jsonProcessor: collectAllSchemas() - Mapped ${componentName} to ${originalComponentName} via ID`); + } + }); + } + } + + // Skip basic type schemas + if (isBasicTypeSchema(schema, originalComponentName)) { + logger.debug(`[collectAllSchemas] Skipping basic type schema: ${originalComponentName}`); + return; + } + + allSchemas.set(originalComponentName, schema); + // Mark as standalone schema from components + schemaMetadata.set(originalComponentName, { + source: 'components.schemas', + name: originalComponentName, + isNested: false, + isStandalone: true, + isBasicType: false, + pointer: null + }); + logger.debug(`jsonProcessor: collectAllSchemas() - Added component schema: ${originalComponentName}`); + }); + } + + // 2. Collect from allSchemas().all() (may have numeric keys, $id URIs) + const allSchemasResult = asyncapi.allSchemas().all(); + if (allSchemasResult) { + allSchemasResult.forEach((schema, schemaKey) => { + let schemaName; + const schemaId = schema.id && typeof schema.id === 'function' ? schema.id() : null; + + logger.debug(`[collectAllSchemas] allSchemas().all() - Processing schemaKey: ${schemaKey}, schemaId: ${schemaId}`); + + if (typeof schemaKey === 'string') { + schemaName = schemaKey; + } else { + // FIXED: Prioritize x-ep-schema-name first for numeric keys + const schemaNameFromExtensions = schema.extensions().get('x-ep-schema-name')?.value(); + + if (schemaNameFromExtensions) { + // If we have x-ep-schema-name, use it directly + schemaName = schemaNameFromExtensions; + logger.debug(`[collectAllSchemas] Using x-ep-schema-name for numeric key ${schemaKey}: ${schemaName}`); + } else { + // Fall back to ID-based mapping for backward compatibility + if (asyncapi._json && asyncapi._json.components && asyncapi._json.components.schemas) { + Object.keys(asyncapi._json.components.schemas).forEach(jsonKey => { + const jsonSchema = asyncapi._json.components.schemas[jsonKey]; + if (jsonSchema.$id === schemaId) { + schemaName = jsonKey; + logger.debug(`[collectAllSchemas] Mapped numeric key ${schemaKey} to component name: ${schemaName} via $id`); + } + }); + } + + // Final fallback to extensions or ID if no mapping found + if (!schemaName) { + schemaName = schema.extensions().get('x-parser-schema-id')?.value() || schemaId; + logger.debug(`[collectAllSchemas] Using final fallback for numeric key ${schemaKey}: ${schemaName}`); + } + } + } + + // Map $id URI to component name if possible + const schemaJsonId = schema._json && schema._json.$id; + if (schemaJsonId && schemaJsonId.startsWith('http://')) { + // Try to map to a component name + if (asyncapi._json && asyncapi._json.components && asyncapi._json.components.schemas) { + for (const [compName, compSchema] of Object.entries(asyncapi._json.components.schemas)) { + if (compSchema.$id === schemaJsonId) { + schemaName = compName; + break; + } + } + } + } + + if (schemaName && !allSchemas.has(schemaName)) { + // Skip basic type schemas + if (isBasicTypeSchema(schema, schemaName)) { + logger.debug(`[collectAllSchemas] Skipping basic type schema: ${schemaName}`); + return; + } + + // Skip schemas with numeric names (0, 1) as they are duplicates of component schemas + if (typeof schemaName === 'string' && /^\d+$/.test(schemaName)) { + logger.debug(`[collectAllSchemas] Skipping numeric schema name: ${schemaName} (duplicate of component schema)`); + return; + } + + // ENHANCED: Skip anonymous schemas that are not referenced in message payloads + const isAnonymousSchema = schemaId && schemaId.startsWith(' { + const operations = channel.operations && typeof channel.operations === 'function' + ? Array.from(channel.operations().values()) + : []; + operations.forEach(operation => { + const messages = operation.messages && typeof operation.messages === 'function' + ? Array.from(operation.messages().values()) + : []; + messages.forEach(message => { + const payload = message.payload(); + if (payload && payload._json && payload._json.$id) { + let inlineName = null; + // Try to map $id to component name + if (asyncapi._json && asyncapi._json.components && asyncapi._json.components.schemas) { + for (const [compName, compSchema] of Object.entries(asyncapi._json.components.schemas)) { + if (compSchema.$id === payload._json.$id) { + inlineName = compName; + break; + } + } + } + if (!inlineName) { + inlineName = payload._json.title || payload._json.$id; + } + if (inlineName && !allSchemas.has(inlineName)) { + // Skip basic type schemas + if (isBasicTypeSchema(payload, inlineName)) { + logger.debug(`[collectAllSchemas] Skipping basic type schema: ${inlineName}`); + return; + } + + // Get schema pointer to determine if nested + const meta = payload.meta(); + const pointer = meta ? meta.pointer : null; + const isNested = pointer && pointer.includes('/properties/'); + + allSchemas.set(inlineName, payload); + schemaMetadata.set(inlineName, { + source: 'inline', + isNested: isNested, + isStandalone: !isNested, + isBasicType: false, + pointer: pointer + }); + } + } + }); + }); + }); + } + + // 4. Filter out nested schemas (but keep component schemas) + const filteredSchemas = new Map(); + const filteredMetadata = new Map(); + + allSchemas.forEach((schema, schemaName) => { + const metadata = schemaMetadata.get(schemaName); + + // Always keep component schemas, even if they're also found as nested + if (metadata && metadata.source === 'components.schemas') { + filteredSchemas.set(schemaName, schema); + filteredMetadata.set(schemaName, metadata); + logger.debug(`[collectAllSchemas] Keeping component schema: ${schemaName} (${metadata.pointer})`); + } else if (metadata && !metadata.isNested) { + filteredSchemas.set(schemaName, schema); + filteredMetadata.set(schemaName, metadata); + } else if (metadata && metadata.isNested) { + logger.debug(`[collectAllSchemas] Filtering out nested schema: ${schemaName} (${metadata.pointer})`); + } + }); + + // 5. Log summary + logger.debug(`[collectAllSchemas] Schema collection summary:`); + logger.debug(` β€’ Total schemas found: ${allSchemas.size}`); + logger.debug(` β€’ Basic type schemas filtered: ${allSchemas.size - filteredSchemas.size}`); + logger.debug(` β€’ Schemas for generation: ${filteredSchemas.size}`); + + filteredSchemas.forEach((schema, schemaName) => { + const metadata = filteredMetadata.get(schemaName); + logger.debug(` β€’ ${schemaName} (${metadata.source})`); + }); + + return filteredSchemas; +} + +/** + * Detect if AsyncAPI document contains JSON schemas + */ +function detectJsonSchemas(asyncapi) { + logger.debug('jsonProcessor.js: detectJsonSchemas() - Detecting JSON schemas'); + const componentsSchemas = asyncapi.components().schemas(); + return componentsSchemas && + ((typeof componentsSchemas.size === 'number' && componentsSchemas.size > 0) || + (typeof componentsSchemas === 'object' && Object.keys(componentsSchemas).length > 0)); +} + +/** + * Process JSON schemas from components.schemas using new schema model + */ +function processJsonSchemas(asyncapi, avroSchemaNames = new Set(), avroClassNames = new Set()) { + logger.debug('jsonProcessor.js: processJsonSchemas() - Processing JSON schemas with new schema model'); + + // Initialize schema model with AsyncAPI document + const schemaModel = new SchemaModel(asyncapi, avroSchemaNames); + schemaModel.setupSuperClassMap(asyncapi); + schemaModel.setupModelClassMap(asyncapi); + + const schemas = []; + + // Use enhanced schema collection + logger.debug('πŸ” DEBUG: About to call collectAllSchemas'); + let allSchemas; + try { + allSchemas = collectAllSchemas(asyncapi); + logger.debug(`πŸ” DEBUG: collectAllSchemas returned ${allSchemas ? allSchemas.size : 'null'} schemas`); + } catch (error) { + logger.debug(`πŸ” DEBUG: collectAllSchemas threw error: ${error.message}`); + logger.debug(`πŸ” DEBUG: Error stack: ${error.stack}`); + allSchemas = new Map(); + } + if (!allSchemas || allSchemas.size === 0) { + return schemas; + } + + // Remove channel parameter filtering logic + + // First pass: collect all schemas and their relationships + const schemaMap = new Map(); + const parentChildMap = new Map(); + + allSchemas.forEach((schema, schemaName) => { + logger.debug(`jsonProcessor: Processing schema - key: ${schemaName}, type: ${typeof schemaName}`); + + // Skip if this schema is already processed as an Avro schema + if (avroSchemaNames.has(schemaName)) { + logger.debug(`Skipping schema ${schemaName} as it's already processed as an Avro schema`); + return; + } + + // Skip if this schema's class name is already processed as an Avro schema + const className = schemaName.split('/').pop().replace('.schema.json', ''); + if (avroClassNames.has(className)) { + logger.debug(`Skipping schema ${schemaName} as its class name ${className} is already processed as an Avro schema`); + return; + } + + schemaMap.set(schemaName, { schema, schemaName: schemaName }); + logger.debug(`jsonProcessor: Added schema to map: ${schemaName}`); + + // Check for inheritance relationships + if (schema._json && schema._json.allOf && Array.isArray(schema._json.allOf) && schema._json.allOf.length >= 2) { + const parentSchema = schema._json.allOf[0]; + const parentName = parentSchema['x-parser-schema-id']; + if (parentName && parentName !== '') { + parentChildMap.set(schemaName, parentName); + } + } + }); + + // Second pass: process schemas ensuring parents come before children + const processedSchemas = new Set(); + + function processSchema(name) { + if (processedSchemas.has(name)) { + return; + } + + const schemaInfo = schemaMap.get(name); + if (!schemaInfo) { + return; + } + + const { schema, schemaName } = schemaInfo; + + // Process parent first if it exists + const parentName = parentChildMap.get(name); + if (parentName && !processedSchemas.has(parentName)) { + processSchema(parentName); + } + + // Get model class from schema model + const modelClass = schemaModel.getModelClass({ schema, schemaName }); + if (!modelClass) { + logger.warn(`No model class found for schema: ${name}`); + processedSchemas.add(name); + return; + } + + // Handle allOf inheritance by merging properties from all schemas + const mergedProperties = []; + const mergedRequired = []; + + // Check if this schema has allOf inheritance + // Debug: Log schema structure to understand why allOf isn't detected + logger.debug(`jsonProcessor: Checking allOf for schema ${name}`); + logger.debug(`jsonProcessor: schema keys: ${Object.keys(schema)}`); + logger.debug(`jsonProcessor: schema._json exists: ${!!schema._json}`); + if (schema._json) { + logger.debug(`jsonProcessor: schema._json keys: ${Object.keys(schema._json)}`); + logger.debug(`jsonProcessor: schema._json.allOf exists: ${!!schema._json.allOf}`); + } + + if (schema._json && schema._json.allOf && Array.isArray(schema._json.allOf)) { + logger.debug(`jsonProcessor: Processing allOf inheritance for schema ${name}`); + logger.debug(`jsonProcessor: allOf array length: ${schema._json.allOf.length}`); + logger.debug(`jsonProcessor: allOf structure: ${JSON.stringify(schema._json.allOf, null, 2)}`); + + // Set up inheritance relationship first + if (schema._json.allOf.length >= 2) { + // First schema is the parent, second schema contains additional properties + const parentSchema = schema._json.allOf[0]; + const parentSchemaName = parentSchema['x-parser-schema-id']; + logger.debug(`jsonProcessor: Parent schema: ${JSON.stringify(parentSchema, null, 2)}`); + logger.debug(`jsonProcessor: Parent schema name: ${parentSchemaName}`); + + if (parentSchemaName && parentSchemaName !== '') { + modelClass.setSuperClassName(parentSchemaName); + logger.debug(`jsonProcessor: βœ… Set up inheritance: ${name} extends ${parentSchemaName}`); + } else { + logger.debug(`jsonProcessor: ❌ Parent schema name invalid: ${parentSchemaName}`); + } + } else { + logger.debug(`jsonProcessor: ❌ allOf array too short: ${schema._json.allOf.length}`); + } + + // For inheritance, only include properties from additional schemas (skip the first one) + // The first schema (index 0) is the parent, so we start from index 1 + for (let index = 1; index < schema._json.allOf.length; index++) { + const allOfSchema = schema._json.allOf[index]; + logger.debug(`jsonProcessor: Processing additional allOf schema ${index} for ${name}`); + logger.debug(`jsonProcessor: allOfSchema structure: ${JSON.stringify(allOfSchema, null, 2)}`); + + // Get properties from this additional allOf schema + if (allOfSchema.properties) { + logger.debug(`jsonProcessor: Found ${Object.keys(allOfSchema.properties).length} properties in allOf schema ${index}`); + Object.entries(allOfSchema.properties).forEach(([propName, propSchema]) => { + const propertyType = getJsonSchemaTypeFromJson(propSchema); + const isRequired = allOfSchema.required && Array.isArray(allOfSchema.required) && allOfSchema.required.includes(propName); + + logger.debug(`jsonProcessor: Adding allOf property: ${propName}, type: ${propertyType}, required: ${isRequired}`); + + // Add validation constraints processing + const validationConstraints = {}; + if (propSchema.minimum !== undefined) { + validationConstraints.minimum = propSchema.minimum; + } + if (propSchema.maximum !== undefined) { + validationConstraints.maximum = propSchema.maximum; + } + + mergedProperties.push({ + name: propName, + type: propertyType, + description: propSchema.description || '', + required: isRequired, + schemaName: propSchema['x-parser-schema-id'], + format: propSchema.format, + enum: propSchema.enum, + items: propSchema.items, + minimum: validationConstraints.minimum, + maximum: validationConstraints.maximum + }); + + if (isRequired) { + mergedRequired.push(propName); + } + }); + } else { + logger.debug(`jsonProcessor: No properties found in allOf schema ${index}`); + } + + // Add required fields from this additional allOf schema + if (allOfSchema.required && Array.isArray(allOfSchema.required)) { + allOfSchema.required.forEach(reqField => { + if (!mergedRequired.includes(reqField)) { + mergedRequired.push(reqField); + } + }); + } + } + } else { + // Regular schema without allOf - use existing logic + const schemaForRef = schemaModel.getAnonymousSchemaForRef(name); + const actualSchema = schemaForRef || schema; + const required = actualSchema.required && typeof actualSchema.required === 'function' ? actualSchema.required() : []; + let schemaProperties = null; + + // Use only the official AsyncAPI parser method + if (actualSchema.properties && typeof actualSchema.properties === 'function') { + schemaProperties = actualSchema.properties(); + } + + if (schemaProperties && typeof schemaProperties.values === 'function') { + logger.debug(`jsonProcessor: Taking schemaProperties.values() path for schema ${name}`); + const propertyArray = Array.from(schemaProperties.values()); + propertyArray.forEach(prop => { + const propertyName = prop.id(); + const propertyType = getJsonSchemaType(prop); + const isRequired = Array.isArray(required) ? required.includes(propertyName) : false; + + // Extract validation constraints from raw JSON (same approach as allOf processing) + let minimum = undefined; + let maximum = undefined; + + // Access raw JSON properties structure like allOf processing does + if (actualSchema._json && actualSchema._json.properties && actualSchema._json.properties[propertyName]) { + const rawPropSchema = actualSchema._json.properties[propertyName]; + logger.debug(`jsonProcessor: Raw prop schema for ${propertyName}: ${JSON.stringify(rawPropSchema, null, 2)}`); + if (rawPropSchema.minimum !== undefined) { + minimum = rawPropSchema.minimum; + logger.debug(`jsonProcessor: Found minimum: ${minimum} for ${propertyName}`); + } + if (rawPropSchema.maximum !== undefined) { + maximum = rawPropSchema.maximum; + logger.debug(`jsonProcessor: Found maximum: ${maximum} for ${propertyName}`); + } + } else { + logger.debug(`jsonProcessor: No raw properties found for ${propertyName} in actualSchema._json`); + logger.debug(`jsonProcessor: actualSchema._json structure: ${JSON.stringify(actualSchema._json, null, 2)}`); + } + + mergedProperties.push({ + name: propertyName, + type: propertyType, + description: prop.description ? prop.description() : '', + required: isRequired, + schemaName: prop.extensions && prop.extensions().get('x-parser-schema-id')?.value(), + format: prop.format ? prop.format() : undefined, + enum: prop.enum ? prop.enum() : undefined, + items: prop.items ? prop.items() : undefined, + minimum: minimum, + maximum: maximum, + // Preserve the actual schema object for nested class generation + schema: prop, + // Preserve items schema for array processing + itemsSchema: prop.items ? prop.items() : undefined + }); + + if (isRequired) { + mergedRequired.push(propertyName); + } + }); + } else if (schemaProperties && typeof schemaProperties.forEach === 'function') { + // Try forEach method + logger.debug(`jsonProcessor: Taking schemaProperties.forEach() path for schema ${name}`); + schemaProperties.forEach((prop, propName) => { + const propertyType = getJsonSchemaType(prop); + const isRequired = Array.isArray(required) ? required.includes(propName) : false; + mergedProperties.push({ + name: propName, + type: propertyType, + description: prop.description ? prop.description() : '', + required: isRequired, + schemaName: prop.extensions && prop.extensions().get('x-parser-schema-id')?.value(), + format: prop.format ? prop.format() : undefined, + enum: prop.enum ? prop.enum() : undefined, + items: prop.items ? prop.items() : undefined, + // Preserve the actual schema object for nested class generation + schema: prop, + // Preserve items schema for array processing + itemsSchema: prop.items ? prop.items() : undefined + }); + + if (isRequired) { + mergedRequired.push(propName); + } + }); + } else if (schemaProperties && typeof schemaProperties === 'object') { + // Handle plain object with property names as keys using Object.entries + logger.debug(`jsonProcessor: Taking Object.entries() path for schema ${name}`); + Object.entries(schemaProperties).forEach(([propName, prop]) => { + const propertyType = getJsonSchemaType(prop); + const isRequired = Array.isArray(required) ? required.includes(propName) : false; + + // Extract validation constraints from raw JSON (same approach as allOf processing) + let minimum = undefined; + let maximum = undefined; + + // Access raw JSON properties structure like allOf processing does + if (actualSchema._json && actualSchema._json.properties && actualSchema._json.properties[propName]) { + const rawPropSchema = actualSchema._json.properties[propName]; + logger.debug(`jsonProcessor: Raw prop schema for ${propName}: ${JSON.stringify(rawPropSchema, null, 2)}`); + if (rawPropSchema.minimum !== undefined) { + minimum = rawPropSchema.minimum; + logger.debug(`jsonProcessor: Found minimum: ${minimum} for ${propName}`); + } + if (rawPropSchema.maximum !== undefined) { + maximum = rawPropSchema.maximum; + logger.debug(`jsonProcessor: Found maximum: ${maximum} for ${propName}`); + } + } else { + logger.debug(`jsonProcessor: No raw properties found for ${propName} in actualSchema._json`); + logger.debug(`jsonProcessor: actualSchema._json structure: ${JSON.stringify(actualSchema._json, null, 2)}`); + } + + mergedProperties.push({ + name: propName, + type: propertyType, + description: prop.description ? prop.description() : '', + required: isRequired, + schemaName: prop.extensions && prop.extensions().get('x-parser-schema-id')?.value(), + format: prop.format ? prop.format() : undefined, + enum: prop.enum ? prop.enum() : undefined, + items: prop.items ? prop.items() : undefined, + minimum: minimum, + maximum: maximum, + // Preserve the actual schema object for nested class generation + schema: prop, + // Preserve items schema for array processing + itemsSchema: prop.items ? prop.items() : undefined + }); + + if (isRequired) { + mergedRequired.push(propName); + } + }); + } + + // Handle parameter schemas with enums (schemas that have enum but no properties) + if (mergedProperties.length === 0 && actualSchema && actualSchema.enum && typeof actualSchema.enum === 'function') { + const enumValues = actualSchema.enum(); + if (enumValues && Array.isArray(enumValues) && enumValues.length > 0) { + // Create a virtual property for the enum + mergedProperties.push({ + name: 'value', + type: 'string', + description: 'Enum value', + required: true, + schemaName: actualSchema.extensions && actualSchema.extensions().get('x-parser-schema-id')?.value(), + format: undefined, + enum: enumValues, + items: undefined + }); + mergedRequired.push('value'); + } + } + } + + // Normalize className and package info + const className = modelClass.getClassName(); + const javaPackage = modelClass.getJavaPackage(); + const packagePath = javaPackage ? javaPackage.replace(/\./g, '/') : null; + const namespace = javaPackage; + const properties = mergedProperties; + const required = mergedRequired; + logger.debug(`jsonProcessor: Processing schema ${name} with ${properties.length} properties`); + // Debug: Log the properties structure to see if validation constraints are included + properties.forEach((prop, index) => { + logger.debug(`jsonProcessor: Property ${index}: ${prop.name}, type: ${prop.type}, minimum: ${prop.minimum}, maximum: ${prop.maximum}`); + }); + // Check if this schema needs JsonProperty imports + const needsJsonPropertyInclude = checkPropertyNames(name, schema); + // Add inheritance info + const extendsClass = modelClass.getSuperClassName(); + let parentProperties = []; + if (extendsClass) { + // Find parent schema in schemas array + const parentSchemaObj = schemas.find(s => s.className === extendsClass); + if (parentSchemaObj) { + parentProperties = parentSchemaObj.properties || []; + } + } + // Get schema title if available + const schemaTitle = schema.title && typeof schema.title === 'function' ? schema.title() : null; + + // Get schema ID for mapping purposes + const schemaId = schema.extensions && schema.extensions().get('x-parser-schema-id')?.value(); + const schemaJsonId = schema._json && schema._json.$id; + + schemas.push({ + name: name, // This is the original schema name from AsyncAPI spec + title: schemaTitle, + className: className, // This is the transformed name for Java + packagePath: packagePath, + namespace: namespace, + properties: properties, + isAvro: false, + isAvroSchema: false, + needsJsonPropertyInclude: needsJsonPropertyInclude, + extendsClass: extendsClass, + canBeInnerClass: modelClass.canBeInnerClass(), + modelClass: modelClass, + parentProperties: parentProperties, + // Add schema ID information for mapping + id: schemaJsonId || schemaId, + schemaId: schemaId + }); + logger.debug(`jsonProcessor: Added schema ${name} with ${properties.length} properties`); + + processedSchemas.add(name); + } + + // Process all schemas + for (const [name] of schemaMap) { + processSchema(name); + } + + logger.debug(`jsonProcessor: Processed ${schemas.length} JSON schemas`); + return schemas; +} + +/** + * Get schema type from JSON object (for allOf processing) + */ +function getJsonSchemaTypeFromJson(schema) { + logger.debug('jsonProcessor.js: getJsonSchemaTypeFromJson() - Getting schema type from JSON object'); + + if (!schema) return 'object'; + + const type = schema.type || null; + const format = schema.format || null; + + if (type === 'array') { + const items = schema.items; + if (items) { + const itemType = items.type || null; + if (!itemType || itemType === 'object') { + return 'array'; + } else { + return `array-${itemType}`; + } + } + return 'array'; + } + + if (!type || type === 'object') { + const schemaName = schema['x-parser-schema-id']; + if (schemaName) { + return `object-${schemaName}`; + } + return 'object'; + } + + return type; +} + +/** + * Get schema type using enhanced type utilities + */ +function getJsonSchemaType(schema) { + logger.debug('jsonProcessor.js: getJsonSchemaType() - Getting schema type using enhanced utilities'); + + if (!schema) return 'object'; + + const type = schema.type ? schema.type() : null; + const format = schema.format ? schema.format() : null; + + if (type === 'array') { + const items = schema.items(); + if (items) { + const itemType = items.type ? items.type() : null; + if (!itemType || itemType === 'object') { + return 'array'; + } else { + return `array-${itemType}`; + } + } + return 'array'; + } + + if (!type || type === 'object') { + const schemaName = schema.extensions && schema.extensions().get('x-parser-schema-id')?.value(); + if (schemaName) { + return `object-${schemaName}`; + } + return 'object'; + } + + return type; +} + +/** + * Determine imports for JSON schemas + */ +function determineImports(functions, extraIncludes, processedSchemas = []) { + logger.debug('jsonProcessor.js: determineImports() - Determining imports for JSON schemas'); + + const imports = []; + + // Add imports for JSON schemas that need JsonProperty + processedSchemas.forEach(schema => { + if (schema.isAvro || schema.isAvroSchema) { + return; // Skip Avro schemas + } + + if (schema.needsJsonPropertyInclude) { + imports.push('com.fasterxml.jackson.annotation.JsonProperty'); + } + }); + + // Remove duplicates + return Array.from(new Set(imports)); +} + +/** + * Determine schema imports + */ +function determineSchemaImports(functions) { + logger.debug('jsonProcessor.js: determineSchemaImports() - Determining schema imports'); + + const imports = []; + + functions.forEach(func => { + if (func.publishPayload && func.publishPayload !== 'Message') { + const importName = getSchemaImport(func.publishPayload); + if (importName) { + imports.push(importName); + } + } + + if (func.subscribePayload && func.subscribePayload !== 'Message') { + const importName = getSchemaImport(func.subscribePayload); + if (importName) { + imports.push(importName); + } + } + }); + + // Remove duplicates + return Array.from(new Set(imports)); +} + +/** + * Get schema import name + */ +function getSchemaImport(schemaName) { + logger.debug(`jsonProcessor.js: getSchemaImport() - Getting import for schema: ${schemaName}`); + + if (!schemaName || schemaName === 'Message') { + return null; + } + + // Check if schema has a package + const { javaPackage, className } = stripPackageName(schemaName); + if (javaPackage) { + return `${javaPackage}.${className}`; + } + + return null; +} + +/** + * Main entry point for JSON processor - matches interface expected by asyncApiProcessor + */ +function processAsyncApi(asyncapi, params) { + logger.debug('jsonProcessor.js: processAsyncApi() - Starting JSON processing'); + + // Initialize schema model with AsyncAPI document + schemaModel.setupSuperClassMap(asyncapi); + schemaModel.setupModelClassMap(asyncapi); + + const schemas = processJsonSchemas(asyncapi); + // logger.debug('jsonProcessor.js: processAsyncApi() - processedSchemas:', JSON.stringify(schemas, null, 2)); + + // Import and use the core processor's function extraction + const coreProcessor = require('../coreProcessor'); + const functions = coreProcessor.extractFunctions(asyncapi, params, schemas); + + const extraIncludes = determineImports(functions, [], schemas); + const imports = determineSchemaImports(functions); + const appProperties = {}; // JSON processor doesn't generate app properties + + return { + schemas, + functions, + extraIncludes, + imports, + appProperties + }; +} + +module.exports = { + detectJsonSchemas, + processJsonSchemas, + getJsonSchemaType, + determineImports, + determineSchemaImports, + getSchemaImport, + processAsyncApi +}; \ No newline at end of file diff --git a/utils/jsonProcessor/jsonProcessor.js b/utils/jsonProcessor/jsonProcessor.js new file mode 100644 index 00000000..caf2be25 --- /dev/null +++ b/utils/jsonProcessor/jsonProcessor.js @@ -0,0 +1,207 @@ +const { logger } = require('../logger'); +const { getSchemaType } = require('../typeUtils'); + +/** + * Process JSON schemas from components.schemas + */ +function processJsonSchemas(asyncapi, avroSchemaNames = new Set()) { + const schemas = []; + + const componentsSchemas = asyncapi.components().schemas(); + if (!componentsSchemas || + ((typeof componentsSchemas.size === 'number' && componentsSchemas.size === 0) || + (typeof componentsSchemas === 'object' && Object.keys(componentsSchemas).length === 0))) { + return schemas; + } + + const allSchemas = asyncapi.allSchemas(); + if (!allSchemas || typeof allSchemas.values !== 'function') { + return schemas; + } + + // First pass: collect all schemas and identify inheritance relationships + const schemaMap = new Map(); + const inheritanceMap = new Map(); // tracks which schemas extend others + const superClassMap = new Map(); // tracks base class relationships + const anonymousSchemaToSubClassMap = new Map(); // tracks anonymous schema to subclass mapping + + // Helper function to check if schema name is anonymous + const isAnonymousSchema = (schemaName) => { + return schemaName && schemaName.startsWith('<'); + }; + + // Helper function to handle allOf inheritance + const handleAllOfSchema = (schema, schemaName, allOfArray) => { + let anonymousSchema = null; + let namedSchema = null; + + allOfArray.forEach(innerSchema => { + const name = innerSchema['x-parser-schema-id']; + if (isAnonymousSchema(name)) { + anonymousSchema = name; + } else { + namedSchema = name; + } + }); + + if (!anonymousSchema || !namedSchema) { + logger.warn('Unable to find both an anonymous and a named schema in an allOf schema for:', { schemaName }); + return null; + } else { + // Set up inheritance relationships + superClassMap.set(anonymousSchema, namedSchema); + anonymousSchemaToSubClassMap.set(anonymousSchema, schemaName); + superClassMap.set(schemaName, namedSchema); + anonymousSchemaToSubClassMap.set(schemaName, anonymousSchema); + + return { + extendsClass: namedSchema, + anonymousSchema: anonymousSchema + }; + } + }; + + Array.from(allSchemas.values()).forEach(schema => { + // Use the same schema naming logic as the reference project + // Prioritize: x-ep-schema-name > x-parser-schema-id > schema.id() + const schemaName = schema.extensions().get('x-ep-schema-name')?.value() || + schema.extensions().get('x-parser-schema-id')?.value() || + schema.id(); + + // Skip if this schema is already processed as an Avro schema + if (avroSchemaNames.has(schemaName)) { + logger.debug(`Skipping schema ${schemaName} as it's already processed as an Avro schema`); + return; + } + + // Normalize className (camel-cased from schemaName) + const getClassName = (name) => { + if (!name) return 'UnknownSchema'; + const dotIndex = name.lastIndexOf('.'); + let className = dotIndex > 0 ? name.substring(dotIndex + 1) : name; + className = className.replace(/[_\s]/g, ' '); + className = className.split(' ').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(''); + return className.charAt(0).toUpperCase() + className.slice(1); + }; + const className = getClassName(schemaName); + + // Normalize packagePath and namespace (from extension or null) + let packagePath = null; + let namespace = null; + if (schema.extensions().get('x-java-package')) { + packagePath = schema.extensions().get('x-java-package').value().replace(/\./g, '/'); + namespace = schema.extensions().get('x-java-package').value(); + } + + const properties = []; + const required = schema.required && typeof schema.required === 'function' ? schema.required() : []; + const schemaProperties = schema.properties && typeof schema.properties === 'function' + ? schema.properties() + : null; + + if (schemaProperties && typeof schemaProperties.values === 'function') { + const propertyArray = Array.from(schemaProperties.values()); + propertyArray.forEach(prop => { + properties.push({ + name: prop.id(), + type: getSchemaType(prop), + description: prop.description ? prop.description() : '', + required: Array.isArray(required) ? required.includes(prop.id()) : false + }); + }); + } else if (schemaProperties && typeof schemaProperties.forEach === 'function') { + // Try forEach method + schemaProperties.forEach((prop, propName) => { + properties.push({ + name: propName, + type: getSchemaType(prop), + description: prop.description ? prop.description() : '', + required: Array.isArray(required) ? required.includes(propName) : false + }); + }); + } else if (schemaProperties && typeof schemaProperties === 'object') { + // Handle plain object with property names as keys + Object.keys(schemaProperties).forEach(propName => { + const prop = schemaProperties[propName]; + properties.push({ + name: propName, + type: getSchemaType(prop), + description: prop.description ? prop.description() : '', + required: Array.isArray(required) ? required.includes(propName) : false + }); + }); + } + + // Check for allOf inheritance - access through _json property + let extendsClass = null; + const schemaData = schema._json; + if (schemaData && schemaData.allOf && Array.isArray(schemaData.allOf) && schemaData.allOf.length > 0) { + // Use the improved allOf handling logic + const inheritanceInfo = handleAllOfSchema(schema, schemaName, schemaData.allOf); + if (inheritanceInfo) { + extendsClass = inheritanceInfo.extendsClass; + inheritanceMap.set(schemaName, extendsClass); + } else { + // Fallback to original logic for edge cases + const firstRef = schemaData.allOf[0]; + // Check for x-parser-schema-id (resolved references) + if (firstRef['x-parser-schema-id']) { + extendsClass = firstRef['x-parser-schema-id']; + inheritanceMap.set(schemaName, extendsClass); + } + // Also check for $ref (unresolved references) + else if (firstRef.$ref) { + const refName = firstRef.$ref.split('/').pop(); + extendsClass = refName; + inheritanceMap.set(schemaName, extendsClass); + } + } + } + + // Add description if available + const description = schema.description ? schema.description() : ''; + + schemaMap.set(schemaName, { + name: schemaName, + namespace: namespace, + packagePath: packagePath, + className: className, + properties: Array.isArray(properties) ? properties : [], + required: required, + extendsClass: extendsClass, + isAvro: false, + description: description, + schema: schema + }); + }); + + // Second pass: add schemas with dependencies in correct order + const addSchemaWithDependencies = (schemaName) => { + const schema = schemaMap.get(schemaName); + if (!schema) { + logger.warn(`Schema ${schemaName} not found in schema map`); + return; + } + + // If this schema extends another class, add the parent first + if (schema.extendsClass && !schemas.find(s => s.name === schema.extendsClass)) { + addSchemaWithDependencies(schema.extendsClass); + } + + // Add this schema if not already added + if (!schemas.find(s => s.name === schemaName)) { + schemas.push(schema); + } + }; + + // Add all schemas in dependency order + Array.from(schemaMap.keys()).forEach(schemaName => { + addSchemaWithDependencies(schemaName); + }); + + return schemas; +} + +module.exports = { + processJsonSchemas +}; \ No newline at end of file diff --git a/utils/jsonProcessor/jsonSchemaModel.js b/utils/jsonProcessor/jsonSchemaModel.js new file mode 100644 index 00000000..6bf4bd7e --- /dev/null +++ b/utils/jsonProcessor/jsonSchemaModel.js @@ -0,0 +1,356 @@ +const _ = require('lodash'); +const { logger } = require('../logger'); +const { stripPackageName } = require('../typeUtils'); + +class SchemaModel { + constructor() { + this.superClassMap = new Map(); + this.anonymousSchemaToSubClassMap = new Map(); + this.modelClassMap = new Map(); + this.nameToSchemaMap = new Map(); + this.javaKeywords = this.initReservedWords(); + } + + /** + * Initialize Java reserved words set + */ + initReservedWords() { + const keywords = new Set([ + 'abstract', 'assert', 'boolean', 'break', 'byte', 'case', 'catch', 'char', 'class', 'const', + 'continue', 'default', 'do', 'double', 'else', 'enum', 'extends', 'final', 'finally', 'float', + 'for', 'if', 'goto', 'implements', 'import', 'instanceof', 'int', 'interface', 'long', 'native', + 'new', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'strictfp', + 'super', 'switch', 'synchronized', 'this', 'throw', 'throws', 'transient', 'try', 'void', 'volatile', 'while' + ]); + return keywords; + } + + /** + * Get model class for a schema + */ + getModelClass({ schema, schemaName }) { + logger.debug(`schemaModel.js: getModelClass() - Getting model class for ${schemaName}`); + + let modelClass; + if (schema) { + const parserSchemaName = schema.extensions && schema.extensions().get('x-parser-schema-id')?.value(); + // Try to use x-parser-schema-id as key + modelClass = this.modelClassMap.get(parserSchemaName); + if (modelClass && modelClass.getClassName().startsWith('Anonymous')) { + // If we translated this schema from the map using an anonymous schema key, we have no idea what the name should be, so we use the one provided directly from the source - not the generator. + // Otherwise, if we translated this schema from the map using a known schema (the name of the schema was picked out correctly by the generator), use that name. + modelClass.setClassName(_.upperFirst(this.isAnonymousSchema(parserSchemaName) ? schemaName : parserSchemaName)); + } + } + // Using x-parser-schema-id didn't work for us, fall back to trying to get at least something using the provided name. + if (!modelClass) { + modelClass = this.modelClassMap.get(schemaName) || this.modelClassMap.get(_.camelCase(schemaName)); + } + + logger.debug(`schemaModel.js: getModelClass() - Returning model class for ${schemaName}: ${modelClass ? 'found' : 'not found'}`); + return modelClass; + } + + /** + * Setup super class map for inheritance relationships + */ + setupSuperClassMap(asyncapi) { + if (this.superClassMap.size > 0) { + return; + } + + logger.debug('schemaModel.js: setupSuperClassMap() - Setting up inheritance relationships'); + + const allSchemas = asyncapi.allSchemas().all(); + if (!allSchemas) return; + + // allSchemas is a Map, so we need to iterate over entries properly + allSchemas.forEach((schema, schemaName) => { + if (typeof schemaName !== 'string') { + // logger.debug(`Skipping non-string schema key: ${schemaName}`); + return; + } + logger.debug(`schemaModel.js: setupSuperClassMap() - Processing schema: ${schemaName}`); + + // Check for allOf inheritance + if (schema.allOf && typeof schema.allOf === 'function') { + const allOf = schema.allOf(); + if (allOf && allOf.length > 0) { + this.handleAllOfSchema(schema, schemaName, allOf); + } + } + }); + + logger.debug('schemaModel.js: setupSuperClassMap() - Super class map:', this.superClassMap); + } + + /** + * Handle allOf schema inheritance + */ + handleAllOfSchema(schema, schemaName, allOfArray) { + logger.debug(`schemaModel.js: handleAllOfSchema() - Handling allOf for ${schemaName}`); + + let anonymousSchema = null; + let namedSchema = null; + + allOfArray.forEach(innerSchema => { + const name = innerSchema.extensions && innerSchema.extensions().get('x-parser-schema-id')?.value(); + if (this.isAnonymousSchema(name)) { + anonymousSchema = name; + } else { + namedSchema = name; + } + }); + + if (!anonymousSchema || !namedSchema) { + logger.warn(`schemaModel.js: handleAllOfSchema() - Unable to find both an anonymous and a named schema in allOf for ${schemaName}`); + return; + } + + // Set up inheritance relationships + this.superClassMap.set(anonymousSchema, namedSchema); + this.anonymousSchemaToSubClassMap.set(anonymousSchema, schemaName); + this.superClassMap.set(schemaName, namedSchema); + this.anonymousSchemaToSubClassMap.set(schemaName, anonymousSchema); + + logger.debug(`schemaModel.js: handleAllOfSchema() - Set up inheritance: ${schemaName} extends ${namedSchema}`); + } + + /** + * Setup model class map + */ + setupModelClassMap(asyncapi) { + if (this.modelClassMap.size > 0) { + return; + } + + logger.debug('schemaModel.js: setupModelClassMap() - Setting up model class map'); + + // Use the same logic as collectAllSchemas to ensure consistent schema names + const allSchemas = new Map(); + + // 1. Collect from components.schemas (prefer these names) + const componentsSchemas = asyncapi.components().schemas(); + if (componentsSchemas && typeof componentsSchemas.forEach === 'function') { + componentsSchemas.forEach((schema, componentName) => { + // The AsyncAPI library sometimes returns numeric keys instead of original component names + // We need to map them back to the original names using the _json structure + let originalComponentName = componentName; + const schemaId = schema.id && typeof schema.id === 'function' ? schema.id() : null; + + if (asyncapi._json && asyncapi._json.components && asyncapi._json.components.schemas) { + // Find the schema with matching ID to get the original key + // NOTE: Handle cases where multiple schemas might have the same $id (which is invalid but happens) + let foundMatch = false; + Object.keys(asyncapi._json.components.schemas).forEach(jsonKey => { + const jsonSchema = asyncapi._json.components.schemas[jsonKey]; + + // First try x-parser-schema-id (most reliable) + if (schemaId && jsonSchema['x-parser-schema-id'] === schemaId) { + originalComponentName = jsonKey; + foundMatch = true; + logger.debug(`schemaModel.js: setupModelClassMap() - Mapped ${componentName} to ${originalComponentName} via x-parser-schema-id`); + } + }); + + // If no x-parser-schema-id match found, fall back to position-based mapping for numeric keys + if (!foundMatch && (typeof componentName === 'number' || (typeof componentName === 'string' && componentName.match(/^\d+$/)))) { + const schemaKeys = Object.keys(asyncapi._json.components.schemas); + const index = parseInt(componentName); + if (index < schemaKeys.length) { + originalComponentName = schemaKeys[index]; + logger.debug(`schemaModel.js: setupModelClassMap() - Mapped numeric ${componentName} to ${originalComponentName} by position`); + } + } + // If componentName is already a string name, use it as-is + else if (!foundMatch && typeof componentName === 'string' && componentName.length > 0 && !componentName.match(/^\d+$/)) { + logger.debug(`schemaModel.js: setupModelClassMap() - Using componentName as-is: ${componentName} (no ID match found)`); + } + } + + + allSchemas.set(originalComponentName, schema); + }); + } + + // Register all schemas with consistent names + allSchemas.forEach((schema, schemaName) => { + logger.debug(`schemaModel.js: setupModelClassMap() - Processing schema: ${schemaName}, type: ${schema.type ? schema.type() : 'unknown'}`); + this.registerSchemaNameToModelClass(schema, schemaName, asyncapi); + this.nameToSchemaMap.set(schemaName, schema); + }); + + logger.debug('schemaModel.js: setupModelClassMap() - Model class map size:', this.modelClassMap.size); + } + + /** + * Map schema ID to component name + */ + mapSchemaIdToComponentName(schemaId, asyncapi) { + logger.debug(`schemaModel.js: mapSchemaIdToComponentName() - Mapping schema ID: ${schemaId}`); + + // First, try to find the schema in components.schemas + const componentsSchemas = asyncapi.components().schemas(); + if (componentsSchemas) { + for (const [schemaName, schema] of componentsSchemas.entries()) { + const parserSchemaId = schema.extensions && schema.extensions().get('x-parser-schema-id')?.value(); + if (parserSchemaId === schemaId) { + logger.debug(`schemaModel.js: mapSchemaIdToComponentName() - Found schema: ${schemaName}`); + return schemaName; + } + } + } + + // If not found in components, return the schemaId as is + logger.debug(`schemaModel.js: mapSchemaIdToComponentName() - Not found, returning schemaId: ${schemaId}`); + return schemaId; + } + + /** + * Check if schema name is anonymous + */ + isAnonymousSchema(schemaName) { + return schemaName && schemaName.startsWith('<'); + } + + /** + * Register schema name to model class + */ + registerSchemaNameToModelClass(schema, schemaName, asyncapi) { + let modelClass = this.modelClassMap.get(schemaName); + if (!modelClass) { + modelClass = new ModelClass(); + } + + if (this.isAnonymousSchema(schemaName)) { + this.handleAnonymousSchemaForAllOf(modelClass, schemaName); + } + + // Check if this is a top-level schema (not an inner class) + let nonInnerClassSchemas = []; + if (asyncapi.components && typeof asyncapi.components === 'function') { + const schemasObj = asyncapi.components().schemas(); + if (schemasObj && typeof schemasObj === 'object') { + nonInnerClassSchemas = Array.from(schemasObj.values()).map(schema => schema._meta.id) + } + } + if (nonInnerClassSchemas.includes(schemaName)) { + modelClass.setCanBeInnerClass(false); + } + + const classNameAndLocation = stripPackageName(schemaName); + let className = classNameAndLocation.className; + const javaPackage = classNameAndLocation.javaPackage; + + if (schema.extensions && schema.extensions().get('x-ep-schema-name')) { + className = schema.extensions().get('x-ep-schema-name').value(); + } + + modelClass.setJavaPackage(javaPackage); + modelClass.setClassName(className); + + logger.debug(`schemaModel.js: registerSchemaNameToModelClass() - Schema: ${schemaName}, Class: ${modelClass.getClassName()}, Super: ${modelClass.getSuperClassName()}, Package: ${javaPackage}`); + + this.modelClassMap.set(schemaName, modelClass); + } + + /** + * Get anonymous schema for reference + */ + getAnonymousSchemaForRef(realSchemaName) { + // During our allOf parsing, we found this real schema to anon-schema association + const anonSchema = this.anonymousSchemaToSubClassMap.get(realSchemaName); + return anonSchema ? this.nameToSchemaMap.get(anonSchema) : undefined; + } + + /** + * Handle anonymous schema for allOf + */ + handleAnonymousSchemaForAllOf(modelClass, schemaName) { + const subclassName = this.anonymousSchemaToSubClassMap.get(schemaName); + if (subclassName) { + modelClass.setSuperClassName(this.superClassMap.get(schemaName)); + // Be sure the anonymous modelClass and the named modelClass are updated with the superclass information + // We dont want the anonymous schema because the class name won't be correct if it's a $ref, so if the modelClass exists, update that one, if it doesn't we'll make it + const existingModelClass = this.modelClassMap.get(subclassName); + if (existingModelClass) { + existingModelClass.setSuperClassName(this.superClassMap.get(schemaName)); + } + return subclassName; + } + return schemaName; + } + + /** + * Reset all maps (for testing) + */ + reset() { + this.superClassMap.clear(); + this.anonymousSchemaToSubClassMap.clear(); + this.modelClassMap.clear(); + this.nameToSchemaMap.clear(); + } +} + +/** + * ModelClass for representing Java class information + */ +class ModelClass { + constructor() { + this.innerClass = true; + this.className = null; + this.originalName = null; // NEW: store original schema name + this.superClassName = null; + this.javaPackage = null; + } + + getClassName() { + return this.className; + } + + setClassName(originalName) { + this.className = this.fixClassName(originalName); + } + + getOriginalName() { // NEW: getter for original name + return this.originalName; + } + + setOriginalName(originalName) { // NEW: setter for original name + this.originalName = originalName; + } + + getSuperClassName() { + return this.superClassName; + } + + setSuperClassName(originalName) { + this.superClassName = this.fixClassName(originalName); + } + + getJavaPackage() { + return this.javaPackage; + } + + setJavaPackage(javaPackage) { + this.javaPackage = javaPackage; + } + + isSubClass() { + return this.superClassName !== undefined; + } + + fixClassName(originalName) { + return _.upperFirst(_.camelCase(originalName)); + } + + setCanBeInnerClass(innerClass) { + this.innerClass = innerClass; + } + + canBeInnerClass() { + return this.innerClass; + } +} + +module.exports = { SchemaModel, ModelClass }; \ No newline at end of file diff --git a/utils/logger.js b/utils/logger.js new file mode 100644 index 00000000..fabc9bf8 --- /dev/null +++ b/utils/logger.js @@ -0,0 +1,139 @@ +/** + * Centralized logger for the AsyncAPI code generator + * Supports different log levels with environment-based control + */ + +const LOG_LEVELS = { + ERROR: 0, + WARN: 1, + INFO: 2, + DEBUG: 3 +}; + +// Get log level from environment variable, default to ERROR +const getLogLevel = () => { + const envLevel = process.env.LOG_LEVEL?.toUpperCase(); + return LOG_LEVELS[envLevel] !== undefined ? LOG_LEVELS[envLevel] : LOG_LEVELS.DEBUG; +}; + +let currentLogLevel = getLogLevel(); + +/** + * Format log message with timestamp and context + */ +const formatMessage = (level, context, message, data) => { + const timestamp = new Date().toISOString(); + const contextStr = context ? `[${context}]` : ''; + const dataStr = data ? ` ${JSON.stringify(data, null, 2)}` : ''; + return `${timestamp} ${level}${contextStr}: ${message}${dataStr}`; +}; + +/** + * Check if a log level should be output + */ +const shouldLog = (level) => { + return LOG_LEVELS[level] <= currentLogLevel; +}; + +/** + * Logger class with different log levels + */ +class Logger { + constructor(context = '') { + this.context = context; + } + + error(message, data = null) { + if (shouldLog('ERROR')) { + console.error(formatMessage('ERROR', this.context, message, data)); + } + } + + warn(message, data = null) { + if (shouldLog('WARN')) { + console.warn(formatMessage('WARN', this.context, message, data)); + } + } + + info(message, data = null) { + if (shouldLog('INFO')) { + console.log(formatMessage('INFO', this.context, message, data)); + } + } + + debug(message, data = null) { + if (shouldLog('DEBUG')) { + console.log(formatMessage('DEBUG', this.context, message, data)); + } + } + + /** + * Create a new logger instance with a specific context + */ + withContext(context) { + return new Logger(context); + } + + /** + * Get current log level name + */ + getCurrentLevel() { + return Object.keys(LOG_LEVELS).find(key => LOG_LEVELS[key] === currentLogLevel) || 'ERROR'; + } + + /** + * Set log level dynamically + * @param {string} level - Log level name (ERROR, WARN, INFO, DEBUG) + */ + setLevel(level) { + const upperLevel = level.toUpperCase(); + if (LOG_LEVELS[upperLevel] !== undefined) { + currentLogLevel = LOG_LEVELS[upperLevel]; + } else { + console.warn(`Invalid log level: ${level}. Valid levels are: ${Object.keys(LOG_LEVELS).join(', ')}`); + } + } +} + +// Create default logger instance +const logger = new Logger(); + +/** + * Set the global log level for all logger instances + * @param {string} level - Log level name (ERROR, WARN, INFO, DEBUG) + */ +const setLogLevel = (level) => { + const upperLevel = level.toUpperCase(); + if (LOG_LEVELS[upperLevel] !== undefined) { + currentLogLevel = LOG_LEVELS[upperLevel]; + } else { + console.warn(`Invalid log level: ${level}. Valid levels are: ${Object.keys(LOG_LEVELS).join(', ')}`); + } +}; + +/** + * Configure logger based on AsyncAPI generator settings + * @param {object} generator - AsyncAPI generator instance + */ +const configureFromGenerator = (generator) => { + if (generator && generator.debug) { + setLogLevel('DEBUG'); + logger.debug('Logger configured from generator: DEBUG level enabled'); + } else { + // Keep current level or fall back to environment variable + const envLevel = process.env.LOG_LEVEL; + if (!envLevel) { + setLogLevel('ERROR'); // Default to ERROR if no debug and no env var + } + logger.debug(`Logger configured: ${logger.getCurrentLevel()} level`); + } +}; + +// Export both the class and default instance +module.exports = { + Logger, + logger, + LOG_LEVELS, + setLogLevel, + configureFromGenerator +}; \ No newline at end of file diff --git a/utils/typeUtils.js b/utils/typeUtils.js new file mode 100644 index 00000000..65bddcf4 --- /dev/null +++ b/utils/typeUtils.js @@ -0,0 +1,303 @@ +const _ = require('lodash'); +const { logger } = require('./logger'); + +/** + * Enhanced type mapping for Java types (matching reference project exactly) + */ +const stringMap = new Map(); +stringMap.set('date', {javaType: 'java.time.LocalDate', printFormat: '%s', sample: '2000-12-31'}); +stringMap.set('date-time', {javaType: 'java.time.OffsetDateTime', printFormat: '%s', sample: '2000-12-31T23:59:59+01:00'}); +stringMap.set('byte', {javaType: 'byte[]', printFormat: '%s', sample: 'U3dhZ2dlciByb2Nrcw=='}); +stringMap.set('binary', {javaType: 'byte[]', printFormat: '%s', sample: 'base64-encoded file contents'}); +stringMap.set(undefined, {javaType: 'String', printFormat: '%s', sample: '"string"'}); + +const integerMap = new Map(); +integerMap.set('int32', {javaType: 'Integer', printFormat: '%d', sample: '1'}); +integerMap.set('int64', {javaType: 'Long', printFormat: '%d', sample: '1L'}); +integerMap.set(undefined, {javaType: 'Integer', printFormat: '%d', sample: '1'}); + +const numberMap = new Map(); +numberMap.set('float', {javaType: 'Float', printFormat: '%f', sample: '1.1F'}); +numberMap.set('double', {javaType: 'Double', printFormat: '%f', sample: '1.1'}); +numberMap.set(undefined, {javaType: 'java.math.BigDecimal', printFormat: '%s', sample: '100.1'}); + +const booleanMap = new Map(); +booleanMap.set(undefined, {javaType: 'Boolean', printFormat: '%s', sample: 'true'}); + +const nullMap = new Map(); +nullMap.set(undefined, {javaType: 'String', printFormat: '%s', sample: 'null'}); + +const typeMap = new Map(); +typeMap.set('boolean', booleanMap); +typeMap.set('integer', integerMap); +typeMap.set('null', nullMap); +typeMap.set('number', numberMap); +typeMap.set('string', stringMap); + +/** + * Get enhanced type mapping (matching reference project) + */ +function getEnhancedType(type, format) { + logger.debug(`typeUtils.js: getEnhancedType() - Getting type for ${type}, format: ${format}`); + + const typeMapForType = typeMap.get(type); + if (!typeMapForType) { + return {javaType: 'Object', printFormat: '%s', sample: 'null'}; + } + + let typeObject = typeMapForType.get(format); + if (typeObject === undefined) { + typeObject = typeMapForType.get(undefined); + } + + logger.debug(`typeUtils.js: getEnhancedType() - Returning: ${typeObject.javaType}`); + return typeObject; +} + +/** + * Check if property names need JsonProperty annotation (matching reference project) + */ +function checkPropertyNames(name, schema) { + logger.debug(`typeUtils.js: checkPropertyNames() - Checking property: ${name}`); + + if (!schema || !schema.properties) { + return false; + } + + const properties = schema.properties(); + if (!properties) { + return false; + } + + // Handle different types of properties objects + let propertyEntries = []; + + if (typeof properties.forEach === 'function') { + // Map-like object with forEach + properties.forEach((prop, propName) => { + propertyEntries.push([propName, prop]); + }); + } else if (typeof properties.entries === 'function') { + // Map-like object with entries + propertyEntries = Array.from(properties.entries()); + } else if (typeof properties === 'object') { + // Plain object + propertyEntries = Object.entries(properties); + } else { + return false; + } + + // Check if any property name differs from its Java identifier name + for (const [propName, prop] of propertyEntries) { + const javaIdentifierName = getIdentifierName(propName); + if (javaIdentifierName !== propName) { + logger.debug(`typeUtils.js: checkPropertyNames() - Property ${propName} needs JsonProperty (Java: ${javaIdentifierName})`); + return true; + } + } + + return false; +} + +/** + * Get valid Java identifier name (matching reference project) + */ +function getIdentifierName(name) { + logger.debug(`typeUtils.js: getIdentifierName() - Converting: ${name}`); + + let ret = _.camelCase(name); + + // Check if it's a Java reserved word + if (isJavaReservedWord(ret)) { + ret = `_${ret}`; + } + + logger.debug(`typeUtils.js: getIdentifierName() - Result: ${ret}`); + return ret; +} + +/** + * Check if a word is a Java reserved word + */ +function isJavaReservedWord(word) { + const javaKeywords = new Set([ + 'abstract', 'assert', 'boolean', 'break', 'byte', 'case', 'catch', 'char', 'class', 'const', + 'continue', 'default', 'do', 'double', 'else', 'enum', 'extends', 'final', 'finally', 'float', + 'for', 'goto', 'if', 'implements', 'import', 'instanceof', 'int', 'interface', 'long', 'native', + 'new', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'strictfp', + 'super', 'switch', 'synchronized', 'this', 'throw', 'throws', 'transient', 'try', 'void', + 'volatile', 'while', 'true', 'false', 'null' + ]); + + return javaKeywords.has(word.toLowerCase()); +} + +/** + * Fix type for property (matching reference project's fixType function) + */ +function fixType(name, javaName, property) { + logger.debug(`typeUtils.js: fixType() - Fixing type for ${name}, javaName: ${javaName}`); + + if (!property) { + return ['Object', false]; + } + + const type = property.type ? property.type() : null; + const format = property.format ? property.format() : null; + + logger.debug(`typeUtils.js: fixType() - Property type: ${type}, format: ${format}`); + + if (type === 'array') { + const items = property.items(); + if (items) { + const itemType = items.type ? items.type() : null; + const itemFormat = items.format ? items.format() : null; + + if (!itemType || itemType === 'object') { + // Array of objects - need to generate inner class + const itemSchemaName = items.extensions && items.extensions().get('x-parser-schema-id')?.value(); + if (itemSchemaName) { + const { className } = stripPackageName(itemSchemaName); + const javaType = `List<${_.upperFirst(_.camelCase(className))}>`; + logger.debug(`typeUtils.js: fixType() - Array of objects: ${javaType}`); + return [javaType, true]; // true indicates array of objects + } + } else { + // Array of primitives + const typeInfo = getEnhancedType(itemType, itemFormat); + const javaType = `List<${typeInfo.javaType}>`; + logger.debug(`typeUtils.js: fixType() - Array of primitives: ${javaType}`); + return [javaType, false]; + } + } + return ['List', false]; + } + + if (!type || type === 'object') { + // Object type - use schema name + const schemaName = property.extensions && property.extensions().get('x-parser-schema-id')?.value(); + if (schemaName) { + const { className } = stripPackageName(schemaName); + const javaType = _.upperFirst(_.camelCase(className)); + logger.debug(`typeUtils.js: fixType() - Object type: ${javaType}`); + return [javaType, false]; + } + return ['Object', false]; + } + + // Primitive type + const typeInfo = getEnhancedType(type, format); + logger.debug(`typeUtils.js: fixType() - Primitive type: ${typeInfo.javaType}`); + return [typeInfo.javaType, false]; +} + +/** + * Get schema type for JSON schemas (from typeUtils.js) + */ +// function getSchemaType(schema) { +// const type = schema.type(); +// const format = schema.format(); + +// if (type === 'array') { +// const items = schema.items(); +// if (items) { +// const itemType = getSchemaType(items); +// return { javaType: `List<${itemType.javaType}>`, printFormat: '%s', sample: '[]' }; +// } +// return { javaType: 'List', printFormat: '%s', sample: '[]' }; +// } + +// if (type === 'object') { +// return { javaType: 'Object', printFormat: '%s', sample: 'null' }; +// } + +// return getEnhancedType(type, format); +// } + +/** + * Get schema type from AsyncAPI schema object + */ +function getSchemaType(schema) { + if (!schema) return 'object'; + + if (schema.type && typeof schema.type === 'function') { + return schema.type(); + } + + if (schema.type) { + return schema.type; + } + + return 'object'; +} + +/** + * Convert string to PascalCase for class names + */ +function toPascalCase(str) { + logger.debug('ModelClass.js: toPascalCase() - Converting string to PascalCase'); + if (!str) return ''; + + // Remove special characters and convert to PascalCase + return str.replace(/(^|_|\-|\s)(\w)/g, (_, __, c) => c ? c.toUpperCase() : '') + .replace(/^[a-z]/, c => c.toUpperCase()); +} + +/** + * Convert string to camelCase for field names + */ +function toCamelCase(str) { + logger.debug('ModelClass.js: toCamelCase() - Converting string to camelCase'); + if (!str) return ''; + + // Remove special characters and convert to camelCase + return str.replace(/(^|_|\-|\s)(\w)/g, (_, __, c) => c ? c.toUpperCase() : '') + .replace(/^[A-Z]/, c => c.toLowerCase()); +} + +/** + * Convert to Java class name (from typeUtils.js) + */ +function toJavaClassName(name) { + return name + .split(/[^a-zA-Z0-9]/) + .map(part => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase()) + .join(''); +} + +/** + * Strip package name from fully qualified schema name + */ +function stripPackageName(dotSeparatedName) { + // Safety check for non-string input + if (typeof dotSeparatedName !== 'string') { + logger.warn(`typeUtils.js: stripPackageName() - Non-string input: ${typeof dotSeparatedName}, value: ${dotSeparatedName}`); + return { className: 'UnknownSchema' }; + } + + // If there is a dot in the schema name, it's probably an Avro schema with a fully qualified name + if (dotSeparatedName.includes('.')) { + const parts = dotSeparatedName.split('.'); + const className = parts[parts.length - 1]; + const packageName = parts.slice(0, -1).join('.'); + return { className, packageName }; + } + + // For simple names, just return the name as the class name + return { className: dotSeparatedName }; +} + + +module.exports = { + getEnhancedType, + checkPropertyNames, + getIdentifierName, + isJavaReservedWord, + fixType, + getType: getEnhancedType, // Alias for backward compatibility + getSchemaType, + toJavaClassName, + toPascalCase, + toCamelCase, + stripPackageName +}; \ No newline at end of file From 4d15946ab4cf5c3e6d052972c9b1723f573729e2 Mon Sep 17 00:00:00 2001 From: gvensan Date: Fri, 22 Aug 2025 11:33:30 +0530 Subject: [PATCH 2/6] Update to README with information on how to use test scripts and integration test --- README.md | 209 +++++++++++++++++++++++++++++++++++++++++ utils/functionUtils.js | 2 +- 2 files changed, 210 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 00c16b77..66878e25 100644 --- a/README.md +++ b/README.md @@ -211,6 +211,215 @@ This template is compatible with the following version range: >=2.0.0 <=3.3.0. This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind are welcome! +### Prerequisites + +Before contributing, ensure you have the following installed: +- **Node.js 18.18.2** (required for consistent development environment) +- **Java 17+** (for testing generated Spring Boot applications) +- **Maven 3.6+** (for building generated projects) + +### Development Scripts + +The project includes several development scripts to streamline the development and testing process: + +#### Code Generation Scripts + +**`test/generate_output.sh`** - Automated code generation script +```bash +# Generate code for all AsyncAPI files in mocks directory +./test/generate_output.sh -default + +# Generate code for a specific AsyncAPI file (can include full path) +./test/generate_output.sh -f + +# Generate code with custom output directory +./test/generate_output.sh -default -o + +# Generate specific file to custom output directory +./test/generate_output.sh -f -o + +# Show help +./test/generate_output.sh --help + +# Examples: +./test/generate_output.sh -default # Generate code for all files +./test/generate_output.sh -f animals.yaml # Generate code for animals.yaml only +./test/generate_output.sh -f /path/to/file.yaml # Generate code for file at specific path +./test/generate_output.sh -default -o /custom/output # Generate all files with custom output directory +./test/generate_output.sh -f file.yaml -o /output # Generate specific file to custom output +./test/generate_output.sh --help # Show help +``` + +**Features:** +- Automatically sets Node.js version to 18.18.2 +- Generates Spring Cloud Stream code with Solace binder configuration +- Outputs generated code to `test/output/` directory (default) or custom directory +- Supports both YAML and JSON AsyncAPI files +- Uses consistent template parameters (binder: 'solace') +- Requires explicit `-default` option for batch processing (shows help by default) +- Supports individual file processing with `-f` option (accepts any file path) +- Supports custom output directory with `-o` option +- Comprehensive help system with `--help` option +- Temporarily copies external files to mocks directory for processing +- Automatically cleans up temporary files after processing +- Shows default directory information in help output + +#### Compilation Scripts + +**`test/compile_output.sh`** - Automated compilation script +```bash +# Compile all Maven projects in output directory +./test/compile_output.sh -default + +# Compile a specific Maven project +./test/compile_output.sh -d + +# Show help +./test/compile_output.sh --help + +# Examples: +./test/compile_output.sh -default # Compile all projects +./test/compile_output.sh -d animals # Compile only the 'animals' project +./test/compile_output.sh --help # Show help and available projects +``` + +**Features:** +- Compiles generated Maven projects +- Validates that generated code compiles successfully +- Uses `mvn compile` for consistent builds +- Provides clear success/failure feedback +- Requires explicit `-default` option for batch processing (shows help by default) +- Supports individual project compilation with `-d` option +- Comprehensive help system with `--help` option +- Lists all available Maven projects when help is requested +- Shows default directory information in help output + +#### Integration Testing + +**`test/integration.test.js`** - Comprehensive integration test suite + +This test suite validates the entire code generation pipeline and ensures all AsyncAPI files produce valid Spring Cloud Stream applications. + +**Running the Tests:** +```bash +# Run all integration tests +npm test + +# Run only the comprehensive integration tests +npm test -- --testPathPattern=integration.test.js + +# Run with verbose output +npm test -- --testPathPattern=integration.test.js --verbose +``` + +**Recommended Workflow for Integration Testing:** +```bash +# 1. Generate code for all AsyncAPI files with default parameters +./test/generate_output.sh -default + +# 2. Compile all generated projects with default parameters +./test/compile_output.sh -default + +# 3. Run the integration tests +npm test -- --testPathPattern=integration.test.js +``` + +This workflow ensures that: +- All AsyncAPI files are processed with consistent parameters +- Generated code is validated through compilation +- Integration tests run against the latest generated output + +**Test Coverage:** + +The comprehensive integration test suite covers **ALL 37 AsyncAPI files** in the `test/mocks/` directory and validates: + +1. **File Structure Validation** - Essential Maven project structure for all files +2. **POM.XML Validation** - Correct Spring Boot and Solace dependencies +3. **Application.YML Validation** - Proper Solace binder configuration +4. **Application.Java Validation** - Valid Spring Boot structure and syntax +5. **Specific Pattern Validation** - Key patterns like Function types, StreamBridge, etc. +6. **Model Class Validation** - Schema-to-class mapping for files with schemas +7. **Empty Object Schema Validation** - Handling of empty object schemas +8. **Avro Schema Validation** - All Avro schema patterns +9. **Message Payload Type Validation** - Message payload types for different scenarios +10. **Compilation Validation** - Java syntax and structure validation + +**Test Categories:** + +- **Basic Test Files** (8 files): `animals.yaml`, `simple-test.yaml`, `function-name-test.yaml`, etc. +- **Complex Schema Files** (6 files): `nested-arrays.yaml`, `multivariable-topic.yaml`, etc. +- **Avro Schema Files** (4 files): `avro-complex-test.yaml`, `kafka-avro.yaml`, etc. +- **Solace Application Files** (3 files): `solace-test-app.yaml`, `smarty-lighting-streetlights.yaml`, etc. +- **Large Solace JSON Files** (12 files): `solace-smart-shelf-inventory-control.json`, `solace-point-of-sale-system.json`, etc. + +**Test Output:** +- Detailed progress logging for each file +- Comprehensive error reporting +- Validation of all essential components +- ~3 minute execution time for full test suite + +#### Development Workflow + +1. **Before making changes:** + ```bash + npm run lint + npm test + ``` + +2. **Testing code generation:** + ```bash + # Generate code for a specific file + ./test/generate_output.sh -f animals.yaml + + # Generate code with custom output directory + ./test/generate_output.sh -f animals.yaml -o /custom/output + + # Generate code for all files + ./test/generate_output.sh -default + + # Compile the generated code + ./test/compile_output.sh -d animals + + # Compile all generated projects + ./test/compile_output.sh -default + ``` + +3. **Running integration tests:** + ```bash + # Run comprehensive tests + npm test -- --testPathPattern=integration.test.js + ``` + +#### Test Directory Structure + +``` +test/ +β”œβ”€β”€ mocks/ # AsyncAPI definition files (YAML/JSON) +β”œβ”€β”€ output/ # Pre-generated, validated output (reference) +β”œβ”€β”€ temp/ # Temporary test directories +β”œβ”€β”€ generate_output.sh # Code generation script (supports -f and -o options) +β”œβ”€β”€ compile_output.sh # Maven compilation script (supports -d option) +β”œβ”€β”€ generate_code_for_mocks.js # Node.js script for AsyncAPI code generation +└── integration.test.js # Main integration test suite +``` + +#### Quality Assurance + +The integration tests ensure: +- **Consistency**: All AsyncAPI files generate valid Spring Cloud Stream applications +- **Completeness**: Essential files (pom.xml, Application.java, application.yml) are always generated +- **Correctness**: Generated code follows Spring Boot and Spring Cloud Stream best practices +- **Compatibility**: All supported binders (Solace, Kafka, RabbitMQ) work correctly +- **Robustness**: Handles various AsyncAPI patterns (schemas, functions, dynamic topics, etc.) + +### Contributing Guidelines + +1. **Code Quality**: Run `npm run lint` before submitting changes +2. **Testing**: Ensure all tests pass with `npm test` +3. **Integration Testing**: Run comprehensive integration tests for any template changes +4. **Documentation**: Update README.md for any new features or changes +5. **Backward Compatibility**: Ensure changes don't break existing functionality + If you do contribute, please run ```npm run lint``` and ```npm test``` before you submit your code. diff --git a/utils/functionUtils.js b/utils/functionUtils.js index 9cd7d207..5da80448 100644 --- a/utils/functionUtils.js +++ b/utils/functionUtils.js @@ -1036,4 +1036,4 @@ module.exports = { getMultipleMessageComment, consolidateConsumerFunctions, getSampleArg -}; +}; \ No newline at end of file From 59965a59b40d118ba1afb6051b2311841af6facf Mon Sep 17 00:00:00 2001 From: gvensan Date: Sun, 24 Aug 2025 09:50:19 +0530 Subject: [PATCH 3/6] Updated README with info to enable debug logging --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 66878e25..653a9ba0 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,18 @@ asyncapi generate fromTemplate document.yaml @asyncapi/java-spring-cloud-stream- npx @asyncapi/generator document.yaml @asyncapi/java-spring-cloud-stream-template ``` +#### Debug Logging Examples + +**Enable Debug with -debug flag:** +```bash +npx @asyncapi/generator -debug ~/AsyncApiDocument.yaml @asyncapi/java-spring-cloud-stream-template +``` + +**Enable Debug with Environment Variable:** +```bash +DEBUG=true npx @asyncapi/generator ~/AsyncApiDocument.yaml @asyncapi/java-spring-cloud-stream-template +``` + ## Configuration Options Please note that none of the parameters or specification extensions is required. All parameters have defaults as documented below. From 19042022c28636b1aedad0180891dc226ae23cbb Mon Sep 17 00:00:00 2001 From: Giri Venkatesan Date: Mon, 15 Dec 2025 09:47:44 +0530 Subject: [PATCH 4/6] Handled a case where the operationID contains curly-braces {} --- .gitignore | 1 + test/compile_output.sh | 50 ++++++++++++++++++++++++++++------------- test/generate_output.sh | 14 +++++++++--- utils/typeUtils.js | 39 +++++++++++++++++++++++++------- 4 files changed, 78 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index 9181fff1..f3fa3223 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ coverage **/.vscode __transpiled **/__transpiled +samples/ diff --git a/test/compile_output.sh b/test/compile_output.sh index 659f1e15..e54f9092 100755 --- a/test/compile_output.sh +++ b/test/compile_output.sh @@ -75,8 +75,6 @@ if [ ! -d "$OUTPUT_DIR" ]; then exit 1 fi -cd "$OUTPUT_DIR" - # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' @@ -84,26 +82,48 @@ YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color +# Resolve SPECIFIED_PROJECT to absolute path BEFORE changing directory if [ -n "$SPECIFIED_PROJECT" ]; then - # Check if the specified project exists and has pom.xml - if [ ! -d "$SPECIFIED_PROJECT" ]; then - echo -e "${RED}Error: Project directory '$SPECIFIED_PROJECT' not found in output directory!${NC}" - echo -e "${YELLOW}Available projects in $OUTPUT_DIR:${NC}" - for folder in */; do - folder_name="${folder%/}" - if [ -f "$folder_name/pom.xml" ]; then - echo " - $folder_name (Maven project)" - else - echo " - $folder_name (non-Maven folder)" - fi - done - exit 1 + # Check if it's a path (contains /) or just a project name + if [[ "$SPECIFIED_PROJECT" == */* ]]; then + # It's a path - check if it exists from current directory + if [ ! -d "$SPECIFIED_PROJECT" ]; then + echo -e "${RED}Error: Project directory '$SPECIFIED_PROJECT' not found!${NC}" + exit 1 + fi + # Convert to absolute path if it's a relative path + if [[ "$SPECIFIED_PROJECT" != /* ]]; then + SPECIFIED_PROJECT="$(cd "$SPECIFIED_PROJECT" && pwd)" + fi + else + # It's just a project name - check in OUTPUT_DIR + if [ ! -d "$OUTPUT_DIR/$SPECIFIED_PROJECT" ]; then + echo -e "${RED}Error: Project directory '$SPECIFIED_PROJECT' not found in output directory!${NC}" + echo -e "${YELLOW}Available projects in $OUTPUT_DIR:${NC}" + cd "$OUTPUT_DIR" + for folder in */; do + folder_name="${folder%/}" + if [ -f "$folder_name/pom.xml" ]; then + echo " - $folder_name (Maven project)" + else + echo " - $folder_name (non-Maven folder)" + fi + done + exit 1 + fi + # Convert to absolute path + SPECIFIED_PROJECT="$OUTPUT_DIR/$SPECIFIED_PROJECT" fi if [ ! -f "$SPECIFIED_PROJECT/pom.xml" ]; then echo -e "${RED}Error: Project '$SPECIFIED_PROJECT' does not contain a pom.xml file!${NC}" exit 1 fi +fi + +cd "$OUTPUT_DIR" + +if [ -n "$SPECIFIED_PROJECT" ]; then echo -e "${BLUE}=== Maven Compilation Script ===${NC}" echo -e "${BLUE}Compiling specific project: $SPECIFIED_PROJECT${NC}" diff --git a/test/generate_output.sh b/test/generate_output.sh index ea1f58ed..83a5358d 100755 --- a/test/generate_output.sh +++ b/test/generate_output.sh @@ -110,14 +110,22 @@ YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color -cd "$SCRIPT_DIR" - +# Resolve SPECIFIED_FILE to absolute path BEFORE changing directory if [ -n "$SPECIFIED_FILE" ]; then - # Check if the specified file exists (can be any path) + # Check if the specified file exists (relative to current working directory) if [ ! -f "$SPECIFIED_FILE" ]; then echo -e "${RED}Error: File '$SPECIFIED_FILE' not found!${NC}" exit 1 fi + # Convert to absolute path if it's a relative path + if [[ "$SPECIFIED_FILE" != /* ]]; then + SPECIFIED_FILE="$(cd "$(dirname "$SPECIFIED_FILE")" && pwd)/$(basename "$SPECIFIED_FILE")" + fi +fi + +cd "$SCRIPT_DIR" + +if [ -n "$SPECIFIED_FILE" ]; then # Get just the filename for processing (without path) FILENAME=$(basename "$SPECIFIED_FILE") diff --git a/utils/typeUtils.js b/utils/typeUtils.js index 65bddcf4..69b83e57 100644 --- a/utils/typeUtils.js +++ b/utils/typeUtils.js @@ -233,26 +233,49 @@ function getSchemaType(schema) { /** * Convert string to PascalCase for class names + * Handles various separators including slashes, dots, braces, underscores, hyphens, and whitespace */ function toPascalCase(str) { - logger.debug('ModelClass.js: toPascalCase() - Converting string to PascalCase'); + logger.debug('typeUtils.js: toPascalCase() - Converting string to PascalCase'); if (!str) return ''; - // Remove special characters and convert to PascalCase - return str.replace(/(^|_|\-|\s)(\w)/g, (_, __, c) => c ? c.toUpperCase() : '') - .replace(/^[a-z]/, c => c.toUpperCase()); + // First, remove curly braces (used in path parameters like {userId}) + let cleaned = str.replace(/[{}]/g, ''); + + // Split by any non-alphanumeric character (slashes, dots, underscores, hyphens, whitespace, etc.) + const segments = cleaned.split(/[^a-zA-Z0-9]+/); + + // Convert each segment to PascalCase and join + return segments + .filter(segment => segment.length > 0) + .map(segment => segment.charAt(0).toUpperCase() + segment.slice(1)) + .join(''); } /** * Convert string to camelCase for field names + * Handles various separators including slashes, dots, braces, underscores, hyphens, and whitespace */ function toCamelCase(str) { - logger.debug('ModelClass.js: toCamelCase() - Converting string to camelCase'); + logger.debug('typeUtils.js: toCamelCase() - Converting string to camelCase'); if (!str) return ''; - // Remove special characters and convert to camelCase - return str.replace(/(^|_|\-|\s)(\w)/g, (_, __, c) => c ? c.toUpperCase() : '') - .replace(/^[A-Z]/, c => c.toLowerCase()); + // First, remove curly braces (used in path parameters like {userId}) + let cleaned = str.replace(/[{}]/g, ''); + + // Split by any non-alphanumeric character (slashes, dots, underscores, hyphens, whitespace, etc.) + const segments = cleaned.split(/[^a-zA-Z0-9]+/); + + // Convert to camelCase: first segment lowercase, rest PascalCase + return segments + .filter(segment => segment.length > 0) + .map((segment, index) => { + if (index === 0) { + return segment.charAt(0).toLowerCase() + segment.slice(1); + } + return segment.charAt(0).toUpperCase() + segment.slice(1); + }) + .join(''); } /** From 7e20907d2dc97f962bf3d9a41f62b162be59b1ac Mon Sep 17 00:00:00 2001 From: Giri Venkatesan Date: Mon, 26 Jan 2026 17:19:49 +0530 Subject: [PATCH 5/6] fix: resolve eslint errors for upstream PR compatibility - Add missing toJavaClassName import in ApplicationYml.js - Fix duplicate 'properties' key in avroProcessor.js (renamed to propertiesArray) - Move ModelClass definition before SchemaModel to fix use-before-define - Refactor nested ternary expressions into helper functions - Fix brace-style issues (else-if on same line) - Fix lonely-if by converting to else-if chain - Add radix parameter to parseInt() - Prefix intentionally unused variables with underscore - Remove unused destructured variables in coreProcessor.js - Update .eslintrc to ignore vars/args prefixed with underscore - Add .eslintignore to exclude build artifacts --- .eslintignore | 4 + .eslintrc | 2 +- components/Application.js | 740 ++++++++++++------------- components/ApplicationYml.js | 137 ++--- components/ModelClass.js | 140 +++-- components/PomXml.js | 73 +-- components/Readme.js | 301 +++++----- hooks/post-process.js | 23 +- hooks/pre-process.js | 21 +- template/index.js | 19 +- test/generate_code_for_mocks.js | 12 +- test/integration.test.js | 1 - utils/avroProcessor/avroProcessor.js | 233 ++++---- utils/avroProcessor/avroSchemaModel.js | 150 ++--- utils/avroProcessor/index.js | 63 ++- utils/coreProcessor.js | 117 ++-- utils/functionUtils.js | 181 +++--- utils/jsonProcessor/index.js | 100 ++-- utils/jsonProcessor/jsonProcessor.js | 40 +- utils/jsonProcessor/jsonSchemaModel.js | 132 +++-- utils/typeUtils.js | 7 +- 21 files changed, 1228 insertions(+), 1268 deletions(-) create mode 100644 .eslintignore diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..1e8bbee3 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +__transpiled/ +node_modules/ +test/output/ +test/temp/ diff --git a/.eslintrc b/.eslintrc index 400bf9d5..0d04da2c 100644 --- a/.eslintrc +++ b/.eslintrc @@ -40,7 +40,7 @@ rules: no-empty-character-class: 2 no-self-compare: 2 valid-typeof: 2 - no-unused-vars: [2, { "args": "none" }] + no-unused-vars: [2, { "args": "none", "varsIgnorePattern": "^_", "argsIgnorePattern": "^_" }] handle-callback-err: 2 no-shadow-restricted-names: 2 no-new-require: 2 diff --git a/components/Application.js b/components/Application.js index 2dead9b5..20842be3 100644 --- a/components/Application.js +++ b/components/Application.js @@ -14,7 +14,7 @@ function toMethodName(str) { if (!str) return ''; // Remove curly braces first - let cleaned = str.replace(/([{}])/g, ''); + const cleaned = str.replace(/([{}])/g, ''); // Split by slashes to handle channel path structure const segments = cleaned.split('/'); @@ -52,7 +52,7 @@ function toParameterName(str) { if (!str) return ''; // Remove curly braces first - let cleaned = str.replace(/([{}])/g, ''); + const cleaned = str.replace(/([{}])/g, ''); // Convert to proper camelCase (e.g., 'userId' -> 'userId', 'orderID' -> 'orderId') // Handle cases where we have consecutive uppercase letters anywhere in the string @@ -77,37 +77,37 @@ function getInitializationValue(payloadType) { } switch (payloadType) { - case 'String': - return '""'; - case 'Integer': - return '0'; - case 'Long': - return '0L'; - case 'Float': - return '0.0f'; - case 'Double': - return '0.0'; - case 'Boolean': - return 'false'; - case 'java.time.OffsetDateTime': - return 'java.time.OffsetDateTime.now()'; - case 'java.time.LocalDate': - return 'java.time.LocalDate.now()'; - case 'java.time.LocalTime': - return 'java.time.LocalTime.now()'; - case 'java.time.LocalDateTime': - return 'java.time.LocalDateTime.now()'; - case 'java.time.Instant': - return 'java.time.Instant.now()'; - case 'java.math.BigDecimal': - return 'java.math.BigDecimal.ZERO'; - case 'byte[]': - return 'new byte[0]'; - case 'Object': - return 'new Object()'; - default: - // For complex types, use constructor - return `new ${payloadType}()`; + case 'String': + return '""'; + case 'Integer': + return '0'; + case 'Long': + return '0L'; + case 'Float': + return '0.0f'; + case 'Double': + return '0.0'; + case 'Boolean': + return 'false'; + case 'java.time.OffsetDateTime': + return 'java.time.OffsetDateTime.now()'; + case 'java.time.LocalDate': + return 'java.time.LocalDate.now()'; + case 'java.time.LocalTime': + return 'java.time.LocalTime.now()'; + case 'java.time.LocalDateTime': + return 'java.time.LocalDateTime.now()'; + case 'java.time.Instant': + return 'java.time.Instant.now()'; + case 'java.math.BigDecimal': + return 'java.math.BigDecimal.ZERO'; + case 'byte[]': + return 'new byte[0]'; + case 'Object': + return 'new Object()'; + default: + // For complex types, use constructor + return `new ${payloadType}()`; } } @@ -137,7 +137,7 @@ function Application({ asyncapi, params, processedData }) { // Package declaration elements.push(React.createElement(Text, null, `package ${packageName};`)); - elements.push(React.createElement(Text, null, "")); + elements.push(React.createElement(Text, null, '')); // Build imports dynamically based on what's actually used const usedImports = new Set(); @@ -149,39 +149,39 @@ function Application({ asyncapi, params, processedData }) { if (supplierFunctions.length > 0) usedImports.add('java.util.function.Supplier'); if (functionFunctions.length > 0) usedImports.add('java.util.function.Function'); if (consumerFunctions.length > 0 || supplierFunctions.length > 0 || functionFunctions.length > 0) { - usedImports.add('org.springframework.context.annotation.Bean'); + usedImports.add('org.springframework.context.annotation.Bean'); - // Only add Message import if functions actually use Message types - const usesMessageTypes = funcs.some(f => - f.publishPayload === 'Message' || + // Only add Message import if functions actually use Message types + const usesMessageTypes = funcs.some(f => + f.publishPayload === 'Message' || f.subscribePayload === 'Message' || f.publishPayload === 'Message' || f.subscribePayload === 'Message' || (f.publishPayload && f.publishPayload.startsWith('Message<')) || (f.subscribePayload && f.subscribePayload.startsWith('Message<')) || f.hasEnumParameters - ); - if (usesMessageTypes) { - usedImports.add('org.springframework.messaging.Message'); - } + ); + if (usesMessageTypes) { + usedImports.add('org.springframework.messaging.Message'); + } - // Add MessageBuilder import if we have Message payload types - if (funcs.some(f => f.publishPayload === 'Message' || f.subscribePayload === 'Message')) { - usedImports.add('org.springframework.messaging.support.MessageBuilder'); - } + // Add MessageBuilder import if we have Message payload types + if (funcs.some(f => f.publishPayload === 'Message' || f.subscribePayload === 'Message')) { + usedImports.add('org.springframework.messaging.support.MessageBuilder'); + } } if (sendFunctions.length > 0 || funcs.some(f => f.dynamic)) { - if (params.dynamicType === 'streamBridge') { - usedImports.add('org.springframework.beans.factory.annotation.Autowired'); - usedImports.add('org.springframework.cloud.stream.function.StreamBridge'); - } else { - // For header mode, we still need StreamBridge and Message imports - usedImports.add('org.springframework.beans.factory.annotation.Autowired'); - usedImports.add('org.springframework.cloud.stream.function.StreamBridge'); - usedImports.add('org.springframework.cloud.stream.binder.BinderHeaders'); - usedImports.add('org.springframework.messaging.Message'); - usedImports.add('org.springframework.messaging.support.MessageBuilder'); - } + if (params.dynamicType === 'streamBridge') { + usedImports.add('org.springframework.beans.factory.annotation.Autowired'); + usedImports.add('org.springframework.cloud.stream.function.StreamBridge'); + } else { + // For header mode, we still need StreamBridge and Message imports + usedImports.add('org.springframework.beans.factory.annotation.Autowired'); + usedImports.add('org.springframework.cloud.stream.function.StreamBridge'); + usedImports.add('org.springframework.cloud.stream.binder.BinderHeaders'); + usedImports.add('org.springframework.messaging.Message'); + usedImports.add('org.springframework.messaging.support.MessageBuilder'); + } } // Add Arrays import if we have enum validation (in send functions or consumer functions) @@ -215,323 +215,323 @@ function Application({ asyncapi, params, processedData }) { usedImports.add('org.springframework.messaging.support.MessageBuilder'); } if (params.reactive === true || params.reactive === 'true') { - usedImports.add('reactor.core.publisher.Flux'); + usedImports.add('reactor.core.publisher.Flux'); } // Add imports in the correct order (matching reference) const importOrder = [ - 'java.util.Arrays', - 'java.util.List', - 'java.util.function.Consumer', - 'java.util.function.Supplier', - 'java.util.function.Function', - 'org.slf4j.Logger', - 'org.slf4j.LoggerFactory', - 'org.springframework.beans.factory.annotation.Autowired', - 'org.springframework.boot.SpringApplication', - 'org.springframework.boot.autoconfigure.SpringBootApplication', - 'org.springframework.cloud.stream.function.StreamBridge', - 'org.springframework.cloud.stream.binder.BinderHeaders', - 'org.springframework.context.annotation.Bean', - 'org.springframework.messaging.Message', - 'org.springframework.messaging.support.MessageBuilder', - 'reactor.core.publisher.Flux' + 'java.util.Arrays', + 'java.util.List', + 'java.util.function.Consumer', + 'java.util.function.Supplier', + 'java.util.function.Function', + 'org.slf4j.Logger', + 'org.slf4j.LoggerFactory', + 'org.springframework.beans.factory.annotation.Autowired', + 'org.springframework.boot.SpringApplication', + 'org.springframework.boot.autoconfigure.SpringBootApplication', + 'org.springframework.cloud.stream.function.StreamBridge', + 'org.springframework.cloud.stream.binder.BinderHeaders', + 'org.springframework.context.annotation.Bean', + 'org.springframework.messaging.Message', + 'org.springframework.messaging.support.MessageBuilder', + 'reactor.core.publisher.Flux' ]; const addedImports = new Set(); importOrder.forEach(importName => { - if (usedImports.has(importName) && !addedImports.has(importName)) { - elements.push(React.createElement(Text, null, `import ${importName};`)); - addedImports.add(importName); - } + if (usedImports.has(importName) && !addedImports.has(importName)) { + elements.push(React.createElement(Text, null, `import ${importName};`)); + addedImports.add(importName); + } }); if (extraIncludes && extraIncludes.length > 0) { - extraIncludes.forEach(include => { - // Filter out JsonProperty import as it's not needed in Application.java - if (!include.includes('JsonProperty')) { - elements.push(React.createElement(Text, null, `import ${include};`)); - } - }); + extraIncludes.forEach(include => { + // Filter out JsonProperty import as it's not needed in Application.java + if (!include.includes('JsonProperty')) { + elements.push(React.createElement(Text, null, `import ${include};`)); + } + }); } // Add schema imports (for Avro namespaces, etc.) if (imports && imports.length > 0) { - imports.forEach(importName => { - // Filter out JsonProperty import as it's not needed in Application.java - if (!importName.includes('JsonProperty') && !addedImports.has(importName)) { - elements.push(React.createElement(Text, null, `import ${importName};`)); - addedImports.add(importName); - } - }); + imports.forEach(importName => { + // Filter out JsonProperty import as it's not needed in Application.java + if (!importName.includes('JsonProperty') && !addedImports.has(importName)) { + elements.push(React.createElement(Text, null, `import ${importName};`)); + addedImports.add(importName); + } + }); } - elements.push(React.createElement(Text, null, "")); - elements.push(React.createElement(Text, null, "@SpringBootApplication")); - elements.push(React.createElement(Text, null, "public class Application {")); - elements.push(React.createElement(Text, null, " private static final Logger logger = LoggerFactory.getLogger(Application.class);")); - elements.push(React.createElement(Text, null, "")); + elements.push(React.createElement(Text, null, '')); + elements.push(React.createElement(Text, null, '@SpringBootApplication')); + elements.push(React.createElement(Text, null, 'public class Application {')); + elements.push(React.createElement(Text, null, ' private static final Logger logger = LoggerFactory.getLogger(Application.class);')); + elements.push(React.createElement(Text, null, '')); // Add StreamBridge field for send methods or dynamic functions if (sendFunctions.length > 0 || funcs.some(f => f.dynamic)) { - // StreamBridge is needed for both streamBridge and header modes - elements.push(React.createElement(Text, null, " @Autowired")); - elements.push(React.createElement(Text, null, " private StreamBridge streamBridge;")); - elements.push(React.createElement(Text, null, "")); + // StreamBridge is needed for both streamBridge and header modes + elements.push(React.createElement(Text, null, ' @Autowired')); + elements.push(React.createElement(Text, null, ' private StreamBridge streamBridge;')); + elements.push(React.createElement(Text, null, '')); } - elements.push(React.createElement(Text, null, " public static void main(String[] args) {")); - elements.push(React.createElement(Text, null, " SpringApplication.run(Application.class);")); - elements.push(React.createElement(Text, null, " }")); + elements.push(React.createElement(Text, null, ' public static void main(String[] args) {')); + elements.push(React.createElement(Text, null, ' SpringApplication.run(Application.class);')); + elements.push(React.createElement(Text, null, ' }')); // Generate function beans funcs.forEach(func => { - if (func.type === 'send') return; + if (func.type === 'send') return; - const payloadType = func.subscribePayload || func.publishPayload || 'Object'; + const _payloadType = func.subscribePayload || func.publishPayload || 'Object'; - // Add multiple message comment if present - if (func.multipleMessageComment) { - const commentLines = func.multipleMessageComment.split('\n'); - commentLines.forEach(line => { - if (line.trim()) { - elements.push(React.createElement(Text, null, ` ${line}`)); - } - }); - } - elements.push(React.createElement(Text, null, " @Bean")); + // Add multiple message comment if present + if (func.multipleMessageComment) { + const commentLines = func.multipleMessageComment.split('\n'); + commentLines.forEach(line => { + if (line.trim()) { + elements.push(React.createElement(Text, null, ` ${line}`)); + } + }); + } + elements.push(React.createElement(Text, null, ' @Bean')); - // Generate function signature with fallback logic - let functionSignature = func.functionSignature; - if (!functionSignature) { - // Fallback: generate function signature based on type and properties - // Use correct precedence: for consumers prioritize subscribePayload, for suppliers prioritize publishPayload - const payloadType = func.type === 'consumer' - ? (func.subscribePayload || func.publishPayload || 'Object') - : (func.publishPayload || func.subscribePayload || 'Object'); + // Generate function signature with fallback logic + let functionSignature = func.functionSignature; + if (!functionSignature) { + // Fallback: generate function signature based on type and properties + // Use correct precedence: for consumers prioritize subscribePayload, for suppliers prioritize publishPayload + const payloadType = func.type === 'consumer' + ? (func.subscribePayload || func.publishPayload || 'Object') + : (func.publishPayload || func.subscribePayload || 'Object'); - if (func.type === 'supplier') { - if (func.dynamic && func.reactive) { - functionSignature = `public Supplier>> ${func.name}()`; - } else if (func.reactive) { - functionSignature = `public Supplier> ${func.name}()`; - } else { - functionSignature = `public Supplier<${payloadType}> ${func.name}()`; - } - } else if (func.type === 'consumer') { - if (func.reactive) { - functionSignature = `public Consumer> ${func.name}()`; - } else if (func.dynamic && func.parametersToHeaders) { - // Use Consumer> when parametersToHeaders is true and function is dynamic - functionSignature = `public Consumer> ${func.name}()`; - } else if (func.hasEnumParameters) { - // SAFE CHANGE: Use Consumer> when channel has enum parameters for better parameter access - if (payloadType === 'Message' || payloadType === 'Message') { - // FIX: Handle the case where payloadType is already Message to avoid double-wrapping - functionSignature = `public Consumer> ${func.name}()`; - } else { - functionSignature = `public Consumer> ${func.name}()`; - } - } else if (payloadType === 'Message' || payloadType === 'Message') { + if (func.type === 'supplier') { + if (func.dynamic && func.reactive) { + functionSignature = `public Supplier>> ${func.name}()`; + } else if (func.reactive) { + functionSignature = `public Supplier> ${func.name}()`; + } else { + functionSignature = `public Supplier<${payloadType}> ${func.name}()`; + } + } else if (func.type === 'consumer') { + if (func.reactive) { + functionSignature = `public Consumer> ${func.name}()`; + } else if (func.dynamic && func.parametersToHeaders) { + // Use Consumer> when parametersToHeaders is true and function is dynamic + functionSignature = `public Consumer> ${func.name}()`; + } else if (func.hasEnumParameters) { + // SAFE CHANGE: Use Consumer> when channel has enum parameters for better parameter access + if (payloadType === 'Message' || payloadType === 'Message') { // FIX: Handle the case where payloadType is already Message to avoid double-wrapping functionSignature = `public Consumer> ${func.name}()`; } else { - functionSignature = `public Consumer<${payloadType}> ${func.name}()`; - } - } else if (func.type === 'function') { - const inputType = func.subscribePayload || 'Object'; - const outputType = func.publishPayload || func.messageName || 'Object'; - if (func.reactive) { - functionSignature = `public Function, Flux<${outputType}>> ${func.name}()`; - } else { - functionSignature = `public Function<${inputType}, ${outputType}> ${func.name}()`; + functionSignature = `public Consumer> ${func.name}()`; } + } else if (payloadType === 'Message' || payloadType === 'Message') { + // FIX: Handle the case where payloadType is already Message to avoid double-wrapping + functionSignature = `public Consumer> ${func.name}()`; + } else { + functionSignature = `public Consumer<${payloadType}> ${func.name}()`; + } + } else if (func.type === 'function') { + const inputType = func.subscribePayload || 'Object'; + const outputType = func.publishPayload || func.messageName || 'Object'; + if (func.reactive) { + functionSignature = `public Function, Flux<${outputType}>> ${func.name}()`; } else { - functionSignature = `public Object ${func.name || 'unknownFunction'}()`; + functionSignature = `public Function<${inputType}, ${outputType}> ${func.name}()`; } + } else { + functionSignature = `public Object ${func.name || 'unknownFunction'}()`; } + } - elements.push(React.createElement(Text, null, ` ${functionSignature} {`)); - // Function body - if (func.type === 'supplier') { - if (func.reactive) { - // Reactive supplier returns Flux - elements.push(React.createElement(Text, null, " return () -> {")); - elements.push(React.createElement(Text, null, " // Add business logic here.")); - elements.push(React.createElement(Text, null, " // Return a Flux stream")); - const payloadType = func.publishPayload || 'Object'; - if (payloadType === 'Message' || payloadType === 'Message') { - elements.push(React.createElement(Text, null, " // Create sample payload - replace with actual business logic")); - elements.push(React.createElement(Text, null, " Object payload = new Object(); // TODO: Replace with actual message payload")); - elements.push(React.createElement(Text, null, " return Flux.just(MessageBuilder.withPayload(payload).build());")); - } else { - const initValue = getInitializationValue(payloadType); - elements.push(React.createElement(Text, null, ` ${payloadType} payload = ${initValue};`)); - if (func.dynamic) { - elements.push(React.createElement(Text, null, " return Flux.just(MessageBuilder.withPayload(payload).build());")); - } else { - elements.push(React.createElement(Text, null, " return Flux.just(payload);")); - } - } - elements.push(React.createElement(Text, null, " };")); + elements.push(React.createElement(Text, null, ` ${functionSignature} {`)); + // Function body + if (func.type === 'supplier') { + if (func.reactive) { + // Reactive supplier returns Flux + elements.push(React.createElement(Text, null, ' return () -> {')); + elements.push(React.createElement(Text, null, ' // Add business logic here.')); + elements.push(React.createElement(Text, null, ' // Return a Flux stream')); + const payloadType = func.publishPayload || 'Object'; + if (payloadType === 'Message' || payloadType === 'Message') { + elements.push(React.createElement(Text, null, ' // Create sample payload - replace with actual business logic')); + elements.push(React.createElement(Text, null, ' Object payload = new Object(); // TODO: Replace with actual message payload')); + elements.push(React.createElement(Text, null, ' return Flux.just(MessageBuilder.withPayload(payload).build());')); + } else { + const initValue = getInitializationValue(payloadType); + elements.push(React.createElement(Text, null, ` ${payloadType} payload = ${initValue};`)); + if (func.dynamic) { + elements.push(React.createElement(Text, null, ' return Flux.just(MessageBuilder.withPayload(payload).build());')); } else { - // Non-reactive supplier - elements.push(React.createElement(Text, null, " return () -> {")); - elements.push(React.createElement(Text, null, " // Add business logic here.")); - // Create proper message with payload - const payloadType = func.publishPayload || 'Object'; - // Handle Message type specially - create a default payload object - if (payloadType === 'Message' || payloadType === 'Message') { - elements.push(React.createElement(Text, null, " // Create sample payload - replace with actual business logic")); - elements.push(React.createElement(Text, null, " Object payload = new Object(); // TODO: Replace with actual message payload")); - // For Message types, always wrap in MessageBuilder - elements.push(React.createElement(Text, null, " return MessageBuilder.withPayload(payload).build();")); - } else { - const initValue = getInitializationValue(payloadType); - elements.push(React.createElement(Text, null, ` ${payloadType} payload = ${initValue};`)); - // For specific types, return payload directly (unless dynamic) - if (func.dynamic) { - elements.push(React.createElement(Text, null, " return MessageBuilder.withPayload(payload).build();")); - } else { - elements.push(React.createElement(Text, null, " return payload;")); - } - } - elements.push(React.createElement(Text, null, " };")); + elements.push(React.createElement(Text, null, ' return Flux.just(payload);')); } - } else if (func.type === 'consumer') { - if (func.reactive) { - // Reactive consumer handles Flux - elements.push(React.createElement(Text, null, " return flux -> {")); - elements.push(React.createElement(Text, null, " // Add business logic here.")); - elements.push(React.createElement(Text, null, " // Process each item in the Flux stream")); - elements.push(React.createElement(Text, null, " flux.doOnNext(data -> {")); - elements.push(React.createElement(Text, null, " logger.info(data.toString());")); - elements.push(React.createElement(Text, null, " // Add your processing logic here")); - elements.push(React.createElement(Text, null, " }).subscribe();")); - elements.push(React.createElement(Text, null, " };")); - } else if (func.dynamic && func.parametersToHeaders) { - // When using Consumer>, parameter is 'message' and payload is extracted - elements.push(React.createElement(Text, null, " return message -> {")); - elements.push(React.createElement(Text, null, " // Add business logic here.")); - elements.push(React.createElement(Text, null, " // Extract payload from message")); - const payloadType = func.subscribePayload || 'Object'; - elements.push(React.createElement(Text, null, ` ${payloadType} data = message.getPayload();`)); - elements.push(React.createElement(Text, null, " // Access channel parameters from message headers if needed")); - elements.push(React.createElement(Text, null, " // Example: String param = (String) message.getHeaders().get(\"paramName\");")); - elements.push(React.createElement(Text, null, " logger.info(data.toString());")); - elements.push(React.createElement(Text, null, " };")); - } else if (func.hasEnumParameters) { - // SAFE CHANGE: Handle Message for enum parameters - elements.push(React.createElement(Text, null, " return message -> {")); - elements.push(React.createElement(Text, null, " // Extract payload from message")); - // FIX: When subscribePayload is Message, extract as Object to avoid double-wrapping - const payloadType = (func.subscribePayload === 'Message' || func.subscribePayload === 'Message') - ? 'Object' - : (func.subscribePayload || 'Object'); - elements.push(React.createElement(Text, null, ` ${payloadType} data = message.getPayload();`)); - - // Add parameter extraction and validation for enum parameters (only for Solace binder) - if (params.binder === 'solace') { - const consumerValidationCode = generateConsumerParameterValidation(func); - if (consumerValidationCode.length > 0) { - elements.push(React.createElement(Text, null, " // Extract and validate topic parameters from solace_destination header")); - elements.push(React.createElement(Text, null, " // This validation ensures topic parameters match the generated enum constants")); - elements.push(React.createElement(Text, null, " // Note: This is specific to Solace binder - solace_destination header contains the topic path")); - consumerValidationCode.forEach(line => { - elements.push(React.createElement(Text, null, ` ${line}`)); - }); - elements.push(React.createElement(Text, null, "")); - } - } - - elements.push(React.createElement(Text, null, " // Add business logic here.")); - elements.push(React.createElement(Text, null, " logger.info(data.toString());")); - elements.push(React.createElement(Text, null, " };")); - } else if (func.subscribePayload === 'Message' || func.subscribePayload === 'Message') { - // FIX: Handle the case where subscribePayload is already Message to avoid double payload extraction - elements.push(React.createElement(Text, null, " return message -> {")); - elements.push(React.createElement(Text, null, " // Extract payload from message")); - elements.push(React.createElement(Text, null, " Object data = message.getPayload();")); - elements.push(React.createElement(Text, null, " // Add business logic here.")); - elements.push(React.createElement(Text, null, " logger.info(data.toString());")); - elements.push(React.createElement(Text, null, " };")); + } + elements.push(React.createElement(Text, null, ' };')); + } else { + // Non-reactive supplier + elements.push(React.createElement(Text, null, ' return () -> {')); + elements.push(React.createElement(Text, null, ' // Add business logic here.')); + // Create proper message with payload + const payloadType = func.publishPayload || 'Object'; + // Handle Message type specially - create a default payload object + if (payloadType === 'Message' || payloadType === 'Message') { + elements.push(React.createElement(Text, null, ' // Create sample payload - replace with actual business logic')); + elements.push(React.createElement(Text, null, ' Object payload = new Object(); // TODO: Replace with actual message payload')); + // For Message types, always wrap in MessageBuilder + elements.push(React.createElement(Text, null, ' return MessageBuilder.withPayload(payload).build();')); + } else { + const initValue = getInitializationValue(payloadType); + elements.push(React.createElement(Text, null, ` ${payloadType} payload = ${initValue};`)); + // For specific types, return payload directly (unless dynamic) + if (func.dynamic) { + elements.push(React.createElement(Text, null, ' return MessageBuilder.withPayload(payload).build();')); } else { - elements.push(React.createElement(Text, null, " return data -> {")); - elements.push(React.createElement(Text, null, " // Add business logic here.")); - elements.push(React.createElement(Text, null, " logger.info(data.toString());")); - elements.push(React.createElement(Text, null, " };")); + elements.push(React.createElement(Text, null, ' return payload;')); } - } else if (func.type === 'function') { - elements.push(React.createElement(Text, null, " return data -> {")); - elements.push(React.createElement(Text, null, " // Add business logic here.")); - elements.push(React.createElement(Text, null, " logger.info(data.toString());")); - const payloadType = func.publishPayload || 'Object'; - // Handle Message type specially - cannot instantiate directly - if (payloadType === 'Message' || payloadType === 'Message') { - elements.push(React.createElement(Text, null, " // Process input data and create response")); - elements.push(React.createElement(Text, null, " // TODO: Replace with actual business logic to generate output data")); - elements.push(React.createElement(Text, null, " Object payload = data.getPayload();")); - elements.push(React.createElement(Text, null, " return MessageBuilder.withPayload(payload).build();")); - } else { - elements.push(React.createElement(Text, null, " // Process input data and return response")); - elements.push(React.createElement(Text, null, " // TODO: Replace with actual business logic to generate output data")); - elements.push(React.createElement(Text, null, ` ${payloadType} payload = new ${payloadType}();`)); - elements.push(React.createElement(Text, null, " return payload;")); + } + elements.push(React.createElement(Text, null, ' };')); + } + } else if (func.type === 'consumer') { + if (func.reactive) { + // Reactive consumer handles Flux + elements.push(React.createElement(Text, null, ' return flux -> {')); + elements.push(React.createElement(Text, null, ' // Add business logic here.')); + elements.push(React.createElement(Text, null, ' // Process each item in the Flux stream')); + elements.push(React.createElement(Text, null, ' flux.doOnNext(data -> {')); + elements.push(React.createElement(Text, null, ' logger.info(data.toString());')); + elements.push(React.createElement(Text, null, ' // Add your processing logic here')); + elements.push(React.createElement(Text, null, ' }).subscribe();')); + elements.push(React.createElement(Text, null, ' };')); + } else if (func.dynamic && func.parametersToHeaders) { + // When using Consumer>, parameter is 'message' and payload is extracted + elements.push(React.createElement(Text, null, ' return message -> {')); + elements.push(React.createElement(Text, null, ' // Add business logic here.')); + elements.push(React.createElement(Text, null, ' // Extract payload from message')); + const payloadType = func.subscribePayload || 'Object'; + elements.push(React.createElement(Text, null, ` ${payloadType} data = message.getPayload();`)); + elements.push(React.createElement(Text, null, ' // Access channel parameters from message headers if needed')); + elements.push(React.createElement(Text, null, ' // Example: String param = (String) message.getHeaders().get("paramName");')); + elements.push(React.createElement(Text, null, ' logger.info(data.toString());')); + elements.push(React.createElement(Text, null, ' };')); + } else if (func.hasEnumParameters) { + // SAFE CHANGE: Handle Message for enum parameters + elements.push(React.createElement(Text, null, ' return message -> {')); + elements.push(React.createElement(Text, null, ' // Extract payload from message')); + // FIX: When subscribePayload is Message, extract as Object to avoid double-wrapping + const payloadType = (func.subscribePayload === 'Message' || func.subscribePayload === 'Message') + ? 'Object' + : (func.subscribePayload || 'Object'); + elements.push(React.createElement(Text, null, ` ${payloadType} data = message.getPayload();`)); + + // Add parameter extraction and validation for enum parameters (only for Solace binder) + if (params.binder === 'solace') { + const consumerValidationCode = generateConsumerParameterValidation(func); + if (consumerValidationCode.length > 0) { + elements.push(React.createElement(Text, null, ' // Extract and validate topic parameters from solace_destination header')); + elements.push(React.createElement(Text, null, ' // This validation ensures topic parameters match the generated enum constants')); + elements.push(React.createElement(Text, null, ' // Note: This is specific to Solace binder - solace_destination header contains the topic path')); + consumerValidationCode.forEach(line => { + elements.push(React.createElement(Text, null, ` ${line}`)); + }); + elements.push(React.createElement(Text, null, '')); } - elements.push(React.createElement(Text, null, " };")); + } + + elements.push(React.createElement(Text, null, ' // Add business logic here.')); + elements.push(React.createElement(Text, null, ' logger.info(data.toString());')); + elements.push(React.createElement(Text, null, ' };')); + } else if (func.subscribePayload === 'Message' || func.subscribePayload === 'Message') { + // FIX: Handle the case where subscribePayload is already Message to avoid double payload extraction + elements.push(React.createElement(Text, null, ' return message -> {')); + elements.push(React.createElement(Text, null, ' // Extract payload from message')); + elements.push(React.createElement(Text, null, ' Object data = message.getPayload();')); + elements.push(React.createElement(Text, null, ' // Add business logic here.')); + elements.push(React.createElement(Text, null, ' logger.info(data.toString());')); + elements.push(React.createElement(Text, null, ' };')); + } else { + elements.push(React.createElement(Text, null, ' return data -> {')); + elements.push(React.createElement(Text, null, ' // Add business logic here.')); + elements.push(React.createElement(Text, null, ' logger.info(data.toString());')); + elements.push(React.createElement(Text, null, ' };')); } - elements.push(React.createElement(Text, null, " }")); + } else if (func.type === 'function') { + elements.push(React.createElement(Text, null, ' return data -> {')); + elements.push(React.createElement(Text, null, ' // Add business logic here.')); + elements.push(React.createElement(Text, null, ' logger.info(data.toString());')); + const payloadType = func.publishPayload || 'Object'; + // Handle Message type specially - cannot instantiate directly + if (payloadType === 'Message' || payloadType === 'Message') { + elements.push(React.createElement(Text, null, ' // Process input data and create response')); + elements.push(React.createElement(Text, null, ' // TODO: Replace with actual business logic to generate output data')); + elements.push(React.createElement(Text, null, ' Object payload = data.getPayload();')); + elements.push(React.createElement(Text, null, ' return MessageBuilder.withPayload(payload).build();')); + } else { + elements.push(React.createElement(Text, null, ' // Process input data and return response')); + elements.push(React.createElement(Text, null, ' // TODO: Replace with actual business logic to generate output data')); + elements.push(React.createElement(Text, null, ` ${payloadType} payload = new ${payloadType}();`)); + elements.push(React.createElement(Text, null, ' return payload;')); + } + elements.push(React.createElement(Text, null, ' };')); + } + elements.push(React.createElement(Text, null, ' }')); }); // Generate enum classes for channel parameters with enum definitions const enumClasses = generateEnumClasses(processedData, asyncapi); if (enumClasses.length > 0) { - elements.push(React.createElement(Text, null, "")); - elements.push(React.createElement(Text, null, " // Enum classes for channel parameters")); - elements.push(React.createElement(Text, null, " // These enums are generated from AsyncAPI channel parameter enum definitions")); - elements.push(React.createElement(Text, null, " // and handle various data formats (numeric, spaces, camelCase) for valid Java constants")); + elements.push(React.createElement(Text, null, '')); + elements.push(React.createElement(Text, null, ' // Enum classes for channel parameters')); + elements.push(React.createElement(Text, null, ' // These enums are generated from AsyncAPI channel parameter enum definitions')); + elements.push(React.createElement(Text, null, ' // and handle various data formats (numeric, spaces, camelCase) for valid Java constants')); enumClasses.forEach(enumClass => { elements.push(React.createElement(Text, null, ` public static enum ${enumClass.name} {`)); elements.push(React.createElement(Text, null, ` ${enumClass.values.join(', ')}`)); - elements.push(React.createElement(Text, null, " }")); - elements.push(React.createElement(Text, null, "")); + elements.push(React.createElement(Text, null, ' }')); + elements.push(React.createElement(Text, null, '')); }); } // Generate send methods if required sendFunctions.forEach(func => { - if (func.sendMethodName) { - elements.push(React.createElement(Text, null, "")); - const payloadType = func.publishPayload || 'Object'; - elements.push(React.createElement(Text, null, ` public void ${func.sendMethodName}(`)); - elements.push(React.createElement(Text, null, ` ${payloadType} payload, ${func.channelInfo.functionParamList}`)); - elements.push(React.createElement(Text, null, " ) {")); + if (func.sendMethodName) { + elements.push(React.createElement(Text, null, '')); + const payloadType = func.publishPayload || 'Object'; + elements.push(React.createElement(Text, null, ` public void ${func.sendMethodName}(`)); + elements.push(React.createElement(Text, null, ` ${payloadType} payload, ${func.channelInfo.functionParamList}`)); + elements.push(React.createElement(Text, null, ' ) {')); - // Add parameter validation for enum parameters - const validationCode = generateParameterValidation(func); - if (validationCode.length > 0) { - elements.push(React.createElement(Text, null, " // Parameter validation for enum values")); - elements.push(React.createElement(Text, null, " // This validation ensures input parameters match the generated enum constants")); - elements.push(React.createElement(Text, null, " // and handles normalization for different data formats (numeric, spaces, etc.)")); - validationCode.forEach(line => { - elements.push(React.createElement(Text, null, ` ${line}`)); - }); - elements.push(React.createElement(Text, null, "")); - } - // Replace {param} with %s in the topic string for String.format - logger.debug(`Application.js: Processing send function ${func.sendMethodName}, channelInfo:`, func.channelInfo); - if (!func.channelInfo || !func.channelInfo.publishChannel) { - logger.warn(`Application.js: Missing channelInfo or publishChannel for function ${func.sendMethodName}`); - return; - } - const topicFormat = func.channelInfo.publishChannel.replace(/\{[^}]+\}/g, '%s'); - elements.push(React.createElement(Text, null, ` String topic = String.format(\"${topicFormat}\",`)); - elements.push(React.createElement(Text, null, ` ${func.channelInfo.functionArgList});`)); + // Add parameter validation for enum parameters + const validationCode = generateParameterValidation(func); + if (validationCode.length > 0) { + elements.push(React.createElement(Text, null, ' // Parameter validation for enum values')); + elements.push(React.createElement(Text, null, ' // This validation ensures input parameters match the generated enum constants')); + elements.push(React.createElement(Text, null, ' // and handles normalization for different data formats (numeric, spaces, etc.)')); + validationCode.forEach(line => { + elements.push(React.createElement(Text, null, ` ${line}`)); + }); + elements.push(React.createElement(Text, null, '')); + } + // Replace {param} with %s in the topic string for String.format + logger.debug(`Application.js: Processing send function ${func.sendMethodName}, channelInfo:`, func.channelInfo); + if (!func.channelInfo || !func.channelInfo.publishChannel) { + logger.warn(`Application.js: Missing channelInfo or publishChannel for function ${func.sendMethodName}`); + return; + } + const topicFormat = func.channelInfo.publishChannel.replace(/\{[^}]+\}/g, '%s'); + elements.push(React.createElement(Text, null, ` String topic = String.format(\"${topicFormat}\",`)); + elements.push(React.createElement(Text, null, ` ${func.channelInfo.functionArgList});`)); - if (params.dynamicType === 'header') { - elements.push(React.createElement(Text, null, " Message message = MessageBuilder")); - elements.push(React.createElement(Text, null, " .withPayload(payload)")); - elements.push(React.createElement(Text, null, " .setHeader(BinderHeaders.TARGET_DESTINATION, topic)")); - elements.push(React.createElement(Text, null, " .build();")); - elements.push(React.createElement(Text, null, " streamBridge.send(topic, message);")); - } else { - elements.push(React.createElement(Text, null, " streamBridge.send(topic, payload);")); - } - elements.push(React.createElement(Text, null, " }")); + if (params.dynamicType === 'header') { + elements.push(React.createElement(Text, null, ' Message message = MessageBuilder')); + elements.push(React.createElement(Text, null, ' .withPayload(payload)')); + elements.push(React.createElement(Text, null, ' .setHeader(BinderHeaders.TARGET_DESTINATION, topic)')); + elements.push(React.createElement(Text, null, ' .build();')); + elements.push(React.createElement(Text, null, ' streamBridge.send(topic, message);')); + } else { + elements.push(React.createElement(Text, null, ' streamBridge.send(topic, payload);')); } + elements.push(React.createElement(Text, null, ' }')); + } }); - elements.push(React.createElement(Text, null, "}")); + elements.push(React.createElement(Text, null, '}')); return elements; } @@ -625,7 +625,7 @@ function generateEnumClasses(processedData, asyncapi) { // CASE 1: Numeric values (e.g., "3487", "3490") // Java enum constants cannot start with numbers, so prefix with "V_" // Example: "3487" becomes "V_3487" - if (/^\d+$/.test(value)) { + if ((/^\d+$/).test(value)) { return `V_${value}`; } @@ -691,7 +691,7 @@ function generateEnumClasses(processedData, asyncapi) { const validEnumValues = enumValues.map(value => { if (typeof value === 'string') { // CASE 1: Numeric values (e.g., "3487", "3490") - if (/^\d+$/.test(value)) { + if ((/^\d+$/).test(value)) { return `V_${value}`; } @@ -784,58 +784,55 @@ function generateParameterValidation(func) { // STEP 1: Null check validation validationCode.push(`if (${paramName} == null) {`); validationCode.push(` throw new IllegalArgumentException("${paramName} cannot be null");`); - validationCode.push(`}`); + validationCode.push('}'); // STEP 2: Enum value validation with normalization - validationCode.push(`try {`); + validationCode.push('try {'); // Convert the parameter value to match enum format if needed const hasSpaces = param.enumValues.some(value => typeof value === 'string' && value.includes(' ')); - const hasNumericValues = param.enumValues.some(value => typeof value === 'string' && /^\d+$/.test(value)); + const hasNumericValues = param.enumValues.some(value => typeof value === 'string' && (/^\d+$/).test(value)); if (hasSpaces && hasNumericValues) { // CASE 1: Mixed enum values (both spaces and numeric values) // Example: ["3487", "Mobile Application", "3490", "Test Data Generation"] - validationCode.push(` String normalizedValue;`); + validationCode.push(' String normalizedValue;'); validationCode.push(` if (${paramName}.matches("^\\\\d+$")) {`); - validationCode.push(` // Numeric input: prefix with "V_" to match enum constant`); - validationCode.push(` // Example: "3487" -> "V_3487"`); + validationCode.push(' // Numeric input: prefix with "V_" to match enum constant'); + validationCode.push(' // Example: "3487" -> "V_3487"'); validationCode.push(` normalizedValue = "V_" + ${paramName};`); - validationCode.push(` } else {`); - validationCode.push(` // String input with spaces: convert to UPPER_CASE with underscores`); - validationCode.push(` // Example: "Mobile Application" -> "MOBILE_APPLICATION"`); + validationCode.push(' } else {'); + validationCode.push(' // String input with spaces: convert to UPPER_CASE with underscores'); + validationCode.push(' // Example: "Mobile Application" -> "MOBILE_APPLICATION"'); validationCode.push(` normalizedValue = ${paramName}.replace(" ", "_");`); - validationCode.push(` }`); + validationCode.push(' }'); validationCode.push(` ${enumName}.valueOf(normalizedValue);`); - } else if (hasSpaces) { // CASE 2: Only string values with spaces // Example: ["Mobile Application", "Test Data Generation"] - validationCode.push(` // Normalize string values: spaces -> underscores`); - validationCode.push(` // Example: "Mobile Application" -> "MOBILE_APPLICATION"`); + validationCode.push(' // Normalize string values: spaces -> underscores'); + validationCode.push(' // Example: "Mobile Application" -> "MOBILE_APPLICATION"'); validationCode.push(` String normalizedValue = ${paramName}.replace(" ", "_");`); validationCode.push(` ${enumName}.valueOf(normalizedValue);`); - } else if (hasNumericValues) { // CASE 3: Only numeric values // Example: ["3487", "3490", "3555"] - validationCode.push(` // Normalize numeric values: prefix with "V_" if numeric`); - validationCode.push(` // Example: "3487" -> "V_3487", "abc" -> "abc" (unchanged)`); + validationCode.push(' // Normalize numeric values: prefix with "V_" if numeric'); + validationCode.push(' // Example: "3487" -> "V_3487", "abc" -> "abc" (unchanged)'); validationCode.push(` String normalizedValue = ${paramName}.matches("^\\\\d+$") ? "V_" + ${paramName} : ${paramName};`); validationCode.push(` ${enumName}.valueOf(normalizedValue);`); - } else { // CASE 4: Simple string values (camelCase, etc.) // Example: ["customerInitiated", "onlinePaid"] - validationCode.push(` // Direct validation for simple string values (no normalization needed)`); + validationCode.push(' // Direct validation for simple string values (no normalization needed)'); validationCode.push(` ${enumName}.valueOf(${paramName});`); } // STEP 3: Error handling with helpful error message - validationCode.push(`} catch (IllegalArgumentException e) {`); - validationCode.push(` // Provide detailed error message with all valid enum values`); + validationCode.push('} catch (IllegalArgumentException e) {'); + validationCode.push(' // Provide detailed error message with all valid enum values'); validationCode.push(` throw new IllegalArgumentException("Invalid ${paramName}: " + ${paramName} + ". Valid values: " + Arrays.toString(${enumName}.values()));`); - validationCode.push(`}`); + validationCode.push('}'); } }); } @@ -861,12 +858,12 @@ function generateConsumerParameterValidation(func) { if (func.parameters && func.parameters.length > 0) { // First, extract the solace_destination header and split the topic path - validationCode.push(`// Extract topic parameters from solace_destination header`); - validationCode.push(`Object solaceDestinationHeader = message.getHeaders().get("solace_destination");`); - validationCode.push(`String solaceDestination = solaceDestinationHeader != null ? solaceDestinationHeader.toString() : null;`); - validationCode.push(`if (solaceDestination != null) {`); - validationCode.push(` String[] topicSegments = solaceDestination.split("/");`); - validationCode.push(` logger.info("Topic segments: " + Arrays.toString(topicSegments));`); + validationCode.push('// Extract topic parameters from solace_destination header'); + validationCode.push('Object solaceDestinationHeader = message.getHeaders().get("solace_destination");'); + validationCode.push('String solaceDestination = solaceDestinationHeader != null ? solaceDestinationHeader.toString() : null;'); + validationCode.push('if (solaceDestination != null) {'); + validationCode.push(' String[] topicSegments = solaceDestination.split("/");'); + validationCode.push(' logger.info("Topic segments: " + Arrays.toString(topicSegments));'); // Sort parameters by position to ensure correct extraction order const sortedParams = func.parameters @@ -874,7 +871,7 @@ function generateConsumerParameterValidation(func) { .sort((a, b) => a.position - b.position); if (sortedParams.length > 0) { - validationCode.push(` // Extract enum parameters by position from topic path`); + validationCode.push(' // Extract enum parameters by position from topic path'); sortedParams.forEach(param => { const enumName = toPascalCase(param.name); @@ -884,59 +881,56 @@ function generateConsumerParameterValidation(func) { validationCode.push(` // Extract ${paramName} from position ${position} in topic path`); validationCode.push(` if (topicSegments.length > ${position}) {`); validationCode.push(` String ${paramName} = topicSegments[${position}];`); - validationCode.push(` try {`); + validationCode.push(' try {'); // Convert the parameter value to match enum format if needed const hasSpaces = param.enumValues.some(value => typeof value === 'string' && value.includes(' ')); - const hasNumericValues = param.enumValues.some(value => typeof value === 'string' && /^\d+$/.test(value)); + const hasNumericValues = param.enumValues.some(value => typeof value === 'string' && (/^\d+$/).test(value)); if (hasSpaces && hasNumericValues) { // CASE 1: Mixed enum values (both spaces and numeric values) - validationCode.push(` String normalizedValue;`); + validationCode.push(' String normalizedValue;'); validationCode.push(` if (${paramName}.matches("^\\\\d+$")) {`); - validationCode.push(` // Numeric input: prefix with "V_" to match enum constant`); + validationCode.push(' // Numeric input: prefix with "V_" to match enum constant'); validationCode.push(` normalizedValue = "V_" + ${paramName};`); - validationCode.push(` } else {`); - validationCode.push(` // String input with spaces: convert to UPPER_CASE with underscores`); + validationCode.push(' } else {'); + validationCode.push(' // String input with spaces: convert to UPPER_CASE with underscores'); validationCode.push(` normalizedValue = ${paramName}.replace(" ", "_");`); - validationCode.push(` }`); + validationCode.push(' }'); validationCode.push(` ${enumName} validated${toPascalCase(paramName)} = ${enumName}.valueOf(normalizedValue);`); validationCode.push(` logger.info("Validated ${paramName} from topic position ${position}: " + validated${toPascalCase(paramName)});`); - } else if (hasSpaces) { // CASE 2: Only string values with spaces - validationCode.push(` // Normalize string values: spaces -> underscores`); + validationCode.push(' // Normalize string values: spaces -> underscores'); validationCode.push(` String normalizedValue = ${paramName}.replace(" ", "_");`); validationCode.push(` ${enumName} validated${toPascalCase(paramName)} = ${enumName}.valueOf(normalizedValue);`); validationCode.push(` logger.info("Validated ${paramName} from topic position ${position}: " + validated${toPascalCase(paramName)});`); - } else if (hasNumericValues) { // CASE 3: Only numeric values - validationCode.push(` // Normalize numeric values: prefix with "V_" if numeric`); + validationCode.push(' // Normalize numeric values: prefix with "V_" if numeric'); validationCode.push(` String normalizedValue = ${paramName}.matches("^\\\\d+$") ? "V_" + ${paramName} : ${paramName};`); validationCode.push(` ${enumName} validated${toPascalCase(paramName)} = ${enumName}.valueOf(normalizedValue);`); validationCode.push(` logger.info("Validated ${paramName} from topic position ${position}: " + validated${toPascalCase(paramName)});`); - } else { // CASE 4: Simple string values (camelCase, etc.) - validationCode.push(` // Direct validation for simple string values (no normalization needed)`); + validationCode.push(' // Direct validation for simple string values (no normalization needed)'); validationCode.push(` ${enumName} validated${toPascalCase(paramName)} = ${enumName}.valueOf(${paramName});`); validationCode.push(` logger.info("Validated ${paramName} from topic position ${position}: " + validated${toPascalCase(paramName)});`); } // Error handling - validationCode.push(` } catch (IllegalArgumentException e) {`); + validationCode.push(' } catch (IllegalArgumentException e) {'); validationCode.push(` logger.warn("Invalid ${paramName} at topic position ${position}: " + ${paramName} + ". Valid values: " + Arrays.toString(${enumName}.values()));`); - validationCode.push(` }`); - validationCode.push(` } else {`); + validationCode.push(' }'); + validationCode.push(' } else {'); validationCode.push(` logger.warn("Topic path too short, expected ${paramName} at position ${position} but only " + topicSegments.length + " segments found");`); - validationCode.push(` }`); + validationCode.push(' }'); }); } - validationCode.push(`} else {`); - validationCode.push(` logger.debug("No solace_destination found in message headers");`); - validationCode.push(`}`); + validationCode.push('} else {'); + validationCode.push(' logger.debug("No solace_destination found in message headers");'); + validationCode.push('}'); } return validationCode; diff --git a/components/ApplicationYml.js b/components/ApplicationYml.js index 31716612..436d1f6e 100644 --- a/components/ApplicationYml.js +++ b/components/ApplicationYml.js @@ -1,6 +1,7 @@ const React = require('react'); const { Text } = require('@asyncapi/generator-react-sdk'); const { logger } = require('../utils/logger'); +const { toJavaClassName } = require('../utils/typeUtils'); /** * ApplicationYml component for generating Spring Boot application.yml @@ -38,29 +39,29 @@ function ApplicationYml({ asyncapi, params, processedData }) { const needsJacksonConfig = needsJacksonConfiguration(processedData); // Add Spring Cloud Stream configuration - elements.push(React.createElement(Text, null, "spring:")); + elements.push(React.createElement(Text, null, 'spring:')); // Add Jackson configuration if needed if (needsJacksonConfig) { - elements.push(React.createElement(Text, null, " jackson:")); - elements.push(React.createElement(Text, null, " serialization:")); - elements.push(React.createElement(Text, null, " write-dates-as-timestamps: false")); - elements.push(React.createElement(Text, null, " deserialization:")); - elements.push(React.createElement(Text, null, " fail-on-unknown-properties: false")); + elements.push(React.createElement(Text, null, ' jackson:')); + elements.push(React.createElement(Text, null, ' serialization:')); + elements.push(React.createElement(Text, null, ' write-dates-as-timestamps: false')); + elements.push(React.createElement(Text, null, ' deserialization:')); + elements.push(React.createElement(Text, null, ' fail-on-unknown-properties: false')); } - elements.push(React.createElement(Text, null, " cloud:")); - elements.push(React.createElement(Text, null, " function:")); - elements.push(React.createElement(Text, null, ` definition: ${functionDefinition || "''"}`)); + elements.push(React.createElement(Text, null, ' cloud:')); + elements.push(React.createElement(Text, null, ' function:')); + elements.push(React.createElement(Text, null, ` definition: ${functionDefinition || '\'\''}`)); // Add function configuration for parametersToHeaders if (parametersToHeaders && (binder === 'solace' || binder === 'rabbit')) { const headerMappingConfig = generateHeaderMappingConfiguration(consumerFunctions, binder); if (headerMappingConfig && Object.keys(headerMappingConfig).length > 0) { - elements.push(React.createElement(Text, null, " configuration:")); + elements.push(React.createElement(Text, null, ' configuration:')); Object.entries(headerMappingConfig).forEach(([functionName, config]) => { elements.push(React.createElement(Text, null, ` ${functionName}:`)); - elements.push(React.createElement(Text, null, " input-header-mapping-expression:")); + elements.push(React.createElement(Text, null, ' input-header-mapping-expression:')); Object.entries(config['input-header-mapping-expression']).forEach(([paramName, expression]) => { elements.push(React.createElement(Text, null, ` ${paramName}: ${expression}`)); }); @@ -68,11 +69,11 @@ function ApplicationYml({ asyncapi, params, processedData }) { } } - elements.push(React.createElement(Text, null, " stream:")); + elements.push(React.createElement(Text, null, ' stream:')); if (supplierFunctions.length + consumerFunctions.length + functionFunctions.length === 0) { - elements.push(React.createElement(Text, null, " bindings: {}")); + elements.push(React.createElement(Text, null, ' bindings: {}')); } else { - elements.push(React.createElement(Text, null, " bindings:")); + elements.push(React.createElement(Text, null, ' bindings:')); } // Add bindings for supplier functions (use -out-0) @@ -87,11 +88,11 @@ function ApplicationYml({ asyncapi, params, processedData }) { elements.push(React.createElement(Text, null, ` destination: ${destination}`)); // Add binder property if using Solace if (binder === 'solace') { - elements.push(React.createElement(Text, null, ` binder: solace-binder`)); + elements.push(React.createElement(Text, null, ' binder: solace-binder')); } else if (binder === 'rabbit') { - elements.push(React.createElement(Text, null, ` binder: rabbit-binder`)); + elements.push(React.createElement(Text, null, ' binder: rabbit-binder')); } else if (binder === 'kafka') { - elements.push(React.createElement(Text, null, ` binder: kafka-binder`)); + elements.push(React.createElement(Text, null, ' binder: kafka-binder')); } }); @@ -124,11 +125,11 @@ function ApplicationYml({ asyncapi, params, processedData }) { } // Add binder property if using Solace if (binder === 'solace') { - elements.push(React.createElement(Text, null, ` binder: solace-binder`)); + elements.push(React.createElement(Text, null, ' binder: solace-binder')); } else if (binder === 'rabbit') { - elements.push(React.createElement(Text, null, ` binder: rabbit-binder`)); + elements.push(React.createElement(Text, null, ' binder: rabbit-binder')); } else if (binder === 'kafka') { - elements.push(React.createElement(Text, null, ` binder: kafka-binder`)); + elements.push(React.createElement(Text, null, ' binder: kafka-binder')); } }); @@ -175,11 +176,11 @@ function ApplicationYml({ asyncapi, params, processedData }) { elements.push(React.createElement(Text, null, ` ${inputBindingName}:`)); elements.push(React.createElement(Text, null, ` destination: ${inputDestination}`)); if (binder === 'solace') { - elements.push(React.createElement(Text, null, ` binder: solace-binder`)); + elements.push(React.createElement(Text, null, ' binder: solace-binder')); } else if (binder === 'rabbit') { - elements.push(React.createElement(Text, null, ` binder: rabbit-binder`)); + elements.push(React.createElement(Text, null, ' binder: rabbit-binder')); } else if (binder === 'kafka') { - elements.push(React.createElement(Text, null, ` binder: kafka-binder`)); + elements.push(React.createElement(Text, null, ' binder: kafka-binder')); } // Output binding (-out-0) @@ -187,11 +188,11 @@ function ApplicationYml({ asyncapi, params, processedData }) { elements.push(React.createElement(Text, null, ` ${outputBindingName}:`)); elements.push(React.createElement(Text, null, ` destination: ${outputDestination}`)); if (binder === 'solace') { - elements.push(React.createElement(Text, null, ` binder: solace-binder`)); + elements.push(React.createElement(Text, null, ' binder: solace-binder')); } else if (binder === 'rabbit') { - elements.push(React.createElement(Text, null, ` binder: rabbit-binder`)); + elements.push(React.createElement(Text, null, ' binder: rabbit-binder')); } else if (binder === 'kafka') { - elements.push(React.createElement(Text, null, ` binder: kafka-binder`)); + elements.push(React.createElement(Text, null, ' binder: kafka-binder')); } }); @@ -203,25 +204,25 @@ function ApplicationYml({ asyncapi, params, processedData }) { // Bindings for queue-based consumers const queueConsumers = consumerFunctions.filter(f => f.channelInfo && f.channelInfo.queueName); if (queueConsumers.length > 0) { - elements.push(React.createElement(Text, null, " solace:")); - elements.push(React.createElement(Text, null, " bindings:")); + elements.push(React.createElement(Text, null, ' solace:')); + elements.push(React.createElement(Text, null, ' bindings:')); queueConsumers.forEach(func => { const bindingName = `${func.name}-in-0`; elements.push(React.createElement(Text, null, ` ${bindingName}:`)); - elements.push(React.createElement(Text, null, " consumer:")); + elements.push(React.createElement(Text, null, ' consumer:')); elements.push(React.createElement(Text, null, ` queueNameExpression: '''${func.channelInfo.queueName || func.name}'''`)); }); } // Add binders elements.push( - React.createElement(Text, null, " binders:"), - React.createElement(Text, null, ` solace-binder:`), - React.createElement(Text, null, ` type: solace`) + React.createElement(Text, null, ' binders:'), + React.createElement(Text, null, ' solace-binder:'), + React.createElement(Text, null, ' type: solace') ); // Environment section - elements.push(React.createElement(Text, null, " environment:")); - elements.push(React.createElement(Text, null, " solace:")); - elements.push(React.createElement(Text, null, " java:")); + elements.push(React.createElement(Text, null, ' environment:')); + elements.push(React.createElement(Text, null, ' solace:')); + elements.push(React.createElement(Text, null, ' java:')); elements.push(React.createElement(Text, null, ` host: '${host || 'tcp://localhost:55554'}'`)); elements.push(React.createElement(Text, null, ` msgVpn: ${msgVpn || 'default'}`)); elements.push(React.createElement(Text, null, ` clientUsername: ${username || 'default'}`)); @@ -229,16 +230,16 @@ function ApplicationYml({ asyncapi, params, processedData }) { } else if (binder === 'kafka') { // Add binders elements.push( - React.createElement(Text, null, " binders:"), - React.createElement(Text, null, ` kafka-binder:`), - React.createElement(Text, null, ` type: kafka`) + React.createElement(Text, null, ' binders:'), + React.createElement(Text, null, ' kafka-binder:'), + React.createElement(Text, null, ' type: kafka') ); - elements.push(React.createElement(Text, null, " environment:")); - elements.push(React.createElement(Text, null, " spring:")); - elements.push(React.createElement(Text, null, " cloud:")); - elements.push(React.createElement(Text, null, " stream:")); - elements.push(React.createElement(Text, null, " kafka:")); - elements.push(React.createElement(Text, null, " binder:")); + elements.push(React.createElement(Text, null, ' environment:')); + elements.push(React.createElement(Text, null, ' spring:')); + elements.push(React.createElement(Text, null, ' cloud:')); + elements.push(React.createElement(Text, null, ' stream:')); + elements.push(React.createElement(Text, null, ' kafka:')); + elements.push(React.createElement(Text, null, ' binder:')); // Use servers if useServers is true, otherwise use kafkaBrokers let brokerList = kafkaBrokers; @@ -260,13 +261,13 @@ function ApplicationYml({ asyncapi, params, processedData }) { } else if (binder === 'rabbit') { // Add binders elements.push( - React.createElement(Text, null, " binders:"), - React.createElement(Text, null, ` rabbit-binder:`), - React.createElement(Text, null, ` type: rabbit`) + React.createElement(Text, null, ' binders:'), + React.createElement(Text, null, ' rabbit-binder:'), + React.createElement(Text, null, ' type: rabbit') ); - elements.push(React.createElement(Text, null, " environment:")); - elements.push(React.createElement(Text, null, " spring:")); - elements.push(React.createElement(Text, null, " rabbitmq:")); + elements.push(React.createElement(Text, null, ' environment:')); + elements.push(React.createElement(Text, null, ' spring:')); + elements.push(React.createElement(Text, null, ' rabbitmq:')); elements.push(React.createElement(Text, null, ` host: ${rabbitHost}`)); elements.push(React.createElement(Text, null, ` port: ${rabbitPort}`)); elements.push(React.createElement(Text, null, ` username: ${rabbitUsername}`)); @@ -275,39 +276,39 @@ function ApplicationYml({ asyncapi, params, processedData }) { // Add logging configuration (matching reference) elements.push( - React.createElement(Text, null, "logging:"), - React.createElement(Text, null, " level:"), - React.createElement(Text, null, " root: info"), - React.createElement(Text, null, " org:"), - React.createElement(Text, null, " springframework: info"), - React.createElement(Text, null, " springframework.cloud.stream: info"), - React.createElement(Text, null, " springframework.integration: info"), - React.createElement(Text, null, " com:"), - React.createElement(Text, null, " company: info") + React.createElement(Text, null, 'logging:'), + React.createElement(Text, null, ' level:'), + React.createElement(Text, null, ' root: info'), + React.createElement(Text, null, ' org:'), + React.createElement(Text, null, ' springframework: info'), + React.createElement(Text, null, ' springframework.cloud.stream: info'), + React.createElement(Text, null, ' springframework.integration: info'), + React.createElement(Text, null, ' com:'), + React.createElement(Text, null, ' company: info') ); // Add Jackson logging if Jackson config is needed if (needsJacksonConfig) { elements.push( - React.createElement(Text, null, " com.fasterxml.jackson: info") + React.createElement(Text, null, ' com.fasterxml.jackson: info') ); } // Add actuator configuration if enabled (matching nunjucks reference project) if (actuator === 'true' || actuator === true) { elements.push( - React.createElement(Text, null, "server:"), - React.createElement(Text, null, " port: 8080"), - React.createElement(Text, null, "management:"), - React.createElement(Text, null, " endpoints:"), - React.createElement(Text, null, " web:"), - React.createElement(Text, null, " exposure:"), - React.createElement(Text, null, " include: '*'") + React.createElement(Text, null, 'server:'), + React.createElement(Text, null, ' port: 8080'), + React.createElement(Text, null, 'management:'), + React.createElement(Text, null, ' endpoints:'), + React.createElement(Text, null, ' web:'), + React.createElement(Text, null, ' exposure:'), + React.createElement(Text, null, ' include: \'*\'') ); } // Remove trailing blank lines at the end - while (elements.length > 0 && elements[elements.length - 1].props && elements[elements.length - 1].props.children === "") { + while (elements.length > 0 && elements[elements.length - 1].props && elements[elements.length - 1].props.children === '') { elements.pop(); } diff --git a/components/ModelClass.js b/components/ModelClass.js index 732f408f..1633cd73 100644 --- a/components/ModelClass.js +++ b/components/ModelClass.js @@ -1,17 +1,23 @@ const React = require('react'); const { Text } = require('@asyncapi/generator-react-sdk'); const { logger } = require('../utils/logger'); -const { - getEnhancedType, - checkPropertyNames, - getIdentifierName, +const { + getEnhancedType, + getIdentifierName, getSchemaType, - toPascalCase, - toCamelCase, - isJavaReservedWord + toPascalCase } = require('../utils/typeUtils'); const { stripPackageName } = require('../utils/typeUtils'); +/** + * Helper to get items schema, handling both function and direct value + */ +function getItemsSchema(schema) { + if (!schema || !schema.items) return undefined; + if (typeof schema.items === 'function') return schema.items(); + return schema.items; +} + /** * Get Java type for property */ @@ -23,16 +29,16 @@ function getJavaType(property) { // Handle case where type might be an enhanced type object instead of string let type = property.type; if (type && typeof type === 'object') { - logger.debug(`ModelClass.js: getJavaType() - Type is enhanced type object:`, JSON.stringify(type, null, 2)); + logger.debug('ModelClass.js: getJavaType() - Type is enhanced type object:', JSON.stringify(type, null, 2)); // Check if it's an enhanced type object with javaType property (from Avro processing) if (type.javaType) { logger.debug(`ModelClass.js: getJavaType() - Found enhanced type object, using javaType: ${type.javaType}`); return type.javaType; // Return directly, it's already the correct Java type } else if (typeof type.type === 'function') { - logger.debug(`ModelClass.js: getJavaType() - Found AsyncAPI type() method, calling it`); + logger.debug('ModelClass.js: getJavaType() - Found AsyncAPI type() method, calling it'); type = type.type(); } else { - logger.debug(`ModelClass.js: getJavaType() - Type object has no recognized format, defaulting to 'string'`); + logger.debug('ModelClass.js: getJavaType() - Type object has no recognized format, defaulting to \'string\''); type = 'string'; // Default assumption for simple properties } } @@ -72,19 +78,17 @@ function getJavaType(property) { const javaType = `${toPascalCase(className)}[]`; logger.debug(`ModelClass.js: getJavaType() - Array of objects with schema: ${javaType}`); return javaType; - } else { - // Use property name for anonymous schemas - const javaType = `${toPascalCase(property.name)}[]`; - logger.debug(`ModelClass.js: getJavaType() - Array of anonymous objects using property name: ${javaType}`); - return javaType; - } - } else { - // Array of primitives - const typeInfo = getEnhancedType(itemType, itemFormat); - const javaType = `${typeInfo.javaType}[]`; - logger.debug(`ModelClass.js: getJavaType() - Array of primitives: ${javaType}`); + } + // Use property name for anonymous schemas + const javaType = `${toPascalCase(property.name)}[]`; + logger.debug(`ModelClass.js: getJavaType() - Array of anonymous objects using property name: ${javaType}`); return javaType; - } + } + // Array of primitives + const typeInfo = getEnhancedType(itemType, itemFormat); + const javaType = `${typeInfo.javaType}[]`; + logger.debug(`ModelClass.js: getJavaType() - Array of primitives: ${javaType}`); + return javaType; } return 'Object[]'; } @@ -105,22 +109,21 @@ function getJavaType(property) { const javaType = toPascalCase(className); logger.debug(`ModelClass.js: getJavaType() - Object type with schema: ${javaType}`); return javaType; - } else { - // Check if this is a nested object with properties that should generate a class - if (schema.properties && typeof schema.properties === 'function') { - const schemaProperties = schema.properties(); - if (schemaProperties && (typeof schemaProperties.values === 'function' || typeof schemaProperties === 'object')) { - // This is a nested object with properties - generate a class using property name - const javaType = toPascalCase(property.name); - logger.debug(`ModelClass.js: getJavaType() - Nested object type with properties using property name: ${javaType}`); - return javaType; - } + } + // Check if this is a nested object with properties that should generate a class + if (schema.properties && typeof schema.properties === 'function') { + const schemaProperties = schema.properties(); + if (schemaProperties && (typeof schemaProperties.values === 'function' || typeof schemaProperties === 'object')) { + // This is a nested object with properties - generate a class using property name + const javaType = toPascalCase(property.name); + logger.debug(`ModelClass.js: getJavaType() - Nested object type with properties using property name: ${javaType}`); + return javaType; } - // Use property name for anonymous schemas - const javaType = toPascalCase(property.name); - logger.debug(`ModelClass.js: getJavaType() - Anonymous object type using property name: ${javaType}`); - return javaType; } + // Use property name for anonymous schemas + const javaType = toPascalCase(property.name); + logger.debug(`ModelClass.js: getJavaType() - Anonymous object type using property name: ${javaType}`); + return javaType; } return 'Object'; } @@ -134,7 +137,7 @@ function getJavaType(property) { /** * Get sample value for property */ -function getSampleValue(property) { +function _getSampleValue(property) { logger.debug('ModelClass.js: getSampleValue() - Getting sample value for property'); if (!property) return 'null'; @@ -151,23 +154,20 @@ function getSampleValue(property) { return 'U3dhZ2dlciByb2Nrcw=='; } else if (format === 'binary') { return 'base64-encoded file contents'; - } else { - return '"string"'; - } + } + return '"string"'; } else if (type === 'integer') { if (format === 'int64') { return '1L'; - } else { - return '1'; - } + } + return '1'; } else if (type === 'number') { if (format === 'float') { return '1.1F'; } else if (format === 'double') { return '1.1'; - } else { - return '100.1'; - } + } + return '100.1'; } else if (type === 'boolean') { return 'true'; } else if (type === 'null') { @@ -233,7 +233,7 @@ function generateAllArgsConstructor(className, properties, indentLevel = 0, exte }); elements.push(React.createElement(Text, null, `${indent}}`)); - elements.push(React.createElement(Text, null, "")); + elements.push(React.createElement(Text, null, '')); return elements; } @@ -273,7 +273,7 @@ function generateFields(properties, indentLevel = 0) { } elements.push(React.createElement(Text, null, `${indent}private ${javaType} ${fieldName};`)); - elements.push(React.createElement(Text, null, "")); + elements.push(React.createElement(Text, null, '')); }); return elements; @@ -301,7 +301,7 @@ function generateAccessors(className, properties, indentLevel = 0) { elements.push(React.createElement(Text, null, `${indent}public ${javaType} get${methodName}() {`)); elements.push(React.createElement(Text, null, `${indent} return ${fieldName};`)); elements.push(React.createElement(Text, null, `${indent}}`)); - elements.push(React.createElement(Text, null, "")); + elements.push(React.createElement(Text, null, '')); // Setter const paramName = getIdentifierName(prop.name); // Use safe identifier for parameter @@ -309,7 +309,7 @@ function generateAccessors(className, properties, indentLevel = 0) { elements.push(React.createElement(Text, null, `${indent} this.${fieldName} = ${paramName};`)); elements.push(React.createElement(Text, null, `${indent} return this;`)); elements.push(React.createElement(Text, null, `${indent}}`)); - elements.push(React.createElement(Text, null, "")); + elements.push(React.createElement(Text, null, '')); }); return elements; @@ -339,7 +339,7 @@ function generateToString(className, properties, indentLevel = 0, extendsClass = if (javaType === 'Object') { returnLine += '.toString()'; } else if (javaType.endsWith('[]')) { - returnLine += ' != null ? java.util.Arrays.toString(' + fieldName + ') : "null"'; + returnLine += ` != null ? java.util.Arrays.toString(${ fieldName }) : "null"`; } if (isLast) { returnLine += ' + " ]"'; @@ -354,13 +354,13 @@ function generateToString(className, properties, indentLevel = 0, extendsClass = properties.forEach((prop, index) => { const fieldName = getIdentifierName(prop.name); const javaType = getJavaType(prop); - const isLast = index === properties.length - 1; - const separator = index === 0 ? " " : ", "; + const _isLast = index === properties.length - 1; + const separator = index === 0 ? ' ' : ', '; returnLine += `\n${indent} + "${separator}${fieldName}: " + ${fieldName}`; if (javaType === 'Object') { returnLine += '.toString()'; } else if (javaType.endsWith('[]')) { - returnLine += ' != null ? java.util.Arrays.toString(' + fieldName + ') : "null"'; + returnLine += ` != null ? java.util.Arrays.toString(${ fieldName }) : "null"`; } }); } @@ -430,7 +430,7 @@ function generateEnum(property, indentLevel = 0) { return value.replace(/\s+/g, '_').toUpperCase(); } // Handle numeric values (e.g., "123" -> "V_123") - if (/^\d+$/.test(value)) { + if ((/^\d+$/).test(value)) { return `V_${value}`; } // Convert to uppercase for Java enum convention @@ -444,7 +444,7 @@ function generateEnum(property, indentLevel = 0) { // Generate as a static enum inside the class (matching reference project behavior) elements.push(React.createElement(Text, null, `${indent}public static enum ${enumName} { ${enumValuesString} }`)); - elements.push(React.createElement(Text, null, "")); + elements.push(React.createElement(Text, null, '')); return elements; } @@ -563,7 +563,7 @@ function generateInnerClasses(properties, indentLevel = 0, processedData = null) const isRequired = schema.required && Array.isArray(schema.required()) && schema.required().includes(propertyName); // Create a property object that getJavaType can understand - const propertyObj = { + const _propertyObj = { name: propertyName, type: innerPropType, // Always schema type, not Java type format: innerPropFormat, @@ -591,7 +591,7 @@ function generateInnerClasses(properties, indentLevel = 0, processedData = null) } else if (type === 'array' && itemsSchema && itemsSchema.properties && typeof itemsSchema.properties === 'function') { // Check if this is actually a primitive array before generating inner class const itemType = itemsSchema.type ? itemsSchema.type() : null; - const itemFormat = itemsSchema.format ? itemsSchema.format() : null; + const _itemFormat = itemsSchema.format ? itemsSchema.format() : null; // If it's a primitive type (not object), don't generate inner class if (itemType && itemType !== 'object' && !itemType.startsWith('object-')) { @@ -627,7 +627,7 @@ function generateInnerClasses(properties, indentLevel = 0, processedData = null) formatType: typeof propSchema.format }); - let ast = { + const ast = { id: propName, type: typeof propSchema.type === 'function' ? propSchema.type() : propSchema.type, format: typeof propSchema.format === 'function' ? propSchema.format() : propSchema.format, @@ -660,7 +660,7 @@ function generateInnerClasses(properties, indentLevel = 0, processedData = null) description: typeof nestedPropSchema.description === 'function' ? nestedPropSchema.description() : nestedPropSchema.description, required: propSchema.required && Array.isArray(propSchema.required()) && propSchema.required().includes(nestedPropName), schema: nestedPropSchema, - itemsSchema: nestedPropSchema.items ? (typeof nestedPropSchema.items === 'function' ? nestedPropSchema.items() : nestedPropSchema.items) : undefined + itemsSchema: getItemsSchema(nestedPropSchema) }); }); } @@ -672,7 +672,7 @@ function generateInnerClasses(properties, indentLevel = 0, processedData = null) }); } if (propName === 'options') { - logger.debug(`I am here`); + logger.debug('I am here'); } return ast; @@ -688,7 +688,7 @@ function generateInnerClasses(properties, indentLevel = 0, processedData = null) const isRequired = itemsSchema.required && Array.isArray(itemsSchema.required()) && itemsSchema.required().includes(propertyName); // Create a property object that getJavaType can understand - const propertyObj = { + const _propertyObj2 = { name: propertyName, type: innerPropType, // Always schema type, not Java type format: innerPropFormat, @@ -753,20 +753,20 @@ function generateClass(className, properties, indentLevel = 0, isStatic = false, elements.push(React.createElement(Text, null, `${indent}public ${staticKeyword}class ${className}${extendsClause} {`)); // Default constructor - const bodyIndent = indent + ' '; + const bodyIndent = `${indent } `; elements.push(React.createElement(Text, null, `${bodyIndent}public ${className}() {`)); if (extendsClass) { elements.push(React.createElement(Text, null, `${bodyIndent} super();`)); } elements.push(React.createElement(Text, null, `${bodyIndent}}`)); - elements.push(React.createElement(Text, null, "")); + elements.push(React.createElement(Text, null, '')); // All-args constructor elements.push(...generateAllArgsConstructor(className, properties, indentLevel + 1, extendsClass, parentProperties)); // Fields with smart JsonProperty annotations elements.push(...generateFields(properties, indentLevel + 1)); - elements.push(React.createElement(Text, null, "")); + elements.push(React.createElement(Text, null, '')); // Getters and setters elements.push(...generateAccessors(className, properties, indentLevel + 1)); @@ -834,18 +834,18 @@ function ModelClass({ schema, params, asyncapi, processedData, extendsClass, par const packageName = getSmartPackageName(params, asyncapi, schema); if (packageName) { elements.push(React.createElement(Text, null, `package ${packageName};`)); - elements.push(React.createElement(Text, null, "")); + elements.push(React.createElement(Text, null, '')); } // 2. SMART IMPORT ANALYSIS (restored from backup + enhanced) const importAnalysis = analyzeRequiredImports(schema, processedData); // Add base imports - elements.push(React.createElement(Text, null, "import com.fasterxml.jackson.annotation.JsonInclude;")); + elements.push(React.createElement(Text, null, 'import com.fasterxml.jackson.annotation.JsonInclude;')); // Conditional JsonProperty import (only when needed) if (importAnalysis.needsJsonProperty) { - elements.push(React.createElement(Text, null, "import com.fasterxml.jackson.annotation.JsonProperty;")); + elements.push(React.createElement(Text, null, 'import com.fasterxml.jackson.annotation.JsonProperty;')); } // Add cross-schema imports (using processedData) @@ -863,7 +863,7 @@ function ModelClass({ schema, params, asyncapi, processedData, extendsClass, par elements.push(React.createElement(Text, null, importStatement)); }); - elements.push(React.createElement(Text, null, "")); + elements.push(React.createElement(Text, null, '')); // 3. DETERMINE CLASS NAME (with multiple fallback strategies) const finalClassName = className || @@ -1067,6 +1067,4 @@ function prepareSchemaProperties(schema) { return []; } - - module.exports = ModelClass; \ No newline at end of file diff --git a/components/PomXml.js b/components/PomXml.js index 730f8e5b..e763c6d1 100644 --- a/components/PomXml.js +++ b/components/PomXml.js @@ -3,6 +3,37 @@ const { Text } = require('@asyncapi/generator-react-sdk'); const { logger } = require('../utils/logger'); const { isJavaReservedWord } = require('../utils/typeUtils'); +/** + * Get binder dependency elements based on binder type + */ +function getBinderDependency(binder, kafkaVersion, rabbitVersion) { + if (binder === 'rabbit') { + return [ + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' org.springframework.cloud'), + React.createElement(Text, null, ' spring-cloud-stream-binder-rabbit'), + React.createElement(Text, null, ` ${rabbitVersion}`), + React.createElement(Text, null, ' ') + ]; + } + if (binder === 'solace') { + return [ + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' com.solace.spring.cloud'), + React.createElement(Text, null, ' spring-cloud-starter-stream-solace'), + React.createElement(Text, null, ' ') + ]; + } + // Default: kafka + return [ + React.createElement(Text, null, ' '), + React.createElement(Text, null, ' org.springframework.cloud'), + React.createElement(Text, null, ' spring-cloud-stream-binder-kafka'), + React.createElement(Text, null, ` ${kafkaVersion}`), + React.createElement(Text, null, ' ') + ]; +} + /** * PomXml component for generating Maven pom.xml */ @@ -35,14 +66,13 @@ function PomXml({ asyncapi, params, processedData, artifactType = 'application' actuator, processedData }); - } else { - return React.createElement(LibraryPomXml, { - groupId, - artifactId, - version, - springCloudStreamVersion - }); - } + } + return React.createElement(LibraryPomXml, { + groupId, + artifactId, + version, + springCloudStreamVersion + }); } function ApplicationPomXml({ groupId, artifactId, version, springBootVersion, springCloudVersion, solaceSpringCloudVersion, kafkaSpringCloudVersion, rabbitSpringCloudVersion, binder, actuator, processedData }) { @@ -102,24 +132,7 @@ function ApplicationPomXml({ groupId, artifactId, version, springBootVersion, sp React.createElement(Text, null, ' '), React.createElement(Text, null, ''), React.createElement(Text, null, ' '), - ...(binder === 'rabbit' ? [ - React.createElement(Text, null, ' '), - React.createElement(Text, null, ' org.springframework.cloud'), - React.createElement(Text, null, ' spring-cloud-stream-binder-rabbit'), - React.createElement(Text, null, ` ${rabbitSpringCloudVersion}`), - React.createElement(Text, null, ' ') - ] : binder === 'solace' ? [ - React.createElement(Text, null, ' '), - React.createElement(Text, null, ' com.solace.spring.cloud'), - React.createElement(Text, null, ' spring-cloud-starter-stream-solace'), - React.createElement(Text, null, ' ') - ] : [ - React.createElement(Text, null, ' '), - React.createElement(Text, null, ' org.springframework.cloud'), - React.createElement(Text, null, ' spring-cloud-stream-binder-kafka'), - React.createElement(Text, null, ` ${kafkaSpringCloudVersion}`), - React.createElement(Text, null, ' ') - ]), + ...getBinderDependency(binder, kafkaSpringCloudVersion, rabbitSpringCloudVersion), ...(actuator ? [ React.createElement(Text, null, ' '), React.createElement(Text, null, ' org.springframework.boot'), @@ -400,7 +413,7 @@ function needsJacksonJsr310(processedData) { } // Check if any schema has properties with JSR310 types - const jsr310Types = [ + const _jsr310Types = [ 'java.time.LocalDate', 'java.time.LocalTime', 'java.time.LocalDateTime', @@ -419,7 +432,7 @@ function needsJacksonJsr310(processedData) { // Check both type and format to detect JSR310 types const type = property.type; const format = property.format; - const schemaName = property.schemaName; + const _schemaName = property.schemaName; // Check for date-time format which maps to OffsetDateTime if (type === 'string' && format === 'date-time') { @@ -470,8 +483,6 @@ function needsJacksonAnnotations(processedData) { }); } - - /** * Check if validation dependency is needed based on processed data */ @@ -506,8 +517,6 @@ function needsValidation(processedData) { }); } - - module.exports = { PomXml, ApplicationPomXml, diff --git a/components/Readme.js b/components/Readme.js index 906e82e2..773ee2f6 100644 --- a/components/Readme.js +++ b/components/Readme.js @@ -33,57 +33,57 @@ function Readme({ asyncapi, params, processedData }) { return React.createElement(React.Fragment, null, // Header React.createElement(Text, null, `# ${title}`), - React.createElement(Text, null, ""), + React.createElement(Text, null, ''), React.createElement(Text, null, `## Version ${version}`), - React.createElement(Text, null, ""), + React.createElement(Text, null, ''), // Description ...(description || '').split('\n').map((line, index) => React.createElement(Text, { key: index }, line) ), - React.createElement(Text, null, ""), + React.createElement(Text, null, ''), // Project Overview - React.createElement(Text, null, "## Project Overview"), - React.createElement(Text, null, ""), + React.createElement(Text, null, '## Project Overview'), + React.createElement(Text, null, ''), React.createElement(Text, null, `This is a **Spring Cloud Stream** application generated from the **${applicationDomain}** AsyncAPI specification.`), - React.createElement(Text, null, ""), - React.createElement(Text, null, "### Technology Stack"), + React.createElement(Text, null, ''), + React.createElement(Text, null, '### Technology Stack'), ...techStack.map(tech => React.createElement(Text, { key: tech.name }, `- **${tech.name}** ${tech.version}`) ), - React.createElement(Text, null, ""), + React.createElement(Text, null, ''), // Generated Components - React.createElement(Text, null, "## Generated Components"), - React.createElement(Text, null, ""), + React.createElement(Text, null, '## Generated Components'), + React.createElement(Text, null, ''), // Model Classes - React.createElement(Text, null, "### Model Classes"), + React.createElement(Text, null, '### Model Classes'), ...uniqueSchemas.map(schema => React.createElement(Text, { key: schema.name }, `- **${schema.className || schema.name}**`) ), - React.createElement(Text, null, ""), + React.createElement(Text, null, ''), // Functions - React.createElement(Text, null, "### Spring Cloud Stream Functions"), + React.createElement(Text, null, '### Spring Cloud Stream Functions'), ...uniqueFunctions.map(func => { // Use sendMethodName for send functions, otherwise use the function name const displayName = func.type === 'send' && func.sendMethodName ? func.sendMethodName : func.name; return React.createElement(Text, { key: func.name }, `- **${displayName}** - ${getFunctionDescription(func)}`); }), - React.createElement(Text, null, ""), + React.createElement(Text, null, ''), // Message Channels - React.createElement(Text, null, "### Message Channels"), + React.createElement(Text, null, '### Message Channels'), ...uniqueChannels.map(channel => React.createElement(Text, { key: channel.name }, `- **${channel.name}**`) ), - React.createElement(Text, null, ""), + React.createElement(Text, null, ''), // Solace Queues ...(queues.length > 0 ? [ - React.createElement(Text, null, "### Solace Queues"), + React.createElement(Text, null, '### Solace Queues'), ...queues.map(queue => [ React.createElement(Text, { key: queue.name }, `- **${queue.name}** - ${queue.description}`), ...(queue.topicSubscriptions && queue.topicSubscriptions.length > 0 ? @@ -92,144 +92,144 @@ function Readme({ asyncapi, params, processedData }) { ) : [] ) ]).flat(), - React.createElement(Text, null, "") + React.createElement(Text, null, '') ] : []), // Getting Started - React.createElement(Text, null, "## Getting Started"), - React.createElement(Text, null, ""), - React.createElement(Text, null, "### Prerequisites"), + React.createElement(Text, null, '## Getting Started'), + React.createElement(Text, null, ''), + React.createElement(Text, null, '### Prerequisites'), React.createElement(Text, null, `- Java ${javaVersion} or higher`), React.createElement(Text, null, `- Maven ${mavenVersion}+`), React.createElement(Text, null, `- ${binderType} broker (local or cloud)`), - React.createElement(Text, null, ""), - React.createElement(Text, null, "### Configuration"), + React.createElement(Text, null, ''), + React.createElement(Text, null, '### Configuration'), React.createElement(Text, null, `Update the ${binderType} connection settings in \`src/main/resources/application.yml\`:`), - React.createElement(Text, null, ""), - React.createElement(Text, null, "```yaml"), + React.createElement(Text, null, ''), + React.createElement(Text, null, '```yaml'), ...connectionConfig.map(line => React.createElement(Text, { key: line }, line) ), - React.createElement(Text, null, "```"), - React.createElement(Text, null, ""), + React.createElement(Text, null, '```'), + React.createElement(Text, null, ''), // Running the Application - React.createElement(Text, null, "### Running the Application"), - React.createElement(Text, null, ""), - React.createElement(Text, null, "1. **Build the application:**"), - React.createElement(Text, null, " ```bash"), - React.createElement(Text, null, " mvn clean compile"), - React.createElement(Text, null, " ```"), - React.createElement(Text, null, ""), - React.createElement(Text, null, "2. **Run the application:**"), - React.createElement(Text, null, " ```bash"), - React.createElement(Text, null, " mvn spring-boot:run"), - React.createElement(Text, null, " ```"), - React.createElement(Text, null, ""), + React.createElement(Text, null, '### Running the Application'), + React.createElement(Text, null, ''), + React.createElement(Text, null, '1. **Build the application:**'), + React.createElement(Text, null, ' ```bash'), + React.createElement(Text, null, ' mvn clean compile'), + React.createElement(Text, null, ' ```'), + React.createElement(Text, null, ''), + React.createElement(Text, null, '2. **Run the application:**'), + React.createElement(Text, null, ' ```bash'), + React.createElement(Text, null, ' mvn spring-boot:run'), + React.createElement(Text, null, ' ```'), + React.createElement(Text, null, ''), // Development Guide - React.createElement(Text, null, "## Development Guide"), - React.createElement(Text, null, ""), - React.createElement(Text, null, "### Adding Business Logic"), - React.createElement(Text, null, "Each generated function in `Application.java` contains placeholder business logic:"), - React.createElement(Text, null, ""), + React.createElement(Text, null, '## Development Guide'), + React.createElement(Text, null, ''), + React.createElement(Text, null, '### Adding Business Logic'), + React.createElement(Text, null, 'Each generated function in `Application.java` contains placeholder business logic:'), + React.createElement(Text, null, ''), // Consumer Function Example - React.createElement(Text, null, "#### Consumer Functions"), - React.createElement(Text, null, "Process incoming messages:"), - React.createElement(Text, null, ""), - React.createElement(Text, null, "```java"), - React.createElement(Text, null, "@Bean"), - React.createElement(Text, null, "public Consumer> yourConsumer() {"), - React.createElement(Text, null, " return data -> {"), - React.createElement(Text, null, " // Add your business logic here"), - React.createElement(Text, null, " logger.info(\"Received: \" + data.toString());"), - React.createElement(Text, null, " };"), - React.createElement(Text, null, "}"), - React.createElement(Text, null, "```"), - React.createElement(Text, null, ""), + React.createElement(Text, null, '#### Consumer Functions'), + React.createElement(Text, null, 'Process incoming messages:'), + React.createElement(Text, null, ''), + React.createElement(Text, null, '```java'), + React.createElement(Text, null, '@Bean'), + React.createElement(Text, null, 'public Consumer> yourConsumer() {'), + React.createElement(Text, null, ' return data -> {'), + React.createElement(Text, null, ' // Add your business logic here'), + React.createElement(Text, null, ' logger.info("Received: " + data.toString());'), + React.createElement(Text, null, ' };'), + React.createElement(Text, null, '}'), + React.createElement(Text, null, '```'), + React.createElement(Text, null, ''), // Supplier Function Example - React.createElement(Text, null, "#### Supplier Functions"), - React.createElement(Text, null, "Generate and publish messages:"), - React.createElement(Text, null, ""), - React.createElement(Text, null, "```java"), - React.createElement(Text, null, "@Bean"), - React.createElement(Text, null, "public Supplier yourSupplier() {"), - React.createElement(Text, null, " return () -> {"), - React.createElement(Text, null, " // Create and populate your message"), - React.createElement(Text, null, " YourMessageType message = new YourMessageType();"), - React.createElement(Text, null, " // Add your business logic here"), - React.createElement(Text, null, " return message;"), - React.createElement(Text, null, " };"), - React.createElement(Text, null, "}"), - React.createElement(Text, null, "```"), - React.createElement(Text, null, ""), - React.createElement(Text, null, "### Sending Messages"), - React.createElement(Text, null, "Use the generated `send` methods to publish messages:"), - React.createElement(Text, null, ""), - React.createElement(Text, null, "```java"), - React.createElement(Text, null, "// Example: Send order completed message"), - React.createElement(Text, null, "sendOrderCompleted(orderStatus, source, country, storeId, orderId);"), - React.createElement(Text, null, "```"), - React.createElement(Text, null, ""), + React.createElement(Text, null, '#### Supplier Functions'), + React.createElement(Text, null, 'Generate and publish messages:'), + React.createElement(Text, null, ''), + React.createElement(Text, null, '```java'), + React.createElement(Text, null, '@Bean'), + React.createElement(Text, null, 'public Supplier yourSupplier() {'), + React.createElement(Text, null, ' return () -> {'), + React.createElement(Text, null, ' // Create and populate your message'), + React.createElement(Text, null, ' YourMessageType message = new YourMessageType();'), + React.createElement(Text, null, ' // Add your business logic here'), + React.createElement(Text, null, ' return message;'), + React.createElement(Text, null, ' };'), + React.createElement(Text, null, '}'), + React.createElement(Text, null, '```'), + React.createElement(Text, null, ''), + React.createElement(Text, null, '### Sending Messages'), + React.createElement(Text, null, 'Use the generated `send` methods to publish messages:'), + React.createElement(Text, null, ''), + React.createElement(Text, null, '```java'), + React.createElement(Text, null, '// Example: Send order completed message'), + React.createElement(Text, null, 'sendOrderCompleted(orderStatus, source, country, storeId, orderId);'), + React.createElement(Text, null, '```'), + React.createElement(Text, null, ''), // Testing - React.createElement(Text, null, "### Testing"), - React.createElement(Text, null, "1. **Unit Tests:** Create tests for your business logic"), + React.createElement(Text, null, '### Testing'), + React.createElement(Text, null, '1. **Unit Tests:** Create tests for your business logic'), React.createElement(Text, null, `2. **Integration Tests:** Test with a local ${binderType} broker`), - React.createElement(Text, null, "3. **End-to-End Tests:** Test complete message flows"), - React.createElement(Text, null, ""), + React.createElement(Text, null, '3. **End-to-End Tests:** Test complete message flows'), + React.createElement(Text, null, ''), // Deployment - React.createElement(Text, null, "### Deployment"), - React.createElement(Text, null, "1. **Build JAR:** `mvn clean package`"), - React.createElement(Text, null, "2. **Run JAR:** `java -jar target/your-app.jar`"), - React.createElement(Text, null, "3. **Docker:** Use the generated Dockerfile (if available)"), - React.createElement(Text, null, ""), + React.createElement(Text, null, '### Deployment'), + React.createElement(Text, null, '1. **Build JAR:** `mvn clean package`'), + React.createElement(Text, null, '2. **Run JAR:** `java -jar target/your-app.jar`'), + React.createElement(Text, null, '3. **Docker:** Use the generated Dockerfile (if available)'), + React.createElement(Text, null, ''), // Troubleshooting - React.createElement(Text, null, "## Troubleshooting"), - React.createElement(Text, null, ""), - React.createElement(Text, null, "### Common Issues"), + React.createElement(Text, null, '## Troubleshooting'), + React.createElement(Text, null, ''), + React.createElement(Text, null, '### Common Issues'), React.createElement(Text, null, `- **Connection Issues:** Verify ${binderType} broker connectivity`), React.createElement(Text, null, `- **Queue Not Found:** Ensure queues exist in ${binderType}`), - React.createElement(Text, null, "- **Message Format:** Verify message payload matches schema"), - React.createElement(Text, null, ""), - React.createElement(Text, null, "### Logging"), - React.createElement(Text, null, "Adjust logging levels in `application.yml`:"), - React.createElement(Text, null, ""), - React.createElement(Text, null, "```yaml"), - React.createElement(Text, null, "logging:"), - React.createElement(Text, null, " level:"), - React.createElement(Text, null, " com.company: DEBUG"), - React.createElement(Text, null, " org.springframework.cloud.stream: DEBUG"), - React.createElement(Text, null, "```"), - React.createElement(Text, null, ""), + React.createElement(Text, null, '- **Message Format:** Verify message payload matches schema'), + React.createElement(Text, null, ''), + React.createElement(Text, null, '### Logging'), + React.createElement(Text, null, 'Adjust logging levels in `application.yml`:'), + React.createElement(Text, null, ''), + React.createElement(Text, null, '```yaml'), + React.createElement(Text, null, 'logging:'), + React.createElement(Text, null, ' level:'), + React.createElement(Text, null, ' com.company: DEBUG'), + React.createElement(Text, null, ' org.springframework.cloud.stream: DEBUG'), + React.createElement(Text, null, '```'), + React.createElement(Text, null, ''), // API Reference - React.createElement(Text, null, "## API Reference"), - React.createElement(Text, null, ""), - React.createElement(Text, null, "### Message Types"), + React.createElement(Text, null, '## API Reference'), + React.createElement(Text, null, ''), + React.createElement(Text, null, '### Message Types'), ...getMessageTypes(functions).map(msgType => React.createElement(Text, { key: msgType }, `- **${msgType}**`) ), - React.createElement(Text, null, ""), + React.createElement(Text, null, ''), // Configuration Reference - React.createElement(Text, null, "## Configuration Reference"), - React.createElement(Text, null, ""), - React.createElement(Text, null, "### Key Properties"), - React.createElement(Text, null, "- `spring.cloud.function.definition` - Function definitions"), - React.createElement(Text, null, "- `spring.cloud.stream.bindings.*.destination` - Message destinations"), - React.createElement(Text, null, "- `spring.cloud.stream.bindings.*.group` - Consumer groups"), + React.createElement(Text, null, '## Configuration Reference'), + React.createElement(Text, null, ''), + React.createElement(Text, null, '### Key Properties'), + React.createElement(Text, null, '- `spring.cloud.function.definition` - Function definitions'), + React.createElement(Text, null, '- `spring.cloud.stream.bindings.*.destination` - Message destinations'), + React.createElement(Text, null, '- `spring.cloud.stream.bindings.*.group` - Consumer groups'), React.createElement(Text, null, `- \`spring.cloud.stream.${binderName}.bindings.*.consumer.queueNameExpression\` - Queue names`), - React.createElement(Text, null, ""), + React.createElement(Text, null, ''), // License - React.createElement(Text, null, "## License"), - React.createElement(Text, null, "This project is generated from AsyncAPI specification. Please refer to the original specification for licensing information."), - React.createElement(Text, null, "") + React.createElement(Text, null, '## License'), + React.createElement(Text, null, 'This project is generated from AsyncAPI specification. Please refer to the original specification for licensing information.'), + React.createElement(Text, null, '') ); } @@ -349,11 +349,11 @@ function getBinderType(params) { // Map binder to display name const binderMap = { - 'solace': 'Solace PubSub+', - 'kafka': 'Apache Kafka', - 'rabbitmq': 'RabbitMQ', - 'redis': 'Redis', - 'pulsar': 'Apache Pulsar' + solace: 'Solace PubSub+', + kafka: 'Apache Kafka', + rabbitmq: 'RabbitMQ', + redis: 'Redis', + pulsar: 'Apache Pulsar' }; return binderMap[binder.toLowerCase()] || 'Message Broker'; @@ -369,34 +369,34 @@ function getConnectionConfig(params, binderType) { logger.debug('Readme.js: getConnectionConfig() - Getting connection config from params'); const config = []; - config.push("spring:"); - config.push(" cloud:"); - config.push(" stream:"); - config.push(" binders:"); + config.push('spring:'); + config.push(' cloud:'); + config.push(' stream:'); + config.push(' binders:'); const binderName = getBinderName(params); config.push(` ${binderName}-binder:`); - config.push(" type: " + binderName); + config.push(` type: ${ binderName}`); if (binderType === 'Solace PubSub+') { - config.push(" environment:"); - config.push(" solace:"); - config.push(" java:"); + config.push(' environment:'); + config.push(' solace:'); + config.push(' java:'); config.push(` host: '${params.host || 'tcp://your-solace-host:55554'}'`); config.push(` msgVpn: '${params.msgVpn || 'your-message-vpn'}'`); config.push(` clientUsername: '${params.username || 'your-username'}'`); config.push(` clientPassword: '${params.password || 'your-password'}'`); } else if (binderType === 'Apache Kafka') { - config.push(" environment:"); - config.push(" spring:"); - config.push(" kafka:"); - config.push(" bootstrap-servers: '${params.bootstrapServers || 'localhost:9092'}'"); - config.push(" security:"); - config.push(" protocol: '${params.securityProtocol || 'PLAINTEXT'}'"); + config.push(' environment:'); + config.push(' spring:'); + config.push(' kafka:'); + config.push(' bootstrap-servers: \'${params.bootstrapServers || \'localhost:9092\'}\''); + config.push(' security:'); + config.push(' protocol: \'${params.securityProtocol || \'PLAINTEXT\'}\''); } else if (binderType === 'RabbitMQ') { - config.push(" environment:"); - config.push(" spring:"); - config.push(" rabbitmq:"); + config.push(' environment:'); + config.push(' spring:'); + config.push(' rabbitmq:'); config.push(` host: '${params.rabbitHost || 'localhost'}'`); config.push(` port: ${params.rabbitPort || 5672}`); config.push(` username: '${params.rabbitUsername || 'guest'}'`); @@ -406,14 +406,13 @@ function getConnectionConfig(params, binderType) { return config; } - function getFunctionDescription(func) { // Use the actual generated function information from processedData const functionType = func.type || 'unknown'; const isDynamic = func.dynamic || false; const hasParams = func.hasParams || false; const messageName = func.messageName || ''; - const sendMethodName = func.sendMethodName || ''; + const _sendMethodName = func.sendMethodName || ''; // Build a comprehensive description based on the actual function properties let description = ''; @@ -436,15 +435,13 @@ function getFunctionDescription(func) { if (hasParams) { description += ' with dynamic topic parameters'; } - } else { + } else if (func.name && func.name.includes('Supplier')) { // Fallback for unknown types - if (func.name && func.name.includes('Supplier')) { - description = 'Message supplier function for publishing messages'; - } else if (func.name && func.name.includes('Consumer')) { - description = 'Message consumer function for processing messages'; - } else { - description = 'Spring Cloud Stream function'; - } + description = 'Message supplier function for publishing messages'; + } else if (func.name && func.name.includes('Consumer')) { + description = 'Message consumer function for processing messages'; + } else { + description = 'Spring Cloud Stream function'; } return description; @@ -455,7 +452,7 @@ function getChannels(asyncapi) { const channels = []; try { if (asyncapi.channels && typeof asyncapi.channels === 'function') { - const channelMap = asyncapi.channels(); + const _channelMap = asyncapi.channels(); // Get the raw JSON to access channel names const rawChannels = asyncapi._json?.channels || {}; for (const [name, channel] of Object.entries(rawChannels)) { @@ -500,7 +497,7 @@ function getQueues(asyncapi) { if (asyncapi.channels && typeof asyncapi.channels === 'function') { // Get the raw JSON to access channel names const rawChannels = asyncapi._json?.channels || {}; - for (const [name, channel] of Object.entries(rawChannels)) { + for (const [_name, channel] of Object.entries(rawChannels)) { const channelQueues = extractQueuesFromChannel(channel); for (const queue of channelQueues) { if (queueMap.has(queue.name)) { diff --git a/hooks/post-process.js b/hooks/post-process.js index 24ddf289..33d88b69 100644 --- a/hooks/post-process.js +++ b/hooks/post-process.js @@ -13,8 +13,8 @@ module.exports = { const targetDir = generator.targetDir; const javaPackage = generator.templateParams.javaPackage || 'com.company'; - const packagePath = javaPackage.replace(/\./g, '/'); - + const _packagePath = javaPackage.replace(/\./g, '/'); + // Create the main Java source directory structure const javaSourceDir = path.join(targetDir, 'src/main/java'); ensureDirectoryExists(javaSourceDir); @@ -78,17 +78,14 @@ function organizeGeneratedFiles(generator, targetDir, javaSourceDir, resourcesDi logger.debug(`Post-process: Removing unwanted Java file: ${file}`); fs.unlinkSync(filePath); } - } - // Handle YAML/Properties files - else if (file.endsWith('.yml') || file.endsWith('.yaml') || file.endsWith('.properties')) { + } else if (file.endsWith('.yml') || file.endsWith('.yaml') || file.endsWith('.properties')) { + // Handle YAML/Properties files moveResourceFile(filePath, resourcesDir, file); - } - // Keep pom.xml and README.md in root - else if (file === 'pom.xml' || file === 'README.md' || file === 'package.json' || file === 'package-lock.json') { + } else if (file === 'pom.xml' || file === 'README.md' || file === 'package.json' || file === 'package-lock.json') { + // Keep pom.xml and README.md in root logger.debug(`Post-process: Keeping ${file} in root directory`); - } - // Clean up any other files that shouldn't be in root - else { + } else { + // Clean up any other files that shouldn't be in root logger.debug(`Post-process: Removing unexpected file: ${file}`); fs.unlinkSync(filePath); } @@ -124,7 +121,7 @@ function moveJavaFileWithPackage(sourcePath, targetDir, fileName, generator) { } // Check if this file is already in a namespace directory (Avro schema) - const sourceDir = path.dirname(sourcePath); + const _sourceDir = path.dirname(sourcePath); const relativePath = path.relative(generator.targetDir, sourcePath); // If the file is already in src/main/java/package/path/ structure, it's an Avro schema @@ -243,7 +240,6 @@ function getPackageInfo(schemaName, generator) { // Default fallback logger.debug(`Post-process: No package info found for ${schemaName}, using default`); return { javaPackage: null, className: schemaName }; - } catch (error) { logger.warn(`Post-process: Error getting package info for ${schemaName}:`, error.message); return { javaPackage: null, className: schemaName }; @@ -389,7 +385,6 @@ function getAvroPackageInfoFromMessages(schemaName, asyncapi) { } } } - } catch (error) { logger.warn('Post-process: Error extracting AVRO package info from messages:', error.message); } diff --git a/hooks/pre-process.js b/hooks/pre-process.js index 9e748e31..98d80add 100644 --- a/hooks/pre-process.js +++ b/hooks/pre-process.js @@ -184,7 +184,7 @@ function setupTemplateParameters(generator) { /** * Extract Java package from AVRO namespaces in messages */ -function extractJavaPackageFromAvroNamespaces(asyncapi) { +function _extractJavaPackageFromAvroNamespaces(asyncapi) { logger.debug('pre-process.js: extractJavaPackageFromAvroNamespaces() - Extracting Java package from AVRO namespaces'); try { // Check components.messages for AVRO schemas @@ -192,7 +192,7 @@ function extractJavaPackageFromAvroNamespaces(asyncapi) { if (messages) { // Try different ways to iterate over messages if (typeof messages.forEach === 'function') { - let foundPackages = new Set(); + const foundPackages = new Set(); messages.forEach((msg, msgName) => { try { @@ -230,15 +230,14 @@ function extractJavaPackageFromAvroNamespaces(asyncapi) { const packages = Array.from(foundPackages); if (packages.length === 1) { return packages[0]; - } else { - // Multiple packages found - try to find a common parent - const commonParent = findCommonParentPackage(packages); - if (commonParent) { - return commonParent; - } - // If no common parent, use the first package - return packages[0]; + } + // Multiple packages found - try to find a common parent + const commonParent = findCommonParentPackage(packages); + if (commonParent) { + return commonParent; } + // If no common parent, use the first package + return packages[0]; } } } @@ -267,7 +266,7 @@ function findCommonParentPackage(packages) { for (let i = 0; i < parts.length; i++) { const testPrefix = parts.slice(0, i + 1).join('.'); - const allMatch = packages.every(pkg => pkg.startsWith(testPrefix + '.') || pkg === testPrefix); + const allMatch = packages.every(pkg => pkg.startsWith(`${testPrefix }.`) || pkg === testPrefix); if (allMatch) { commonPrefix = testPrefix; diff --git a/template/index.js b/template/index.js index 77843160..81a6f2c8 100644 --- a/template/index.js +++ b/template/index.js @@ -13,7 +13,6 @@ function Template({ asyncapi, params, targetDir }) { const { PomXml } = require('../components/PomXml'); const { Readme } = require('../components/Readme'); const { processAsyncApi } = require('../utils/asyncApiProcessor'); - const filenamify = require('filenamify'); logger.debug('template/index.js: Template() - About to call processAsyncApi'); try { @@ -40,14 +39,14 @@ function Template({ asyncapi, params, targetDir }) { logger.debug('template/index.js: Template() - About to generate pom.xml'); if (artifactType === 'application') { files.push( - React.createElement(File, { name: "pom.xml" }, - React.createElement(PomXml, { params, asyncapi, processedData, artifactType: "application" }) + React.createElement(File, { name: 'pom.xml' }, + React.createElement(PomXml, { params, asyncapi, processedData, artifactType: 'application' }) ) ); } else { files.push( - React.createElement(File, { name: "pom.xml" }, - React.createElement(PomXml, { params, asyncapi, processedData, artifactType: "library" }) + React.createElement(File, { name: 'pom.xml' }, + React.createElement(PomXml, { params, asyncapi, processedData, artifactType: 'library' }) ) ); } @@ -55,7 +54,7 @@ function Template({ asyncapi, params, targetDir }) { // Generate README.md logger.debug('template/index.js: Template() - About to generate README.md'); files.push( - React.createElement(File, { name: "README.md" }, + React.createElement(File, { name: 'README.md' }, React.createElement(Readme, { params, asyncapi, processedData }) ) ); @@ -81,8 +80,8 @@ function Template({ asyncapi, params, targetDir }) { logger.debug(`template/index.js: Processing schema [${index}]: ${schemaName}`); // Skip schemas with numeric names (0, 1) as they are duplicates of component schemas - if ((typeof schemaName === 'number' && /^\d+$/.test(String(schemaName))) || - (typeof schemaName === 'string' && /^\d+$/.test(schemaName))) { + if ((typeof schemaName === 'number' && (/^\d+$/).test(String(schemaName))) || + (typeof schemaName === 'string' && (/^\d+$/).test(schemaName))) { logger.debug(`template/index.js: Skipping numeric schema name: ${schemaName} (duplicate of component schema)`); return; } @@ -131,7 +130,7 @@ function Template({ asyncapi, params, targetDir }) { processedData, // <-- pass processedData to ModelClass extendsClass: processedSchema.extendsClass, namespace: processedSchema.namespace, - className: className, + className, parentProperties: processedSchema.parentProperties // <-- pass parentProperties }) ) @@ -141,7 +140,7 @@ function Template({ asyncapi, params, targetDir }) { // Generate application.yml in root (will be moved by post-hook) logger.debug('template/index.js: Template() - About to generate application.yml'); files.push( - React.createElement(File, { name: "application.yml" }, + React.createElement(File, { name: 'application.yml' }, React.createElement(ApplicationYml, { params, asyncapi, processedData }) ) ); diff --git a/test/generate_code_for_mocks.js b/test/generate_code_for_mocks.js index 85bc6e7a..95d9241f 100644 --- a/test/generate_code_for_mocks.js +++ b/test/generate_code_for_mocks.js @@ -54,10 +54,10 @@ const runGenerator = async (fileName, idx, total) => { const outputDir = path.resolve(baseOutputDir, baseFileName); // Force immediate output for file header - console.log(`\n===============================================================`); + console.log('\n==============================================================='); console.log(`[${idx + 1}/${total}] Processing: ${fileName}`); console.log(`πŸ“ Output: ${outputDir}`); - console.log(`===============================================================`); + console.log('==============================================================='); process.stdout.write(''); // Force flush // Clean up existing output directory @@ -103,7 +103,7 @@ const runGenerator = async (fileName, idx, total) => { }; const runAllTests = async () => { - console.log(`\nπŸ§ͺ Starting AsyncAPI code generation tests...`); + console.log('\nπŸ§ͺ Starting AsyncAPI code generation tests...'); console.log(`πŸ“‚ Template: ${templatePath}`); console.log(`πŸ“ Source: ${mocksDir}`); console.log(`πŸ“ Output: ${baseOutputDir}`); @@ -130,20 +130,20 @@ const runAllTests = async () => { const endTime = Date.now(); const duration = ((endTime - startTime) / 1000).toFixed(2); - console.log(`\nπŸ“Š Test Results:`); + console.log('\nπŸ“Š Test Results:'); console.log(` βœ… Successful: ${successCount}`); console.log(` ❌ Failed: ${failureCount}`); console.log(` ⏱️ Duration: ${duration}s`); if (failedFiles.length > 0) { - console.log(`\n❌ Failed Files:`); + console.log('\n❌ Failed Files:'); failedFiles.forEach(file => { console.log(` - ${file}`); }); } if (successfulFiles.length > 0) { - console.log(`\nβœ… Successful Files:`); + console.log('\nβœ… Successful Files:'); successfulFiles.forEach(file => { console.log(` - ${file}`); }); diff --git a/test/integration.test.js b/test/integration.test.js index 492fd01a..b962801f 100644 --- a/test/integration.test.js +++ b/test/integration.test.js @@ -6,7 +6,6 @@ const TEST_SUITE_NAME = 'Comprehensive Integration Tests - ALL AsyncAPI Files Va // Constants for folder identification const MOCKS_FOLDER = path.join('test', 'mocks'); -const OUTPUT_FOLDER = path.join('test', 'output'); const TEMP_OUTPUT_FOLDER = path.join('test', 'temp', 'comprehensiveIntegrationTestResult'); // ALL AsyncAPI files in the mocks directory diff --git a/utils/avroProcessor/avroProcessor.js b/utils/avroProcessor/avroProcessor.js index 368dc5f2..16333b2b 100644 --- a/utils/avroProcessor/avroProcessor.js +++ b/utils/avroProcessor/avroProcessor.js @@ -15,22 +15,22 @@ function extractAvroSchemasFromMessages(asyncapi) { const messages = asyncapi.components().messages(); if (!messages) { - return schemas; - } + return schemas; + } - // Simple iteration over messages - if (typeof messages.forEach === 'function') { - messages.forEach((message, messageName) => { - try { - if (!message) { - logger.warn(`extractAvroSchemasFromMessages: message ${messageName} is null or undefined`); - return; - } + // Simple iteration over messages + if (typeof messages.forEach === 'function') { + messages.forEach((message, messageName) => { + try { + if (!message) { + logger.warn(`extractAvroSchemasFromMessages: message ${messageName} is null or undefined`); + return; + } - const payload = message.payload && message.payload(); - const schemaFormat = message.schemaFormat && message.schemaFormat(); + const payload = message.payload && message.payload(); + const schemaFormat = message.schemaFormat && message.schemaFormat(); - // Check if this is an Avro schema + // Check if this is an Avro schema if (payload && schemaFormat && schemaFormat.includes('avro')) { logger.debug(`Found Avro schema in message ${messageName}`); @@ -174,7 +174,7 @@ function extractAvroSchemasFromMessages(asyncapi) { }), _json: { name: className, - namespace: namespace, + namespace, type: 'record', // Include processed fields with correct type information fields: properties.map(prop => ({ @@ -200,7 +200,7 @@ function extractAvroSchemasFromMessages(asyncapi) { return propMap; }, // Add properties array directly to schema object for template detection - properties: properties, + propertiesArray: properties, required: () => required, description: () => payload.description ? payload.description() : '' }; @@ -214,8 +214,8 @@ function extractAvroSchemasFromMessages(asyncapi) { logger.debug(`Replacing existing schema with Avro schema: ${namespace}.${className}`); schemas[existingSchemaIndex] = { name: `${namespace}.${className}`, - properties: properties, - required: required, + properties, + required, description: payload.description ? payload.description() : '', extendsClass: null, schema: avroSchema, @@ -227,8 +227,8 @@ function extractAvroSchemasFromMessages(asyncapi) { } else { schemas.push({ name: `${namespace}.${className}`, - properties: properties, - required: required, + properties, + required, description: payload.description ? payload.description() : '', extendsClass: null, schema: avroSchema, @@ -282,28 +282,28 @@ function processAvroFieldType(field) { // Handle logical types (must check before other types) if (field.logicalType) { switch (field.logicalType) { - case 'timestamp-millis': - case 'timestamp-micros': - return { - javaType: 'java.time.Instant', - required: true, - schema: { _json: field, type: () => 'long', description: () => field.doc || '', required: () => true } - }; - case 'decimal': - return { - javaType: 'java.math.BigDecimal', - required: true, - schema: { _json: field, type: () => 'bytes', description: () => field.doc || '', required: () => true } - }; + case 'timestamp-millis': + case 'timestamp-micros': + return { + javaType: 'java.time.Instant', + required: true, + schema: { _json: field, type: () => 'long', description: () => field.doc || '', required: () => true } + }; + case 'decimal': + return { + javaType: 'java.math.BigDecimal', + required: true, + schema: { _json: field, type: () => 'bytes', description: () => field.doc || '', required: () => true } + }; // Add more logical types as needed } } // Handle arrays if (fieldType === 'array' && field.items) { - const itemResult = processAvroFieldType(typeof field.items === 'object' ? { ...field.items, name: fieldName + 'Item' } : { name: fieldName + 'Item', type: field.items }); + const itemResult = processAvroFieldType(typeof field.items === 'object' ? { ...field.items, name: `${fieldName }Item` } : { name: `${fieldName }Item`, type: field.items }); return { - javaType: itemResult.javaType + '[]', + javaType: `${itemResult.javaType }[]`, required: true, schema: { _json: field, type: () => 'array', description: () => field.doc || '', required: () => true } }; @@ -312,7 +312,7 @@ function processAvroFieldType(field) { // Handle maps (JSON Schema format: type=object with additionalProperties) if (fieldType === 'object' && field.additionalProperties) { const valueType = field.additionalProperties.type || 'Object'; - const valueResult = processAvroFieldType({ name: fieldName + 'Value', type: valueType }); + const valueResult = processAvroFieldType({ name: `${fieldName }Value`, type: valueType }); return { javaType: `Map`, required: true, @@ -326,7 +326,7 @@ function processAvroFieldType(field) { return { javaType: enumClassName, required: true, - enumClassName: enumClassName, + enumClassName, enumSymbols: field && field.enum ? field.enum : [], schema: { _json: field, type: () => 'enum', description: () => field.doc || '', required: () => true, enum: () => field && field.enum ? field.enum : [] } }; @@ -338,7 +338,7 @@ function processAvroFieldType(field) { return { javaType: enumClassName, required: true, - enumClassName: enumClassName, + enumClassName, enumSymbols: fieldType.symbols || [], schema: { _json: field, type: () => 'enum', description: () => field.doc || '', required: () => true, enum: () => fieldType.symbols } }; @@ -374,19 +374,19 @@ function processAvroFieldType(field) { // Check for logical types on the field itself if (field.logicalType) { switch (field.logicalType) { - case 'timestamp-millis': - case 'timestamp-micros': - return { - javaType: 'java.time.Instant', - required: true, - schema: { _json: field, type: () => 'long', description: () => field.doc || '', required: () => true } - }; - case 'decimal': - return { - javaType: 'java.math.BigDecimal', - required: true, - schema: { _json: field, type: () => 'bytes', description: () => field.doc || '', required: () => true } - }; + case 'timestamp-millis': + case 'timestamp-micros': + return { + javaType: 'java.time.Instant', + required: true, + schema: { _json: field, type: () => 'long', description: () => field.doc || '', required: () => true } + }; + case 'decimal': + return { + javaType: 'java.math.BigDecimal', + required: true, + schema: { _json: field, type: () => 'bytes', description: () => field.doc || '', required: () => true } + }; // Add more logical types as needed } } @@ -455,24 +455,23 @@ function processAvroUnionType(unionTypes, fieldName, field) { required: false, schema: fieldSchema }; - } else { - // Complex union: use Object for now - const fieldSchema = { - _json: { - type: 'object', - description: field.doc || '' - }, - type: () => 'object', - description: () => field.doc || '', - required: () => true - }; + } + // Complex union: use Object for now + const fieldSchema = { + _json: { + type: 'object', + description: field.doc || '' + }, + type: () => 'object', + description: () => field.doc || '', + required: () => true + }; - return { - javaType: 'Object', - required: true, - schema: fieldSchema - }; - } + return { + javaType: 'Object', + required: true, + schema: fieldSchema + }; } /** @@ -587,7 +586,7 @@ function processAvroMapType(mapType, fieldName, field) { } } else if (typeof valuesType === 'object' && valuesType !== null) { // Recursively process value type for Avro features - valueJavaType = processAvroFieldType({ ...valuesType, name: fieldName + 'Value' }).javaType; + valueJavaType = processAvroFieldType({ ...valuesType, name: `${fieldName }Value` }).javaType; } const fieldSchema = { @@ -667,35 +666,35 @@ function processAvroRecordType(recordType, fieldName, field) { function convertAvroTypeToJavaTypeInline(avroType) { if (typeof avroType === 'string') { switch (avroType.toLowerCase()) { - case 'string': - return 'String'; - case 'int': - case 'integer': - return 'Integer'; - case 'long': - return 'Long'; - case 'float': - return 'Float'; - case 'double': - return 'Double'; - case 'boolean': - return 'Boolean'; - case 'bytes': - return 'byte[]'; - case 'null': - return 'Object'; - case 'enum': - return 'String'; - case 'record': - return 'Object'; - case 'array': - return 'Object[]'; - case 'map': - return 'Map'; - case 'fixed': - return 'byte[]'; - default: - return 'String'; + case 'string': + return 'String'; + case 'int': + case 'integer': + return 'Integer'; + case 'long': + return 'Long'; + case 'float': + return 'Float'; + case 'double': + return 'Double'; + case 'boolean': + return 'Boolean'; + case 'bytes': + return 'byte[]'; + case 'null': + return 'Object'; + case 'enum': + return 'String'; + case 'record': + return 'Object'; + case 'array': + return 'Object[]'; + case 'map': + return 'Map'; + case 'fixed': + return 'byte[]'; + default: + return 'String'; } } else if (Array.isArray(avroType)) { const nonNullTypes = avroType.filter(t => t !== 'null'); @@ -708,26 +707,26 @@ function convertAvroTypeToJavaTypeInline(avroType) { const logicalType = avroType.logicalType; if (logicalType) { switch (logicalType) { - case 'date': - return 'java.time.LocalDate'; - case 'time-millis': - return 'java.time.LocalTime'; - case 'time-micros': - return 'java.time.LocalTime'; - case 'timestamp-millis': - return 'java.time.Instant'; - case 'timestamp-micros': - return 'java.time.Instant'; - case 'local-timestamp-millis': - return 'java.time.LocalDateTime'; - case 'local-timestamp-micros': - return 'java.time.LocalDateTime'; - case 'uuid': - return 'java.util.UUID'; - case 'decimal': - return 'java.math.BigDecimal'; - default: - return convertAvroTypeToJavaTypeInline(baseType); + case 'date': + return 'java.time.LocalDate'; + case 'time-millis': + return 'java.time.LocalTime'; + case 'time-micros': + return 'java.time.LocalTime'; + case 'timestamp-millis': + return 'java.time.Instant'; + case 'timestamp-micros': + return 'java.time.Instant'; + case 'local-timestamp-millis': + return 'java.time.LocalDateTime'; + case 'local-timestamp-micros': + return 'java.time.LocalDateTime'; + case 'uuid': + return 'java.util.UUID'; + case 'decimal': + return 'java.math.BigDecimal'; + default: + return convertAvroTypeToJavaTypeInline(baseType); } } return convertAvroTypeToJavaTypeInline(baseType); diff --git a/utils/avroProcessor/avroSchemaModel.js b/utils/avroProcessor/avroSchemaModel.js index ae2b7d6f..cbbd838b 100644 --- a/utils/avroProcessor/avroSchemaModel.js +++ b/utils/avroProcessor/avroSchemaModel.js @@ -2,6 +2,80 @@ const _ = require('lodash'); const { logger } = require('../logger'); const { stripPackageName } = require('../typeUtils'); +/** + * ModelClass for representing Java class information + */ +class ModelClass { + constructor() { + this.innerClass = true; + this.className = null; + this.originalName = null; // NEW: store original schema name + this.superClassName = null; + this.javaPackage = null; + } + + getClassName() { + return this.className; + } + + setClassName(originalName) { + this.className = this.fixClassName(originalName); + } + + getOriginalName() { // NEW: getter for original name + return this.originalName; + } + + setOriginalName(originalName) { // NEW: setter for original name + this.originalName = originalName; + } + + getSuperClassName() { + return this.superClassName; + } + + setSuperClassName(originalName) { + this.superClassName = this.fixClassName(originalName); + } + + getJavaPackage() { + return this.javaPackage; + } + + setJavaPackage(javaPackage) { + this.javaPackage = javaPackage; + } + + isSubClass() { + return this.superClassName !== undefined; + } + + fixClassName(originalName) { + // For AVRO schemas, the originalName should already be the class name part (e.g., "JobOrder" from "com.example.api.jobOrder.JobOrder") + if (!originalName) return 'UnknownSchema'; + + // If the name contains dots, it's a full schema name, so we need to extract the class name + if (originalName.includes('.')) { + const lastDotIndex = originalName.lastIndexOf('.'); + originalName = originalName.substring(lastDotIndex + 1); + } + + // Remove special characters and convert to PascalCase + let className = originalName.replace(/[^a-zA-Z0-9]/g, ''); + className = className.charAt(0).toUpperCase() + className.slice(1); + + return className; + } + + setCanBeInnerClass(innerClass) { + this.innerClass = innerClass; + } + + canBeInnerClass() { + return this.innerClass; + } +} + class SchemaModel { constructor() { this.superClassMap = new Map(); @@ -126,7 +200,7 @@ class SchemaModel { logger.debug('schemaModel.js: setupModelClassMap() - Setting up model class map'); - const allSchemas = asyncapi.allSchemas().all() + const allSchemas = asyncapi.allSchemas().all(); if (!allSchemas || allSchemas.length === 0) return; // Register all schemas recursively as a flat map of name -> ModelClass @@ -240,78 +314,4 @@ class SchemaModel { } } -/** - * ModelClass for representing Java class information - */ -class ModelClass { - constructor() { - this.innerClass = true; - this.className = null; - this.originalName = null; // NEW: store original schema name - this.superClassName = null; - this.javaPackage = null; - } - - getClassName() { - return this.className; - } - - setClassName(originalName) { - this.className = this.fixClassName(originalName); - } - - getOriginalName() { // NEW: getter for original name - return this.originalName; - } - - setOriginalName(originalName) { // NEW: setter for original name - this.originalName = originalName; - } - - getSuperClassName() { - return this.superClassName; - } - - setSuperClassName(originalName) { - this.superClassName = this.fixClassName(originalName); - } - - getJavaPackage() { - return this.javaPackage; - } - - setJavaPackage(javaPackage) { - this.javaPackage = javaPackage; - } - - isSubClass() { - return this.superClassName !== undefined; - } - - fixClassName(originalName) { - // For AVRO schemas, the originalName should already be the class name part (e.g., "JobOrder" from "com.example.api.jobOrder.JobOrder") - if (!originalName) return 'UnknownSchema'; - - // If the name contains dots, it's a full schema name, so we need to extract the class name - if (originalName.includes('.')) { - const lastDotIndex = originalName.lastIndexOf('.'); - originalName = originalName.substring(lastDotIndex + 1); - } - - // Remove special characters and convert to PascalCase - let className = originalName.replace(/[^a-zA-Z0-9]/g, ''); - className = className.charAt(0).toUpperCase() + className.slice(1); - - return className; - } - - setCanBeInnerClass(innerClass) { - this.innerClass = innerClass; - } - - canBeInnerClass() { - return this.innerClass; - } -} - module.exports = { SchemaModel, ModelClass }; \ No newline at end of file diff --git a/utils/avroProcessor/index.js b/utils/avroProcessor/index.js index 22d606a4..067e1c92 100644 --- a/utils/avroProcessor/index.js +++ b/utils/avroProcessor/index.js @@ -1,24 +1,24 @@ const { logger } = require('../logger'); const { SchemaModel } = require('./avroSchemaModel'); -const { - getEnhancedType, - checkPropertyNames, - getIdentifierName, - fixType, +const { + checkPropertyNames, stripPackageName } = require('../typeUtils'); -const { - getSampleArg, - getMultipleMessageComment, - getMessagePayloadType, - getPayloadClass -} = require('../functionUtils'); const { processAvroFieldType } = require('./avroProcessor'); // Initialize schema model instance const schemaModel = new SchemaModel(); +/** + * Helper to safely get a value that might be a function or direct value + */ +function getValue(obj, defaultValue = undefined) { + if (obj === undefined || obj === null) return defaultValue; + if (typeof obj === 'function') return obj(); + return obj; +} + /** * Detect if AsyncAPI document contains Avro schemas */ @@ -235,18 +235,18 @@ function processAvroSchema(schema, schemaName) { const propertyArray = Array.from(schemaProperties.values()); propertyArray.forEach(prop => { const propertyName = prop.id(); - const isRequired = Array.isArray(required) ? required.includes(propertyName) : false; + const _isRequired = Array.isArray(required) ? required.includes(propertyName) : false; // Use comprehensive Avro field processing const processedField = processAvroFieldType({ name: propertyName, type: prop.type ? prop.type() : 'object', doc: prop.description ? prop.description() : '', - logicalType: prop.logicalType ? (typeof prop.logicalType === 'function' ? prop.logicalType() : prop.logicalType) : undefined, + logicalType: getValue(prop.logicalType), items: prop.items ? prop.items() : undefined, additionalProperties: prop.additionalProperties ? prop.additionalProperties() : undefined, enum: prop.enum ? prop.enum() : undefined, - oneOf: prop.oneOf ? (typeof prop.oneOf === 'function' ? prop.oneOf() : prop.oneOf) : undefined, + oneOf: getValue(prop.oneOf), minimum: prop.minimum ? prop.minimum() : undefined, maximum: prop.maximum ? prop.maximum() : undefined, pattern: prop.pattern ? prop.pattern() : undefined, @@ -268,24 +268,24 @@ function processAvroSchema(schema, schemaName) { } else if (schemaProperties && typeof schemaProperties.forEach === 'function') { // Try forEach method schemaProperties.forEach((prop, propName) => { - const isRequired = Array.isArray(required) ? required.includes(propName) : false; + const _isRequired = Array.isArray(required) ? required.includes(propName) : false; // Use comprehensive Avro field processing const processedField = processAvroFieldType({ name: propName, type: prop.type ? prop.type() : 'object', doc: prop.description ? prop.description() : '', - logicalType: prop.logicalType ? (typeof prop.logicalType === 'function' ? prop.logicalType() : prop.logicalType) : undefined, + logicalType: getValue(prop.logicalType), items: prop.items ? prop.items() : undefined, additionalProperties: prop.additionalProperties ? prop.additionalProperties() : undefined, enum: prop.enum ? prop.enum() : undefined, - oneOf: prop.oneOf ? (typeof prop.oneOf === 'function' ? prop.oneOf() : prop.oneOf) : undefined, + oneOf: getValue(prop.oneOf), minimum: prop.minimum ? prop.minimum() : undefined, maximum: prop.maximum ? prop.maximum() : undefined, pattern: prop.pattern ? prop.pattern() : undefined, fields: prop.fields ? prop.fields() : undefined }); - + properties.push({ name: propName, type: processedField, // Use the processed field object with javaType @@ -301,14 +301,14 @@ function processAvroSchema(schema, schemaName) { } else if (schemaProperties && typeof schemaProperties === 'object') { // Handle plain object with property names as keys using Object.entries Object.entries(schemaProperties).forEach(([propName, prop]) => { - const isRequired = Array.isArray(required) ? required.includes(propName) : false; + const _isRequired = Array.isArray(required) ? required.includes(propName) : false; // Use comprehensive Avro field processing const processedField = processAvroFieldType({ name: propName, type: prop.type ? prop.type() : 'object', doc: prop.description ? prop.description() : '', - logicalType: prop.logicalType ? (typeof prop.logicalType === 'function' ? prop.logicalType() : prop.logicalType) : undefined, + logicalType: getValue(prop.logicalType), items: prop.items ? prop.items() : undefined, additionalProperties: prop.additionalProperties ? prop.additionalProperties() : undefined, enum: prop.enum ? prop.enum() : undefined, @@ -318,7 +318,7 @@ function processAvroSchema(schema, schemaName) { pattern: prop.pattern ? prop.pattern() : undefined, fields: prop.fields ? prop.fields() : undefined }); - + properties.push({ name: propName, type: processedField, // Use the processed field object with javaType @@ -341,16 +341,16 @@ function processAvroSchema(schema, schemaName) { return { name: schemaName, // This is the original schema name from AsyncAPI spec - className: className, // Use the extracted class name (not the full schema name) - packagePath: packagePath, - namespace: namespace, - properties: properties, + className, // Use the extracted class name (not the full schema name) + packagePath, + namespace, + properties, isAvro: true, isAvroSchema: true, - needsJsonPropertyInclude: needsJsonPropertyInclude, - extendsClass: extendsClass, + needsJsonPropertyInclude, + extendsClass, canBeInnerClass: modelClass.canBeInnerClass(), - modelClass: modelClass + modelClass }; } @@ -363,7 +363,7 @@ function getAvroSchemaType(schema) { if (!schema) return 'object'; const type = schema.type ? schema.type() : null; - const format = schema.format ? schema.format() : null; + const _format = schema.format ? schema.format() : null; if (type === 'array') { const items = schema.items(); @@ -371,9 +371,8 @@ function getAvroSchemaType(schema) { const itemType = items.type ? items.type() : null; if (!itemType || itemType === 'object') { return 'array-object'; - } else { - return `array-${itemType}`; - } + } + return `array-${itemType}`; } return 'array'; } diff --git a/utils/coreProcessor.js b/utils/coreProcessor.js index f29f7ec0..43e5445a 100644 --- a/utils/coreProcessor.js +++ b/utils/coreProcessor.js @@ -1,7 +1,6 @@ -const _ = require('lodash'); const { logger } = require('./logger'); const { processJsonSchemas } = require('./jsonProcessor/index'); -const { extractAvroSchemasFromMessages, isAvroSchema, isAvroMessage } = require('./avroProcessor'); +const { extractAvroSchemasFromMessages } = require('./avroProcessor'); const { toPascalCase, toCamelCase, getSchemaType } = require('./typeUtils'); const { getFunctionName, getMultipleMessageComment, sortParametersUsingChannelName, getFunctionPayloadType } = require('./functionUtils'); const { getPackageName } = require('../components/Application'); @@ -184,9 +183,9 @@ function detectJsonSchemas(asyncapi) { * Generates consumer, supplier, and send functions based on channel operations */ function extractFunctions(asyncapi, params, processedSchemas = []) { - const functionMap = new Map(); - const usedFunctionNames = new Set(); - const { reactive = false, dynamicType = 'streamBridge', binder = 'solace', parametersToHeaders = false } = params; + const _functionMap = new Map(); + const _usedFunctionNames = new Set(); + const { reactive = false, dynamicType = 'streamBridge', binder: _binder = 'solace', parametersToHeaders = false } = params; const channels = asyncapi.channels(); logger.debug('extractFunctions: Starting function extraction'); @@ -287,7 +286,7 @@ function extractFunctions(asyncapi, params, processedSchemas = []) { // Handle remaining conflicts by adding a unique suffix if (existingMethodNames.includes(sendMethodName)) { let counter = 1; - let baseName = sendMethodName; + const baseName = sendMethodName; while (existingMethodNames.includes(sendMethodName)) { sendMethodName = `${baseName}${counter}`; counter++; @@ -298,7 +297,7 @@ function extractFunctions(asyncapi, params, processedSchemas = []) { functions.push({ name: getFunctionName(channelName, realPublisher, false), type: 'send', - sendMethodName: sendMethodName, + sendMethodName, publishPayload: payloadType, dynamic: true, dynamicType, @@ -308,7 +307,7 @@ function extractFunctions(asyncapi, params, processedSchemas = []) { parameters, channelInfo, operation: realPublisher, - messageName: messageName, + messageName, multipleMessageComment: getMultipleMessageComment(realPublisher) }); } else { @@ -326,7 +325,7 @@ function extractFunctions(asyncapi, params, processedSchemas = []) { parameters: [], channelInfo, operation: realPublisher, - messageName: messageName, + messageName, multipleMessageComment: getMultipleMessageComment(realPublisher) }); } @@ -375,15 +374,15 @@ function extractFunctions(asyncapi, params, processedSchemas = []) { queueName: queueInfo.queueName, topicSubscriptions: queueInfo.topicSubscriptions }, - group: queueInfo.queueName + '-group', + group: `${queueInfo.queueName }-group`, isQueueWithSubscription: true, queueName: queueInfo.queueName, topicSubscriptions: queueInfo.topicSubscriptions, subscribeChannel: channelInfo.subscribeChannel, publishChannel: channelInfo.publishChannel, operation: realSubscriber, - messageName: messageName, - hasEnumParameters: hasEnumParameters + messageName, + hasEnumParameters }); } }); @@ -409,15 +408,15 @@ function extractFunctions(asyncapi, params, processedSchemas = []) { hasParams: channelInfo.hasParams || false, parameters: channelInfo.parameters || [], channelInfo, - group: channelInfo.queueName + '-group', + group: `${channelInfo.queueName }-group`, isQueueWithSubscription: true, queueName: channelInfo.queueName, topicSubscriptions: channelInfo.topicSubscriptions, subscribeChannel: channelInfo.subscribeChannel, publishChannel: channelInfo.publishChannel, operation: realSubscriber, - messageName: messageName, - hasEnumParameters: hasEnumParameters + messageName, + hasEnumParameters }); } } else { @@ -441,9 +440,9 @@ function extractFunctions(asyncapi, params, processedSchemas = []) { parameters: channelInfo.parameters || [], channelInfo, operation: realSubscriber, - messageName: messageName, + messageName, multipleMessageComment: getMultipleMessageComment(realSubscriber), - hasEnumParameters: hasEnumParameters + hasEnumParameters }); } } @@ -459,7 +458,6 @@ function extractFunctions(asyncapi, params, processedSchemas = []) { return processedFunctions; } - /** * Convert queue name to consumer bean name * Handles dot-separated names (e.g., 'coreBanking.accounts' -> 'CoreBankingaccounts') @@ -486,26 +484,26 @@ function toConsumerBeanName(str) { function extractMessageName(operation) { try { if (!operation) { - logger.debug(`extractMessageName: operation is null`); + logger.debug('extractMessageName: operation is null'); return null; } const messages = operation.messages(); if (!messages || typeof messages.values !== 'function') { - logger.debug(`extractMessageName: No messages or values function`); + logger.debug('extractMessageName: No messages or values function'); return null; } const messageArray = Array.from(messages.values()); logger.debug(`extractMessageName: Found ${messageArray.length} messages`); if (messageArray.length === 0) { - logger.debug(`extractMessageName: No messages in array`); + logger.debug('extractMessageName: No messages in array'); return null; } // Take the first message const message = messageArray[0]; - logger.debug(`extractMessageName: Processing first message`); + logger.debug('extractMessageName: Processing first message'); // Try to get the message name using AsyncAPI library functions if (message.name && typeof message.name === 'function') { @@ -558,9 +556,9 @@ function extractMessageName(operation) { } // Try to get from message object's internal structure - logger.debug(`extractMessageName: Checking message object properties`); + logger.debug('extractMessageName: Checking message object properties'); if (message._json) { - logger.debug(`extractMessageName: message._json exists`); + logger.debug('extractMessageName: message._json exists'); // Try to get the message name from the internal JSON structure const messageJson = message._json; logger.debug(`extractMessageName: message._json keys: ${Object.keys(messageJson).join(', ')}`); @@ -599,7 +597,7 @@ function toParameterName(str) { if (!str) return ''; // Remove curly braces first - let cleaned = str.replace(/([{}])/g, ''); + const cleaned = str.replace(/([{}])/g, ''); // Preserve camelCase parameters (e.g., 'transactionID' -> 'transactionID') if (cleaned.match(/^[a-z]+[A-Z][A-Z]/)) { @@ -667,8 +665,8 @@ function extractChannelParameters(channel) { type: getParameterType(param), required: isRequired, position: actualPosition, - enumValues: enumValues, - hasEnum: hasEnum + enumValues, + hasEnum }); } catch (error) { logger.warn(`Error processing channel parameter ${param?.id() || 'unknown'}:`, error.message); @@ -723,16 +721,16 @@ function getParameterType(param) { const schemaType = getSchemaType(schema); // Convert schema type to Java type switch (schemaType.toLowerCase()) { - case 'string': - return 'String'; - case 'integer': - return 'Integer'; - case 'number': - return 'Double'; - case 'boolean': - return 'Boolean'; - default: - return 'String'; // Default to String for unknown types + case 'string': + return 'String'; + case 'integer': + return 'Integer'; + case 'number': + return 'Double'; + case 'boolean': + return 'Boolean'; + default: + return 'String'; // Default to String for unknown types } } return 'String'; @@ -920,14 +918,9 @@ function getSchemaImport(schemaName, avroSchemaMap = new Map(), currentPackage = */ function generateAppProperties(asyncapi, params) { // Destructure parameters with defaults from package.json - const { - binder = 'kafka', - host, - username, - password, - msgVpn, - parametersToHeaders = false, - view: paramView + const { + binder = 'kafka', + view: paramView } = params; // Validate binder parameter @@ -961,7 +954,7 @@ function generateAppProperties(asyncapi, params) { // Provider view: publish operations become publishers (suppliers) const isPublisher = isProvider; const bindingType = isPublisher ? 'out-0' : 'in-0'; - const operationType = isPublisher ? 'Supplier' : 'Consumer'; + const _operationType = isPublisher ? 'Supplier' : 'Consumer'; properties.push(`spring.cloud.stream.bindings.${functionName}-${bindingType}.destination=${destination}`); @@ -982,7 +975,7 @@ function generateAppProperties(asyncapi, params) { // Provider view: subscribe operations become subscribers (consumers) const isPublisher = !isProvider; const bindingType = isPublisher ? 'out-0' : 'in-0'; - const operationType = isPublisher ? 'Supplier' : 'Consumer'; + const _operationType = isPublisher ? 'Supplier' : 'Consumer'; properties.push(`spring.cloud.stream.bindings.${functionName}-${bindingType}.destination=${destination}`); @@ -1024,7 +1017,7 @@ function getChannelInfo(channel, operation, parameters) { } const channelInfo = { - publishChannel: publishChannel, + publishChannel, subscribeChannel: getSubscribeChannel(channel, operation), parameters }; @@ -1111,26 +1104,26 @@ function extractSolaceQueueInfo(channel, operation) { const bindings = operation.bindings(); if (!bindings) { - logger.debug(`coreProcessor.js: extractSolaceQueueInfo() - No bindings found`); + logger.debug('coreProcessor.js: extractSolaceQueueInfo() - No bindings found'); return null; } const solaceBinding = bindings.get('solace'); if (!solaceBinding) { - logger.debug(`coreProcessor.js: extractSolaceQueueInfo() - No solace binding found`); + logger.debug('coreProcessor.js: extractSolaceQueueInfo() - No solace binding found'); return null; } // Access the raw JSON structure since the AsyncAPI library methods might not work as expected const solaceBindingJson = solaceBinding._json || solaceBinding; if (!solaceBindingJson || !solaceBindingJson.destinations) { - logger.debug(`coreProcessor.js: extractSolaceQueueInfo() - No destinations found in solace binding`); + logger.debug('coreProcessor.js: extractSolaceQueueInfo() - No destinations found in solace binding'); return null; } const destinations = solaceBindingJson.destinations; if (!destinations || destinations.length === 0) { - logger.debug(`coreProcessor.js: extractSolaceQueueInfo() - No destinations array found`); + logger.debug('coreProcessor.js: extractSolaceQueueInfo() - No destinations array found'); return null; } @@ -1168,7 +1161,7 @@ function extractSolaceQueueInfo(channel, operation) { /** * Get group name for a function */ -function getGroupName(channel, operation, params) { +function _getGroupName(_channel, operation, _params) { // Check for x-scs-group extension first const extensions = operation.extensions(); if (extensions && extensions.get('x-scs-group')) { @@ -1183,7 +1176,7 @@ function getGroupName(channel, operation, params) { /** * Check if channel has queue with subscription */ -function isQueueWithSubscription(channel, operation) { +function _isQueueWithSubscription(_channel, operation) { // Check for x-scs-queue extension const extensions = operation.extensions(); if (extensions && extensions.get('x-scs-queue')) { @@ -1201,7 +1194,7 @@ function isQueueWithSubscription(channel, operation) { /** * Get queue name for a function */ -function getQueueName(channel, operation, params) { +function _getQueueName(channel, operation, _params) { // Check for x-scs-queue extension first const extensions = operation.extensions(); if (extensions && extensions.get('x-scs-queue')) { @@ -1225,7 +1218,7 @@ function getQueueName(channel, operation, params) { * Replaces parameter placeholders with wildcards for subscribe operations */ function getSubscribeChannel(channel, operation) { - let channelName = channel.id(); + const channelName = channel.id(); // For subscribe operations, use the channel name with wildcards if (operation.action() === 'subscribe') { @@ -1246,7 +1239,7 @@ function getSubscribeChannel(channel, operation) { * Replaces parameter placeholders with format strings for publish operations */ function getPublishChannel(channel, operation) { - let channelName = channel.id(); + const channelName = channel.id(); // For publish operations, use the channel name with format strings if (operation.action() === 'publish') { @@ -1301,7 +1294,7 @@ function replaceChannelParametersWithFormatStrings(channelName, channel) { let formatString = '%s'; // Default to string if (schema) { const type = schema.type(); - const format = schema.format(); + const _format = schema.format(); if (type === 'integer') { formatString = '%d'; @@ -1398,10 +1391,10 @@ function processXScsFunctionNameGrouping(functions, isProvider = false) { messageName: consumer.messageName, multipleMessageComment: consumer.multipleMessageComment, // Additional properties for Function type - inputPayload: inputPayload, - outputPayload: outputPayload, - inputOperation: inputOperation, - outputOperation: outputOperation + inputPayload, + outputPayload, + inputOperation, + outputOperation }; processedFunctions.push(functionSpec); diff --git a/utils/functionUtils.js b/utils/functionUtils.js index 5da80448..c3d12f5e 100644 --- a/utils/functionUtils.js +++ b/utils/functionUtils.js @@ -15,42 +15,42 @@ function getPrimitiveJavaType(schemaType, payload) { : null; switch (schemaType.toLowerCase()) { - case 'string': - // Handle string formats (following Nunjucks typeMap) - switch (format) { - case 'date-time': - return 'java.time.OffsetDateTime'; - case 'byte': - case 'binary': - return 'byte[]'; - default: - return 'String'; - } - case 'integer': - // Handle integer formats - switch (format) { - case 'int64': - return 'Long'; - case 'int32': - default: - return 'Integer'; - } - case 'number': - // Handle number formats - switch (format) { - case 'float': - return 'Float'; - case 'double': - return 'Double'; - default: - return 'java.math.BigDecimal'; - } - case 'boolean': - return 'Boolean'; - case 'null': + case 'string': + // Handle string formats (following Nunjucks typeMap) + switch (format) { + case 'date-time': + return 'java.time.OffsetDateTime'; + case 'byte': + case 'binary': + return 'byte[]'; + default: return 'String'; + } + case 'integer': + // Handle integer formats + switch (format) { + case 'int64': + return 'Long'; + case 'int32': + default: + return 'Integer'; + } + case 'number': + // Handle number formats + switch (format) { + case 'float': + return 'Float'; + case 'double': + return 'Double'; default: - return null; // Not a primitive type + return 'java.math.BigDecimal'; + } + case 'boolean': + return 'Boolean'; + case 'null': + return 'String'; + default: + return null; // Not a primitive type } } @@ -105,7 +105,7 @@ function getFunctionPayloadType(operation, avroSchemaMap) { const message = messageArray[0]; const payload = message.payload(); - logger.debug(`coreProcessor.js: getFunctionPayloadType() - Single message payload:`, payload ? 'exists' : 'null'); + logger.debug('coreProcessor.js: getFunctionPayloadType() - Single message payload:', payload ? 'exists' : 'null'); if (!payload) { return 'String'; @@ -173,25 +173,22 @@ function getFunctionPayloadType(operation, avroSchemaMap) { const result = `List<${toPascalCase(className)}>`; logger.debug(`coreProcessor.js: getFunctionPayloadType() - Array of objects: "${result}"`); return result; - } else { - // Anonymous schema or no schema name - use generic type - const result = 'List'; - logger.debug(`coreProcessor.js: getFunctionPayloadType() - Array of anonymous objects: "${result}"`); - return result; - } - } else { - // Array of primitives - const primitiveType = getPrimitiveJavaType(itemType, items); - if (primitiveType) { - const result = `List<${primitiveType}>`; - logger.debug(`coreProcessor.js: getFunctionPayloadType() - Array of primitives: "${result}"`); - return result; - } else { - const result = 'List'; - logger.debug(`coreProcessor.js: getFunctionPayloadType() - Array of unknown type: "${result}"`); - return result; - } - } + } + // Anonymous schema or no schema name - use generic type + const result = 'List'; + logger.debug(`coreProcessor.js: getFunctionPayloadType() - Array of anonymous objects: "${result}"`); + return result; + } + // Array of primitives + const primitiveType = getPrimitiveJavaType(itemType, items); + if (primitiveType) { + const result = `List<${primitiveType}>`; + logger.debug(`coreProcessor.js: getFunctionPayloadType() - Array of primitives: "${result}"`); + return result; + } + const result = 'List'; + logger.debug(`coreProcessor.js: getFunctionPayloadType() - Array of unknown type: "${result}"`); + return result; } // Fallback for array without items return 'List'; @@ -220,7 +217,7 @@ function getFunctionPayloadType(operation, avroSchemaMap) { } } // Simple anonymous schema - use Object - logger.debug(`coreProcessor.js: getFunctionPayloadType() - Simple anonymous schema: "Object"`); + logger.debug('coreProcessor.js: getFunctionPayloadType() - Simple anonymous schema: "Object"'); return 'Object'; } @@ -290,7 +287,7 @@ function getFunctionPayloadType(operation, avroSchemaMap) { } } - logger.debug(`coreProcessor.js: getFunctionPayloadType() - Final result: "Object"`); + logger.debug('coreProcessor.js: getFunctionPayloadType() - Final result: "Object"'); return 'Object'; } catch (error) { logger.warn(`getFunctionPayloadType: Error getting payload type: ${error.message}`); @@ -351,14 +348,12 @@ function getFunctionName(channelName, operation, isSubscriber) { if (hasCustomName) { // Use x-scs-function-name as-is without suffix return toCamelCase(functionName); - } else { - // Add suffix for generated names - if (isSubscriber) { - return `${toCamelCase(functionName)}Consumer`; - } else { - return `${toCamelCase(functionName)}Supplier`; - } - } + } + // Add suffix for generated names + if (isSubscriber) { + return `${toCamelCase(functionName)}Consumer`; + } + return `${toCamelCase(functionName)}Supplier`; } /** @@ -368,7 +363,7 @@ function getChannelInfo(params, channelName, channel) { logger.debug(`functionUtils.js: getChannelInfo() - Getting channel info for: ${channelName}`); const channelInfo = { - channelName: channelName, + channelName, hasParams: false, parameters: [], publishChannel: channelName, @@ -400,7 +395,7 @@ function getChannelInfo(params, channelName, channel) { const parameter = { name: paramName, type: paramType, - sampleArg: sampleArg, + sampleArg, position: actualPosition }; @@ -418,7 +413,7 @@ function getChannelInfo(params, channelName, channel) { }); } - logger.debug(`functionUtils.js: getChannelInfo() - Channel info:`, channelInfo); + logger.debug('functionUtils.js: getChannelInfo() - Channel info:', channelInfo); return channelInfo; } @@ -444,7 +439,7 @@ function getChannelInfoForConsumer(params, channelName, channel) { * Get subscribe channel name */ function getSubscribeChannel(channelInfo) { - logger.debug(`functionUtils.js: getSubscribeChannel() - Getting subscribe channel`); + logger.debug('functionUtils.js: getSubscribeChannel() - Getting subscribe channel'); return channelInfo.subscribeChannel || channelInfo.channelName; } @@ -453,7 +448,7 @@ function getSubscribeChannel(channelInfo) { * Get publish channel name */ function getPublishChannel(channelInfo) { - logger.debug(`functionUtils.js: getPublishChannel() - Getting publish channel`); + logger.debug('functionUtils.js: getPublishChannel() - Getting publish channel'); return channelInfo.publishChannel || channelInfo.channelName; } @@ -462,7 +457,7 @@ function getPublishChannel(channelInfo) { * Consolidate supplier functions with same payload type */ function consolidateSupplierFunctions(functions) { - logger.debug(`functionUtils.js: consolidateSupplierFunctions() - Consolidating supplier functions`); + logger.debug('functionUtils.js: consolidateSupplierFunctions() - Consolidating supplier functions'); const queueDestinationMap = new Map(); const consolidatedFunctions = []; @@ -528,7 +523,7 @@ function consolidateSupplierFunctions(functions) { * Consolidate queue functions (for Solace) */ function consolidateQueueFunctions(functions) { - logger.debug(`functionUtils.js: consolidateQueueFunctions() - Consolidating queue functions`); + logger.debug('functionUtils.js: consolidateQueueFunctions() - Consolidating queue functions'); // First consolidate suppliers by queue destination let consolidatedFunctions = consolidateSupplierFunctions(functions); @@ -600,7 +595,7 @@ function sortParametersUsingChannelName(parameters, channelName) { * Get message name from operation */ function getMessageName(operation) { - logger.debug(`functionUtils.js: getMessageName() - Getting message name from operation`); + logger.debug('functionUtils.js: getMessageName() - Getting message name from operation'); if (!operation) { logger.warn('getMessageName: operation is null or undefined'); @@ -650,7 +645,7 @@ function getMessageName(operation) { * Extract schema name from message */ function extractSchemaNameFromMessage(message) { - logger.debug(`functionUtils.js: extractSchemaNameFromMessage() - Extracting schema name from message`); + logger.debug('functionUtils.js: extractSchemaNameFromMessage() - Extracting schema name from message'); try { // Helper function to extract name from ref const extractNameFromRef = (ref) => { @@ -717,7 +712,7 @@ function extractSchemaNameFromMessage(message) { } } - logger.debug(`functionUtils.js: extractSchemaNameFromMessage() - Could not extract schema name`); + logger.debug('functionUtils.js: extractSchemaNameFromMessage() - Could not extract schema name'); return null; } catch (error) { logger.warn(`extractSchemaNameFromMessage: Error extracting schema name: ${error.message}`); @@ -754,7 +749,7 @@ function getSendFunctionName(channelName, operation) { } else { // Convert message name to PascalCase for function name const functionName = messageName.replace(/(^|_|\-|\s)(\w)/g, (_, __, c) => c ? c.toUpperCase() : '') - .replace(/^[a-z]/, c => c.toUpperCase()); + .replace(/^[a-z]/, c => c.toUpperCase()); return `send${functionName}`; } } @@ -766,7 +761,7 @@ function getSendFunctionName(channelName, operation) { if (messageName && messageName !== 'Object') { // Convert message name to PascalCase for function name const functionName = messageName.replace(/(^|_|\-|\s)(\w)/g, (_, __, c) => c ? c.toUpperCase() : '') - .replace(/^[a-z]/, c => c.toUpperCase()); + .replace(/^[a-z]/, c => c.toUpperCase()); return `send${functionName}`; } @@ -797,14 +792,14 @@ function getSendFunctionName(channelName, operation) { logger.debug(`functionUtils.js: getSendFunctionName() - Schema name: ${schemaName}`); if (schemaName) { const functionName = schemaName.replace(/(^|_|\-|\s)(\w)/g, (_, __, c) => c ? c.toUpperCase() : '') - .replace(/^[a-z]/, c => c.toUpperCase()); + .replace(/^[a-z]/, c => c.toUpperCase()); return `send${functionName}`; } // Fallback: use channel name const fallbackName = channelName.replace(/[^a-zA-Z0-9]/g, ' ') - .replace(/(^|_|\-|\s)(\w)/g, (_, __, c) => c ? c.toUpperCase() : '') - .replace(/^[a-z]/, c => c.toUpperCase()); + .replace(/(^|_|\-|\s)(\w)/g, (_, __, c) => c ? c.toUpperCase() : '') + .replace(/^[a-z]/, c => c.toUpperCase()); return `send${fallbackName}`; } @@ -812,7 +807,7 @@ function getSendFunctionName(channelName, operation) { * Get payload class for operation */ function getPayloadClass(pubOrSub, processedSchemas = []) { - logger.debug(`functionUtils.js: getPayloadClass() - Getting payload class for operation`); + logger.debug('functionUtils.js: getPayloadClass() - Getting payload class for operation'); let ret; @@ -839,7 +834,7 @@ function getPayloadClass(pubOrSub, processedSchemas = []) { * Get multiple message comment */ function getMultipleMessageComment(pubOrSub) { - logger.debug(`functionUtils.js: getMultipleMessageComment() - Getting comment for operation`); + logger.debug('functionUtils.js: getMultipleMessageComment() - Getting comment for operation'); let ret = ''; @@ -864,9 +859,9 @@ function getMultipleMessageComment(pubOrSub) { * Consolidate consumer functions with same payload type */ function consolidateConsumerFunctions(functions) { - logger.debug(`functionUtils.js: consolidateConsumerFunctions() - Consolidating consumer functions`); + logger.debug('functionUtils.js: consolidateConsumerFunctions() - Consolidating consumer functions'); - const payloadTypeMap = new Map(); + const _payloadTypeMap = new Map(); const queueMap = new Map(); // New map for queue-based consolidation const consolidatedFunctions = []; @@ -922,7 +917,6 @@ function consolidateConsumerFunctions(functions) { return consolidatedFunctions; } - /** * Get sample argument for parameter (matching reference project) */ @@ -945,23 +939,20 @@ function getSampleArg(param) { return 'U3dhZ2dlciByb2Nrcw=='; } else if (format === 'binary') { return 'base64-encoded file contents'; - } else { - return '"string"'; - } + } + return '"string"'; } else if (type === 'integer') { if (format === 'int64') { return '1L'; - } else { - return '1'; - } + } + return '1'; } else if (type === 'number') { if (format === 'float') { return '1.1F'; } else if (format === 'double') { return '1.1'; - } else { - return '100.1'; - } + } + return '100.1'; } else if (type === 'boolean') { return 'true'; } else if (type === 'null') { @@ -977,7 +968,7 @@ function getSampleArg(param) { * Get message payload type (matching reference project) */ function getMessagePayloadType(message) { - logger.debug(`functionUtils.js: getMessagePayloadType() - Getting payload type for message`); + logger.debug('functionUtils.js: getMessagePayloadType() - Getting payload type for message'); let ret; const payload = message.payload(); @@ -1015,8 +1006,6 @@ function getMessagePayloadType(message) { return ret || 'Object'; } - - module.exports = { hasMultipleMessages, getFunctionPayloadType, diff --git a/utils/jsonProcessor/index.js b/utils/jsonProcessor/index.js index 2196efe1..0ba17519 100644 --- a/utils/jsonProcessor/index.js +++ b/utils/jsonProcessor/index.js @@ -1,20 +1,12 @@ const { logger } = require('../logger'); const { SchemaModel } = require('./jsonSchemaModel'); -const { - getEnhancedType, - checkPropertyNames, - getIdentifierName, - fixType +const { + checkPropertyNames } = require('../typeUtils'); const { - stripPackageName, - getSampleArg, - getMultipleMessageComment, - getMessagePayloadType, - getPayloadClass + stripPackageName } = require('../functionUtils'); - // Initialize schema model instance const schemaModel = new SchemaModel(); @@ -55,7 +47,7 @@ typeMap.set('string', stringMap); * Map schema ID to component name for inline schemas * This handles cases like http://example.com/root.json -> RideReceipt */ -function mapSchemaIdToComponentName(schemaId, asyncapi) { +function _mapSchemaIdToComponentName(schemaId, asyncapi) { logger.debug(`πŸ” DEBUG: mapSchemaIdToComponentName called with schemaId: ${schemaId}`); if (!schemaId || !schemaId.startsWith('http://')) { @@ -90,7 +82,7 @@ function mapSchemaIdToComponentName(schemaId, asyncapi) { // If the library returned numeric keys, try to get the actual component names from _json if (asyncapi._json && asyncapi._json.components && asyncapi._json.components.schemas) { - logger.debug(`πŸ” DEBUG: Trying to find component name from _json structure`); + logger.debug('πŸ” DEBUG: Trying to find component name from _json structure'); let foundComponentName = null; Object.keys(asyncapi._json.components.schemas).forEach(componentName => { const schema = asyncapi._json.components.schemas[componentName]; @@ -298,20 +290,20 @@ function collectAllSchemas(asyncapi) { return; } - // Skip schemas with numeric names (0, 1) as they are duplicates of component schemas - if (typeof schemaName === 'string' && /^\d+$/.test(schemaName)) { - logger.debug(`[collectAllSchemas] Skipping numeric schema name: ${schemaName} (duplicate of component schema)`); - return; - } + // Skip schemas with numeric names (0, 1) as they are duplicates of component schemas + if (typeof schemaName === 'string' && (/^\d+$/).test(schemaName)) { + logger.debug(`[collectAllSchemas] Skipping numeric schema name: ${schemaName} (duplicate of component schema)`); + return; + } - // ENHANCED: Skip anonymous schemas that are not referenced in message payloads - const isAnonymousSchema = schemaId && schemaId.startsWith(' { @@ -803,22 +795,22 @@ function processJsonSchemas(asyncapi, avroSchemaNames = new Set(), avroClassName const schemaJsonId = schema._json && schema._json.$id; schemas.push({ - name: name, // This is the original schema name from AsyncAPI spec + name, // This is the original schema name from AsyncAPI spec title: schemaTitle, - className: className, // This is the transformed name for Java - packagePath: packagePath, - namespace: namespace, - properties: properties, + className, // This is the transformed name for Java + packagePath, + namespace, + properties, isAvro: false, isAvroSchema: false, - needsJsonPropertyInclude: needsJsonPropertyInclude, - extendsClass: extendsClass, + needsJsonPropertyInclude, + extendsClass, canBeInnerClass: modelClass.canBeInnerClass(), - modelClass: modelClass, - parentProperties: parentProperties, + modelClass, + parentProperties, // Add schema ID information for mapping id: schemaJsonId || schemaId, - schemaId: schemaId + schemaId }); logger.debug(`jsonProcessor: Added schema ${name} with ${properties.length} properties`); @@ -843,17 +835,16 @@ function getJsonSchemaTypeFromJson(schema) { if (!schema) return 'object'; const type = schema.type || null; - const format = schema.format || null; - + const _format = schema.format || null; + if (type === 'array') { const items = schema.items; if (items) { const itemType = items.type || null; if (!itemType || itemType === 'object') { return 'array'; - } else { - return `array-${itemType}`; - } + } + return `array-${itemType}`; } return 'array'; } @@ -878,17 +869,16 @@ function getJsonSchemaType(schema) { if (!schema) return 'object'; const type = schema.type ? schema.type() : null; - const format = schema.format ? schema.format() : null; - + const _format2 = schema.format ? schema.format() : null; + if (type === 'array') { const items = schema.items(); if (items) { const itemType = items.type ? items.type() : null; if (!itemType || itemType === 'object') { return 'array'; - } else { - return `array-${itemType}`; - } + } + return `array-${itemType}`; } return 'array'; } diff --git a/utils/jsonProcessor/jsonProcessor.js b/utils/jsonProcessor/jsonProcessor.js index caf2be25..be90e1a8 100644 --- a/utils/jsonProcessor/jsonProcessor.js +++ b/utils/jsonProcessor/jsonProcessor.js @@ -47,18 +47,17 @@ function processJsonSchemas(asyncapi, avroSchemaNames = new Set()) { if (!anonymousSchema || !namedSchema) { logger.warn('Unable to find both an anonymous and a named schema in an allOf schema for:', { schemaName }); return null; - } else { - // Set up inheritance relationships - superClassMap.set(anonymousSchema, namedSchema); - anonymousSchemaToSubClassMap.set(anonymousSchema, schemaName); - superClassMap.set(schemaName, namedSchema); - anonymousSchemaToSubClassMap.set(schemaName, anonymousSchema); + } + // Set up inheritance relationships + superClassMap.set(anonymousSchema, namedSchema); + anonymousSchemaToSubClassMap.set(anonymousSchema, schemaName); + superClassMap.set(schemaName, namedSchema); + anonymousSchemaToSubClassMap.set(schemaName, anonymousSchema); - return { - extendsClass: namedSchema, - anonymousSchema: anonymousSchema - }; - } + return { + extendsClass: namedSchema, + anonymousSchema + }; }; Array.from(allSchemas.values()).forEach(schema => { @@ -148,9 +147,8 @@ function processJsonSchemas(asyncapi, avroSchemaNames = new Set()) { if (firstRef['x-parser-schema-id']) { extendsClass = firstRef['x-parser-schema-id']; inheritanceMap.set(schemaName, extendsClass); - } - // Also check for $ref (unresolved references) - else if (firstRef.$ref) { + } else if (firstRef.$ref) { + // Also check for $ref (unresolved references) const refName = firstRef.$ref.split('/').pop(); extendsClass = refName; inheritanceMap.set(schemaName, extendsClass); @@ -163,15 +161,15 @@ function processJsonSchemas(asyncapi, avroSchemaNames = new Set()) { schemaMap.set(schemaName, { name: schemaName, - namespace: namespace, - packagePath: packagePath, - className: className, + namespace, + packagePath, + className, properties: Array.isArray(properties) ? properties : [], - required: required, - extendsClass: extendsClass, + required, + extendsClass, isAvro: false, - description: description, - schema: schema + description, + schema }); }); diff --git a/utils/jsonProcessor/jsonSchemaModel.js b/utils/jsonProcessor/jsonSchemaModel.js index 6bf4bd7e..da9754f1 100644 --- a/utils/jsonProcessor/jsonSchemaModel.js +++ b/utils/jsonProcessor/jsonSchemaModel.js @@ -2,6 +2,67 @@ const _ = require('lodash'); const { logger } = require('../logger'); const { stripPackageName } = require('../typeUtils'); +/** + * ModelClass for representing Java class information + */ +class ModelClass { + constructor() { + this.innerClass = true; + this.className = null; + this.originalName = null; // NEW: store original schema name + this.superClassName = null; + this.javaPackage = null; + } + + getClassName() { + return this.className; + } + + setClassName(originalName) { + this.className = this.fixClassName(originalName); + } + + getOriginalName() { // NEW: getter for original name + return this.originalName; + } + + setOriginalName(originalName) { // NEW: setter for original name + this.originalName = originalName; + } + + getSuperClassName() { + return this.superClassName; + } + + setSuperClassName(originalName) { + this.superClassName = this.fixClassName(originalName); + } + + getJavaPackage() { + return this.javaPackage; + } + + setJavaPackage(javaPackage) { + this.javaPackage = javaPackage; + } + + isSubClass() { + return this.superClassName !== undefined; + } + + fixClassName(originalName) { + return _.upperFirst(_.camelCase(originalName)); + } + + setCanBeInnerClass(innerClass) { + this.innerClass = innerClass; + } + + canBeInnerClass() { + return this.innerClass; + } +} + class SchemaModel { constructor() { this.superClassMap = new Map(); @@ -156,18 +217,16 @@ class SchemaModel { // If no x-parser-schema-id match found, fall back to position-based mapping for numeric keys if (!foundMatch && (typeof componentName === 'number' || (typeof componentName === 'string' && componentName.match(/^\d+$/)))) { const schemaKeys = Object.keys(asyncapi._json.components.schemas); - const index = parseInt(componentName); + const index = parseInt(componentName, 10); if (index < schemaKeys.length) { originalComponentName = schemaKeys[index]; logger.debug(`schemaModel.js: setupModelClassMap() - Mapped numeric ${componentName} to ${originalComponentName} by position`); } - } - // If componentName is already a string name, use it as-is - else if (!foundMatch && typeof componentName === 'string' && componentName.length > 0 && !componentName.match(/^\d+$/)) { + } else if (!foundMatch && typeof componentName === 'string' && componentName.length > 0 && !componentName.match(/^\d+$/)) { + // If componentName is already a string name, use it as-is logger.debug(`schemaModel.js: setupModelClassMap() - Using componentName as-is: ${componentName} (no ID match found)`); } } - allSchemas.set(originalComponentName, schema); }); @@ -231,7 +290,7 @@ class SchemaModel { if (asyncapi.components && typeof asyncapi.components === 'function') { const schemasObj = asyncapi.components().schemas(); if (schemasObj && typeof schemasObj === 'object') { - nonInnerClassSchemas = Array.from(schemasObj.values()).map(schema => schema._meta.id) + nonInnerClassSchemas = Array.from(schemasObj.values()).map(schema => schema._meta.id); } } if (nonInnerClassSchemas.includes(schemaName)) { @@ -292,65 +351,4 @@ class SchemaModel { } } -/** - * ModelClass for representing Java class information - */ -class ModelClass { - constructor() { - this.innerClass = true; - this.className = null; - this.originalName = null; // NEW: store original schema name - this.superClassName = null; - this.javaPackage = null; - } - - getClassName() { - return this.className; - } - - setClassName(originalName) { - this.className = this.fixClassName(originalName); - } - - getOriginalName() { // NEW: getter for original name - return this.originalName; - } - - setOriginalName(originalName) { // NEW: setter for original name - this.originalName = originalName; - } - - getSuperClassName() { - return this.superClassName; - } - - setSuperClassName(originalName) { - this.superClassName = this.fixClassName(originalName); - } - - getJavaPackage() { - return this.javaPackage; - } - - setJavaPackage(javaPackage) { - this.javaPackage = javaPackage; - } - - isSubClass() { - return this.superClassName !== undefined; - } - - fixClassName(originalName) { - return _.upperFirst(_.camelCase(originalName)); - } - - setCanBeInnerClass(innerClass) { - this.innerClass = innerClass; - } - - canBeInnerClass() { - return this.innerClass; - } -} - module.exports = { SchemaModel, ModelClass }; \ No newline at end of file diff --git a/utils/typeUtils.js b/utils/typeUtils.js index 69b83e57..6e411734 100644 --- a/utils/typeUtils.js +++ b/utils/typeUtils.js @@ -88,7 +88,7 @@ function checkPropertyNames(name, schema) { } // Check if any property name differs from its Java identifier name - for (const [propName, prop] of propertyEntries) { + for (const [propName, _prop] of propertyEntries) { const javaIdentifierName = getIdentifierName(propName); if (javaIdentifierName !== propName) { logger.debug(`typeUtils.js: checkPropertyNames() - Property ${propName} needs JsonProperty (Java: ${javaIdentifierName})`); @@ -240,7 +240,7 @@ function toPascalCase(str) { if (!str) return ''; // First, remove curly braces (used in path parameters like {userId}) - let cleaned = str.replace(/[{}]/g, ''); + const cleaned = str.replace(/[{}]/g, ''); // Split by any non-alphanumeric character (slashes, dots, underscores, hyphens, whitespace, etc.) const segments = cleaned.split(/[^a-zA-Z0-9]+/); @@ -261,7 +261,7 @@ function toCamelCase(str) { if (!str) return ''; // First, remove curly braces (used in path parameters like {userId}) - let cleaned = str.replace(/[{}]/g, ''); + const cleaned = str.replace(/[{}]/g, ''); // Split by any non-alphanumeric character (slashes, dots, underscores, hyphens, whitespace, etc.) const segments = cleaned.split(/[^a-zA-Z0-9]+/); @@ -310,7 +310,6 @@ function stripPackageName(dotSeparatedName) { return { className: dotSeparatedName }; } - module.exports = { getEnhancedType, checkPropertyNames, From d1b513f91fb0ac5323748dc685b65b1db27b6f6a Mon Sep 17 00:00:00 2001 From: Giri Venkatesan Date: Tue, 3 Feb 2026 16:48:53 +0530 Subject: [PATCH 6/6] Reduce code duplication to meet SonarQube <3% threshold - Create utils/processorUtils.js with shared processor functions - Create utils/schemaModel/BaseSchemaModel.js for common schema logic - Create utils/packageUtils.js for AVRO package extraction - Refactor avroProcessor and jsonProcessor to use shared utilities - Refactor hooks/pre-process.js and post-process.js - Add helper functions to components/Application.js - Add test/run_output.sh script for running generated projects --- components/Application.js | 250 ++++++-------- hooks/post-process.js | 148 ++------- hooks/pre-process.js | 100 +----- test/run_output.sh | 438 +++++++++++++++++++++++++ utils/avroProcessor/avroSchemaModel.js | 260 ++------------- utils/avroProcessor/index.js | 234 +++++-------- utils/functionUtils.js | 6 +- utils/jsonProcessor/index.js | 79 ++--- utils/jsonProcessor/jsonSchemaModel.js | 285 +++------------- utils/packageUtils.js | 232 +++++++++++++ utils/processorUtils.js | 224 +++++++++++++ utils/schemaModel/BaseSchemaModel.js | 247 ++++++++++++++ 12 files changed, 1463 insertions(+), 1040 deletions(-) create mode 100755 test/run_output.sh create mode 100644 utils/packageUtils.js create mode 100644 utils/processorUtils.js create mode 100644 utils/schemaModel/BaseSchemaModel.js diff --git a/components/Application.js b/components/Application.js index 20842be3..7619a0ca 100644 --- a/components/Application.js +++ b/components/Application.js @@ -111,6 +111,87 @@ function getInitializationValue(payloadType) { } } +/** + * Convert enum value to valid Java enum constant + * Handles various data formats: numeric, hyphens, spaces, camelCase + * + * @param {string|number} value - The enum value to convert + * @returns {string} Valid Java enum constant + */ +function toJavaEnumConstant(value) { + if (typeof value === 'string') { + // CASE 1: Numeric values - prefix with "V_" (Java constants can't start with numbers) + if ((/^\d+$/).test(value)) { + return `V_${value}`; + } + // CASE 2: Values with hyphens - convert to underscores + if (value.includes('-')) { + return value.replace(/-/g, '_'); + } + // CASE 3: Values with spaces - convert to underscores + if (value.includes(' ')) { + return value.replace(/\s+/g, '_'); + } + // CASE 4: camelCase or other valid values - return as-is + return value; + } + // CASE 5: Non-string values - convert to string + return String(value); +} + +/** + * Generate Java validation code for enum parameter normalization + * Produces code that normalizes input values to match generated enum constants + * + * @param {string} paramName - The parameter variable name + * @param {string} enumName - The enum class name + * @param {Array} enumValues - Array of original enum values + * @param {string} indent - Indentation string for generated code + * @param {string|null} resultVar - Optional variable name for storing validated enum (null for simple valueOf call) + * @returns {Array} Array of code lines + */ +function generateEnumValidationCode(paramName, enumName, enumValues, indent, resultVar = null) { + const code = []; + const hasSpaces = enumValues.some(v => typeof v === 'string' && v.includes(' ')); + const hasNumericValues = enumValues.some(v => typeof v === 'string' && (/^\d+$/).test(v)); + + // Build the valueOf call based on whether we need to store the result + const valueOfCall = resultVar + ? `${enumName} ${resultVar} = ${enumName}.valueOf(normalizedValue);` + : `${enumName}.valueOf(normalizedValue);`; + const directValueOfCall = resultVar + ? `${enumName} ${resultVar} = ${enumName}.valueOf(${paramName});` + : `${enumName}.valueOf(${paramName});`; + + if (hasSpaces && hasNumericValues) { + // CASE 1: Mixed enum values (both spaces and numeric values) + code.push(`${indent}String normalizedValue;`); + code.push(`${indent}if (${paramName}.matches("^\\\\d+$")) {`); + code.push(`${indent} // Numeric input: prefix with "V_" to match enum constant`); + code.push(`${indent} normalizedValue = "V_" + ${paramName};`); + code.push(`${indent}} else {`); + code.push(`${indent} // String input with spaces: convert to underscores`); + code.push(`${indent} normalizedValue = ${paramName}.replace(" ", "_");`); + code.push(`${indent}}`); + code.push(`${indent}${valueOfCall}`); + } else if (hasSpaces) { + // CASE 2: Only string values with spaces + code.push(`${indent}// Normalize string values: spaces -> underscores`); + code.push(`${indent}String normalizedValue = ${paramName}.replace(" ", "_");`); + code.push(`${indent}${valueOfCall}`); + } else if (hasNumericValues) { + // CASE 3: Only numeric values + code.push(`${indent}// Normalize numeric values: prefix with "V_" if numeric`); + code.push(`${indent}String normalizedValue = ${paramName}.matches("^\\\\d+$") ? "V_" + ${paramName} : ${paramName};`); + code.push(`${indent}${valueOfCall}`); + } else { + // CASE 4: Simple string values (camelCase, etc.) - no normalization needed + code.push(`${indent}// Direct validation for simple string values`); + code.push(`${indent}${directValueOfCall}`); + } + return code; +} + /** * Application component for generating Spring Boot Application.java * Matches the reference project output exactly @@ -617,42 +698,10 @@ function generateEnumClasses(processedData, asyncapi) { // Avoid generating duplicate enum classes for the same parameter name if (!processedEnums.has(enumName)) { processedEnums.add(enumName); - - // Convert enum values to valid Java identifiers - // This handles various data formats while ensuring valid Java enum constants - const validEnumValues = param.enumValues.map(value => { - if (typeof value === 'string') { - // CASE 1: Numeric values (e.g., "3487", "3490") - // Java enum constants cannot start with numbers, so prefix with "V_" - // Example: "3487" becomes "V_3487" - if ((/^\d+$/).test(value)) { - return `V_${value}`; - } - - // CASE 2: Values with hyphens (e.g., "in-app", "out-of-stock") - // Convert hyphens to underscores and make uppercase for Java conventions - // Example: "in-app" becomes "IN_APP" - if (value.includes('-')) { - return value.replace(/-/g, '_'); - } - - // CASE 3: Values with spaces (e.g., "Mobile Application", "Test Data Generation") - // Convert spaces to underscores and make uppercase for Java conventions - // Example: "Mobile Application" becomes "MOBILE_APPLICATION" - if (value.includes(' ')) { - return value.replace(/\s+/g, '_'); - } - - // CASE 4: camelCase values (e.g., "customerInitiated", "onlinePaid") - // Convert to uppercase for Java enum convention - return value; - } - - // CASE 5: Non-string values (numbers, booleans, etc.) - // Convert to string representation and make uppercase - return String(value); - }); - + + // Convert enum values to valid Java identifiers using helper + const validEnumValues = param.enumValues.map(toJavaEnumConstant); + enumClasses.push({ name: enumName, values: validEnumValues @@ -686,33 +735,10 @@ function generateEnumClasses(processedData, asyncapi) { // Avoid generating duplicate enum classes for the same parameter name if (!processedEnums.has(enumName)) { processedEnums.add(enumName); - - // Convert enum values to valid Java identifiers - const validEnumValues = enumValues.map(value => { - if (typeof value === 'string') { - // CASE 1: Numeric values (e.g., "3487", "3490") - if ((/^\d+$/).test(value)) { - return `V_${value}`; - } - - // CASE 2: Values with hyphens (e.g., "in-app", "out-of-stock") - if (value.includes('-')) { - return value.replace(/-/g, '_'); - } - - // CASE 3: Values with spaces (e.g., "Mobile Application", "Test Data Generation") - if (value.includes(' ')) { - return value.replace(/\s+/g, '_'); - } - - // CASE 4: camelCase values (e.g., "customerInitiated", "onlinePaid") - return value; - } - - // CASE 5: Non-string values (numbers, booleans, etc.) - return String(value); - }); - + + // Convert enum values to valid Java identifiers using helper + const validEnumValues = enumValues.map(toJavaEnumConstant); + enumClasses.push({ name: enumName, values: validEnumValues @@ -774,60 +800,23 @@ function getParameterEnumValues(param) { */ function generateParameterValidation(func) { const validationCode = []; - + if (func.parameters && func.parameters.length > 0) { func.parameters.forEach(param => { if (param.hasEnum && param.enumValues && param.enumValues.length > 0) { const enumName = toPascalCase(param.name); const paramName = param.name; - + // STEP 1: Null check validation validationCode.push(`if (${paramName} == null) {`); validationCode.push(` throw new IllegalArgumentException("${paramName} cannot be null");`); validationCode.push('}'); - - // STEP 2: Enum value validation with normalization + + // STEP 2: Enum value validation with normalization (using helper) validationCode.push('try {'); - - // Convert the parameter value to match enum format if needed - const hasSpaces = param.enumValues.some(value => typeof value === 'string' && value.includes(' ')); - const hasNumericValues = param.enumValues.some(value => typeof value === 'string' && (/^\d+$/).test(value)); - - if (hasSpaces && hasNumericValues) { - // CASE 1: Mixed enum values (both spaces and numeric values) - // Example: ["3487", "Mobile Application", "3490", "Test Data Generation"] - validationCode.push(' String normalizedValue;'); - validationCode.push(` if (${paramName}.matches("^\\\\d+$")) {`); - validationCode.push(' // Numeric input: prefix with "V_" to match enum constant'); - validationCode.push(' // Example: "3487" -> "V_3487"'); - validationCode.push(` normalizedValue = "V_" + ${paramName};`); - validationCode.push(' } else {'); - validationCode.push(' // String input with spaces: convert to UPPER_CASE with underscores'); - validationCode.push(' // Example: "Mobile Application" -> "MOBILE_APPLICATION"'); - validationCode.push(` normalizedValue = ${paramName}.replace(" ", "_");`); - validationCode.push(' }'); - validationCode.push(` ${enumName}.valueOf(normalizedValue);`); - } else if (hasSpaces) { - // CASE 2: Only string values with spaces - // Example: ["Mobile Application", "Test Data Generation"] - validationCode.push(' // Normalize string values: spaces -> underscores'); - validationCode.push(' // Example: "Mobile Application" -> "MOBILE_APPLICATION"'); - validationCode.push(` String normalizedValue = ${paramName}.replace(" ", "_");`); - validationCode.push(` ${enumName}.valueOf(normalizedValue);`); - } else if (hasNumericValues) { - // CASE 3: Only numeric values - // Example: ["3487", "3490", "3555"] - validationCode.push(' // Normalize numeric values: prefix with "V_" if numeric'); - validationCode.push(' // Example: "3487" -> "V_3487", "abc" -> "abc" (unchanged)'); - validationCode.push(` String normalizedValue = ${paramName}.matches("^\\\\d+$") ? "V_" + ${paramName} : ${paramName};`); - validationCode.push(` ${enumName}.valueOf(normalizedValue);`); - } else { - // CASE 4: Simple string values (camelCase, etc.) - // Example: ["customerInitiated", "onlinePaid"] - validationCode.push(' // Direct validation for simple string values (no normalization needed)'); - validationCode.push(` ${enumName}.valueOf(${paramName});`); - } - + const normalizationCode = generateEnumValidationCode(paramName, enumName, param.enumValues, ' '); + validationCode.push(...normalizationCode); + // STEP 3: Error handling with helpful error message validationCode.push('} catch (IllegalArgumentException e) {'); validationCode.push(' // Provide detailed error message with all valid enum values'); @@ -836,7 +825,7 @@ function generateParameterValidation(func) { } }); } - + return validationCode; } @@ -877,47 +866,18 @@ function generateConsumerParameterValidation(func) { const enumName = toPascalCase(param.name); const paramName = param.name; const position = param.position; - + const resultVarName = `validated${toPascalCase(paramName)}`; + validationCode.push(` // Extract ${paramName} from position ${position} in topic path`); validationCode.push(` if (topicSegments.length > ${position}) {`); validationCode.push(` String ${paramName} = topicSegments[${position}];`); validationCode.push(' try {'); - - // Convert the parameter value to match enum format if needed - const hasSpaces = param.enumValues.some(value => typeof value === 'string' && value.includes(' ')); - const hasNumericValues = param.enumValues.some(value => typeof value === 'string' && (/^\d+$/).test(value)); - - if (hasSpaces && hasNumericValues) { - // CASE 1: Mixed enum values (both spaces and numeric values) - validationCode.push(' String normalizedValue;'); - validationCode.push(` if (${paramName}.matches("^\\\\d+$")) {`); - validationCode.push(' // Numeric input: prefix with "V_" to match enum constant'); - validationCode.push(` normalizedValue = "V_" + ${paramName};`); - validationCode.push(' } else {'); - validationCode.push(' // String input with spaces: convert to UPPER_CASE with underscores'); - validationCode.push(` normalizedValue = ${paramName}.replace(" ", "_");`); - validationCode.push(' }'); - validationCode.push(` ${enumName} validated${toPascalCase(paramName)} = ${enumName}.valueOf(normalizedValue);`); - validationCode.push(` logger.info("Validated ${paramName} from topic position ${position}: " + validated${toPascalCase(paramName)});`); - } else if (hasSpaces) { - // CASE 2: Only string values with spaces - validationCode.push(' // Normalize string values: spaces -> underscores'); - validationCode.push(` String normalizedValue = ${paramName}.replace(" ", "_");`); - validationCode.push(` ${enumName} validated${toPascalCase(paramName)} = ${enumName}.valueOf(normalizedValue);`); - validationCode.push(` logger.info("Validated ${paramName} from topic position ${position}: " + validated${toPascalCase(paramName)});`); - } else if (hasNumericValues) { - // CASE 3: Only numeric values - validationCode.push(' // Normalize numeric values: prefix with "V_" if numeric'); - validationCode.push(` String normalizedValue = ${paramName}.matches("^\\\\d+$") ? "V_" + ${paramName} : ${paramName};`); - validationCode.push(` ${enumName} validated${toPascalCase(paramName)} = ${enumName}.valueOf(normalizedValue);`); - validationCode.push(` logger.info("Validated ${paramName} from topic position ${position}: " + validated${toPascalCase(paramName)});`); - } else { - // CASE 4: Simple string values (camelCase, etc.) - validationCode.push(' // Direct validation for simple string values (no normalization needed)'); - validationCode.push(` ${enumName} validated${toPascalCase(paramName)} = ${enumName}.valueOf(${paramName});`); - validationCode.push(` logger.info("Validated ${paramName} from topic position ${position}: " + validated${toPascalCase(paramName)});`); - } - + + // Generate validation code using helper (with result variable) + const normalizationCode = generateEnumValidationCode(paramName, enumName, param.enumValues, ' ', resultVarName); + validationCode.push(...normalizationCode); + validationCode.push(` logger.info("Validated ${paramName} from topic position ${position}: " + ${resultVarName});`); + // Error handling validationCode.push(' } catch (IllegalArgumentException e) {'); validationCode.push(` logger.warn("Invalid ${paramName} at topic position ${position}: " + ${paramName} + ". Valid values: " + Arrays.toString(${enumName}.values()));`); diff --git a/hooks/post-process.js b/hooks/post-process.js index 33d88b69..aab672a1 100644 --- a/hooks/post-process.js +++ b/hooks/post-process.js @@ -1,6 +1,7 @@ const fs = require('fs'); const path = require('path'); const { logger } = require('../utils/logger'); +const { extractPackageFromSchemaId, extractAvroPackageFromMessages, extractAvroPackageFromChannels } = require('../utils/packageUtils'); /** * Post-process hook that runs after file generation @@ -199,17 +200,15 @@ function getPackageInfo(schemaName, generator) { if (foundSchema) { logger.debug(`Post-process: Found schema for ${schemaName}`); - - // Check if schema has a namespace (for Avro schemas) + + // Check if schema has a namespace (for Avro schemas) using shared utility const schemaId = foundSchema.id(); - const dotIndex = schemaId.lastIndexOf('.'); - if (dotIndex > 0) { - const javaPackage = schemaId.substring(0, dotIndex); - const className = schemaId.substring(dotIndex + 1); - logger.debug(`Post-process: Found namespace in schema ID: ${javaPackage}.${className}`); - return { javaPackage, className }; + const packageInfo = extractPackageFromSchemaId(schemaId); + if (packageInfo) { + logger.debug(`Post-process: Found namespace in schema ID: ${packageInfo.javaPackage}.${packageInfo.className}`); + return packageInfo; } - + // Check for namespace in schema's _json property (AVRO schemas) const schemaData = foundSchema._json; if (schemaData && schemaData.namespace) { @@ -218,7 +217,7 @@ function getPackageInfo(schemaName, generator) { logger.debug(`Post-process: Found namespace in _json: ${javaPackage}.${className}`); return { javaPackage, className }; } - + logger.debug(`Post-process: No namespace found for ${schemaName}, schemaData:`, JSON.stringify(schemaData, null, 2)); } } @@ -269,126 +268,25 @@ function getPackageInfoFromFile(schemaName, targetDir) { /** * Get AVRO package information from message payloads + * Uses shared utilities from packageUtils.js */ function getAvroPackageInfoFromMessages(schemaName, asyncapi) { logger.debug('post-process.js: getAvroPackageInfoFromMessages() - Getting AVRO package info from messages'); - try { - // Check components.messages for AVRO schemas - const messages = asyncapi.components().messages(); - if (messages) { - // Try different ways to iterate over messages - if (typeof messages.forEach === 'function') { - messages.forEach((msg, msgName) => { - try { - // Check the message's _json property for AVRO namespace - if (msg._json && msg._json.payload) { - const payloadData = msg._json.payload; - - // Check for AVRO namespace in x-parser-schema-id - if (payloadData && payloadData['x-parser-schema-id']) { - const schemaId = payloadData['x-parser-schema-id']; - - // Extract package and class name from schema ID (e.g., "com.example.api.jobOrder.JobOrder") - const lastDotIndex = schemaId.lastIndexOf('.'); - if (lastDotIndex > 0) { - const javaPackage = schemaId.substring(0, lastDotIndex); - const className = schemaId.substring(lastDotIndex + 1); - - // Check if this matches our schema name - if (className === schemaName) { - logger.debug(`Post-process: Found AVRO schema match in components.messages: ${javaPackage}.${className}`); - return { javaPackage, className }; - } - } - } - - // Fallback: Check for name and namespace fields (original AVRO format) - if (payloadData && payloadData.namespace && payloadData.name) { - const javaPackage = payloadData.namespace; - const className = payloadData.name; - - // Check if this matches our schema name - if (className === schemaName) { - logger.debug(`Post-process: Found AVRO schema match in components.messages: ${javaPackage}.${className}`); - return { javaPackage, className }; - } - } - } - } catch (error) { - logger.warn(`Post-process: Error processing message ${msgName}:`, error.message); - } - }); - } - } - - // Also check for AVRO schemas in channel operations (inline messages) - const channels = asyncapi.channels(); - if (channels && typeof channels.values === 'function') { - for (const channel of channels.values()) { - const channelName = channel.id(); - - // Get all operations for this channel - const operations = channel.operations && typeof channel.operations === 'function' - ? Array.from(channel.operations().values()) - : []; - // Check all operations for Avro messages - for (const operation of operations) { - try { - const messages = operation.messages && typeof operation.messages === 'function' - ? Array.from(operation.messages().values()) - : []; - - for (const message of messages) { - const schemaFormat = message.schemaFormat && message.schemaFormat(); - if (schemaFormat && schemaFormat.includes('avro')) { - // This is an Avro message, check for namespace - const payload = message.payload && message.payload(); - if (payload && payload._json) { - const payloadData = payload._json; - - // Check for name and namespace fields (original Avro format) - if (payloadData.namespace && payloadData.name) { - const javaPackage = payloadData.namespace; - const className = payloadData.name; - - // Check if this matches our schema name - if (className === schemaName) { - logger.debug(`Post-process: Found AVRO schema match in channel operations: ${javaPackage}.${className}`); - return { javaPackage, className }; - } - } - - // Check for namespace in x-parser-schema-id (transformed Avro format) - if (payloadData['x-parser-schema-id']) { - const schemaId = payloadData['x-parser-schema-id']; - - // Extract package and class name from schema ID (e.g., "userpublisher.User") - const lastDotIndex = schemaId.lastIndexOf('.'); - if (lastDotIndex > 0) { - const javaPackage = schemaId.substring(0, lastDotIndex); - const className = schemaId.substring(lastDotIndex + 1); - - // Check if this matches our schema name - if (className === schemaName) { - logger.debug(`Post-process: Found AVRO schema match in channel operations via x-parser-schema-id: ${javaPackage}.${className}`); - return { javaPackage, className }; - } - } - } - } - } - } - } catch (error) { - logger.warn(`Post-process: Error checking channel ${channelName} operation for AVRO namespace:`, error.message); - } - } - } - } - } catch (error) { - logger.warn('Post-process: Error extracting AVRO package info from messages:', error.message); + // First, check components.messages using shared utility + const messagesResult = extractAvroPackageFromMessages(asyncapi, schemaName); + if (messagesResult) { + logger.debug(`Post-process: Found AVRO schema match in components.messages: ${messagesResult.javaPackage}.${messagesResult.className}`); + return messagesResult; } - + + // Also check channel operations using shared utility + const channelsResult = extractAvroPackageFromChannels(asyncapi, schemaName); + if (channelsResult) { + logger.debug(`Post-process: Found AVRO schema match in channel operations: ${channelsResult.javaPackage}.${channelsResult.className}`); + return channelsResult; + } + return null; } diff --git a/hooks/pre-process.js b/hooks/pre-process.js index 98d80add..0d5c065d 100644 --- a/hooks/pre-process.js +++ b/hooks/pre-process.js @@ -1,5 +1,6 @@ const _ = require('lodash'); const { logger, configureFromGenerator } = require('../utils/logger'); +const { collectAvroPackagesFromMessages, findCommonParentPackage } = require('../utils/packageUtils'); /** * Pre-process hook that runs before file generation @@ -183,97 +184,32 @@ function setupTemplateParameters(generator) { /** * Extract Java package from AVRO namespaces in messages + * Uses shared utility from packageUtils.js */ function _extractJavaPackageFromAvroNamespaces(asyncapi) { logger.debug('pre-process.js: extractJavaPackageFromAvroNamespaces() - Extracting Java package from AVRO namespaces'); try { - // Check components.messages for AVRO schemas - const messages = asyncapi.components().messages(); - if (messages) { - // Try different ways to iterate over messages - if (typeof messages.forEach === 'function') { - const foundPackages = new Set(); - - messages.forEach((msg, msgName) => { - try { - // Check the message's _json property for AVRO namespace - if (msg._json && msg._json.payload) { - const payloadData = msg._json.payload; - - // Check for AVRO namespace in x-parser-schema-id - if (payloadData && payloadData['x-parser-schema-id']) { - const schemaId = payloadData['x-parser-schema-id']; - - // Extract package from schema ID (e.g., "com.example.api.jobOrder.JobOrder" -> "com.example.api.jobOrder") - const lastDotIndex = schemaId.lastIndexOf('.'); - if (lastDotIndex > 0) { - const javaPackage = schemaId.substring(0, lastDotIndex); - foundPackages.add(javaPackage); - logger.debug(`Pre-process: Found AVRO namespace: ${javaPackage}`); - } - } - - // Fallback: Check for name and namespace fields (original AVRO format) - if (payloadData && payloadData.namespace) { - const javaPackage = payloadData.namespace; - foundPackages.add(javaPackage); - logger.debug(`Pre-process: Found AVRO namespace: ${javaPackage}`); - } - } - } catch (error) { - logger.warn(`Pre-process: Error processing message ${msgName}:`, error.message); - } - }); - - // If we found packages, use the first one (or a common parent if multiple) - if (foundPackages.size > 0) { - const packages = Array.from(foundPackages); - if (packages.length === 1) { - return packages[0]; - } - // Multiple packages found - try to find a common parent - const commonParent = findCommonParentPackage(packages); - if (commonParent) { - return commonParent; - } - // If no common parent, use the first package - return packages[0]; - } + // Collect all AVRO packages using shared utility + const foundPackages = collectAvroPackagesFromMessages(asyncapi); + + if (foundPackages.size > 0) { + const packages = Array.from(foundPackages); + if (packages.length === 1) { + return packages[0]; + } + // Multiple packages found - try to find a common parent + const commonParent = findCommonParentPackage(packages); + if (commonParent) { + return commonParent; } + // If no common parent, use the first package + return packages[0]; } } catch (error) { logger.warn('Pre-process: Error extracting AVRO namespaces:', error.message); } - + return null; } -/** - * Find common parent package from multiple packages - */ -function findCommonParentPackage(packages) { - logger.debug('pre-process.js: findCommonParentPackage() - Finding common parent package'); - if (packages.length === 0) return null; - if (packages.length === 1) return packages[0]; - - // Sort packages by length (shortest first) - const sortedPackages = packages.sort((a, b) => a.length - b.length); - const shortest = sortedPackages[0]; - - // Find the longest common prefix - let commonPrefix = ''; - const parts = shortest.split('.'); - - for (let i = 0; i < parts.length; i++) { - const testPrefix = parts.slice(0, i + 1).join('.'); - const allMatch = packages.every(pkg => pkg.startsWith(`${testPrefix }.`) || pkg === testPrefix); - - if (allMatch) { - commonPrefix = testPrefix; - } else { - break; - } - } - - return commonPrefix || null; -} \ No newline at end of file +// findCommonParentPackage is now imported from utils/packageUtils.js \ No newline at end of file diff --git a/test/run_output.sh b/test/run_output.sh new file mode 100755 index 00000000..5d580397 --- /dev/null +++ b/test/run_output.sh @@ -0,0 +1,438 @@ +#!/bin/bash + +# Script to run Spring Boot Maven projects in output directory +# Usage: ./run_output.sh [-d project-name] [-default] [-t timeout] [-h|--help] +# -default: Run all Maven projects in output directory (sequentially) +# -d project-name: Run only that specific project +# -t timeout: Timeout in seconds for each application (default: 30) +# -h, --help: Show this help message +# If no options are provided, shows this help message + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +OUTPUT_DIR="$SCRIPT_DIR/output" +DEFAULT_TIMEOUT=30 + +# Function to show help +show_help() { + echo "Usage: $0 [-d project-name] [-default] [-t timeout] [-h|--help]" + echo "" + echo "Options:" + echo " -default Run all Spring Boot projects in output directory" + echo " -d project-name Run only that specific Spring Boot project" + echo " -t timeout Timeout in seconds for each application (default: $DEFAULT_TIMEOUT)" + echo " -h, --help Show this help message" + echo "" + echo "Examples:" + echo " $0 -default # Run all Spring Boot projects with default timeout" + echo " $0 -default -t 60 # Run all projects with 60 second timeout" + echo " $0 -d animals # Run only the 'animals' project" + echo " $0 -d animals -t 45 # Run 'animals' project with 45 second timeout" + echo " $0 --help # Show this help message" + echo "" + echo "Default Directories:" + echo " Output Directory: $OUTPUT_DIR" + echo " Script Location: $SCRIPT_DIR" + echo "" + echo "Note: Applications are started with 'mvn spring-boot:run' and will run" + echo " until the timeout is reached. The script checks if the application" + echo " starts successfully by monitoring the log output." + echo "" +} + +# Parse command line arguments +SPECIFIED_PROJECT="" +DEFAULT_MODE=false +TIMEOUT=$DEFAULT_TIMEOUT + +while [[ $# -gt 0 ]]; do + case $1 in + -d) + if [[ -n "$2" && "$2" != -* ]]; then + SPECIFIED_PROJECT="$2" + shift 2 + else + echo "Error: -d requires a project name argument" + exit 1 + fi + ;; + -t) + if [[ -n "$2" && "$2" != -* ]]; then + TIMEOUT="$2" + shift 2 + else + echo "Error: -t requires a timeout value in seconds" + exit 1 + fi + ;; + -default) + DEFAULT_MODE=true + shift + ;; + -h|--help) + show_help + exit 0 + ;; + *) + echo "Error: Unknown option $1" + echo "Use -h or --help for usage information" + exit 1 + ;; + esac +done + +# If no options provided, show help +if [ -z "$SPECIFIED_PROJECT" ] && [ "$DEFAULT_MODE" = false ]; then + echo "No options specified. Use -default to run all projects or -d to specify a project." + echo "" + show_help + exit 0 +fi + +# Check if output directory exists +if [ ! -d "$OUTPUT_DIR" ]; then + echo "Error: Output directory '$OUTPUT_DIR' does not exist!" + exit 1 +fi + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +# Function to check if a Spring Boot application started successfully +check_spring_boot_started() { + local log_file="$1" + local timeout="$2" + local start_time=$(date +%s) + + while true; do + local current_time=$(date +%s) + local elapsed=$((current_time - start_time)) + + if [ $elapsed -ge $timeout ]; then + return 2 # Timeout + fi + + if [ -f "$log_file" ]; then + # Check for successful startup indicators + if grep -q "Started.*Application" "$log_file" 2>/dev/null || \ + grep -q "Started.*in.*seconds" "$log_file" 2>/dev/null || \ + grep -q "Tomcat started on port" "$log_file" 2>/dev/null || \ + grep -q "Netty started on port" "$log_file" 2>/dev/null; then + return 0 # Success + fi + + # Check for failure indicators + if grep -q "APPLICATION FAILED TO START" "$log_file" 2>/dev/null || \ + grep -q "Error starting ApplicationContext" "$log_file" 2>/dev/null || \ + grep -q "Application run failed" "$log_file" 2>/dev/null || \ + grep -q "BUILD FAILURE" "$log_file" 2>/dev/null; then + return 1 # Failed + fi + fi + + sleep 1 + done +} + +# Function to run a single Spring Boot project +run_spring_boot_project() { + local project_path="$1" + local project_name="$2" + local timeout="$3" + local log_file="/tmp/spring-boot-run-${project_name}-$$.log" + + echo -e "${GREEN}Running Spring Boot project: '$project_name'...${NC}" + echo -e "${YELLOW}Executing: mvn spring-boot:run in '$project_path'${NC}" + echo -e "${CYAN}Timeout: ${timeout}s${NC}" + + # Record start time + local start_time=$(date +%s) + + # Start the Spring Boot application in background + cd "$project_path" + mvn spring-boot:run > "$log_file" 2>&1 & + local mvn_pid=$! + cd - > /dev/null + + # Wait for startup or timeout + check_spring_boot_started "$log_file" "$timeout" + local result=$? + + # Calculate execution time + local end_time=$(date +%s) + local execution_time=$((end_time - start_time)) + + # Kill the Spring Boot process + if kill -0 $mvn_pid 2>/dev/null; then + kill $mvn_pid 2>/dev/null + # Wait a moment and force kill if needed + sleep 2 + if kill -0 $mvn_pid 2>/dev/null; then + kill -9 $mvn_pid 2>/dev/null + fi + fi + + # Report results + case $result in + 0) + echo -e "${GREEN}βœ“ Application started successfully for '$project_name' (${execution_time}s)${NC}" + # Show startup message + if [ -f "$log_file" ]; then + echo -e "${CYAN}Startup log (last 5 lines):${NC}" + tail -5 "$log_file" | head -5 + fi + rm -f "$log_file" + return 0 + ;; + 1) + echo -e "${RED}βœ— Application failed to start for '$project_name' (${execution_time}s)${NC}" + echo -e "${RED}Error details:${NC}" + if [ -f "$log_file" ]; then + # Show error details + grep -A 5 "APPLICATION FAILED TO START\|Error starting ApplicationContext\|Application run failed\|BUILD FAILURE" "$log_file" | head -20 + echo "" + echo -e "${YELLOW}Full log saved at: $log_file${NC}" + fi + return 1 + ;; + 2) + echo -e "${YELLOW}⏱ Timeout reached for '$project_name' (${execution_time}s)${NC}" + echo -e "${YELLOW}Application may still be starting or running. Check log for details.${NC}" + if [ -f "$log_file" ]; then + echo -e "${CYAN}Last 10 lines of log:${NC}" + tail -10 "$log_file" + fi + rm -f "$log_file" + return 2 + ;; + esac +} + +# Resolve SPECIFIED_PROJECT to absolute path BEFORE changing directory +if [ -n "$SPECIFIED_PROJECT" ]; then + # Check if it's a path (contains /) or just a project name + if [[ "$SPECIFIED_PROJECT" == */* ]]; then + # It's a path - check if it exists from current directory + if [ ! -d "$SPECIFIED_PROJECT" ]; then + echo -e "${RED}Error: Project directory '$SPECIFIED_PROJECT' not found!${NC}" + exit 1 + fi + # Convert to absolute path if it's a relative path + if [[ "$SPECIFIED_PROJECT" != /* ]]; then + SPECIFIED_PROJECT="$(cd "$SPECIFIED_PROJECT" && pwd)" + fi + else + # It's just a project name - check in OUTPUT_DIR + if [ ! -d "$OUTPUT_DIR/$SPECIFIED_PROJECT" ]; then + echo -e "${RED}Error: Project directory '$SPECIFIED_PROJECT' not found in output directory!${NC}" + echo -e "${YELLOW}Available projects in $OUTPUT_DIR:${NC}" + cd "$OUTPUT_DIR" + for folder in */; do + folder_name="${folder%/}" + if [ -f "$folder_name/pom.xml" ]; then + echo " - $folder_name (Maven project)" + else + echo " - $folder_name (non-Maven folder)" + fi + done + exit 1 + fi + # Convert to absolute path + SPECIFIED_PROJECT="$OUTPUT_DIR/$SPECIFIED_PROJECT" + fi + + if [ ! -f "$SPECIFIED_PROJECT/pom.xml" ]; then + echo -e "${RED}Error: Project '$SPECIFIED_PROJECT' does not contain a pom.xml file!${NC}" + exit 1 + fi +fi + +cd "$OUTPUT_DIR" + +if [ -n "$SPECIFIED_PROJECT" ]; then + + echo -e "${BLUE}=== Spring Boot Run Script ===${NC}" + echo -e "${BLUE}Running specific project: $SPECIFIED_PROJECT${NC}" + echo -e "${BLUE}Timeout: ${TIMEOUT}s${NC}" + echo "" + + # Process only the specified project + maven_projects=("$SPECIFIED_PROJECT") + non_maven_folders=() +elif [ "$DEFAULT_MODE" = true ]; then + echo -e "${BLUE}=== Spring Boot Run Script ===${NC}" + echo -e "${BLUE}Running all Spring Boot projects in output directory${NC}" + echo -e "${BLUE}Timeout per project: ${TIMEOUT}s${NC}" + echo "" + + # Find all directories with pom.xml files + maven_projects=() + non_maven_folders=() + + for folder in */; do + # Remove trailing slash + folder_name="${folder%/}" + + # Skip the verified directory + if [[ "$folder_name" == "verified" ]]; then + continue + fi + + # Check if folder contains pom.xml + if [ -f "$folder_name/pom.xml" ]; then + maven_projects+=("$folder_name") + else + non_maven_folders+=("$folder_name") + fi + done +else + echo "Error: No valid operation specified" + exit 1 +fi + +echo -e "${YELLOW}Spring Boot projects to run (${#maven_projects[@]}):${NC}" +if [ ${#maven_projects[@]} -gt 0 ]; then + printf '%s\n' "${maven_projects[@]}" +else + echo "None" +fi +echo "" + +if [ "$DEFAULT_MODE" = true ] && [ ${#non_maven_folders[@]} -gt 0 ]; then + echo -e "${YELLOW}Non-Maven folders (${#non_maven_folders[@]}):${NC}" + printf '%s\n' "${non_maven_folders[@]}" + echo "" +fi + +# Run each Spring Boot project +runs_attempted=0 +runs_successful=0 +runs_failed=0 +runs_timeout=0 +failed_projects=() +timeout_projects=() + +for project in "${maven_projects[@]}"; do + # Get project name (handle both full path and relative) + if [[ "$project" == /* ]]; then + project_name=$(basename "$project") + project_path="$project" + else + project_name="$project" + project_path="$OUTPUT_DIR/$project" + fi + + run_spring_boot_project "$project_path" "$project_name" "$TIMEOUT" + run_result=$? + + case $run_result in + 0) + ((runs_successful++)) + ;; + 1) + failed_projects+=("$project_name") + ((runs_failed++)) + ;; + 2) + timeout_projects+=("$project_name") + ((runs_timeout++)) + ;; + esac + + echo "----------------------------------------" + ((runs_attempted++)) +done + +# Summary +echo "" +echo -e "${BLUE}=== Run Summary ===${NC}" +if [ "$DEFAULT_MODE" = true ]; then + echo -e "Total folders found: $((${#maven_projects[@]} + ${#non_maven_folders[@]}))" + echo -e "Maven projects found: ${#maven_projects[@]}" + echo -e "Non-Maven folders: ${#non_maven_folders[@]}" +else + echo -e "Project run: $(basename "$SPECIFIED_PROJECT")" +fi +echo -e "Runs attempted: $runs_attempted" +echo -e "Successful starts: ${GREEN}$runs_successful${NC}" +echo -e "Failed starts: ${RED}$runs_failed${NC}" +echo -e "Timeouts: ${YELLOW}$runs_timeout${NC}" + +if [ $runs_failed -eq 0 ] && [ $runs_timeout -eq 0 ] && [ $runs_attempted -gt 0 ]; then + echo -e "${GREEN}All Spring Boot applications started successfully! βœ“${NC}" +elif [ $runs_failed -gt 0 ]; then + echo -e "${RED}Failed projects:${NC}" + printf '%s\n' "${failed_projects[@]}" +fi + +if [ $runs_timeout -gt 0 ]; then + echo -e "${YELLOW}Timeout projects (may have started slowly):${NC}" + printf '%s\n' "${timeout_projects[@]}" +fi + +echo "" + +# Optional: Create a detailed report (only for batch processing) +if [ "$DEFAULT_MODE" = true ]; then + read -p "Generate detailed run report to file? (y/N): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + report_file="$SCRIPT_DIR/run_report_$(date +%Y%m%d_%H%M%S).txt" + echo "Generating detailed report: $report_file" + + { + echo "=== SPRING BOOT RUN REPORT ===" + echo "Generated: $(date)" + echo "Directory: $OUTPUT_DIR" + echo "Timeout per project: ${TIMEOUT}s" + echo "" + echo "=== SUMMARY ===" + echo "Total folders found: $((${#maven_projects[@]} + ${#non_maven_folders[@]}))" + echo "Maven projects found: ${#maven_projects[@]}" + echo "Non-Maven folders: ${#non_maven_folders[@]}" + echo "Runs attempted: $runs_attempted" + echo "Successful starts: $runs_successful" + echo "Failed starts: $runs_failed" + echo "Timeouts: $runs_timeout" + echo "" + + if [ ${#maven_projects[@]} -gt 0 ]; then + echo "=== MAVEN PROJECTS ===" + printf '%s\n' "${maven_projects[@]}" + echo "" + fi + + if [ ${#non_maven_folders[@]} -gt 0 ]; then + echo "=== NON-MAVEN FOLDERS ===" + printf '%s\n' "${non_maven_folders[@]}" + echo "" + fi + + if [ ${#failed_projects[@]} -gt 0 ]; then + echo "=== FAILED PROJECTS ===" + printf '%s\n' "${failed_projects[@]}" + echo "" + fi + + if [ ${#timeout_projects[@]} -gt 0 ]; then + echo "=== TIMEOUT PROJECTS ===" + printf '%s\n' "${timeout_projects[@]}" + echo "" + fi + + } > "$report_file" + + echo -e "${GREEN}Report saved to: $report_file${NC}" + fi +fi + +# Exit with appropriate code +if [ $runs_failed -gt 0 ]; then + exit 1 +else + exit 0 +fi diff --git a/utils/avroProcessor/avroSchemaModel.js b/utils/avroProcessor/avroSchemaModel.js index cbbd838b..c563afe9 100644 --- a/utils/avroProcessor/avroSchemaModel.js +++ b/utils/avroProcessor/avroSchemaModel.js @@ -1,55 +1,14 @@ -const _ = require('lodash'); -const { logger } = require('../logger'); -const { stripPackageName } = require('../typeUtils'); +const { BaseSchemaModel, BaseModelClass, stripPackageName, logger, _ } = require('../schemaModel/BaseSchemaModel'); /** - * ModelClass for representing Java class information + * ModelClass for representing Java class information (Avro-specific) + * Overrides fixClassName for Avro schema naming conventions */ -class ModelClass { - constructor() { - this.innerClass = true; - this.className = null; - this.originalName = null; // NEW: store original schema name - this.superClassName = null; - this.javaPackage = null; - } - - getClassName() { - return this.className; - } - - setClassName(originalName) { - this.className = this.fixClassName(originalName); - } - - getOriginalName() { // NEW: getter for original name - return this.originalName; - } - - setOriginalName(originalName) { // NEW: setter for original name - this.originalName = originalName; - } - - getSuperClassName() { - return this.superClassName; - } - - setSuperClassName(originalName) { - this.superClassName = this.fixClassName(originalName); - } - - getJavaPackage() { - return this.javaPackage; - } - - setJavaPackage(javaPackage) { - this.javaPackage = javaPackage; - } - - isSubClass() { - return this.superClassName !== undefined; - } - +class ModelClass extends BaseModelClass { + /** + * Convert original name to Java class name format (Avro-specific) + * For AVRO schemas, handles full package names like "com.example.api.jobOrder.JobOrder" + */ fixClassName(originalName) { // For AVRO schemas, the originalName should already be the class name part (e.g., "JobOrder" from "com.example.api.jobOrder.JobOrder") if (!originalName) return 'UnknownSchema'; @@ -66,143 +25,26 @@ class ModelClass { return className; } - - setCanBeInnerClass(innerClass) { - this.innerClass = innerClass; - } - - canBeInnerClass() { - return this.innerClass; - } } -class SchemaModel { - constructor() { - this.superClassMap = new Map(); - this.anonymousSchemaToSubClassMap = new Map(); - this.modelClassMap = new Map(); - this.nameToSchemaMap = new Map(); - this.javaKeywords = this.initReservedWords(); - } - - /** - * Initialize Java reserved words set - */ - initReservedWords() { - const keywords = new Set([ - 'abstract', 'assert', 'boolean', 'break', 'byte', 'case', 'catch', 'char', 'class', 'const', - 'continue', 'default', 'do', 'double', 'else', 'enum', 'extends', 'final', 'finally', 'float', - 'for', 'if', 'goto', 'implements', 'import', 'instanceof', 'int', 'interface', 'long', 'native', - 'new', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'strictfp', - 'super', 'switch', 'synchronized', 'this', 'throw', 'throws', 'transient', 'try', 'void', 'volatile', 'while' - ]); - return keywords; - } - - /** - * Get model class for a schema - */ - getModelClass({ schema, schemaName }) { - logger.debug(`schemaModel.js: getModelClass() - Getting model class for ${schemaName}`); - - let modelClass; - if (schema) { - const parserSchemaName = schema.extensions && schema.extensions().get('x-parser-schema-id')?.value(); - // Try to use x-parser-schema-id as key - modelClass = this.modelClassMap.get(parserSchemaName); - if (modelClass && modelClass.getClassName().startsWith('Anonymous')) { - // If we translated this schema from the map using an anonymous schema key, we have no idea what the name should be, so we use the one provided directly from the source - not the generator. - // Otherwise, if we translated this schema from the map using a known schema (the name of the schema was picked out correctly by the generator), use that name. - modelClass.setClassName(_.upperFirst(this.isAnonymousSchema(parserSchemaName) ? schemaName : parserSchemaName)); - } - } - // Using x-parser-schema-id didn't work for us, fall back to trying to get at least something using the provided name. - if (!modelClass) { - modelClass = this.modelClassMap.get(schemaName) || this.modelClassMap.get(_.camelCase(schemaName)); - } - - logger.debug(`schemaModel.js: getModelClass() - Returning model class for ${schemaName}`); - return modelClass; - } - - /** - * Setup super class map for inheritance relationships - */ - setupSuperClassMap(asyncapi) { - if (this.superClassMap.size > 0) { - return; - } - - logger.debug('schemaModel.js: setupSuperClassMap() - Setting up inheritance relationships'); - - const allSchemas = asyncapi.allSchemas().all(); - if (!allSchemas) return; - - // allSchemas is a Map, so we need to iterate over entries properly - allSchemas.forEach((schema, schemaName) => { - if (typeof schemaName !== 'string') { - // logger.debug(`Skipping non-string schema key: ${schemaName}`); - return; - } - logger.debug(`schemaModel.js: setupSuperClassMap() - Processing schema: ${schemaName}`); - - // Check for allOf inheritance - if (schema.allOf && typeof schema.allOf === 'function') { - const allOf = schema.allOf(); - if (allOf && allOf.length > 0) { - this.handleAllOfSchema(schema, schemaName, allOf); - } - } - }); - - logger.debug('schemaModel.js: setupSuperClassMap() - Super class map:', this.superClassMap); - } - - /** - * Handle allOf schema inheritance - */ - handleAllOfSchema(schema, schemaName, allOfArray) { - logger.debug(`schemaModel.js: handleAllOfSchema() - Handling allOf for ${schemaName}`); - - let anonymousSchema = null; - let namedSchema = null; - - allOfArray.forEach(innerSchema => { - const name = innerSchema.extensions && innerSchema.extensions().get('x-parser-schema-id')?.value(); - if (this.isAnonymousSchema(name)) { - anonymousSchema = name; - } else { - namedSchema = name; - } - }); - - if (!anonymousSchema || !namedSchema) { - logger.warn(`schemaModel.js: handleAllOfSchema() - Unable to find both an anonymous and a named schema in allOf for ${schemaName}`); - return; - } - - // Set up inheritance relationships - this.superClassMap.set(anonymousSchema, namedSchema); - this.anonymousSchemaToSubClassMap.set(anonymousSchema, schemaName); - this.superClassMap.set(schemaName, namedSchema); - this.anonymousSchemaToSubClassMap.set(schemaName, anonymousSchema); - - logger.debug(`schemaModel.js: handleAllOfSchema() - Set up inheritance: ${schemaName} extends ${namedSchema}`); - } - +/** + * SchemaModel for Avro schema processing + * Extends BaseSchemaModel with Avro-specific schema registration + */ +class SchemaModel extends BaseSchemaModel { /** - * Setup model class map + * Setup model class map (Avro-specific implementation) */ setupModelClassMap(asyncapi) { if (this.modelClassMap.size > 0) { return; } - - logger.debug('schemaModel.js: setupModelClassMap() - Setting up model class map'); - + + logger.debug('AvroSchemaModel: setupModelClassMap() - Setting up model class map'); + const allSchemas = asyncapi.allSchemas().all(); if (!allSchemas || allSchemas.length === 0) return; - + // Register all schemas recursively as a flat map of name -> ModelClass // allSchemas is a Map, so we need to iterate over entries properly allSchemas.forEach((schema, schemaName) => { @@ -213,29 +55,22 @@ class SchemaModel { } else { // For numeric keys, try to get name from schema extensions or id name = schema.extensions().get('x-ep-schema-name')?.value() || schema.id(); - + if (!name) { logger.debug(`Skipping schema with numeric key ${schemaName} and no identifiable name`); return; } } - logger.debug(`schemaModel.js: setupModelClassMap() - Processing schema: ${name}, type: ${schema.type ? schema.type() : 'unknown'}`); + logger.debug(`AvroSchemaModel: setupModelClassMap() - Processing schema: ${name}, type: ${schema.type ? schema.type() : 'unknown'}`); this.registerSchemaNameToModelClass(schema, name, asyncapi); this.nameToSchemaMap.set(name, schema); }); - - logger.debug('schemaModel.js: setupModelClassMap() - Model class map size:', this.modelClassMap.size); - } - /** - * Check if schema name is anonymous - */ - isAnonymousSchema(schemaName) { - return schemaName && schemaName.startsWith('<'); + logger.debug('AvroSchemaModel: setupModelClassMap() - Model class map size:', this.modelClassMap.size); } /** - * Register schema name to model class + * Register schema name to model class (Avro-specific implementation) */ registerSchemaNameToModelClass(schema, schemaName, asyncapi) { let modelClass = this.modelClassMap.get(schemaName); @@ -246,7 +81,7 @@ class SchemaModel { if (this.isAnonymousSchema(schemaName)) { this.handleAnonymousSchemaForAllOf(modelClass, schemaName); } - + // Check if this is a top-level schema (not an inner class) let nonInnerClassSchemas = []; if (asyncapi.components && typeof asyncapi.components === 'function') { @@ -262,56 +97,19 @@ class SchemaModel { const classNameAndLocation = stripPackageName(schemaName); let className = classNameAndLocation.className; const javaPackage = classNameAndLocation.javaPackage; - + if (schema.extensions && schema.extensions().get('x-ep-schema-name')) { className = schema.extensions().get('x-ep-schema-name').value(); } - + modelClass.setJavaPackage(javaPackage); modelClass.setClassName(className); - modelClass.setOriginalName(schemaName); // NEW: store original schema name - - logger.debug(`schemaModel.js: registerSchemaNameToModelClass() - Schema: ${schemaName}, Class: ${modelClass.getClassName()}, Super: ${modelClass.getSuperClassName()}, Package: ${javaPackage}`); - - this.modelClassMap.set(schemaName, modelClass); - } - - /** - * Get anonymous schema for reference - */ - getAnonymousSchemaForRef(realSchemaName) { - // During our allOf parsing, we found this real schema to anon-schema association - const anonSchema = this.anonymousSchemaToSubClassMap.get(realSchemaName); - return anonSchema ? this.nameToSchemaMap.get(anonSchema) : undefined; - } + modelClass.setOriginalName(schemaName); - /** - * Handle anonymous schema for allOf - */ - handleAnonymousSchemaForAllOf(modelClass, schemaName) { - const subclassName = this.anonymousSchemaToSubClassMap.get(schemaName); - if (subclassName) { - modelClass.setSuperClassName(this.superClassMap.get(schemaName)); - // Be sure the anonymous modelClass and the named modelClass are updated with the superclass information - // We dont want the anonymous schema because the class name won't be correct if it's a $ref, so if the modelClass exists, update that one, if it doesn't we'll make it - const existingModelClass = this.modelClassMap.get(subclassName); - if (existingModelClass) { - existingModelClass.setSuperClassName(this.superClassMap.get(schemaName)); - } - return subclassName; - } - return schemaName; - } + logger.debug(`AvroSchemaModel: registerSchemaNameToModelClass() - Schema: ${schemaName}, Class: ${modelClass.getClassName()}, Super: ${modelClass.getSuperClassName()}, Package: ${javaPackage}`); - /** - * Reset all maps (for testing) - */ - reset() { - this.superClassMap.clear(); - this.anonymousSchemaToSubClassMap.clear(); - this.modelClassMap.clear(); - this.nameToSchemaMap.clear(); + this.modelClassMap.set(schemaName, modelClass); } } -module.exports = { SchemaModel, ModelClass }; \ No newline at end of file +module.exports = { SchemaModel, ModelClass }; diff --git a/utils/avroProcessor/index.js b/utils/avroProcessor/index.js index 067e1c92..f8c86512 100644 --- a/utils/avroProcessor/index.js +++ b/utils/avroProcessor/index.js @@ -4,27 +4,27 @@ const { checkPropertyNames, stripPackageName } = require('../typeUtils'); +const { + getValue, + getFirstMessage, + iterateChannelOperations, + getSchemaType, + createProcessorResult, + initializeSchemaModel, + extractFunctionsFromCore +} = require('../processorUtils'); const { processAvroFieldType } = require('./avroProcessor'); // Initialize schema model instance const schemaModel = new SchemaModel(); -/** - * Helper to safely get a value that might be a function or direct value - */ -function getValue(obj, defaultValue = undefined) { - if (obj === undefined || obj === null) return defaultValue; - if (typeof obj === 'function') return obj(); - return obj; -} - /** * Detect if AsyncAPI document contains Avro schemas */ function detectAvroSchemas(asyncapi) { logger.debug('avroProcessor.js: detectAvroSchemas() - Detecting Avro schemas'); - + // Check for Avro schemas in components.schemas const componentsSchemas = asyncapi.components().schemas(); if (componentsSchemas) { @@ -35,44 +35,27 @@ function detectAvroSchemas(asyncapi) { } } } - - // Check for Avro schemas in messages - const channels = asyncapi.channels(); - for (const channel of channels.values()) { - const channelName = channel.id(); - // Get all operations for this channel - const operations = channel.operations && typeof channel.operations === 'function' - ? Array.from(channel.operations().values()) - : []; - - // Find publish and subscribe operations - const publishOperation = operations.find(op => op.action && op.action() === 'publish'); - const subscribeOperation = operations.find(op => op.action && op.action() === 'subscribe'); - - if (publishOperation) { - const messages = publishOperation.messages(); - if (messages && messages.length > 0) { - const message = messages[0]; - if (message && isAvroMessage(message)) { - logger.debug(`avroProcessor: Found Avro message in publish channel: ${channelName}`); - return true; - } - } + + // Check for Avro schemas in messages using shared utility + let foundAvro = false; + iterateChannelOperations(asyncapi, (channel, channelName, publishOp, subscribeOp) => { + if (foundAvro) return; + + const publishMessage = getFirstMessage(publishOp); + if (publishMessage && isAvroMessage(publishMessage)) { + logger.debug(`avroProcessor: Found Avro message in publish channel: ${channelName}`); + foundAvro = true; + return; } - - if (subscribeOperation) { - const messages = subscribeOperation.messages(); - if (messages && messages.length > 0) { - const message = messages[0]; - if (message && isAvroMessage(message)) { - logger.debug(`avroProcessor: Found Avro message in subscribe channel: ${channelName}`); - return true; - } - } + + const subscribeMessage = getFirstMessage(subscribeOp); + if (subscribeMessage && isAvroMessage(subscribeMessage)) { + logger.debug(`avroProcessor: Found Avro message in subscribe channel: ${channelName}`); + foundAvro = true; } - } - - return false; + }); + + return foundAvro; } /** @@ -110,19 +93,40 @@ function isAvroMessage(message) { return isAvroSchema(payload); } +/** + * Process message payload for Avro schema extraction + * @param {Object} message - The message object + * @param {Set} processedSchemaNames - Set of already processed schema names + * @param {Array} schemas - Array to push processed schemas into + */ +function processMessagePayloadForAvro(message, processedSchemaNames, schemas) { + if (!message) return; + + const payload = message.payload(); + if (payload && isAvroSchema(payload)) { + const schemaName = payload.extensions && payload.extensions().get('x-parser-schema-id')?.value() || payload.id(); + if (schemaName && !processedSchemaNames.has(schemaName)) { + const processedSchema = processAvroSchema(payload, schemaName); + if (processedSchema) { + schemas.push(processedSchema); + processedSchemaNames.add(schemaName); + } + } + } +} + /** * Extract Avro schemas from messages using new schema model */ function extractAvroSchemasFromMessages(asyncapi) { logger.debug('avroProcessor.js: extractAvroSchemasFromMessages() - Extracting Avro schemas with new schema model'); - - // Initialize schema model with AsyncAPI document - schemaModel.setupSuperClassMap(asyncapi); - schemaModel.setupModelClassMap(asyncapi); - + + // Initialize schema model with AsyncAPI document using shared utility + initializeSchemaModel(schemaModel, asyncapi); + const schemas = []; const processedSchemaNames = new Set(); - + // Extract schemas from components.schemas const componentsSchemas = asyncapi.components().schemas(); if (componentsSchemas) { @@ -136,65 +140,20 @@ function extractAvroSchemasFromMessages(asyncapi) { } } } - - // Extract schemas from messages - const channels = asyncapi.channels(); - for (const channel of channels.values()) { - const channelName = channel.id(); + + // Extract schemas from messages using shared utility + iterateChannelOperations(asyncapi, (channel, channelName, publishOp, subscribeOp) => { logger.debug(`avroProcessor.js: extractAvroSchemasFromMessages() - Processing channel: ${channelName}`); - - // Get all operations for this channel - const operations = channel.operations && typeof channel.operations === 'function' - ? Array.from(channel.operations().values()) - : []; - - // Find publish and subscribe operations - const publishOperation = operations.find(op => op.action && op.action() === 'publish'); - const subscribeOperation = operations.find(op => op.action && op.action() === 'subscribe'); - + // Check publish messages - if (publishOperation) { - const messages = publishOperation.messages(); - if (messages && messages.length > 0) { - const message = messages[0]; - if (message) { - const payload = message.payload(); - if (payload && isAvroSchema(payload)) { - const schemaName = payload.extensions && payload.extensions().get('x-parser-schema-id')?.value() || payload.id(); - if (schemaName && !processedSchemaNames.has(schemaName)) { - const processedSchema = processAvroSchema(payload, schemaName); - if (processedSchema) { - schemas.push(processedSchema); - processedSchemaNames.add(schemaName); - } - } - } - } - } - } - + const publishMessage = getFirstMessage(publishOp); + processMessagePayloadForAvro(publishMessage, processedSchemaNames, schemas); + // Check subscribe messages - if (subscribeOperation) { - const messages = subscribeOperation.messages(); - if (messages && messages.length > 0) { - const message = messages[0]; - if (message) { - const payload = message.payload(); - if (payload && isAvroSchema(payload)) { - const schemaName = payload.extensions && payload.extensions().get('x-parser-schema-id')?.value() || payload.id(); - if (schemaName && !processedSchemaNames.has(schemaName)) { - const processedSchema = processAvroSchema(payload, schemaName); - if (processedSchema) { - schemas.push(processedSchema); - processedSchemaNames.add(schemaName); - } - } - } - } - } - } - } - + const subscribeMessage = getFirstMessage(subscribeOp); + processMessagePayloadForAvro(subscribeMessage, processedSchemaNames, schemas); + }); + logger.debug(`avroProcessor: Extracted ${schemas.length} Avro schemas`); return schemas; } @@ -355,37 +314,12 @@ function processAvroSchema(schema, schemaName) { } /** - * Get Avro schema type using enhanced type utilities + * Get Avro schema type using shared utility + * Uses 'array-object' style for object arrays (Avro convention) */ function getAvroSchemaType(schema) { logger.debug('avroProcessor.js: getAvroSchemaType() - Getting Avro schema type'); - - if (!schema) return 'object'; - - const type = schema.type ? schema.type() : null; - const _format = schema.format ? schema.format() : null; - - if (type === 'array') { - const items = schema.items(); - if (items) { - const itemType = items.type ? items.type() : null; - if (!itemType || itemType === 'object') { - return 'array-object'; - } - return `array-${itemType}`; - } - return 'array'; - } - - if (!type || type === 'object') { - const schemaName = schema.extensions && schema.extensions().get('x-parser-schema-id')?.value(); - if (schemaName) { - return `object-${schemaName}`; - } - return 'object'; - } - - return type; + return getSchemaType(schema, { useArrayObject: true }); } /** @@ -480,28 +414,20 @@ function determineAvroImports(functions, schemas) { */ function processAsyncApi(asyncapi, params) { logger.debug('avroProcessor.js: processAsyncApi() - Starting Avro processing'); - - // Initialize schema model with AsyncAPI document - schemaModel.setupSuperClassMap(asyncapi); - schemaModel.setupModelClassMap(asyncapi); - + + // Initialize schema model with AsyncAPI document using shared utility + initializeSchemaModel(schemaModel, asyncapi); + const schemas = extractAvroSchemasFromMessages(asyncapi); - - // Import and use the core processor's function extraction - const coreProcessor = require('../coreProcessor'); - const functions = coreProcessor.extractFunctions(asyncapi, params, schemas); - + + // Extract functions using shared utility + const functions = extractFunctionsFromCore(asyncapi, params, schemas); + const extraIncludes = determineAvroExtraIncludes(functions, schemas); const imports = determineAvroImports(functions, schemas); - const appProperties = {}; // Avro processor doesn't generate app properties - return { - schemas, - functions, - extraIncludes, - imports, - appProperties - }; + // Use shared utility for consistent result structure + return createProcessorResult(schemas, functions, extraIncludes, imports, {}); } module.exports = { diff --git a/utils/functionUtils.js b/utils/functionUtils.js index c3d12f5e..5a2db76b 100644 --- a/utils/functionUtils.js +++ b/utils/functionUtils.js @@ -373,7 +373,7 @@ function getChannelInfo(params, channelName, channel) { }; // Extract parameters from channel name - const paramMatches = channelName.match(/\{([^}]+)\}/g); + const paramMatches = channelName.match(/\{([^}]{1,250})\}/g); if (paramMatches) { channelInfo.hasParams = true; @@ -427,7 +427,7 @@ function getChannelInfoForConsumer(params, channelName, channel) { // For consumers, convert path parameters to wildcards in subscribe channel if (channelInfo.hasParams) { - const wildcardChannel = channelName.replace(/\{[^}]+\}/g, '*'); + const wildcardChannel = channelName.replace(/\{[^}]{1,250}\}/g, '*'); channelInfo.subscribeChannel = wildcardChannel; logger.debug(`functionUtils.js: getChannelInfoForConsumer() - Converted subscribe channel to wildcard: ${channelInfo.subscribeChannel}`); } @@ -571,7 +571,7 @@ function sortParametersUsingChannelName(parameters, channelName) { } // Extract parameter names from channel name in order - const paramMatches = channelName.match(/\{([^}]+)\}/g); + const paramMatches = channelName.match(/\{([^}]{1,250})\}/g); if (!paramMatches) { return parameters; } diff --git a/utils/jsonProcessor/index.js b/utils/jsonProcessor/index.js index 0ba17519..7c67b4a3 100644 --- a/utils/jsonProcessor/index.js +++ b/utils/jsonProcessor/index.js @@ -6,6 +6,13 @@ const { const { stripPackageName } = require('../functionUtils'); +const { + getChannelOperations, + getSchemaType, + createProcessorResult, + initializeSchemaModel, + extractFunctionsFromCore +} = require('../processorUtils'); // Initialize schema model instance const schemaModel = new SchemaModel(); @@ -322,13 +329,11 @@ function collectAllSchemas(asyncapi) { }); } - // 3. Collect inline schemas from channel operations (if any) + // 3. Collect inline schemas from channel operations (if any) using shared utility const channels = asyncapi.channels(); if (channels && typeof channels.forEach === 'function') { channels.forEach((channel) => { - const operations = channel.operations && typeof channel.operations === 'function' - ? Array.from(channel.operations().values()) - : []; + const operations = getChannelOperations(channel); operations.forEach(operation => { const messages = operation.messages && typeof operation.messages === 'function' ? Array.from(operation.messages().values()) @@ -355,12 +360,12 @@ function collectAllSchemas(asyncapi) { logger.debug(`[collectAllSchemas] Skipping basic type schema: ${inlineName}`); return; } - + // Get schema pointer to determine if nested const meta = payload.meta(); const pointer = meta ? meta.pointer : null; const isNested = pointer && pointer.includes('/properties/'); - + allSchemas.set(inlineName, payload); schemaMetadata.set(inlineName, { source: 'inline', @@ -861,37 +866,12 @@ function getJsonSchemaTypeFromJson(schema) { } /** - * Get schema type using enhanced type utilities + * Get schema type using shared utility + * Uses 'array' style for object arrays (JSON convention) */ function getJsonSchemaType(schema) { logger.debug('jsonProcessor.js: getJsonSchemaType() - Getting schema type using enhanced utilities'); - - if (!schema) return 'object'; - - const type = schema.type ? schema.type() : null; - const _format2 = schema.format ? schema.format() : null; - - if (type === 'array') { - const items = schema.items(); - if (items) { - const itemType = items.type ? items.type() : null; - if (!itemType || itemType === 'object') { - return 'array'; - } - return `array-${itemType}`; - } - return 'array'; - } - - if (!type || type === 'object') { - const schemaName = schema.extensions && schema.extensions().get('x-parser-schema-id')?.value(); - if (schemaName) { - return `object-${schemaName}`; - } - return 'object'; - } - - return type; + return getSchemaType(schema, { useArrayObject: false }); } /** @@ -969,29 +949,20 @@ function getSchemaImport(schemaName) { */ function processAsyncApi(asyncapi, params) { logger.debug('jsonProcessor.js: processAsyncApi() - Starting JSON processing'); - - // Initialize schema model with AsyncAPI document - schemaModel.setupSuperClassMap(asyncapi); - schemaModel.setupModelClassMap(asyncapi); - + + // Initialize schema model with AsyncAPI document using shared utility + initializeSchemaModel(schemaModel, asyncapi); + const schemas = processJsonSchemas(asyncapi); - // logger.debug('jsonProcessor.js: processAsyncApi() - processedSchemas:', JSON.stringify(schemas, null, 2)); - - // Import and use the core processor's function extraction - const coreProcessor = require('../coreProcessor'); - const functions = coreProcessor.extractFunctions(asyncapi, params, schemas); - + + // Extract functions using shared utility + const functions = extractFunctionsFromCore(asyncapi, params, schemas); + const extraIncludes = determineImports(functions, [], schemas); const imports = determineSchemaImports(functions); - const appProperties = {}; // JSON processor doesn't generate app properties - - return { - schemas, - functions, - extraIncludes, - imports, - appProperties - }; + + // Use shared utility for consistent result structure + return createProcessorResult(schemas, functions, extraIncludes, imports, {}); } module.exports = { diff --git a/utils/jsonProcessor/jsonSchemaModel.js b/utils/jsonProcessor/jsonSchemaModel.js index da9754f1..3769af94 100644 --- a/utils/jsonProcessor/jsonSchemaModel.js +++ b/utils/jsonProcessor/jsonSchemaModel.js @@ -1,195 +1,32 @@ -const _ = require('lodash'); -const { logger } = require('../logger'); -const { stripPackageName } = require('../typeUtils'); +const { BaseSchemaModel, BaseModelClass, stripPackageName, logger, _ } = require('../schemaModel/BaseSchemaModel'); /** - * ModelClass for representing Java class information + * ModelClass for representing Java class information (JSON-specific) + * Uses default fixClassName from base class (lodash upperFirst + camelCase) */ -class ModelClass { - constructor() { - this.innerClass = true; - this.className = null; - this.originalName = null; // NEW: store original schema name - this.superClassName = null; - this.javaPackage = null; - } - - getClassName() { - return this.className; - } - - setClassName(originalName) { - this.className = this.fixClassName(originalName); - } - - getOriginalName() { // NEW: getter for original name - return this.originalName; - } - - setOriginalName(originalName) { // NEW: setter for original name - this.originalName = originalName; - } - - getSuperClassName() { - return this.superClassName; - } - - setSuperClassName(originalName) { - this.superClassName = this.fixClassName(originalName); - } - - getJavaPackage() { - return this.javaPackage; - } - - setJavaPackage(javaPackage) { - this.javaPackage = javaPackage; - } - - isSubClass() { - return this.superClassName !== undefined; - } - - fixClassName(originalName) { - return _.upperFirst(_.camelCase(originalName)); - } - - setCanBeInnerClass(innerClass) { - this.innerClass = innerClass; - } - - canBeInnerClass() { - return this.innerClass; - } +class ModelClass extends BaseModelClass { + // Uses default fixClassName from BaseModelClass: + // return _.upperFirst(_.camelCase(originalName)); } -class SchemaModel { - constructor() { - this.superClassMap = new Map(); - this.anonymousSchemaToSubClassMap = new Map(); - this.modelClassMap = new Map(); - this.nameToSchemaMap = new Map(); - this.javaKeywords = this.initReservedWords(); - } - - /** - * Initialize Java reserved words set - */ - initReservedWords() { - const keywords = new Set([ - 'abstract', 'assert', 'boolean', 'break', 'byte', 'case', 'catch', 'char', 'class', 'const', - 'continue', 'default', 'do', 'double', 'else', 'enum', 'extends', 'final', 'finally', 'float', - 'for', 'if', 'goto', 'implements', 'import', 'instanceof', 'int', 'interface', 'long', 'native', - 'new', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'strictfp', - 'super', 'switch', 'synchronized', 'this', 'throw', 'throws', 'transient', 'try', 'void', 'volatile', 'while' - ]); - return keywords; - } - - /** - * Get model class for a schema - */ - getModelClass({ schema, schemaName }) { - logger.debug(`schemaModel.js: getModelClass() - Getting model class for ${schemaName}`); - - let modelClass; - if (schema) { - const parserSchemaName = schema.extensions && schema.extensions().get('x-parser-schema-id')?.value(); - // Try to use x-parser-schema-id as key - modelClass = this.modelClassMap.get(parserSchemaName); - if (modelClass && modelClass.getClassName().startsWith('Anonymous')) { - // If we translated this schema from the map using an anonymous schema key, we have no idea what the name should be, so we use the one provided directly from the source - not the generator. - // Otherwise, if we translated this schema from the map using a known schema (the name of the schema was picked out correctly by the generator), use that name. - modelClass.setClassName(_.upperFirst(this.isAnonymousSchema(parserSchemaName) ? schemaName : parserSchemaName)); - } - } - // Using x-parser-schema-id didn't work for us, fall back to trying to get at least something using the provided name. - if (!modelClass) { - modelClass = this.modelClassMap.get(schemaName) || this.modelClassMap.get(_.camelCase(schemaName)); - } - - logger.debug(`schemaModel.js: getModelClass() - Returning model class for ${schemaName}: ${modelClass ? 'found' : 'not found'}`); - return modelClass; - } - - /** - * Setup super class map for inheritance relationships - */ - setupSuperClassMap(asyncapi) { - if (this.superClassMap.size > 0) { - return; - } - - logger.debug('schemaModel.js: setupSuperClassMap() - Setting up inheritance relationships'); - - const allSchemas = asyncapi.allSchemas().all(); - if (!allSchemas) return; - - // allSchemas is a Map, so we need to iterate over entries properly - allSchemas.forEach((schema, schemaName) => { - if (typeof schemaName !== 'string') { - // logger.debug(`Skipping non-string schema key: ${schemaName}`); - return; - } - logger.debug(`schemaModel.js: setupSuperClassMap() - Processing schema: ${schemaName}`); - - // Check for allOf inheritance - if (schema.allOf && typeof schema.allOf === 'function') { - const allOf = schema.allOf(); - if (allOf && allOf.length > 0) { - this.handleAllOfSchema(schema, schemaName, allOf); - } - } - }); - - logger.debug('schemaModel.js: setupSuperClassMap() - Super class map:', this.superClassMap); - } - - /** - * Handle allOf schema inheritance - */ - handleAllOfSchema(schema, schemaName, allOfArray) { - logger.debug(`schemaModel.js: handleAllOfSchema() - Handling allOf for ${schemaName}`); - - let anonymousSchema = null; - let namedSchema = null; - - allOfArray.forEach(innerSchema => { - const name = innerSchema.extensions && innerSchema.extensions().get('x-parser-schema-id')?.value(); - if (this.isAnonymousSchema(name)) { - anonymousSchema = name; - } else { - namedSchema = name; - } - }); - - if (!anonymousSchema || !namedSchema) { - logger.warn(`schemaModel.js: handleAllOfSchema() - Unable to find both an anonymous and a named schema in allOf for ${schemaName}`); - return; - } - - // Set up inheritance relationships - this.superClassMap.set(anonymousSchema, namedSchema); - this.anonymousSchemaToSubClassMap.set(anonymousSchema, schemaName); - this.superClassMap.set(schemaName, namedSchema); - this.anonymousSchemaToSubClassMap.set(schemaName, anonymousSchema); - - logger.debug(`schemaModel.js: handleAllOfSchema() - Set up inheritance: ${schemaName} extends ${namedSchema}`); - } - +/** + * SchemaModel for JSON schema processing + * Extends BaseSchemaModel with JSON-specific schema registration + */ +class SchemaModel extends BaseSchemaModel { /** - * Setup model class map + * Setup model class map (JSON-specific implementation) */ setupModelClassMap(asyncapi) { if (this.modelClassMap.size > 0) { return; } - - logger.debug('schemaModel.js: setupModelClassMap() - Setting up model class map'); - + + logger.debug('JsonSchemaModel: setupModelClassMap() - Setting up model class map'); + // Use the same logic as collectAllSchemas to ensure consistent schema names const allSchemas = new Map(); - + // 1. Collect from components.schemas (prefer these names) const componentsSchemas = asyncapi.components().schemas(); if (componentsSchemas && typeof componentsSchemas.forEach === 'function') { @@ -198,82 +35,75 @@ class SchemaModel { // We need to map them back to the original names using the _json structure let originalComponentName = componentName; const schemaId = schema.id && typeof schema.id === 'function' ? schema.id() : null; - + if (asyncapi._json && asyncapi._json.components && asyncapi._json.components.schemas) { // Find the schema with matching ID to get the original key // NOTE: Handle cases where multiple schemas might have the same $id (which is invalid but happens) let foundMatch = false; Object.keys(asyncapi._json.components.schemas).forEach(jsonKey => { const jsonSchema = asyncapi._json.components.schemas[jsonKey]; - + // First try x-parser-schema-id (most reliable) if (schemaId && jsonSchema['x-parser-schema-id'] === schemaId) { originalComponentName = jsonKey; foundMatch = true; - logger.debug(`schemaModel.js: setupModelClassMap() - Mapped ${componentName} to ${originalComponentName} via x-parser-schema-id`); + logger.debug(`JsonSchemaModel: setupModelClassMap() - Mapped ${componentName} to ${originalComponentName} via x-parser-schema-id`); } }); - + // If no x-parser-schema-id match found, fall back to position-based mapping for numeric keys if (!foundMatch && (typeof componentName === 'number' || (typeof componentName === 'string' && componentName.match(/^\d+$/)))) { const schemaKeys = Object.keys(asyncapi._json.components.schemas); const index = parseInt(componentName, 10); if (index < schemaKeys.length) { originalComponentName = schemaKeys[index]; - logger.debug(`schemaModel.js: setupModelClassMap() - Mapped numeric ${componentName} to ${originalComponentName} by position`); + logger.debug(`JsonSchemaModel: setupModelClassMap() - Mapped numeric ${componentName} to ${originalComponentName} by position`); } } else if (!foundMatch && typeof componentName === 'string' && componentName.length > 0 && !componentName.match(/^\d+$/)) { // If componentName is already a string name, use it as-is - logger.debug(`schemaModel.js: setupModelClassMap() - Using componentName as-is: ${componentName} (no ID match found)`); + logger.debug(`JsonSchemaModel: setupModelClassMap() - Using componentName as-is: ${componentName} (no ID match found)`); } } allSchemas.set(originalComponentName, schema); }); } - + // Register all schemas with consistent names allSchemas.forEach((schema, schemaName) => { - logger.debug(`schemaModel.js: setupModelClassMap() - Processing schema: ${schemaName}, type: ${schema.type ? schema.type() : 'unknown'}`); + logger.debug(`JsonSchemaModel: setupModelClassMap() - Processing schema: ${schemaName}, type: ${schema.type ? schema.type() : 'unknown'}`); this.registerSchemaNameToModelClass(schema, schemaName, asyncapi); this.nameToSchemaMap.set(schemaName, schema); }); - - logger.debug('schemaModel.js: setupModelClassMap() - Model class map size:', this.modelClassMap.size); + + logger.debug('JsonSchemaModel: setupModelClassMap() - Model class map size:', this.modelClassMap.size); } /** * Map schema ID to component name */ mapSchemaIdToComponentName(schemaId, asyncapi) { - logger.debug(`schemaModel.js: mapSchemaIdToComponentName() - Mapping schema ID: ${schemaId}`); - + logger.debug(`JsonSchemaModel: mapSchemaIdToComponentName() - Mapping schema ID: ${schemaId}`); + // First, try to find the schema in components.schemas const componentsSchemas = asyncapi.components().schemas(); if (componentsSchemas) { for (const [schemaName, schema] of componentsSchemas.entries()) { const parserSchemaId = schema.extensions && schema.extensions().get('x-parser-schema-id')?.value(); if (parserSchemaId === schemaId) { - logger.debug(`schemaModel.js: mapSchemaIdToComponentName() - Found schema: ${schemaName}`); + logger.debug(`JsonSchemaModel: mapSchemaIdToComponentName() - Found schema: ${schemaName}`); return schemaName; } } } - + // If not found in components, return the schemaId as is - logger.debug(`schemaModel.js: mapSchemaIdToComponentName() - Not found, returning schemaId: ${schemaId}`); + logger.debug(`JsonSchemaModel: mapSchemaIdToComponentName() - Not found, returning schemaId: ${schemaId}`); return schemaId; } /** - * Check if schema name is anonymous - */ - isAnonymousSchema(schemaName) { - return schemaName && schemaName.startsWith('<'); - } - - /** - * Register schema name to model class + * Register schema name to model class (JSON-specific implementation) */ registerSchemaNameToModelClass(schema, schemaName, asyncapi) { let modelClass = this.modelClassMap.get(schemaName); @@ -284,13 +114,13 @@ class SchemaModel { if (this.isAnonymousSchema(schemaName)) { this.handleAnonymousSchemaForAllOf(modelClass, schemaName); } - + // Check if this is a top-level schema (not an inner class) let nonInnerClassSchemas = []; if (asyncapi.components && typeof asyncapi.components === 'function') { const schemasObj = asyncapi.components().schemas(); if (schemasObj && typeof schemasObj === 'object') { - nonInnerClassSchemas = Array.from(schemasObj.values()).map(schema => schema._meta.id); + nonInnerClassSchemas = Array.from(schemasObj.values()).map(s => s._meta.id); } } if (nonInnerClassSchemas.includes(schemaName)) { @@ -300,55 +130,18 @@ class SchemaModel { const classNameAndLocation = stripPackageName(schemaName); let className = classNameAndLocation.className; const javaPackage = classNameAndLocation.javaPackage; - + if (schema.extensions && schema.extensions().get('x-ep-schema-name')) { className = schema.extensions().get('x-ep-schema-name').value(); } - + modelClass.setJavaPackage(javaPackage); modelClass.setClassName(className); - - logger.debug(`schemaModel.js: registerSchemaNameToModelClass() - Schema: ${schemaName}, Class: ${modelClass.getClassName()}, Super: ${modelClass.getSuperClassName()}, Package: ${javaPackage}`); - - this.modelClassMap.set(schemaName, modelClass); - } - - /** - * Get anonymous schema for reference - */ - getAnonymousSchemaForRef(realSchemaName) { - // During our allOf parsing, we found this real schema to anon-schema association - const anonSchema = this.anonymousSchemaToSubClassMap.get(realSchemaName); - return anonSchema ? this.nameToSchemaMap.get(anonSchema) : undefined; - } - /** - * Handle anonymous schema for allOf - */ - handleAnonymousSchemaForAllOf(modelClass, schemaName) { - const subclassName = this.anonymousSchemaToSubClassMap.get(schemaName); - if (subclassName) { - modelClass.setSuperClassName(this.superClassMap.get(schemaName)); - // Be sure the anonymous modelClass and the named modelClass are updated with the superclass information - // We dont want the anonymous schema because the class name won't be correct if it's a $ref, so if the modelClass exists, update that one, if it doesn't we'll make it - const existingModelClass = this.modelClassMap.get(subclassName); - if (existingModelClass) { - existingModelClass.setSuperClassName(this.superClassMap.get(schemaName)); - } - return subclassName; - } - return schemaName; - } + logger.debug(`JsonSchemaModel: registerSchemaNameToModelClass() - Schema: ${schemaName}, Class: ${modelClass.getClassName()}, Super: ${modelClass.getSuperClassName()}, Package: ${javaPackage}`); - /** - * Reset all maps (for testing) - */ - reset() { - this.superClassMap.clear(); - this.anonymousSchemaToSubClassMap.clear(); - this.modelClassMap.clear(); - this.nameToSchemaMap.clear(); + this.modelClassMap.set(schemaName, modelClass); } } -module.exports = { SchemaModel, ModelClass }; \ No newline at end of file +module.exports = { SchemaModel, ModelClass }; diff --git a/utils/packageUtils.js b/utils/packageUtils.js new file mode 100644 index 00000000..a793cccd --- /dev/null +++ b/utils/packageUtils.js @@ -0,0 +1,232 @@ +const { logger } = require('./logger'); + +/** + * Extract Java package and class name from a fully qualified schema ID + * Example: "com.example.api.jobOrder.JobOrder" -> { javaPackage: "com.example.api.jobOrder", className: "JobOrder" } + * + * @param {string} schemaId - The fully qualified schema ID + * @returns {Object|null} Object with javaPackage and className, or null if not extractable + */ +function extractPackageFromSchemaId(schemaId) { + if (!schemaId || typeof schemaId !== 'string') { + return null; + } + + const lastDotIndex = schemaId.lastIndexOf('.'); + if (lastDotIndex > 0) { + return { + javaPackage: schemaId.substring(0, lastDotIndex), + className: schemaId.substring(lastDotIndex + 1) + }; + } + + return null; +} + +/** + * Extract AVRO package information from message payload data + * Checks both x-parser-schema-id and namespace/name fields + * + * @param {Object} payloadData - The message payload _json data + * @param {string|null} targetSchemaName - Optional: only return if className matches this name + * @returns {Object|null} Object with javaPackage and className, or null if not found + */ +function extractAvroPackageFromPayload(payloadData, targetSchemaName = null) { + if (!payloadData) { + return null; + } + + // Check for AVRO namespace in x-parser-schema-id + if (payloadData['x-parser-schema-id']) { + const packageInfo = extractPackageFromSchemaId(payloadData['x-parser-schema-id']); + if (packageInfo) { + // If targetSchemaName specified, only return if it matches + if (targetSchemaName && packageInfo.className !== targetSchemaName) { + return null; + } + return packageInfo; + } + } + + // Fallback: Check for name and namespace fields (original AVRO format) + if (payloadData.namespace) { + const className = payloadData.name || null; + if (className) { + // If targetSchemaName specified, only return if it matches + if (targetSchemaName && className !== targetSchemaName) { + return null; + } + return { + javaPackage: payloadData.namespace, + className + }; + } + } + + return null; +} + +/** + * Extract AVRO package information from AsyncAPI messages + * Iterates through components.messages looking for AVRO schemas + * + * @param {Object} asyncapi - The AsyncAPI document + * @param {string|null} targetSchemaName - Optional: only return if className matches this name + * @returns {Object|null} Object with javaPackage and className, or null if not found + */ +function extractAvroPackageFromMessages(asyncapi, targetSchemaName = null) { + try { + const messages = asyncapi.components().messages(); + if (!messages || typeof messages.forEach !== 'function') { + return null; + } + + let result = null; + messages.forEach((msg, _msgName) => { + if (result) return; // Already found + + try { + if (msg._json && msg._json.payload) { + const packageInfo = extractAvroPackageFromPayload(msg._json.payload, targetSchemaName); + if (packageInfo) { + result = packageInfo; + } + } + } catch (error) { + logger.warn('packageUtils: Error processing message for AVRO package:', error.message); + } + }); + + return result; + } catch (error) { + logger.warn('packageUtils: Error extracting AVRO package from messages:', error.message); + return null; + } +} + +/** + * Extract AVRO package information from AsyncAPI channel operations + * Checks inline messages in channel operations for AVRO schemas + * + * @param {Object} asyncapi - The AsyncAPI document + * @param {string|null} targetSchemaName - Optional: only return if className matches this name + * @returns {Object|null} Object with javaPackage and className, or null if not found + */ +function extractAvroPackageFromChannels(asyncapi, targetSchemaName = null) { + try { + const channels = asyncapi.channels(); + if (!channels || typeof channels.values !== 'function') { + return null; + } + + for (const channel of channels.values()) { + const operations = channel.operations && typeof channel.operations === 'function' + ? Array.from(channel.operations().values()) + : []; + + for (const operation of operations) { + try { + const messages = operation.messages && typeof operation.messages === 'function' + ? Array.from(operation.messages().values()) + : []; + + for (const message of messages) { + const schemaFormat = message.schemaFormat && message.schemaFormat(); + if (schemaFormat && schemaFormat.includes('avro')) { + const payload = message.payload && message.payload(); + if (payload && payload._json) { + const packageInfo = extractAvroPackageFromPayload(payload._json, targetSchemaName); + if (packageInfo) { + return packageInfo; + } + } + } + } + } catch (error) { + logger.warn('packageUtils: Error checking channel operation for AVRO namespace:', error.message); + } + } + } + } catch (error) { + logger.warn('packageUtils: Error extracting AVRO package from channels:', error.message); + } + + return null; +} + +/** + * Extract all unique Java packages from AVRO namespaces in AsyncAPI messages + * Used for pre-processing to collect all packages + * + * @param {Object} asyncapi - The AsyncAPI document + * @returns {Set} Set of unique Java package names + */ +function collectAvroPackagesFromMessages(asyncapi) { + const foundPackages = new Set(); + + try { + const messages = asyncapi.components().messages(); + if (!messages || typeof messages.forEach !== 'function') { + return foundPackages; + } + + messages.forEach((msg, _msgName) => { + try { + if (msg._json && msg._json.payload) { + const packageInfo = extractAvroPackageFromPayload(msg._json.payload); + if (packageInfo && packageInfo.javaPackage) { + foundPackages.add(packageInfo.javaPackage); + logger.debug(`packageUtils: Found AVRO namespace: ${packageInfo.javaPackage}`); + } + } + } catch (error) { + logger.warn('packageUtils: Error processing message for AVRO package collection:', error.message); + } + }); + } catch (error) { + logger.warn('packageUtils: Error collecting AVRO packages from messages:', error.message); + } + + return foundPackages; +} + +/** + * Find common parent package from multiple packages + * + * @param {Array} packages - Array of package names + * @returns {string|null} Common parent package or null + */ +function findCommonParentPackage(packages) { + if (!packages || packages.length === 0) return null; + if (packages.length === 1) return packages[0]; + + // Sort packages by length (shortest first) + const sortedPackages = [...packages].sort((a, b) => a.length - b.length); + const shortest = sortedPackages[0]; + + // Find the longest common prefix + let commonPrefix = ''; + const parts = shortest.split('.'); + + for (let i = 0; i < parts.length; i++) { + const testPrefix = parts.slice(0, i + 1).join('.'); + const allMatch = packages.every(pkg => pkg.startsWith(`${testPrefix}.`) || pkg === testPrefix); + + if (allMatch) { + commonPrefix = testPrefix; + } else { + break; + } + } + + return commonPrefix || null; +} + +module.exports = { + extractPackageFromSchemaId, + extractAvroPackageFromPayload, + extractAvroPackageFromMessages, + extractAvroPackageFromChannels, + collectAvroPackagesFromMessages, + findCommonParentPackage +}; diff --git a/utils/processorUtils.js b/utils/processorUtils.js new file mode 100644 index 00000000..45aebed7 --- /dev/null +++ b/utils/processorUtils.js @@ -0,0 +1,224 @@ +const { logger } = require('./logger'); + +/** + * Shared utilities for Avro and JSON processors + * Consolidates common patterns to reduce code duplication + */ + +/** + * Safely get a value that might be a function or direct value + * @param {*} obj - The object to get value from + * @param {*} defaultValue - Default value if obj is null/undefined + * @returns {*} The resolved value + */ +function getValue(obj, defaultValue = undefined) { + if (obj === undefined || obj === null) return defaultValue; + if (typeof obj === 'function') return obj(); + return obj; +} + +/** + * Get operations from a channel in a safe manner + * @param {Object} channel - The channel object + * @returns {Array} Array of operations + */ +function getChannelOperations(channel) { + if (!channel) return []; + return channel.operations && typeof channel.operations === 'function' + ? Array.from(channel.operations().values()) + : []; +} + +/** + * Find publish operation from operations array + * @param {Array} operations - Array of operations + * @returns {Object|undefined} The publish operation or undefined + */ +function findPublishOperation(operations) { + return operations.find(op => op.action && op.action() === 'publish'); +} + +/** + * Find subscribe operation from operations array + * @param {Array} operations - Array of operations + * @returns {Object|undefined} The subscribe operation or undefined + */ +function findSubscribeOperation(operations) { + return operations.find(op => op.action && op.action() === 'subscribe'); +} + +/** + * Get messages from an operation safely + * @param {Object} operation - The operation object + * @returns {Array} Array of messages + */ +function getOperationMessages(operation) { + if (!operation) return []; + const messages = operation.messages && typeof operation.messages === 'function' + ? operation.messages() + : []; + return messages && messages.length > 0 ? messages : []; +} + +/** + * Get the first message from an operation + * @param {Object} operation - The operation object + * @returns {Object|null} The first message or null + */ +function getFirstMessage(operation) { + const messages = getOperationMessages(operation); + return messages.length > 0 ? messages[0] : null; +} + +/** + * Iterate over channels with publish/subscribe operations + * @param {Object} asyncapi - The AsyncAPI document + * @param {Function} callback - Callback function(channel, channelName, publishOp, subscribeOp) + */ +function iterateChannelOperations(asyncapi, callback) { + const channels = asyncapi.channels(); + if (!channels) return; + + for (const channel of channels.values()) { + const channelName = channel.id(); + const operations = getChannelOperations(channel); + const publishOperation = findPublishOperation(operations); + const subscribeOperation = findSubscribeOperation(operations); + + callback(channel, channelName, publishOperation, subscribeOperation); + } +} + +/** + * Get schema type with consistent handling for both Avro and JSON processors + * @param {Object} schema - The schema object + * @param {Object} options - Options for type detection + * @param {boolean} options.useArrayObject - Return 'array-object' for object arrays (Avro style) + * @returns {string} The schema type + */ +function getSchemaType(schema, options = {}) { + const { useArrayObject = false } = options; + + if (!schema) return 'object'; + + const type = schema.type ? schema.type() : null; + + if (type === 'array') { + const items = schema.items ? schema.items() : null; + if (items) { + const itemType = items.type ? items.type() : null; + if (!itemType || itemType === 'object') { + return useArrayObject ? 'array-object' : 'array'; + } + return `array-${itemType}`; + } + return 'array'; + } + + if (!type || type === 'object') { + const schemaName = schema.extensions && schema.extensions().get('x-parser-schema-id')?.value(); + if (schemaName) { + return `object-${schemaName}`; + } + return 'object'; + } + + return type; +} + +/** + * Iterate over schema properties using various accessor patterns + * Handles: values(), forEach(), and plain object patterns + * @param {Object} schemaProperties - The schema properties object + * @param {Function} callback - Callback function(property, propertyName) + */ +function iterateSchemaProperties(schemaProperties, callback) { + if (!schemaProperties) return; + + if (typeof schemaProperties.values === 'function') { + const propertyArray = Array.from(schemaProperties.values()); + propertyArray.forEach(prop => { + const propertyName = prop.id ? prop.id() : null; + if (propertyName) { + callback(prop, propertyName); + } + }); + } else if (typeof schemaProperties.forEach === 'function') { + schemaProperties.forEach((prop, propName) => { + callback(prop, propName); + }); + } else if (typeof schemaProperties === 'object') { + Object.entries(schemaProperties).forEach(([propName, prop]) => { + callback(prop, propName); + }); + } +} + +/** + * Create standard processor result object + * @param {Array} schemas - Processed schemas + * @param {Array} functions - Extracted functions + * @param {Array} extraIncludes - Extra include statements + * @param {Array} imports - Import statements + * @param {Object} appProperties - Application properties + * @returns {Object} Standard result object + */ +function createProcessorResult(schemas, functions, extraIncludes = [], imports = [], appProperties = {}) { + return { + schemas, + functions, + extraIncludes, + imports, + appProperties + }; +} + +/** + * Initialize schema model with AsyncAPI document + * Common pattern for both Avro and JSON processors + * @param {Object} schemaModel - The schema model instance + * @param {Object} asyncapi - The AsyncAPI document + */ +function initializeSchemaModel(schemaModel, asyncapi) { + schemaModel.setupSuperClassMap(asyncapi); + schemaModel.setupModelClassMap(asyncapi); +} + +/** + * Extract functions using core processor + * Common pattern for both Avro and JSON processors + * @param {Object} asyncapi - The AsyncAPI document + * @param {Object} params - Template parameters + * @param {Array} schemas - Processed schemas + * @returns {Array} Extracted functions + */ +function extractFunctionsFromCore(asyncapi, params, schemas) { + const coreProcessor = require('./coreProcessor'); + return coreProcessor.extractFunctions(asyncapi, params, schemas); +} + +/** + * Log processing summary for debugging + * @param {string} processorName - Name of the processor (e.g., 'avro', 'json') + * @param {number} schemaCount - Number of schemas processed + * @param {number} functionCount - Number of functions extracted + */ +function logProcessingSummary(processorName, schemaCount, functionCount) { + logger.debug(`${processorName}Processor: Processed ${schemaCount} schemas, extracted ${functionCount} functions`); +} + +module.exports = { + getValue, + getChannelOperations, + findPublishOperation, + findSubscribeOperation, + getOperationMessages, + getFirstMessage, + iterateChannelOperations, + getSchemaType, + iterateSchemaProperties, + createProcessorResult, + initializeSchemaModel, + extractFunctionsFromCore, + logProcessingSummary +}; diff --git a/utils/schemaModel/BaseSchemaModel.js b/utils/schemaModel/BaseSchemaModel.js new file mode 100644 index 00000000..0441fbc8 --- /dev/null +++ b/utils/schemaModel/BaseSchemaModel.js @@ -0,0 +1,247 @@ +const _ = require('lodash'); +const { logger } = require('../logger'); +const { stripPackageName } = require('../typeUtils'); + +/** + * Base ModelClass for representing Java class information + * Subclasses should override fixClassName() for format-specific behavior + */ +class BaseModelClass { + constructor() { + this.innerClass = true; + this.className = null; + this.originalName = null; + this.superClassName = null; + this.javaPackage = null; + } + + getClassName() { + return this.className; + } + + setClassName(originalName) { + this.className = this.fixClassName(originalName); + } + + getOriginalName() { + return this.originalName; + } + + setOriginalName(originalName) { + this.originalName = originalName; + } + + getSuperClassName() { + return this.superClassName; + } + + setSuperClassName(originalName) { + this.superClassName = this.fixClassName(originalName); + } + + getJavaPackage() { + return this.javaPackage; + } + + setJavaPackage(javaPackage) { + this.javaPackage = javaPackage; + } + + isSubClass() { + return this.superClassName !== undefined; + } + + /** + * Convert original name to Java class name format + * Subclasses should override this for format-specific behavior + */ + fixClassName(originalName) { + return _.upperFirst(_.camelCase(originalName)); + } + + setCanBeInnerClass(innerClass) { + this.innerClass = innerClass; + } + + canBeInnerClass() { + return this.innerClass; + } +} + +/** + * Base SchemaModel for managing schema-to-class mappings + * Subclasses should override setupModelClassMap() and registerSchemaNameToModelClass() + */ +class BaseSchemaModel { + constructor() { + this.superClassMap = new Map(); + this.anonymousSchemaToSubClassMap = new Map(); + this.modelClassMap = new Map(); + this.nameToSchemaMap = new Map(); + this.javaKeywords = this.initReservedWords(); + } + + /** + * Initialize Java reserved words set + */ + initReservedWords() { + const keywords = new Set([ + 'abstract', 'assert', 'boolean', 'break', 'byte', 'case', 'catch', 'char', 'class', 'const', + 'continue', 'default', 'do', 'double', 'else', 'enum', 'extends', 'final', 'finally', 'float', + 'for', 'if', 'goto', 'implements', 'import', 'instanceof', 'int', 'interface', 'long', 'native', + 'new', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'strictfp', + 'super', 'switch', 'synchronized', 'this', 'throw', 'throws', 'transient', 'try', 'void', 'volatile', 'while' + ]); + return keywords; + } + + /** + * Get model class for a schema + */ + getModelClass({ schema, schemaName }) { + logger.debug(`BaseSchemaModel: getModelClass() - Getting model class for ${schemaName}`); + + let modelClass; + if (schema) { + const parserSchemaName = schema.extensions && schema.extensions().get('x-parser-schema-id')?.value(); + // Try to use x-parser-schema-id as key + modelClass = this.modelClassMap.get(parserSchemaName); + if (modelClass && modelClass.getClassName().startsWith('Anonymous')) { + // If we translated this schema from the map using an anonymous schema key, we have no idea what the name should be, so we use the one provided directly from the source - not the generator. + // Otherwise, if we translated this schema from the map using a known schema (the name of the schema was picked out correctly by the generator), use that name. + modelClass.setClassName(_.upperFirst(this.isAnonymousSchema(parserSchemaName) ? schemaName : parserSchemaName)); + } + } + // Using x-parser-schema-id didn't work for us, fall back to trying to get at least something using the provided name. + if (!modelClass) { + modelClass = this.modelClassMap.get(schemaName) || this.modelClassMap.get(_.camelCase(schemaName)); + } + + logger.debug(`BaseSchemaModel: getModelClass() - Returning model class for ${schemaName}: ${modelClass ? 'found' : 'not found'}`); + return modelClass; + } + + /** + * Setup super class map for inheritance relationships + */ + setupSuperClassMap(asyncapi) { + if (this.superClassMap.size > 0) { + return; + } + + logger.debug('BaseSchemaModel: setupSuperClassMap() - Setting up inheritance relationships'); + + const allSchemas = asyncapi.allSchemas().all(); + if (!allSchemas) return; + + // allSchemas is a Map, so we need to iterate over entries properly + allSchemas.forEach((schema, schemaName) => { + if (typeof schemaName !== 'string') { + return; + } + logger.debug(`BaseSchemaModel: setupSuperClassMap() - Processing schema: ${schemaName}`); + + // Check for allOf inheritance + if (schema.allOf && typeof schema.allOf === 'function') { + const allOf = schema.allOf(); + if (allOf && allOf.length > 0) { + this.handleAllOfSchema(schema, schemaName, allOf); + } + } + }); + + logger.debug('BaseSchemaModel: setupSuperClassMap() - Super class map:', this.superClassMap); + } + + /** + * Handle allOf schema inheritance + */ + handleAllOfSchema(schema, schemaName, allOfArray) { + logger.debug(`BaseSchemaModel: handleAllOfSchema() - Handling allOf for ${schemaName}`); + + let anonymousSchema = null; + let namedSchema = null; + + allOfArray.forEach(innerSchema => { + const name = innerSchema.extensions && innerSchema.extensions().get('x-parser-schema-id')?.value(); + if (this.isAnonymousSchema(name)) { + anonymousSchema = name; + } else { + namedSchema = name; + } + }); + + if (!anonymousSchema || !namedSchema) { + logger.warn(`BaseSchemaModel: handleAllOfSchema() - Unable to find both an anonymous and a named schema in allOf for ${schemaName}`); + return; + } + + // Set up inheritance relationships + this.superClassMap.set(anonymousSchema, namedSchema); + this.anonymousSchemaToSubClassMap.set(anonymousSchema, schemaName); + this.superClassMap.set(schemaName, namedSchema); + this.anonymousSchemaToSubClassMap.set(schemaName, anonymousSchema); + + logger.debug(`BaseSchemaModel: handleAllOfSchema() - Set up inheritance: ${schemaName} extends ${namedSchema}`); + } + + /** + * Setup model class map - subclasses must override this + */ + setupModelClassMap(_asyncapi) { + throw new Error('setupModelClassMap() must be implemented by subclass'); + } + + /** + * Check if schema name is anonymous + */ + isAnonymousSchema(schemaName) { + return schemaName && schemaName.startsWith('<'); + } + + /** + * Register schema name to model class - subclasses must override this + */ + registerSchemaNameToModelClass(_schema, _schemaName, _asyncapi) { + throw new Error('registerSchemaNameToModelClass() must be implemented by subclass'); + } + + /** + * Get anonymous schema for reference + */ + getAnonymousSchemaForRef(realSchemaName) { + // During our allOf parsing, we found this real schema to anon-schema association + const anonSchema = this.anonymousSchemaToSubClassMap.get(realSchemaName); + return anonSchema ? this.nameToSchemaMap.get(anonSchema) : undefined; + } + + /** + * Handle anonymous schema for allOf + */ + handleAnonymousSchemaForAllOf(modelClass, schemaName) { + const subclassName = this.anonymousSchemaToSubClassMap.get(schemaName); + if (subclassName) { + modelClass.setSuperClassName(this.superClassMap.get(schemaName)); + // Be sure the anonymous modelClass and the named modelClass are updated with the superclass information + // We dont want the anonymous schema because the class name won't be correct if it's a $ref, so if the modelClass exists, update that one, if it doesn't we'll make it + const existingModelClass = this.modelClassMap.get(subclassName); + if (existingModelClass) { + existingModelClass.setSuperClassName(this.superClassMap.get(schemaName)); + } + return subclassName; + } + return schemaName; + } + + /** + * Reset all maps (for testing) + */ + reset() { + this.superClassMap.clear(); + this.anonymousSchemaToSubClassMap.clear(); + this.modelClassMap.clear(); + this.nameToSchemaMap.clear(); + } +} + +module.exports = { BaseSchemaModel, BaseModelClass, stripPackageName, logger, _ };