From c3a6df9627bf5d5789e4d80195585ec718d3e250 Mon Sep 17 00:00:00 2001 From: sumaiya shazad Date: Sun, 23 Mar 2025 08:23:53 +0530 Subject: [PATCH] #122 - Package for har (import) --- packages/har_parser/.gitignore | 31 + packages/har_parser/CHANGELOG.md | 3 + packages/har_parser/LICENSE | 201 ++ packages/har_parser/README.md | 287 +++ packages/har_parser/analysis_options.yaml | 6 + packages/har_parser/example/har_example.dart | 254 +++ packages/har_parser/lib/har_parser.dart | 3 + packages/har_parser/lib/models/har_log.dart | 107 ++ .../lib/models/har_log.freezed.dart | 1683 +++++++++++++++++ packages/har_parser/lib/models/har_log.g.dart | 131 ++ packages/har_parser/lib/models/models.dart | 1 + packages/har_parser/pubspec.yaml | 25 + .../collection_apidash.dart | 253 +++ packages/har_parser/test/har_parser_test.dart | 25 + .../test/models/collection_apidash_model.dart | 120 ++ 15 files changed, 3130 insertions(+) create mode 100644 packages/har_parser/.gitignore create mode 100644 packages/har_parser/CHANGELOG.md create mode 100644 packages/har_parser/LICENSE create mode 100644 packages/har_parser/README.md create mode 100644 packages/har_parser/analysis_options.yaml create mode 100644 packages/har_parser/example/har_example.dart create mode 100644 packages/har_parser/lib/har_parser.dart create mode 100644 packages/har_parser/lib/models/har_log.dart create mode 100644 packages/har_parser/lib/models/har_log.freezed.dart create mode 100644 packages/har_parser/lib/models/har_log.g.dart create mode 100644 packages/har_parser/lib/models/models.dart create mode 100644 packages/har_parser/pubspec.yaml create mode 100644 packages/har_parser/test/collection_examples/collection_apidash.dart create mode 100644 packages/har_parser/test/har_parser_test.dart create mode 100644 packages/har_parser/test/models/collection_apidash_model.dart diff --git a/packages/har_parser/.gitignore b/packages/har_parser/.gitignore new file mode 100644 index 00000000..eb6c05cd --- /dev/null +++ b/packages/har_parser/.gitignore @@ -0,0 +1,31 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +build/ diff --git a/packages/har_parser/CHANGELOG.md b/packages/har_parser/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/packages/har_parser/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/har_parser/LICENSE b/packages/har_parser/LICENSE new file mode 100644 index 00000000..e1622b53 --- /dev/null +++ b/packages/har_parser/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2023 Ashita Prasad, Ankit Mahato + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/packages/har_parser/README.md b/packages/har_parser/README.md new file mode 100644 index 00000000..462f3c5c --- /dev/null +++ b/packages/har_parser/README.md @@ -0,0 +1,287 @@ +# insomnia + +Seamlessly convert Har Collection Format to Dart. + +Helps you bring your APIs stored in Har to Dart and work with them. + +Currently, this package is being used by [API Dash](https://github.com/foss42/apidash), a beautiful open-source cross-platform (macOS, Windows, Linux, Android & iOS) API Client built using Flutter which can help you easily create & customize your API requests, visually inspect responses and generate API integration code. A lightweight alternative to postman. + +## Usage + +### Example 1: Har collection JSON string to Har model + +```dart +import 'package:har_parser/har_parser.dart'; + +void main() { + // Example 1: Har collection JSON string to Har model + var collectionJsonStr = r''' +{ +"log": { + "version": "1.2", + "creator": {"name": "Sample HAR Creator", "version": "1.0"}, + "entries": [ + { + "startedDateTime": "2024-02-23T08:00:00.000Z", + "time": 50, + "request": { + "method": "GET", + "url": "https://api.example.com/users", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": {}, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 100, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:05:00.000Z", + "time": 70, + "request": { + "method": "POST", + "url": "https://api.example.com/login", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": { + "mimeType": "application/json", + "text": "{\"username\":\"user\",\"password\":\"pass\"}" + }, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 50, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:10:00.000Z", + "time": 60, + "request": { + "method": "GET", + "url": "https://api.example.com/products", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": {}, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 200, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:15:00.000Z", + "time": 80, + "request": { + "method": "PUT", + "url": "https://api.example.com/products/123", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": { + "mimeType": "application/json", + "text": "{\"name\":\"New Product\",\"price\":50}" + }, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 50, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + } + ] + } + }'''; + + var collection = harLogFromJsonStr(collectionJsonStr); + + print(collection.log?.creator); + print(collection.log?.entries?[0].startedDateTime); + print(collection.log?.entries?[0].request?.url); +} +``` + +### Example 2: Har collection from JSON + +```dart +import 'package:har_parser/har_parser.dart'; + +void main() { + // Example 2: Har collection from JSON +var collectionJson = { + "log": { + "version": "1.2", + "creator": {"name": "Sample HAR Creator", "version": "1.0"}, + "entries": [ + { + "startedDateTime": "2024-02-23T08:00:00.000Z", + "time": 50, + "request": { + "method": "GET", + "url": "https://api.example.com/users", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": {}, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 100, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:05:00.000Z", + "time": 70, + "request": { + "method": "POST", + "url": "https://api.example.com/login", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": { + "mimeType": "application/json", + "text": "{\"username\":\"user\",\"password\":\"pass\"}" + }, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 50, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:10:00.000Z", + "time": 60, + "request": { + "method": "GET", + "url": "https://api.example.com/products", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": {}, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 200, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:15:00.000Z", + "time": 80, + "request": { + "method": "PUT", + "url": "https://api.example.com/products/123", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": { + "mimeType": "application/json", + "text": "{\"name\":\"New Product\",\"price\":50}" + }, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 50, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + } + ] + } + }; + + var collection1 = HarLog.fromJson(collectionJson); + print(collection1.log?.creator?.name); + print(collection1.log?.entries?[0].startedDateTime); + print(collection1.log?.entries?[0].request?.url); + +} +``` + +## Maintainer + +- Ashita Prasad ([GitHub](https://github.com/ashitaprasad), [LinkedIn](https://www.linkedin.com/in/ashitaprasad/), [X](https://x.com/ashitaprasad)) +- Mohammed Ayaan (contributor) ([GitHub](https://github.com/ayaan-md-blr)) + +## License + +This project is licensed under the [Apache License 2.0](https://github.com/foss42/apidash/blob/main/packages/har_parser/LICENSE). diff --git a/packages/har_parser/analysis_options.yaml b/packages/har_parser/analysis_options.yaml new file mode 100644 index 00000000..1dea9522 --- /dev/null +++ b/packages/har_parser/analysis_options.yaml @@ -0,0 +1,6 @@ +analyzer: + exclude: + - "**/*.g.dart" + - "**/*.freezed.dart" + errors: + invalid_annotation_target: ignore diff --git a/packages/har_parser/example/har_example.dart b/packages/har_parser/example/har_example.dart new file mode 100644 index 00000000..6b1c560c --- /dev/null +++ b/packages/har_parser/example/har_example.dart @@ -0,0 +1,254 @@ +import 'package:har_parser/har_parser.dart'; + +void main() { + //Example 1 + var collectionJsonStr = r''' +{ +"log": { + "version": "1.2", + "creator": {"name": "Sample HAR Creator", "version": "1.0"}, + "entries": [ + { + "startedDateTime": "2024-02-23T08:00:00.000Z", + "time": 50, + "request": { + "method": "GET", + "url": "https://api.example.com/users", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": {}, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 100, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:05:00.000Z", + "time": 70, + "request": { + "method": "POST", + "url": "https://api.example.com/login", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": { + "mimeType": "application/json", + "text": "{\"username\":\"user\",\"password\":\"pass\"}" + }, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 50, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:10:00.000Z", + "time": 60, + "request": { + "method": "GET", + "url": "https://api.example.com/products", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": {}, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 200, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:15:00.000Z", + "time": 80, + "request": { + "method": "PUT", + "url": "https://api.example.com/products/123", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": { + "mimeType": "application/json", + "text": "{\"name\":\"New Product\",\"price\":50}" + }, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 50, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + } + ] + } + }'''; + + var collection = harLogFromJsonStr(collectionJsonStr); + + print(collection.log?.creator); + print(collection.log?.entries?[0].startedDateTime); + print(collection.log?.entries?[0].request?.url); + + var collectionJson = { + "log": { + "version": "1.2", + "creator": {"name": "Sample HAR Creator", "version": "1.0"}, + "entries": [ + { + "startedDateTime": "2024-02-23T08:00:00.000Z", + "time": 50, + "request": { + "method": "GET", + "url": "https://api.example.com/users", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": {}, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 100, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:05:00.000Z", + "time": 70, + "request": { + "method": "POST", + "url": "https://api.example.com/login", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": { + "mimeType": "application/json", + "text": "{\"username\":\"user\",\"password\":\"pass\"}" + }, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 50, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:10:00.000Z", + "time": 60, + "request": { + "method": "GET", + "url": "https://api.example.com/products", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": {}, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 200, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:15:00.000Z", + "time": 80, + "request": { + "method": "PUT", + "url": "https://api.example.com/products/123", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": { + "mimeType": "application/json", + "text": "{\"name\":\"New Product\",\"price\":50}" + }, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 50, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + } + ] + } + }; + + var collection1 = HarLog.fromJson(collectionJson); + print(collection1.log?.creator?.name); + print(collection1.log?.entries?[0].startedDateTime); + print(collection1.log?.entries?[0].request?.url); +} diff --git a/packages/har_parser/lib/har_parser.dart b/packages/har_parser/lib/har_parser.dart new file mode 100644 index 00000000..4300b9d6 --- /dev/null +++ b/packages/har_parser/lib/har_parser.dart @@ -0,0 +1,3 @@ +library har; + +export 'models/models.dart'; diff --git a/packages/har_parser/lib/models/har_log.dart b/packages/har_parser/lib/models/har_log.dart new file mode 100644 index 00000000..8887e315 --- /dev/null +++ b/packages/har_parser/lib/models/har_log.dart @@ -0,0 +1,107 @@ +import 'dart:convert'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'har_log.freezed.dart'; +part 'har_log.g.dart'; + +HarLog harLogFromJsonStr(String str) => HarLog.fromJson(json.decode(str)); + +String harLogToJsonStr(HarLog data) => + JsonEncoder.withIndent(' ').convert(data); + +@freezed +class HarLog with _$HarLog { + @JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) + const factory HarLog({ + Log? log, + }) = _HarLog; + + factory HarLog.fromJson(Map json) => _$HarLogFromJson(json); +} + +@freezed +class Log with _$Log { + @JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) + const factory Log({ + String? version, + Creator? creator, + List? entries, + }) = _Log; + + factory Log.fromJson(Map json) => _$LogFromJson(json); +} + +@freezed +class Creator with _$Creator { + @JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) + const factory Creator({ + String? name, + String? version, + }) = _Creator; + + factory Creator.fromJson(Map json) => + _$CreatorFromJson(json); +} + +@freezed +class Entry with _$Entry { + @JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) + const factory Entry({ + String? startedDateTime, + int? time, + Request? request, + Response? response, + }) = _Entry; + + factory Entry.fromJson(Map json) => _$EntryFromJson(json); +} + +@freezed +class Request with _$Request { + @JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) + const factory Request({ + String? method, + String? url, + String? httpVersion, + List? cookies, + List? headers, + List? queryString, + Map? postData, + int? headersSize, + int? bodySize, + }) = _Request; + + factory Request.fromJson(Map json) => + _$RequestFromJson(json); +} + +@freezed +class Response with _$Response { + @JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) + const factory Response({ + int? status, + String? statusText, + String? httpVersion, + List? cookies, + List? headers, + Content? content, + String? redirectURL, + int? headersSize, + int? bodySize, + }) = _Response; + + factory Response.fromJson(Map json) => + _$ResponseFromJson(json); +} + +@freezed +class Content with _$Content { + @JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) + const factory Content({ + int? size, + String? mimeType, + }) = _Content; + + factory Content.fromJson(Map json) => + _$ContentFromJson(json); +} diff --git a/packages/har_parser/lib/models/har_log.freezed.dart b/packages/har_parser/lib/models/har_log.freezed.dart new file mode 100644 index 00000000..4e8ffad6 --- /dev/null +++ b/packages/har_parser/lib/models/har_log.freezed.dart @@ -0,0 +1,1683 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'har_log.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +HarLog _$HarLogFromJson(Map json) { + return _HarLog.fromJson(json); +} + +/// @nodoc +mixin _$HarLog { + Log? get log => throw _privateConstructorUsedError; + + /// Serializes this HarLog to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of HarLog + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $HarLogCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $HarLogCopyWith<$Res> { + factory $HarLogCopyWith(HarLog value, $Res Function(HarLog) then) = + _$HarLogCopyWithImpl<$Res, HarLog>; + @useResult + $Res call({Log? log}); + + $LogCopyWith<$Res>? get log; +} + +/// @nodoc +class _$HarLogCopyWithImpl<$Res, $Val extends HarLog> + implements $HarLogCopyWith<$Res> { + _$HarLogCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of HarLog + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? log = freezed, + }) { + return _then(_value.copyWith( + log: freezed == log + ? _value.log + : log // ignore: cast_nullable_to_non_nullable + as Log?, + ) as $Val); + } + + /// Create a copy of HarLog + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $LogCopyWith<$Res>? get log { + if (_value.log == null) { + return null; + } + + return $LogCopyWith<$Res>(_value.log!, (value) { + return _then(_value.copyWith(log: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$HarLogImplCopyWith<$Res> implements $HarLogCopyWith<$Res> { + factory _$$HarLogImplCopyWith( + _$HarLogImpl value, $Res Function(_$HarLogImpl) then) = + __$$HarLogImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({Log? log}); + + @override + $LogCopyWith<$Res>? get log; +} + +/// @nodoc +class __$$HarLogImplCopyWithImpl<$Res> + extends _$HarLogCopyWithImpl<$Res, _$HarLogImpl> + implements _$$HarLogImplCopyWith<$Res> { + __$$HarLogImplCopyWithImpl( + _$HarLogImpl _value, $Res Function(_$HarLogImpl) _then) + : super(_value, _then); + + /// Create a copy of HarLog + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? log = freezed, + }) { + return _then(_$HarLogImpl( + log: freezed == log + ? _value.log + : log // ignore: cast_nullable_to_non_nullable + as Log?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$HarLogImpl implements _HarLog { + const _$HarLogImpl({this.log}); + + factory _$HarLogImpl.fromJson(Map json) => + _$$HarLogImplFromJson(json); + + @override + final Log? log; + + @override + String toString() { + return 'HarLog(log: $log)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$HarLogImpl && + (identical(other.log, log) || other.log == log)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, log); + + /// Create a copy of HarLog + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$HarLogImplCopyWith<_$HarLogImpl> get copyWith => + __$$HarLogImplCopyWithImpl<_$HarLogImpl>(this, _$identity); + + @override + Map toJson() { + return _$$HarLogImplToJson( + this, + ); + } +} + +abstract class _HarLog implements HarLog { + const factory _HarLog({final Log? log}) = _$HarLogImpl; + + factory _HarLog.fromJson(Map json) = _$HarLogImpl.fromJson; + + @override + Log? get log; + + /// Create a copy of HarLog + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$HarLogImplCopyWith<_$HarLogImpl> get copyWith => + throw _privateConstructorUsedError; +} + +Log _$LogFromJson(Map json) { + return _Log.fromJson(json); +} + +/// @nodoc +mixin _$Log { + String? get version => throw _privateConstructorUsedError; + Creator? get creator => throw _privateConstructorUsedError; + List? get entries => throw _privateConstructorUsedError; + + /// Serializes this Log to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Log + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $LogCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $LogCopyWith<$Res> { + factory $LogCopyWith(Log value, $Res Function(Log) then) = + _$LogCopyWithImpl<$Res, Log>; + @useResult + $Res call({String? version, Creator? creator, List? entries}); + + $CreatorCopyWith<$Res>? get creator; +} + +/// @nodoc +class _$LogCopyWithImpl<$Res, $Val extends Log> implements $LogCopyWith<$Res> { + _$LogCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Log + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? version = freezed, + Object? creator = freezed, + Object? entries = freezed, + }) { + return _then(_value.copyWith( + version: freezed == version + ? _value.version + : version // ignore: cast_nullable_to_non_nullable + as String?, + creator: freezed == creator + ? _value.creator + : creator // ignore: cast_nullable_to_non_nullable + as Creator?, + entries: freezed == entries + ? _value.entries + : entries // ignore: cast_nullable_to_non_nullable + as List?, + ) as $Val); + } + + /// Create a copy of Log + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $CreatorCopyWith<$Res>? get creator { + if (_value.creator == null) { + return null; + } + + return $CreatorCopyWith<$Res>(_value.creator!, (value) { + return _then(_value.copyWith(creator: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$LogImplCopyWith<$Res> implements $LogCopyWith<$Res> { + factory _$$LogImplCopyWith(_$LogImpl value, $Res Function(_$LogImpl) then) = + __$$LogImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String? version, Creator? creator, List? entries}); + + @override + $CreatorCopyWith<$Res>? get creator; +} + +/// @nodoc +class __$$LogImplCopyWithImpl<$Res> extends _$LogCopyWithImpl<$Res, _$LogImpl> + implements _$$LogImplCopyWith<$Res> { + __$$LogImplCopyWithImpl(_$LogImpl _value, $Res Function(_$LogImpl) _then) + : super(_value, _then); + + /// Create a copy of Log + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? version = freezed, + Object? creator = freezed, + Object? entries = freezed, + }) { + return _then(_$LogImpl( + version: freezed == version + ? _value.version + : version // ignore: cast_nullable_to_non_nullable + as String?, + creator: freezed == creator + ? _value.creator + : creator // ignore: cast_nullable_to_non_nullable + as Creator?, + entries: freezed == entries + ? _value._entries + : entries // ignore: cast_nullable_to_non_nullable + as List?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$LogImpl implements _Log { + const _$LogImpl({this.version, this.creator, final List? entries}) + : _entries = entries; + + factory _$LogImpl.fromJson(Map json) => + _$$LogImplFromJson(json); + + @override + final String? version; + @override + final Creator? creator; + final List? _entries; + @override + List? get entries { + final value = _entries; + if (value == null) return null; + if (_entries is EqualUnmodifiableListView) return _entries; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + @override + String toString() { + return 'Log(version: $version, creator: $creator, entries: $entries)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LogImpl && + (identical(other.version, version) || other.version == version) && + (identical(other.creator, creator) || other.creator == creator) && + const DeepCollectionEquality().equals(other._entries, _entries)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, version, creator, + const DeepCollectionEquality().hash(_entries)); + + /// Create a copy of Log + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$LogImplCopyWith<_$LogImpl> get copyWith => + __$$LogImplCopyWithImpl<_$LogImpl>(this, _$identity); + + @override + Map toJson() { + return _$$LogImplToJson( + this, + ); + } +} + +abstract class _Log implements Log { + const factory _Log( + {final String? version, + final Creator? creator, + final List? entries}) = _$LogImpl; + + factory _Log.fromJson(Map json) = _$LogImpl.fromJson; + + @override + String? get version; + @override + Creator? get creator; + @override + List? get entries; + + /// Create a copy of Log + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$LogImplCopyWith<_$LogImpl> get copyWith => + throw _privateConstructorUsedError; +} + +Creator _$CreatorFromJson(Map json) { + return _Creator.fromJson(json); +} + +/// @nodoc +mixin _$Creator { + String? get name => throw _privateConstructorUsedError; + String? get version => throw _privateConstructorUsedError; + + /// Serializes this Creator to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Creator + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $CreatorCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CreatorCopyWith<$Res> { + factory $CreatorCopyWith(Creator value, $Res Function(Creator) then) = + _$CreatorCopyWithImpl<$Res, Creator>; + @useResult + $Res call({String? name, String? version}); +} + +/// @nodoc +class _$CreatorCopyWithImpl<$Res, $Val extends Creator> + implements $CreatorCopyWith<$Res> { + _$CreatorCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Creator + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = freezed, + Object? version = freezed, + }) { + return _then(_value.copyWith( + name: freezed == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String?, + version: freezed == version + ? _value.version + : version // ignore: cast_nullable_to_non_nullable + as String?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$CreatorImplCopyWith<$Res> implements $CreatorCopyWith<$Res> { + factory _$$CreatorImplCopyWith( + _$CreatorImpl value, $Res Function(_$CreatorImpl) then) = + __$$CreatorImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String? name, String? version}); +} + +/// @nodoc +class __$$CreatorImplCopyWithImpl<$Res> + extends _$CreatorCopyWithImpl<$Res, _$CreatorImpl> + implements _$$CreatorImplCopyWith<$Res> { + __$$CreatorImplCopyWithImpl( + _$CreatorImpl _value, $Res Function(_$CreatorImpl) _then) + : super(_value, _then); + + /// Create a copy of Creator + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = freezed, + Object? version = freezed, + }) { + return _then(_$CreatorImpl( + name: freezed == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String?, + version: freezed == version + ? _value.version + : version // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$CreatorImpl implements _Creator { + const _$CreatorImpl({this.name, this.version}); + + factory _$CreatorImpl.fromJson(Map json) => + _$$CreatorImplFromJson(json); + + @override + final String? name; + @override + final String? version; + + @override + String toString() { + return 'Creator(name: $name, version: $version)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$CreatorImpl && + (identical(other.name, name) || other.name == name) && + (identical(other.version, version) || other.version == version)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, name, version); + + /// Create a copy of Creator + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$CreatorImplCopyWith<_$CreatorImpl> get copyWith => + __$$CreatorImplCopyWithImpl<_$CreatorImpl>(this, _$identity); + + @override + Map toJson() { + return _$$CreatorImplToJson( + this, + ); + } +} + +abstract class _Creator implements Creator { + const factory _Creator({final String? name, final String? version}) = + _$CreatorImpl; + + factory _Creator.fromJson(Map json) = _$CreatorImpl.fromJson; + + @override + String? get name; + @override + String? get version; + + /// Create a copy of Creator + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$CreatorImplCopyWith<_$CreatorImpl> get copyWith => + throw _privateConstructorUsedError; +} + +Entry _$EntryFromJson(Map json) { + return _Entry.fromJson(json); +} + +/// @nodoc +mixin _$Entry { + String? get startedDateTime => throw _privateConstructorUsedError; + int? get time => throw _privateConstructorUsedError; + Request? get request => throw _privateConstructorUsedError; + Response? get response => throw _privateConstructorUsedError; + + /// Serializes this Entry to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Entry + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $EntryCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $EntryCopyWith<$Res> { + factory $EntryCopyWith(Entry value, $Res Function(Entry) then) = + _$EntryCopyWithImpl<$Res, Entry>; + @useResult + $Res call( + {String? startedDateTime, + int? time, + Request? request, + Response? response}); + + $RequestCopyWith<$Res>? get request; + $ResponseCopyWith<$Res>? get response; +} + +/// @nodoc +class _$EntryCopyWithImpl<$Res, $Val extends Entry> + implements $EntryCopyWith<$Res> { + _$EntryCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Entry + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? startedDateTime = freezed, + Object? time = freezed, + Object? request = freezed, + Object? response = freezed, + }) { + return _then(_value.copyWith( + startedDateTime: freezed == startedDateTime + ? _value.startedDateTime + : startedDateTime // ignore: cast_nullable_to_non_nullable + as String?, + time: freezed == time + ? _value.time + : time // ignore: cast_nullable_to_non_nullable + as int?, + request: freezed == request + ? _value.request + : request // ignore: cast_nullable_to_non_nullable + as Request?, + response: freezed == response + ? _value.response + : response // ignore: cast_nullable_to_non_nullable + as Response?, + ) as $Val); + } + + /// Create a copy of Entry + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $RequestCopyWith<$Res>? get request { + if (_value.request == null) { + return null; + } + + return $RequestCopyWith<$Res>(_value.request!, (value) { + return _then(_value.copyWith(request: value) as $Val); + }); + } + + /// Create a copy of Entry + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $ResponseCopyWith<$Res>? get response { + if (_value.response == null) { + return null; + } + + return $ResponseCopyWith<$Res>(_value.response!, (value) { + return _then(_value.copyWith(response: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$EntryImplCopyWith<$Res> implements $EntryCopyWith<$Res> { + factory _$$EntryImplCopyWith( + _$EntryImpl value, $Res Function(_$EntryImpl) then) = + __$$EntryImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String? startedDateTime, + int? time, + Request? request, + Response? response}); + + @override + $RequestCopyWith<$Res>? get request; + @override + $ResponseCopyWith<$Res>? get response; +} + +/// @nodoc +class __$$EntryImplCopyWithImpl<$Res> + extends _$EntryCopyWithImpl<$Res, _$EntryImpl> + implements _$$EntryImplCopyWith<$Res> { + __$$EntryImplCopyWithImpl( + _$EntryImpl _value, $Res Function(_$EntryImpl) _then) + : super(_value, _then); + + /// Create a copy of Entry + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? startedDateTime = freezed, + Object? time = freezed, + Object? request = freezed, + Object? response = freezed, + }) { + return _then(_$EntryImpl( + startedDateTime: freezed == startedDateTime + ? _value.startedDateTime + : startedDateTime // ignore: cast_nullable_to_non_nullable + as String?, + time: freezed == time + ? _value.time + : time // ignore: cast_nullable_to_non_nullable + as int?, + request: freezed == request + ? _value.request + : request // ignore: cast_nullable_to_non_nullable + as Request?, + response: freezed == response + ? _value.response + : response // ignore: cast_nullable_to_non_nullable + as Response?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$EntryImpl implements _Entry { + const _$EntryImpl( + {this.startedDateTime, this.time, this.request, this.response}); + + factory _$EntryImpl.fromJson(Map json) => + _$$EntryImplFromJson(json); + + @override + final String? startedDateTime; + @override + final int? time; + @override + final Request? request; + @override + final Response? response; + + @override + String toString() { + return 'Entry(startedDateTime: $startedDateTime, time: $time, request: $request, response: $response)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$EntryImpl && + (identical(other.startedDateTime, startedDateTime) || + other.startedDateTime == startedDateTime) && + (identical(other.time, time) || other.time == time) && + (identical(other.request, request) || other.request == request) && + (identical(other.response, response) || + other.response == response)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => + Object.hash(runtimeType, startedDateTime, time, request, response); + + /// Create a copy of Entry + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$EntryImplCopyWith<_$EntryImpl> get copyWith => + __$$EntryImplCopyWithImpl<_$EntryImpl>(this, _$identity); + + @override + Map toJson() { + return _$$EntryImplToJson( + this, + ); + } +} + +abstract class _Entry implements Entry { + const factory _Entry( + {final String? startedDateTime, + final int? time, + final Request? request, + final Response? response}) = _$EntryImpl; + + factory _Entry.fromJson(Map json) = _$EntryImpl.fromJson; + + @override + String? get startedDateTime; + @override + int? get time; + @override + Request? get request; + @override + Response? get response; + + /// Create a copy of Entry + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$EntryImplCopyWith<_$EntryImpl> get copyWith => + throw _privateConstructorUsedError; +} + +Request _$RequestFromJson(Map json) { + return _Request.fromJson(json); +} + +/// @nodoc +mixin _$Request { + String? get method => throw _privateConstructorUsedError; + String? get url => throw _privateConstructorUsedError; + String? get httpVersion => throw _privateConstructorUsedError; + List? get cookies => throw _privateConstructorUsedError; + List? get headers => throw _privateConstructorUsedError; + List? get queryString => throw _privateConstructorUsedError; + Map? get postData => throw _privateConstructorUsedError; + int? get headersSize => throw _privateConstructorUsedError; + int? get bodySize => throw _privateConstructorUsedError; + + /// Serializes this Request to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Request + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $RequestCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $RequestCopyWith<$Res> { + factory $RequestCopyWith(Request value, $Res Function(Request) then) = + _$RequestCopyWithImpl<$Res, Request>; + @useResult + $Res call( + {String? method, + String? url, + String? httpVersion, + List? cookies, + List? headers, + List? queryString, + Map? postData, + int? headersSize, + int? bodySize}); +} + +/// @nodoc +class _$RequestCopyWithImpl<$Res, $Val extends Request> + implements $RequestCopyWith<$Res> { + _$RequestCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Request + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? method = freezed, + Object? url = freezed, + Object? httpVersion = freezed, + Object? cookies = freezed, + Object? headers = freezed, + Object? queryString = freezed, + Object? postData = freezed, + Object? headersSize = freezed, + Object? bodySize = freezed, + }) { + return _then(_value.copyWith( + method: freezed == method + ? _value.method + : method // ignore: cast_nullable_to_non_nullable + as String?, + url: freezed == url + ? _value.url + : url // ignore: cast_nullable_to_non_nullable + as String?, + httpVersion: freezed == httpVersion + ? _value.httpVersion + : httpVersion // ignore: cast_nullable_to_non_nullable + as String?, + cookies: freezed == cookies + ? _value.cookies + : cookies // ignore: cast_nullable_to_non_nullable + as List?, + headers: freezed == headers + ? _value.headers + : headers // ignore: cast_nullable_to_non_nullable + as List?, + queryString: freezed == queryString + ? _value.queryString + : queryString // ignore: cast_nullable_to_non_nullable + as List?, + postData: freezed == postData + ? _value.postData + : postData // ignore: cast_nullable_to_non_nullable + as Map?, + headersSize: freezed == headersSize + ? _value.headersSize + : headersSize // ignore: cast_nullable_to_non_nullable + as int?, + bodySize: freezed == bodySize + ? _value.bodySize + : bodySize // ignore: cast_nullable_to_non_nullable + as int?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$RequestImplCopyWith<$Res> implements $RequestCopyWith<$Res> { + factory _$$RequestImplCopyWith( + _$RequestImpl value, $Res Function(_$RequestImpl) then) = + __$$RequestImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String? method, + String? url, + String? httpVersion, + List? cookies, + List? headers, + List? queryString, + Map? postData, + int? headersSize, + int? bodySize}); +} + +/// @nodoc +class __$$RequestImplCopyWithImpl<$Res> + extends _$RequestCopyWithImpl<$Res, _$RequestImpl> + implements _$$RequestImplCopyWith<$Res> { + __$$RequestImplCopyWithImpl( + _$RequestImpl _value, $Res Function(_$RequestImpl) _then) + : super(_value, _then); + + /// Create a copy of Request + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? method = freezed, + Object? url = freezed, + Object? httpVersion = freezed, + Object? cookies = freezed, + Object? headers = freezed, + Object? queryString = freezed, + Object? postData = freezed, + Object? headersSize = freezed, + Object? bodySize = freezed, + }) { + return _then(_$RequestImpl( + method: freezed == method + ? _value.method + : method // ignore: cast_nullable_to_non_nullable + as String?, + url: freezed == url + ? _value.url + : url // ignore: cast_nullable_to_non_nullable + as String?, + httpVersion: freezed == httpVersion + ? _value.httpVersion + : httpVersion // ignore: cast_nullable_to_non_nullable + as String?, + cookies: freezed == cookies + ? _value._cookies + : cookies // ignore: cast_nullable_to_non_nullable + as List?, + headers: freezed == headers + ? _value._headers + : headers // ignore: cast_nullable_to_non_nullable + as List?, + queryString: freezed == queryString + ? _value._queryString + : queryString // ignore: cast_nullable_to_non_nullable + as List?, + postData: freezed == postData + ? _value._postData + : postData // ignore: cast_nullable_to_non_nullable + as Map?, + headersSize: freezed == headersSize + ? _value.headersSize + : headersSize // ignore: cast_nullable_to_non_nullable + as int?, + bodySize: freezed == bodySize + ? _value.bodySize + : bodySize // ignore: cast_nullable_to_non_nullable + as int?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$RequestImpl implements _Request { + const _$RequestImpl( + {this.method, + this.url, + this.httpVersion, + final List? cookies, + final List? headers, + final List? queryString, + final Map? postData, + this.headersSize, + this.bodySize}) + : _cookies = cookies, + _headers = headers, + _queryString = queryString, + _postData = postData; + + factory _$RequestImpl.fromJson(Map json) => + _$$RequestImplFromJson(json); + + @override + final String? method; + @override + final String? url; + @override + final String? httpVersion; + final List? _cookies; + @override + List? get cookies { + final value = _cookies; + if (value == null) return null; + if (_cookies is EqualUnmodifiableListView) return _cookies; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + final List? _headers; + @override + List? get headers { + final value = _headers; + if (value == null) return null; + if (_headers is EqualUnmodifiableListView) return _headers; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + final List? _queryString; + @override + List? get queryString { + final value = _queryString; + if (value == null) return null; + if (_queryString is EqualUnmodifiableListView) return _queryString; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + final Map? _postData; + @override + Map? get postData { + final value = _postData; + if (value == null) return null; + if (_postData is EqualUnmodifiableMapView) return _postData; + // ignore: implicit_dynamic_type + return EqualUnmodifiableMapView(value); + } + + @override + final int? headersSize; + @override + final int? bodySize; + + @override + String toString() { + return 'Request(method: $method, url: $url, httpVersion: $httpVersion, cookies: $cookies, headers: $headers, queryString: $queryString, postData: $postData, headersSize: $headersSize, bodySize: $bodySize)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$RequestImpl && + (identical(other.method, method) || other.method == method) && + (identical(other.url, url) || other.url == url) && + (identical(other.httpVersion, httpVersion) || + other.httpVersion == httpVersion) && + const DeepCollectionEquality().equals(other._cookies, _cookies) && + const DeepCollectionEquality().equals(other._headers, _headers) && + const DeepCollectionEquality() + .equals(other._queryString, _queryString) && + const DeepCollectionEquality().equals(other._postData, _postData) && + (identical(other.headersSize, headersSize) || + other.headersSize == headersSize) && + (identical(other.bodySize, bodySize) || + other.bodySize == bodySize)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + method, + url, + httpVersion, + const DeepCollectionEquality().hash(_cookies), + const DeepCollectionEquality().hash(_headers), + const DeepCollectionEquality().hash(_queryString), + const DeepCollectionEquality().hash(_postData), + headersSize, + bodySize); + + /// Create a copy of Request + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$RequestImplCopyWith<_$RequestImpl> get copyWith => + __$$RequestImplCopyWithImpl<_$RequestImpl>(this, _$identity); + + @override + Map toJson() { + return _$$RequestImplToJson( + this, + ); + } +} + +abstract class _Request implements Request { + const factory _Request( + {final String? method, + final String? url, + final String? httpVersion, + final List? cookies, + final List? headers, + final List? queryString, + final Map? postData, + final int? headersSize, + final int? bodySize}) = _$RequestImpl; + + factory _Request.fromJson(Map json) = _$RequestImpl.fromJson; + + @override + String? get method; + @override + String? get url; + @override + String? get httpVersion; + @override + List? get cookies; + @override + List? get headers; + @override + List? get queryString; + @override + Map? get postData; + @override + int? get headersSize; + @override + int? get bodySize; + + /// Create a copy of Request + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$RequestImplCopyWith<_$RequestImpl> get copyWith => + throw _privateConstructorUsedError; +} + +Response _$ResponseFromJson(Map json) { + return _Response.fromJson(json); +} + +/// @nodoc +mixin _$Response { + int? get status => throw _privateConstructorUsedError; + String? get statusText => throw _privateConstructorUsedError; + String? get httpVersion => throw _privateConstructorUsedError; + List? get cookies => throw _privateConstructorUsedError; + List? get headers => throw _privateConstructorUsedError; + Content? get content => throw _privateConstructorUsedError; + String? get redirectURL => throw _privateConstructorUsedError; + int? get headersSize => throw _privateConstructorUsedError; + int? get bodySize => throw _privateConstructorUsedError; + + /// Serializes this Response to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Response + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $ResponseCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ResponseCopyWith<$Res> { + factory $ResponseCopyWith(Response value, $Res Function(Response) then) = + _$ResponseCopyWithImpl<$Res, Response>; + @useResult + $Res call( + {int? status, + String? statusText, + String? httpVersion, + List? cookies, + List? headers, + Content? content, + String? redirectURL, + int? headersSize, + int? bodySize}); + + $ContentCopyWith<$Res>? get content; +} + +/// @nodoc +class _$ResponseCopyWithImpl<$Res, $Val extends Response> + implements $ResponseCopyWith<$Res> { + _$ResponseCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Response + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? status = freezed, + Object? statusText = freezed, + Object? httpVersion = freezed, + Object? cookies = freezed, + Object? headers = freezed, + Object? content = freezed, + Object? redirectURL = freezed, + Object? headersSize = freezed, + Object? bodySize = freezed, + }) { + return _then(_value.copyWith( + status: freezed == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as int?, + statusText: freezed == statusText + ? _value.statusText + : statusText // ignore: cast_nullable_to_non_nullable + as String?, + httpVersion: freezed == httpVersion + ? _value.httpVersion + : httpVersion // ignore: cast_nullable_to_non_nullable + as String?, + cookies: freezed == cookies + ? _value.cookies + : cookies // ignore: cast_nullable_to_non_nullable + as List?, + headers: freezed == headers + ? _value.headers + : headers // ignore: cast_nullable_to_non_nullable + as List?, + content: freezed == content + ? _value.content + : content // ignore: cast_nullable_to_non_nullable + as Content?, + redirectURL: freezed == redirectURL + ? _value.redirectURL + : redirectURL // ignore: cast_nullable_to_non_nullable + as String?, + headersSize: freezed == headersSize + ? _value.headersSize + : headersSize // ignore: cast_nullable_to_non_nullable + as int?, + bodySize: freezed == bodySize + ? _value.bodySize + : bodySize // ignore: cast_nullable_to_non_nullable + as int?, + ) as $Val); + } + + /// Create a copy of Response + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $ContentCopyWith<$Res>? get content { + if (_value.content == null) { + return null; + } + + return $ContentCopyWith<$Res>(_value.content!, (value) { + return _then(_value.copyWith(content: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$ResponseImplCopyWith<$Res> + implements $ResponseCopyWith<$Res> { + factory _$$ResponseImplCopyWith( + _$ResponseImpl value, $Res Function(_$ResponseImpl) then) = + __$$ResponseImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {int? status, + String? statusText, + String? httpVersion, + List? cookies, + List? headers, + Content? content, + String? redirectURL, + int? headersSize, + int? bodySize}); + + @override + $ContentCopyWith<$Res>? get content; +} + +/// @nodoc +class __$$ResponseImplCopyWithImpl<$Res> + extends _$ResponseCopyWithImpl<$Res, _$ResponseImpl> + implements _$$ResponseImplCopyWith<$Res> { + __$$ResponseImplCopyWithImpl( + _$ResponseImpl _value, $Res Function(_$ResponseImpl) _then) + : super(_value, _then); + + /// Create a copy of Response + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? status = freezed, + Object? statusText = freezed, + Object? httpVersion = freezed, + Object? cookies = freezed, + Object? headers = freezed, + Object? content = freezed, + Object? redirectURL = freezed, + Object? headersSize = freezed, + Object? bodySize = freezed, + }) { + return _then(_$ResponseImpl( + status: freezed == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as int?, + statusText: freezed == statusText + ? _value.statusText + : statusText // ignore: cast_nullable_to_non_nullable + as String?, + httpVersion: freezed == httpVersion + ? _value.httpVersion + : httpVersion // ignore: cast_nullable_to_non_nullable + as String?, + cookies: freezed == cookies + ? _value._cookies + : cookies // ignore: cast_nullable_to_non_nullable + as List?, + headers: freezed == headers + ? _value._headers + : headers // ignore: cast_nullable_to_non_nullable + as List?, + content: freezed == content + ? _value.content + : content // ignore: cast_nullable_to_non_nullable + as Content?, + redirectURL: freezed == redirectURL + ? _value.redirectURL + : redirectURL // ignore: cast_nullable_to_non_nullable + as String?, + headersSize: freezed == headersSize + ? _value.headersSize + : headersSize // ignore: cast_nullable_to_non_nullable + as int?, + bodySize: freezed == bodySize + ? _value.bodySize + : bodySize // ignore: cast_nullable_to_non_nullable + as int?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$ResponseImpl implements _Response { + const _$ResponseImpl( + {this.status, + this.statusText, + this.httpVersion, + final List? cookies, + final List? headers, + this.content, + this.redirectURL, + this.headersSize, + this.bodySize}) + : _cookies = cookies, + _headers = headers; + + factory _$ResponseImpl.fromJson(Map json) => + _$$ResponseImplFromJson(json); + + @override + final int? status; + @override + final String? statusText; + @override + final String? httpVersion; + final List? _cookies; + @override + List? get cookies { + final value = _cookies; + if (value == null) return null; + if (_cookies is EqualUnmodifiableListView) return _cookies; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + final List? _headers; + @override + List? get headers { + final value = _headers; + if (value == null) return null; + if (_headers is EqualUnmodifiableListView) return _headers; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + @override + final Content? content; + @override + final String? redirectURL; + @override + final int? headersSize; + @override + final int? bodySize; + + @override + String toString() { + return 'Response(status: $status, statusText: $statusText, httpVersion: $httpVersion, cookies: $cookies, headers: $headers, content: $content, redirectURL: $redirectURL, headersSize: $headersSize, bodySize: $bodySize)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ResponseImpl && + (identical(other.status, status) || other.status == status) && + (identical(other.statusText, statusText) || + other.statusText == statusText) && + (identical(other.httpVersion, httpVersion) || + other.httpVersion == httpVersion) && + const DeepCollectionEquality().equals(other._cookies, _cookies) && + const DeepCollectionEquality().equals(other._headers, _headers) && + (identical(other.content, content) || other.content == content) && + (identical(other.redirectURL, redirectURL) || + other.redirectURL == redirectURL) && + (identical(other.headersSize, headersSize) || + other.headersSize == headersSize) && + (identical(other.bodySize, bodySize) || + other.bodySize == bodySize)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + status, + statusText, + httpVersion, + const DeepCollectionEquality().hash(_cookies), + const DeepCollectionEquality().hash(_headers), + content, + redirectURL, + headersSize, + bodySize); + + /// Create a copy of Response + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$ResponseImplCopyWith<_$ResponseImpl> get copyWith => + __$$ResponseImplCopyWithImpl<_$ResponseImpl>(this, _$identity); + + @override + Map toJson() { + return _$$ResponseImplToJson( + this, + ); + } +} + +abstract class _Response implements Response { + const factory _Response( + {final int? status, + final String? statusText, + final String? httpVersion, + final List? cookies, + final List? headers, + final Content? content, + final String? redirectURL, + final int? headersSize, + final int? bodySize}) = _$ResponseImpl; + + factory _Response.fromJson(Map json) = + _$ResponseImpl.fromJson; + + @override + int? get status; + @override + String? get statusText; + @override + String? get httpVersion; + @override + List? get cookies; + @override + List? get headers; + @override + Content? get content; + @override + String? get redirectURL; + @override + int? get headersSize; + @override + int? get bodySize; + + /// Create a copy of Response + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$ResponseImplCopyWith<_$ResponseImpl> get copyWith => + throw _privateConstructorUsedError; +} + +Content _$ContentFromJson(Map json) { + return _Content.fromJson(json); +} + +/// @nodoc +mixin _$Content { + int? get size => throw _privateConstructorUsedError; + String? get mimeType => throw _privateConstructorUsedError; + + /// Serializes this Content to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Content + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $ContentCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ContentCopyWith<$Res> { + factory $ContentCopyWith(Content value, $Res Function(Content) then) = + _$ContentCopyWithImpl<$Res, Content>; + @useResult + $Res call({int? size, String? mimeType}); +} + +/// @nodoc +class _$ContentCopyWithImpl<$Res, $Val extends Content> + implements $ContentCopyWith<$Res> { + _$ContentCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Content + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? size = freezed, + Object? mimeType = freezed, + }) { + return _then(_value.copyWith( + size: freezed == size + ? _value.size + : size // ignore: cast_nullable_to_non_nullable + as int?, + mimeType: freezed == mimeType + ? _value.mimeType + : mimeType // ignore: cast_nullable_to_non_nullable + as String?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$ContentImplCopyWith<$Res> implements $ContentCopyWith<$Res> { + factory _$$ContentImplCopyWith( + _$ContentImpl value, $Res Function(_$ContentImpl) then) = + __$$ContentImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({int? size, String? mimeType}); +} + +/// @nodoc +class __$$ContentImplCopyWithImpl<$Res> + extends _$ContentCopyWithImpl<$Res, _$ContentImpl> + implements _$$ContentImplCopyWith<$Res> { + __$$ContentImplCopyWithImpl( + _$ContentImpl _value, $Res Function(_$ContentImpl) _then) + : super(_value, _then); + + /// Create a copy of Content + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? size = freezed, + Object? mimeType = freezed, + }) { + return _then(_$ContentImpl( + size: freezed == size + ? _value.size + : size // ignore: cast_nullable_to_non_nullable + as int?, + mimeType: freezed == mimeType + ? _value.mimeType + : mimeType // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$ContentImpl implements _Content { + const _$ContentImpl({this.size, this.mimeType}); + + factory _$ContentImpl.fromJson(Map json) => + _$$ContentImplFromJson(json); + + @override + final int? size; + @override + final String? mimeType; + + @override + String toString() { + return 'Content(size: $size, mimeType: $mimeType)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ContentImpl && + (identical(other.size, size) || other.size == size) && + (identical(other.mimeType, mimeType) || + other.mimeType == mimeType)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, size, mimeType); + + /// Create a copy of Content + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$ContentImplCopyWith<_$ContentImpl> get copyWith => + __$$ContentImplCopyWithImpl<_$ContentImpl>(this, _$identity); + + @override + Map toJson() { + return _$$ContentImplToJson( + this, + ); + } +} + +abstract class _Content implements Content { + const factory _Content({final int? size, final String? mimeType}) = + _$ContentImpl; + + factory _Content.fromJson(Map json) = _$ContentImpl.fromJson; + + @override + int? get size; + @override + String? get mimeType; + + /// Create a copy of Content + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$ContentImplCopyWith<_$ContentImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/packages/har_parser/lib/models/har_log.g.dart b/packages/har_parser/lib/models/har_log.g.dart new file mode 100644 index 00000000..7bec7f01 --- /dev/null +++ b/packages/har_parser/lib/models/har_log.g.dart @@ -0,0 +1,131 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'har_log.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$HarLogImpl _$$HarLogImplFromJson(Map json) => _$HarLogImpl( + log: json['log'] == null + ? null + : Log.fromJson(Map.from(json['log'] as Map)), + ); + +Map _$$HarLogImplToJson(_$HarLogImpl instance) => + { + if (instance.log?.toJson() case final value?) 'log': value, + }; + +_$LogImpl _$$LogImplFromJson(Map json) => _$LogImpl( + version: json['version'] as String?, + creator: json['creator'] == null + ? null + : Creator.fromJson(Map.from(json['creator'] as Map)), + entries: (json['entries'] as List?) + ?.map((e) => Entry.fromJson(Map.from(e as Map))) + .toList(), + ); + +Map _$$LogImplToJson(_$LogImpl instance) => { + if (instance.version case final value?) 'version': value, + if (instance.creator?.toJson() case final value?) 'creator': value, + if (instance.entries?.map((e) => e.toJson()).toList() case final value?) + 'entries': value, + }; + +_$CreatorImpl _$$CreatorImplFromJson(Map json) => _$CreatorImpl( + name: json['name'] as String?, + version: json['version'] as String?, + ); + +Map _$$CreatorImplToJson(_$CreatorImpl instance) => + { + if (instance.name case final value?) 'name': value, + if (instance.version case final value?) 'version': value, + }; + +_$EntryImpl _$$EntryImplFromJson(Map json) => _$EntryImpl( + startedDateTime: json['startedDateTime'] as String?, + time: (json['time'] as num?)?.toInt(), + request: json['request'] == null + ? null + : Request.fromJson(Map.from(json['request'] as Map)), + response: json['response'] == null + ? null + : Response.fromJson( + Map.from(json['response'] as Map)), + ); + +Map _$$EntryImplToJson(_$EntryImpl instance) => + { + if (instance.startedDateTime case final value?) 'startedDateTime': value, + if (instance.time case final value?) 'time': value, + if (instance.request?.toJson() case final value?) 'request': value, + if (instance.response?.toJson() case final value?) 'response': value, + }; + +_$RequestImpl _$$RequestImplFromJson(Map json) => _$RequestImpl( + method: json['method'] as String?, + url: json['url'] as String?, + httpVersion: json['httpVersion'] as String?, + cookies: json['cookies'] as List?, + headers: json['headers'] as List?, + queryString: json['queryString'] as List?, + postData: (json['postData'] as Map?)?.map( + (k, e) => MapEntry(k as String, e), + ), + headersSize: (json['headersSize'] as num?)?.toInt(), + bodySize: (json['bodySize'] as num?)?.toInt(), + ); + +Map _$$RequestImplToJson(_$RequestImpl instance) => + { + if (instance.method case final value?) 'method': value, + if (instance.url case final value?) 'url': value, + if (instance.httpVersion case final value?) 'httpVersion': value, + if (instance.cookies case final value?) 'cookies': value, + if (instance.headers case final value?) 'headers': value, + if (instance.queryString case final value?) 'queryString': value, + if (instance.postData case final value?) 'postData': value, + if (instance.headersSize case final value?) 'headersSize': value, + if (instance.bodySize case final value?) 'bodySize': value, + }; + +_$ResponseImpl _$$ResponseImplFromJson(Map json) => _$ResponseImpl( + status: (json['status'] as num?)?.toInt(), + statusText: json['statusText'] as String?, + httpVersion: json['httpVersion'] as String?, + cookies: json['cookies'] as List?, + headers: json['headers'] as List?, + content: json['content'] == null + ? null + : Content.fromJson(Map.from(json['content'] as Map)), + redirectURL: json['redirectURL'] as String?, + headersSize: (json['headersSize'] as num?)?.toInt(), + bodySize: (json['bodySize'] as num?)?.toInt(), + ); + +Map _$$ResponseImplToJson(_$ResponseImpl instance) => + { + if (instance.status case final value?) 'status': value, + if (instance.statusText case final value?) 'statusText': value, + if (instance.httpVersion case final value?) 'httpVersion': value, + if (instance.cookies case final value?) 'cookies': value, + if (instance.headers case final value?) 'headers': value, + if (instance.content?.toJson() case final value?) 'content': value, + if (instance.redirectURL case final value?) 'redirectURL': value, + if (instance.headersSize case final value?) 'headersSize': value, + if (instance.bodySize case final value?) 'bodySize': value, + }; + +_$ContentImpl _$$ContentImplFromJson(Map json) => _$ContentImpl( + size: (json['size'] as num?)?.toInt(), + mimeType: json['mimeType'] as String?, + ); + +Map _$$ContentImplToJson(_$ContentImpl instance) => + { + if (instance.size case final value?) 'size': value, + if (instance.mimeType case final value?) 'mimeType': value, + }; diff --git a/packages/har_parser/lib/models/models.dart b/packages/har_parser/lib/models/models.dart new file mode 100644 index 00000000..f3ea5369 --- /dev/null +++ b/packages/har_parser/lib/models/models.dart @@ -0,0 +1 @@ +export 'har_log.dart'; diff --git a/packages/har_parser/pubspec.yaml b/packages/har_parser/pubspec.yaml new file mode 100644 index 00000000..14b9c10a --- /dev/null +++ b/packages/har_parser/pubspec.yaml @@ -0,0 +1,25 @@ +name: har_parser +description: "Seamlessly convert har Format to Dart and vice versa." +version: 0.0.1 +homepage: https://github.com/foss42/apidash + +topics: + - har + - api + - rest + - http + - network + +environment: + sdk: ">=3.0.0 <4.0.0" + +dependencies: + freezed_annotation: ^2.4.4 + json_annotation: ^4.9.0 + +dev_dependencies: + build_runner: ^2.4.12 + freezed: ^2.5.7 + json_serializable: ^6.7.1 + lints: ^4.0.0 + test: ^1.24.0 diff --git a/packages/har_parser/test/collection_examples/collection_apidash.dart b/packages/har_parser/test/collection_examples/collection_apidash.dart new file mode 100644 index 00000000..f759eb5d --- /dev/null +++ b/packages/har_parser/test/collection_examples/collection_apidash.dart @@ -0,0 +1,253 @@ +var collectionJsonStr = r''' +{ + "log": { + "version": "1.2", + "creator": { + "name": "Sample HAR Creator", + "version": "1.0" + }, + "entries": [ + { + "startedDateTime": "2024-02-23T08:00:00.000Z", + "time": 50, + "request": { + "method": "GET", + "url": "https://api.example.com/users", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": {}, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": { + "size": 100, + "mimeType": "application/json" + }, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:05:00.000Z", + "time": 70, + "request": { + "method": "POST", + "url": "https://api.example.com/login", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": { + "mimeType": "application/json", + "text": "{\"username\":\"user\",\"password\":\"pass\"}" + }, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": { + "size": 50, + "mimeType": "application/json" + }, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:10:00.000Z", + "time": 60, + "request": { + "method": "GET", + "url": "https://api.example.com/products", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": {}, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": { + "size": 200, + "mimeType": "application/json" + }, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:15:00.000Z", + "time": 80, + "request": { + "method": "PUT", + "url": "https://api.example.com/products/123", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": { + "mimeType": "application/json", + "text": "{\"name\":\"New Product\",\"price\":50}" + }, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": { + "size": 50, + "mimeType": "application/json" + }, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + } + ] + } +}'''; + +var collectionJson = { + "log": { + "version": "1.2", + "creator": {"name": "Sample HAR Creator", "version": "1.0"}, + "entries": [ + { + "startedDateTime": "2024-02-23T08:00:00.000Z", + "time": 50, + "request": { + "method": "GET", + "url": "https://api.example.com/users", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": {}, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 100, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:05:00.000Z", + "time": 70, + "request": { + "method": "POST", + "url": "https://api.example.com/login", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": { + "mimeType": "application/json", + "text": "{\"username\":\"user\",\"password\":\"pass\"}" + }, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 50, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:10:00.000Z", + "time": 60, + "request": { + "method": "GET", + "url": "https://api.example.com/products", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": {}, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 200, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + }, + { + "startedDateTime": "2024-02-23T08:15:00.000Z", + "time": 80, + "request": { + "method": "PUT", + "url": "https://api.example.com/products/123", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "queryString": [], + "postData": { + "mimeType": "application/json", + "text": "{\"name\":\"New Product\",\"price\":50}" + }, + "headersSize": -1, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [], + "content": {"size": 50, "mimeType": "application/json"}, + "redirectURL": "", + "headersSize": -1, + "bodySize": -1 + } + } + ] + } +}; diff --git a/packages/har_parser/test/har_parser_test.dart b/packages/har_parser/test/har_parser_test.dart new file mode 100644 index 00000000..2dee014e --- /dev/null +++ b/packages/har_parser/test/har_parser_test.dart @@ -0,0 +1,25 @@ +import 'package:har_parser/har_parser.dart'; +import 'package:test/test.dart'; + +import 'collection_examples/collection_apidash.dart'; +import 'models/collection_apidash_model.dart'; + +void main() { + group('Postman tests', () { + test('API Dash Postman collection from Json String', () { + expect(harLogFromJsonStr(collectionJsonStr), collectionApiDashModel); + }); + + test('API Dash Postman collection from Json', () { + expect(HarLog.fromJson(collectionJson), collectionApiDashModel); + }); + + test('API Dash Postman collection to Json String', () { + expect(harLogToJsonStr(collectionApiDashModel), collectionJsonStr); + }); + + test('API Dash Postman collection to Json', () { + expect(collectionApiDashModel.toJson(), collectionJson); + }); + }); +} diff --git a/packages/har_parser/test/models/collection_apidash_model.dart b/packages/har_parser/test/models/collection_apidash_model.dart new file mode 100644 index 00000000..a92278c5 --- /dev/null +++ b/packages/har_parser/test/models/collection_apidash_model.dart @@ -0,0 +1,120 @@ +import 'package:har_parser/models/models.dart'; + +var collectionApiDashModel = HarLog( + log: Log( + version: "1.2", + creator: Creator(name: "Sample HAR Creator", version: "1.0"), + entries: [ + Entry( + startedDateTime: "2024-02-23T08:00:00.000Z", + time: 50, + request: Request( + method: "GET", + url: "https://api.example.com/users", + httpVersion: "HTTP/1.1", + cookies: [], + headers: [], + queryString: [], + postData: {}, + headersSize: -1, + bodySize: -1, + ), + response: Response( + status: 200, + statusText: "OK", + httpVersion: "HTTP/1.1", + cookies: [], + headers: [], + content: Content(size: 100, mimeType: "application/json"), + redirectURL: "", + headersSize: -1, + bodySize: -1, + ), + ), + Entry( + startedDateTime: "2024-02-23T08:05:00.000Z", + time: 70, + request: Request( + method: "POST", + url: "https://api.example.com/login", + httpVersion: "HTTP/1.1", + cookies: [], + headers: [], + queryString: [], + postData: { + "mimeType": "application/json", + "text": '{"username":"user","password":"pass"}', + }, + headersSize: -1, + bodySize: -1, + ), + response: Response( + status: 200, + statusText: "OK", + httpVersion: "HTTP/1.1", + cookies: [], + headers: [], + content: Content(size: 50, mimeType: "application/json"), + redirectURL: "", + headersSize: -1, + bodySize: -1, + ), + ), + Entry( + startedDateTime: "2024-02-23T08:10:00.000Z", + time: 60, + request: Request( + method: "GET", + url: "https://api.example.com/products", + httpVersion: "HTTP/1.1", + cookies: [], + headers: [], + queryString: [], + postData: {}, + headersSize: -1, + bodySize: -1, + ), + response: Response( + status: 200, + statusText: "OK", + httpVersion: "HTTP/1.1", + cookies: [], + headers: [], + content: Content(size: 200, mimeType: "application/json"), + redirectURL: "", + headersSize: -1, + bodySize: -1, + ), + ), + Entry( + startedDateTime: "2024-02-23T08:15:00.000Z", + time: 80, + request: Request( + method: "PUT", + url: "https://api.example.com/products/123", + httpVersion: "HTTP/1.1", + cookies: [], + headers: [], + queryString: [], + postData: { + "mimeType": "application/json", + "text": '{"name":"New Product","price":50}', + }, + headersSize: -1, + bodySize: -1, + ), + response: Response( + status: 200, + statusText: "OK", + httpVersion: "HTTP/1.1", + cookies: [], + headers: [], + content: Content(size: 50, mimeType: "application/json"), + redirectURL: "", + headersSize: -1, + bodySize: -1, + ), + ), + ], + ), +);