Merge branch 'main' into client_cancellation

This commit is contained in:
K GOVIND
2025-03-04 23:49:04 +05:30
committed by GitHub
54 changed files with 996 additions and 513 deletions

2
.gitignore vendored
View File

@ -5,9 +5,11 @@
*.swp
.DS_Store
.atom/
.build/
.buildlog/
.history
.svn/
.swiftpm/
migrate_working_dir/
.fvm
.fvmrc

View File

@ -15,3 +15,28 @@ A List of API endpoints that can be used for testing API Dash
#### For Testing sites with Bad Certificate
- https://badssl.com/
- https://www.ssl.com/sample-valid-revoked-and-expired-ssl-tls-certificates/
#### PDF
- https://training.github.com/downloads/github-git-cheat-sheet.pdf
#### Text
- https://www.google.com/robots.txt
#### JSON
- https://api.apidash.dev/openapi.json
#### XML
- https://apidash.dev/sitemap.xml
#### Video
- https://download.blender.org/peach/bigbuckbunny_movies/
- https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4
#### Audio
-

View File

@ -0,0 +1,309 @@
# AI Agent for API Testing and Automated Tool Integration
## Personal Information
- **Full Name:** Akshay Waghmare
- **University Name:** Indian Institute of Information Technology, Allahabad (IIIT Allahabad)
- **Program Enrolled In:** B.Tech in Electronics and Communication Engineering (ECE)
- **Year:** Pre-final Year (Third Year)
- **Expected Graduation Date:** May 2026
## About Me
Im Akshay Waghmare, a pre-final year B.Tech student at IIIT Allahabad, majoring in Electronics and Communication Engineering. With a strong foundation in full-stack development and backend architecture, I have hands-on experience in technologies like **Next.js**, **Node.js**, **Spring Boot**, **Kafka**, **RabbitMQ**, and **Flutter**. Ive interned at **Screenera.ai** and **Webneco Infotech**, working on building scalable, high-performance applications. My open-source contributions span organizations like **Wikimedia Foundation**, **C2SI**, and **OpenClimateFix**, and Ive mentored aspiring developers at **OpenCode IIIT Allahabad**. Ive also participated in several competitions, achieving **AIR 12** in the **Amazon ML Challenge**, **Goldman Sachs India Hackathon (National Finalist)**, and **Google GenAI Hackathon**. Im passionate about AI, cloud technologies, and innovative software solutions, especially in automating tasks with AI agents and leveraging **Large Language Models (LLMs)** for smarter workflows.
## Project Details
- **Project Title:** AI Agent for API Testing and Automated Tool Integration
- **Description:**
This project leverages Large Language Models (LLMs) to automate API testing by generating intelligent test cases, validating responses, and converting APIs into structured tool definitions for seamless integration with AI agent frameworks like **crewAI, smolagents, pydantic-ai, and langgraph**.
- **Key Features:**
- Automated API discovery and structured parsing from OpenAPI specs, Postman collections, and raw API calls.
- AI-powered test case generation, including edge cases and security testing.
- Automated API request execution and intelligent validation using machine learning.
- Seamless tool integration with AI frameworks for advanced automation.
- Benchmark dataset & evaluation framework for selecting the best LLM backend for end users.
# Proposed Idea : AI Agents for API Testing & Tool Definition Generator
I propose a approach leveraging Large Language Models to utilise both API testing and framework integration. My solution combines intelligent test generation with automated tool definition creation, all powered by contextually-aware AI.
The core of my approach is a unified pipeline that first parses and understands API specifications at a deep semantic level, then uses that understanding for two key purposes: generating comprehensive test suites and creating framework-specific tool definitions. This dual-purpose system will dramatically reduce the manual effort typically required for both tasks while improving quality and coverage.
For the API testing component, We will focus on areas where traditional testing tools fall short - particularly intelligent edge case detection and business logic validation. By leveraging LLMs' ability to reason about APIs contextually, the system will identify potential issues that rule-based generators miss. The test generation will cover functional testing with parameter variations, edge cases including boundary values and invalid inputs, security testing for authentication and injection vulnerabilities, and even performance testing scenarios.
For the framework integration component, We will then develop a flexible adapter system that generates properly typed tool definitions with appropriate validation rules for each target framework. This means developers can instantly convert their APIs into tool definitions for crewAI, langchain, pydantic-ai, langgraph, and other frameworks without manually rewriting specifications and validation logic.
To address the benchmarking requirement in the project description, After that we can create a standardized dataset of diverse API specifications and implement a comprehensive evaluation framework. This will measure multiple dimensions including accuracy of generated tests and tools, API coverage percentage, relevance to the API's purpose, edge case detection ability, and cost efficiency across different LLM providers. This will enable users to make informed decisions about which model best fits their specific needs.
## System Architecture
The system architecture consists of several key components working together to form a pipeline:
```mermaid
flowchart TD
subgraph Client["Client Layer"]
Web[Web Interface]
CLI[Command Line Interface]
SDK[SDK/API Client]
end
subgraph Gateway["API Gateway"]
GW[API Gateway/Load Balancer]
Auth[Authentication Service]
end
subgraph Core["Core Services"]
subgraph APIAnalysis["API Analysis Service"]
Parser[API Specification Parser]
Analyzer[Endpoint Analyzer]
DependencyDetector[Dependency Detector]
end
subgraph TestGen["Test Generation Service"]
TestCaseGen[Test Case Generator]
TestDataGen[Test Data Generator]
TestSuiteOrg[Test Suite Organizer]
EdgeCaseGen[Edge Case Generator]
end
subgraph ToolGen["Tool Generation Service"]
ToolDefGen[Tool Definition Generator]
SchemaGen[Schema Generator]
FrameworkAdapter[Framework Adapter]
DocGen[Documentation Generator]
end
end
subgraph LLM["LLM Services"]
PromptMgr[Prompt Manager]
ModelRouter[Model Router]
TokenManager[Token Manager]
OutputParser[Output Parser]
CacheManager[Cache Manager]
end
subgraph Execution["Execution Services"]
subgraph Runner["Test Runner Service"]
Executor[Request Executor]
AuthManager[Auth Manager]
RateLimit[Rate Limiter]
Retry[Retry Manager]
end
subgraph Validator["Validation Service"]
SchemaValidator[Schema Validator]
LogicValidator[Business Logic Validator]
PerformanceValidator[Performance Validator]
SecurityValidator[Security Validator]
end
subgraph Reporter["Reporting Service"]
ResultCollector[Result Collector]
CoverageAnalyzer[Coverage Analyzer]
ReportGenerator[Report Generator]
Visualizer[Visualizer]
end
end
subgraph Data["Data Services"]
DB[(Database)]
Cache[(Cache)]
Storage[(Object Storage)]
Queue[(Message Queue)]
end
subgraph External["External Systems"]
TargetAPIs[Target APIs]
CISystem[CI/CD Systems]
AIFrameworks[AI Agent Frameworks]
Monitoring[Monitoring Systems]
end
%% Client to Gateway
Web --> GW
CLI --> GW
SDK --> GW
%% Gateway to Services
GW --> Auth
Auth --> Parser
Auth --> TestCaseGen
Auth --> ToolDefGen
Auth --> Executor
%% API Analysis Flow
Parser --> Analyzer
Analyzer --> DependencyDetector
Parser --> DB
%% Test Generation Flow
Analyzer --> TestCaseGen
TestCaseGen --> TestDataGen
TestDataGen --> TestSuiteOrg
TestCaseGen --> EdgeCaseGen
EdgeCaseGen --> TestSuiteOrg
TestSuiteOrg --> DB
%% Tool Generation Flow
Analyzer --> ToolDefGen
ToolDefGen --> SchemaGen
SchemaGen --> FrameworkAdapter
FrameworkAdapter --> DocGen
ToolDefGen --> DB
%% LLM Integration
TestCaseGen --> PromptMgr
EdgeCaseGen --> PromptMgr
ToolDefGen --> PromptMgr
LogicValidator --> PromptMgr
PromptMgr --> ModelRouter
ModelRouter --> TokenManager
TokenManager --> OutputParser
ModelRouter --> CacheManager
CacheManager --> Cache
%% Execution Flow
TestSuiteOrg --> Executor
Executor --> AuthManager
AuthManager --> RateLimit
RateLimit --> Retry
Executor --> TargetAPIs
TargetAPIs --> Executor
Executor --> SchemaValidator
SchemaValidator --> LogicValidator
LogicValidator --> PerformanceValidator
PerformanceValidator --> SecurityValidator
SchemaValidator --> ResultCollector
LogicValidator --> ResultCollector
PerformanceValidator --> ResultCollector
SecurityValidator --> ResultCollector
%% Reporting Flow
ResultCollector --> CoverageAnalyzer
CoverageAnalyzer --> ReportGenerator
ReportGenerator --> Visualizer
ReportGenerator --> Storage
%% Data Service Integration
DB <--> Parser
DB <--> TestSuiteOrg
DB <--> ToolDefGen
DB <--> ResultCollector
Queue <--> Executor
Storage <--> ReportGenerator
%% External Integrations
ReportGenerator --> CISystem
FrameworkAdapter --> AIFrameworks
Reporter --> Monitoring
%% Styling
classDef client fill:#3498db,stroke:#2980b9,color:white
classDef gateway fill:#f1c40f,stroke:#f39c12,color:black
classDef core fill:#27ae60,stroke:#229954,color:white
classDef llm fill:#9b59b6,stroke:#8e44ad,color:white
classDef execution fill:#e74c3c,stroke:#c0392b,color:white
classDef data fill:#16a085,stroke:#1abc9c,color:white
classDef external fill:#7f8c8d,stroke:#2c3e50,color:white
class Web,CLI,SDK client
class GW,Auth gateway
class Parser,Analyzer,DependencyDetector,TestCaseGen,TestDataGen,TestSuiteOrg,EdgeCaseGen,ToolDefGen,SchemaGen,FrameworkAdapter,DocGen core
class PromptMgr,ModelRouter,TokenManager,OutputParser,CacheManager llm
class Executor,AuthManager,RateLimit,Retry,SchemaValidator,LogicValidator,PerformanceValidator,SecurityValidator,ResultCollector,CoverageAnalyzer,ReportGenerator,Visualizer execution
class DB,Cache,Storage,Queue data
class TargetAPIs,CISystem,AIFrameworks,Monitoring external
```
1. **API Specification Parser**: This component handles multiple API specification formats (OpenAPI, GraphQL, gRPC, etc.) and normalizes them into a unified internal representation. I'll build on existing parsing libraries but extend them with custom logic to extract semantic meaning and relationships between endpoints.
2. **LLM Integration Layer**: A provider-agnostic abstraction supporting multiple LLM services with intelligent routing, caching, and fallback mechanisms. Prompt templates will be version-controlled and systematically optimized through iterative testing to achieve the best results.
3. **Test Generation Engine**: This core component uses LLMs to analyze API specifications and generate comprehensive test suites. For large APIs that might exceed context limits, I'll implement a chunking approach that processes endpoints in logical batches while maintaining awareness of their relationships.
4. **Test Execution Runtime**: Once tests are generated, this component executes them against target APIs, handling authentication, implementing appropriate retry logic, respecting rate limits, and collecting comprehensive response data for validation.
5. **Response Validation Service**: This combines traditional schema validation with LLM-powered semantic validation to catch subtle issues in responses that might comply with the schema but violate business logic or contain inconsistent data.
6. **Tool Definition Generator**: This component converts API specifications into properly structured tool definitions for various AI frameworks, handling the specific requirements and patterns of each target framework.
7. **Benchmark Framework**: The evaluation system that assesses LLM performance on standardized tasks with detailed metrics for accuracy, coverage, relevance, and efficiency.
All components will be implemented in Python with comprehensive test coverage and documentation. The architecture will be modular, allowing for component reuse and independent scaling as needs evolve.
For frontend integration, I can either develop integration points with your existing Flutter-based application or implement a CLI interface. The backend will expose a clear API that can be consumed by either approach. I'd welcome discussion on which option would better align with your current infrastructure and team workflows - the CLI would offer simplicity for CI/CD integration, while Flutter integration would provide a more seamless experience for existing users.
## System Workflow and Interactions
To illustrate how the components of my proposed system interact, I've created a sequence diagram showing the key workflows:
```mermaid
sequenceDiagram
actor User as "User" #ff6347
participant UI as "Client(API Dash UI)/CLI Interface" #4682b4
participant Orch as "Orchestrator" #32cd32
participant Parser as "API Parser" #ffa500
participant LLM as "LLM Service" #8a2be2
participant TestGen as "Test Generator" #ff1493
participant Runner as "Test Runner" #00ced1
participant Validator as "Response Validator" #ff8c00
participant Reporter as "Test Reporter" #9932cc
participant ToolGen as "Tool Generator" #ffb6c1
participant API as "Target API" #20b2aa
User->>UI: Upload API Spec / Define Test Scenario
UI->>Orch: Submit Request
Orch->>Parser: Parse API Specification
Parser-->>Orch: Structured API Metadata
Orch->>LLM: Generate Test Cases
LLM->>TestGen: Create Test Scenarios
TestGen-->>Orch: Generated Test Cases
Orch->>Runner: Execute Tests
Runner->>API: Send API Requests
API-->>Runner: API Responses
Runner->>Validator: Validate Responses
Validator->>LLM: Analyze Response Quality
LLM-->>Validator: Validation Results
Validator-->>Runner: Validation Results
Runner-->>Orch: Test Execution Results
Orch->>Reporter: Generate Reports
Reporter-->>UI: Display Results
alt Tool Definition Generation
User->>UI: Request Tool Definitions
UI->>Orch: Forward Request
Orch->>ToolGen: Generate Tool Definitions
ToolGen->>LLM: Optimize Tool Descriptions
LLM-->>ToolGen: Enhanced Descriptions
ToolGen-->>Orch: Framework-Specific Definitions
Orch-->>UI: Return Tool Definitions
UI-->>User: Download Definitions
end
```
This diagram demonstrates the four key workflows in the system:
1. API Specification Analysis - The system ingests and parses API specifications, then uses LLM to understand them semantically.
2. Test Generation - Using the parsed API and LLM intelligence, the system creates comprehensive test suites tailored to the API's functionality.
3. Test Execution - Tests are run against the actual API, with responses validated both technically and semantically using LLM-powered understanding.
4. Tool Definition Generation - The system leverages its understanding of the API to create framework-specific tool definitions that developers can immediately use.
The LLM service is central to the entire workflow, providing the intelligence needed for deep API understanding, smart test generation, semantic validation, and appropriate tool definition creation.
## Clarifying Questions
I have some questions for more understanding:
1. Which AI frameworks are highest priority for tool definition generation? Is there a specific order of importance for crewAI, langchain, pydantic-ai, and langgraph?
2. Do you have preferred LLM providers that should be prioritized for integration, or should the system be designed to work with any provider through a common interface?
3. Are there specific types of APIs that should be given special focus in the benchmark dataset (e.g., e-commerce, financial, IoT)?
4. How will the frontend be planned? Will it be a standalone interface, an extension of an existing dashboard, or fully integrated into an API testing - API Dash client ?

View File

@ -0,0 +1,49 @@
## Instructions
- Create a fork of API Dash.
- In the folder [doc/proposals/2025/gsoc](https://github.com/foss42/apidash/tree/main/doc/proposals/2025/gsoc) create a file named `application_<your name>_<short project name>.md`
The file should contain the follow:
```
### About
1. Full Name
3. Contact info (email, phone, etc.)
6. Discord handle
7. Home page (if any)
8. Blog (if any)
9. GitHub profile link
10. Twitter, LinkedIn, other socials
11. Time zone
12. Link to a resume (PDF, publicly accessible via link and not behind any login-wall)
### University Info
1. University name
2. Program you are enrolled in (Degree & Major/Minor)
3. Year
5. Expected graduation date
### Motivation & Past Experience
Short answers to the following questions (Add relevant links wherever you can):
1. Have you worked on or contributed to a FOSS project before? Can you attach repo links or relevant PRs?
2. What is your one project/achievement that you are most proud of? Why?
3. What kind of problems or challenges motivate you the most to solve them?
4. Will you be working on GSoC full-time? In case not, what will you be studying or working on while working on the project?
6. Do you mind regularly syncing up with the project mentors?
7. What interests you the most about API Dash?
8. Can you mention some areas where the project can be improved?
### Project Proposal Information
1. Proposal Title
2. Abstract: A brief summary about the problem that you will be tackling & how.
3. Detailed Description
4. Weekly Timeline: A rough week-wise timeline of activities that you would undertake.
```
- Feel free to add images by adding it to the `images` folder inside [doc/proposals/2025/gsoc](https://github.com/foss42/apidash/tree/main/doc/proposals/2025/gsoc) and linking it to your doc.
- Finally, send your application as a PR for review.

View File

@ -0,0 +1,26 @@
## Instructions
- Create a fork of API Dash.
- In the folder [doc/proposals/2025/gsoc](https://github.com/foss42/apidash/tree/main/doc/proposals/2025/gsoc) create a file named `idea_<your name>_<short project name>.md`
The file should contain the following:
```
### Initial Idea Submission
Full Name:
University name:
Program you are enrolled in (Degree & Major/Minor):
Year:
Expected graduation date:
Project Title: <Write your idea title>
Relevant issues: <Add links to the relevant issues>
Idea description:
<Write you thoughts below discussing your approach and how will you implement it>
```
- Feel free to add images by adding it to the `images` folder inside [doc/proposals/2025/gsoc](https://github.com/foss42/apidash/tree/main/doc/proposals/2025/gsoc) and linking it to your doc.
- Finally, send you changes as a PR for review.

View File

@ -268,15 +268,100 @@ Here are the detailed instructions for running the generated API Dash code in **
## Go (net/http)
TODO
### 1. Install Go compiler
- Windows and MacOS: check out the [official source](https://go.dev/doc/install)
- Linux: Install from your distro's package manager.
Verify if go is installed:
```bash
go version
```
### 2. Create a project
```bash
go mod init example.com/api
```
### 3. Run the generated code
- Paste the generated code into `main.go`.
- Build and run by `go run main.go`.
## JavaScript (axios)
TODO
The generated api code can be run in browser by using the code in an html file as demonstrated below:
### 1. Create the html file with generated code
Create a new file `index.html`
```html
<!DOCTYPE html>
<html>
<head>
<title>Axios Example</title>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>
<body>
<script>
// Paste your API Dash generated code here !!
</script>
</body>
</html>
```
Make sure to paste the generated js code from api dash under the `<script>` tag.
### 2. Test with Browser Developer Tools
Open the `index.html` file in a modern browser and open devtools.
- **Chrome**: Right-click the page and select "Inspect" or press Ctrl+Shift+I (Windows/Linux) or Cmd+Option+I (macOS).
- **Firefox**: Right-click the page and select "Inspect Element" or press Ctrl+Shift+I (Windows/Linux) or Cmd+Option+I (macOS).
- **Edge**: Right-click the page and select "Inspect" or press F12 or Ctrl+Shift+I.
Navigate to network tab and refresh the page to see the requests and network activity.
## JavaScript (fetch)
TODO
The generated api code can be run in browser by using the code in an html file as demonstrated below:
### 1. Create the html file with generated code
Create a new file `index.html`
```html
<!DOCTYPE html>
<html>
<head>
<title>Fetch Example</title>
</head>
<body>
<script>
// Paste your API Dash generated code here !!
</script>
</body>
</html>
```
Make sure to paste the generated js code from api dash under the `<script>` tag.
### 2. Test with Browser Developer Tools
Open the `index.html` file in a modern browser and open devtools.
- **Chrome**: Right-click the page and select "Inspect" or press Ctrl+Shift+I (Windows/Linux) or Cmd+Option+I (macOS).
- **Firefox**: Right-click the page and select "Inspect Element" or press Ctrl+Shift+I (Windows/Linux) or Cmd+Option+I (macOS).
- **Edge**: Right-click the page and select "Inspect" or press F12 or Ctrl+Shift+I.
Navigate to network tab and refresh the page to see the requests and network activity.
## node.js (JavaScript, axios)

View File

@ -1,6 +1,7 @@
import 'dart:convert';
import 'package:apidash_core/apidash_core.dart';
import 'package:code_builder/code_builder.dart';
import 'package:pub_semver/pub_semver.dart';
import 'package:dart_style/dart_style.dart';
import 'shared.dart';
@ -141,7 +142,8 @@ class DartDioCodeGen {
sbf.writeln(mainFunction.accept(emitter));
return DartFormatter(
pageWidth: contentType == ContentType.formdata ? 70 : 160)
.format(sbf.toString());
languageVersion: Version(3, 2, 4),
pageWidth: contentType == ContentType.formdata ? 70 : 160,
).format(sbf.toString());
}
}

View File

@ -2,6 +2,7 @@ import 'dart:convert';
import 'dart:io';
import 'package:apidash_core/apidash_core.dart';
import 'package:code_builder/code_builder.dart';
import 'package:pub_semver/pub_semver.dart';
import 'package:dart_style/dart_style.dart';
import 'shared.dart';
@ -225,7 +226,8 @@ class DartHttpCodeGen {
sbf.writeln(mainFunction.accept(emitter));
return DartFormatter(
pageWidth: contentType == ContentType.formdata ? 70 : 160)
.format(sbf.toString());
languageVersion: Version(3, 2, 4),
pageWidth: contentType == ContentType.formdata ? 70 : 160,
).format(sbf.toString());
}
}

View File

@ -74,10 +74,7 @@ class NavbarButton extends ConsumerWidget {
? Theme.of(context)
.colorScheme
.onSecondaryContainer
: Theme.of(context)
.colorScheme
.onSurface
.withOpacity(0.65),
: Theme.of(context).colorScheme.onSurfaceVariant,
),
)
: const SizedBox.shrink(),

View File

@ -29,10 +29,7 @@ class EditorTitle extends StatelessWidget {
tooltip: title,
onSelected: onSelected,
child: Ink(
color: Theme.of(context)
.colorScheme
.secondaryContainer
.withOpacity(0.3),
color: Theme.of(context).colorScheme.surface,
padding:
const EdgeInsets.symmetric(horizontal: 12.0, vertical: 6),
child: Row(

View File

@ -29,17 +29,13 @@ class EnvCellField extends StatelessWidget {
),
decoration: InputDecoration(
hintStyle: kCodeStyle.copyWith(
color: clrScheme.outline.withOpacity(
kHintOpacity,
),
color: clrScheme.outlineVariant,
),
hintText: hintText,
contentPadding: const EdgeInsets.only(bottom: 12),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: clrScheme.primary.withOpacity(
kHintOpacity,
),
color: clrScheme.outlineVariant,
),
),
enabledBorder: UnderlineInputBorder(

View File

@ -26,9 +26,7 @@ class EnvURLField extends StatelessWidget {
decoration: InputDecoration(
hintText: kHintTextUrlCard,
hintStyle: kCodeStyle.copyWith(
color: Theme.of(context).colorScheme.outline.withOpacity(
kHintOpacity,
),
color: Theme.of(context).colorScheme.outlineVariant,
),
border: InputBorder.none,
),

View File

@ -1,4 +1,3 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:apidash/providers/providers.dart';
@ -11,10 +10,8 @@ class EnvironmentDropdown extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final environments = ref.watch(environmentsStateNotifierProvider);
final environmentSequence = ref.watch(environmentSequenceProvider);
final environmentsList = environmentSequence
.map((e) => environments?[e])
.whereNotNull()
.toList();
final environmentsList =
environmentSequence.map((e) => environments?[e]).nonNulls.toList();
final activeEnvironment = ref.watch(activeEnvironmentIdStateProvider);
return EnvironmentPopupMenu(

View File

@ -107,7 +107,7 @@ class Dashboard extends ConsumerWidget {
VerticalDivider(
thickness: 1,
width: 1,
color: Theme.of(context).colorScheme.surfaceContainerHighest,
color: Theme.of(context).colorScheme.surfaceContainerHigh,
),
Expanded(
child: IndexedStack(

View File

@ -112,14 +112,14 @@ class _HistoryExpansionTileState extends ConsumerState<HistoryExpansionTile>
child: Icon(
Icons.chevron_right_rounded,
size: 20,
color: colorScheme.onSurface.withOpacity(0.6),
color: colorScheme.outline,
)),
kHSpacer5,
Text(
humanizeDate(widget.date),
style: Theme.of(context).textTheme.titleSmall?.copyWith(
fontWeight: FontWeight.bold,
color: colorScheme.onSurface.withOpacity(0.6),
color: colorScheme.outline,
),
),
],

View File

@ -49,8 +49,9 @@ class HistoryURLCard extends StatelessWidget {
style: kCodeStyle.copyWith(
fontSize: fontSize,
fontWeight: FontWeight.bold,
color: getHTTPMethodColor(
method,
color: getAPIColor(
apiType!,
method: method,
brightness: Theme.of(context).brightness,
),
),

View File

@ -21,21 +21,6 @@ class EditRequestBody extends ConsumerWidget {
final apiType = ref
.watch(selectedRequestModelProvider.select((value) => value?.apiType));
// TODO: #178 GET->POST Currently switches to POST everytime user edits body even if the user intentionally chooses GET
// final sm = ScaffoldMessenger.of(context);
// void changeToPostMethod() {
// if (requestModel?.httpRequestModel!.method == HTTPVerb.get) {
// ref
// .read(collectionStateNotifierProvider.notifier)
// .update(selectedId, method: HTTPVerb.post);
// sm.hideCurrentSnackBar();
// sm.showSnackBar(getSnackBar(
// "Switched to POST method",
// small: false,
// ));
// }
// }
return Column(
children: [
(apiType == APIType.rest)
@ -55,12 +40,8 @@ class EditRequestBody extends ConsumerWidget {
switch (apiType) {
APIType.rest => Expanded(
child: switch (contentType) {
ContentType.formdata => const Padding(
padding: kPh4,
child: FormDataWidget(
// TODO: See changeToPostMethod above
// changeMethodToPost: changeToPostMethod,
)),
ContentType.formdata =>
const Padding(padding: kPh4, child: FormDataWidget()),
// TODO: Fix JsonTextFieldEditor & plug it here
ContentType.json => Padding(
padding: kPt5o10,
@ -69,7 +50,6 @@ class EditRequestBody extends ConsumerWidget {
fieldKey: "$selectedId-json-body-editor",
initialValue: requestModel?.httpRequestModel?.body,
onChanged: (String value) {
// changeToPostMethod();
ref
.read(collectionStateNotifierProvider.notifier)
.update(body: value);
@ -84,7 +64,6 @@ class EditRequestBody extends ConsumerWidget {
fieldKey: "$selectedId-body-editor",
initialValue: requestModel?.httpRequestModel?.body,
onChanged: (String value) {
// changeToPostMethod();
ref
.read(collectionStateNotifierProvider.notifier)
.update(body: value);

View File

@ -23,7 +23,7 @@ class BottomNavBar extends ConsumerWidget {
color: Theme.of(context).colorScheme.onInverseSurface,
),
),
color: Theme.of(context).colorScheme.surface,
color: Theme.of(context).colorScheme.surfaceContainerLowest,
),
child: Material(
type: MaterialType.transparency,

View File

@ -21,9 +21,9 @@ class PageBase extends ConsumerWidget {
final isDarkMode =
ref.watch(settingsProvider.select((value) => value.isDark));
final scaffold = Scaffold(
backgroundColor: Theme.of(context).colorScheme.surface,
backgroundColor: Theme.of(context).colorScheme.surfaceContainerLowest,
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.surface,
backgroundColor: Theme.of(context).colorScheme.surfaceContainerLowest,
primary: true,
title: Text(title),
centerTitle: true,
@ -43,7 +43,7 @@ class PageBase extends ConsumerWidget {
? kPb70
: EdgeInsets.zero) +
(kIsWindows || kIsMacOS ? kPt28 : EdgeInsets.zero),
color: Theme.of(context).colorScheme.surface,
color: Theme.of(context).colorScheme.surfaceContainerLowest,
child: scaffold,
),
if (kIsWindows)

View File

@ -26,15 +26,16 @@ Color getResponseStatusCodeColor(int? statusCode,
return col;
}
Color getHTTPMethodColor(HTTPVerb method,
{Brightness brightness = Brightness.light}) {
Color col = switch (method) {
HTTPVerb.get => kColorHttpMethodGet,
HTTPVerb.head => kColorHttpMethodHead,
HTTPVerb.post => kColorHttpMethodPost,
HTTPVerb.put => kColorHttpMethodPut,
HTTPVerb.patch => kColorHttpMethodPatch,
HTTPVerb.delete => kColorHttpMethodDelete,
Color getAPIColor(
APIType apiType, {
HTTPVerb? method,
Brightness? brightness,
}) {
Color col = switch (apiType) {
APIType.rest => getHTTPMethodColor(
method,
),
APIType.graphql => kColorGQL,
};
if (brightness == Brightness.dark) {
col = getDarkModeColor(col);
@ -42,9 +43,22 @@ Color getHTTPMethodColor(HTTPVerb method,
return col;
}
Color getHTTPMethodColor(HTTPVerb? method) {
Color col = switch (method) {
HTTPVerb.get => kColorHttpMethodGet,
HTTPVerb.head => kColorHttpMethodHead,
HTTPVerb.post => kColorHttpMethodPost,
HTTPVerb.put => kColorHttpMethodPut,
HTTPVerb.patch => kColorHttpMethodPatch,
HTTPVerb.delete => kColorHttpMethodDelete,
_ => kColorHttpMethodGet,
};
return col;
}
Color getDarkModeColor(Color col) {
return Color.alphaBlend(
col.withOpacity(kOpacityDarkModeBlend),
col.withValues(alpha: kOpacityDarkModeBlend),
kColorWhite,
);
}

View File

@ -21,8 +21,7 @@ class HistoryRequestCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
final Color color = Theme.of(context).colorScheme.surface;
final Color colorVariant =
Theme.of(context).colorScheme.surfaceContainerHighest.withOpacity(0.5);
final Color colorVariant = Theme.of(context).colorScheme.surfaceContainer;
final Color surfaceTint = Theme.of(context).colorScheme.primary;
return Card(
shape: const ContinuousRectangleBorder(borderRadius: kBorderRadius12),
@ -38,7 +37,6 @@ class HistoryRequestCard extends StatelessWidget {
onTap: onTap,
borderRadius: kBorderRadius6,
hoverColor: colorVariant,
focusColor: colorVariant.withOpacity(0.5),
child: Padding(
padding: kPv6 + kPh8,
child: SizedBox(

View File

@ -43,8 +43,7 @@ class SidebarEnvironmentCard extends StatelessWidget {
final colorScheme = Theme.of(context).colorScheme;
final Color color =
isGlobal ? colorScheme.secondaryContainer : colorScheme.surface;
final Color colorVariant =
colorScheme.surfaceContainerHighest.withOpacity(0.5);
final Color colorVariant = colorScheme.surfaceContainer;
final Color surfaceTint = colorScheme.primary;
bool isSelected = selectedId == id;
bool inEditMode = editRequestId == id;
@ -68,7 +67,7 @@ class SidebarEnvironmentCard extends StatelessWidget {
child: InkWell(
borderRadius: kBorderRadius8,
hoverColor: colorVariant,
focusColor: colorVariant.withOpacity(0.5),
focusColor: colorVariant,
onTap: inEditMode ? null : onTap,
// onSecondaryTap: onSecondaryTap,
onSecondaryTapUp: (isGlobal)

View File

@ -28,8 +28,7 @@ class SidebarHistoryCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
final Color color = Theme.of(context).colorScheme.surface;
final Color colorVariant =
Theme.of(context).colorScheme.surfaceContainerHighest.withOpacity(0.5);
final Color colorVariant = Theme.of(context).colorScheme.surfaceContainer;
final model = models.first;
final Color surfaceTint = Theme.of(context).colorScheme.primary;
final String name = getHistoryRequestName(model);
@ -53,7 +52,6 @@ class SidebarHistoryCard extends StatelessWidget {
onTap: onTap,
borderRadius: kBorderRadius8,
hoverColor: colorVariant,
focusColor: colorVariant.withOpacity(0.5),
child: Padding(
padding: const EdgeInsets.only(
left: 6,

View File

@ -45,8 +45,7 @@ class SidebarRequestCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
final Color color = Theme.of(context).colorScheme.surface;
final Color colorVariant =
Theme.of(context).colorScheme.surfaceContainerHighest.withOpacity(0.5);
final Color colorVariant = Theme.of(context).colorScheme.surfaceContainer;
final Color surfaceTint = Theme.of(context).colorScheme.primary;
bool isSelected = selectedId == id;
bool inEditMode = editRequestId == id;
@ -72,7 +71,7 @@ class SidebarRequestCard extends StatelessWidget {
child: InkWell(
borderRadius: kBorderRadius8,
hoverColor: colorVariant,
focusColor: colorVariant.withOpacity(0.5),
focusColor: colorVariant,
onTap: inEditMode ? null : onTap,
// onDoubleTap: inEditMode ? null : onDoubleTap,
onSecondaryTapUp: (details) {

View File

@ -118,12 +118,7 @@ class ViewCodePane extends StatelessWidget {
? kLightCodeTheme
: kDarkCodeTheme;
final textContainerdecoration = BoxDecoration(
color: Color.alphaBlend(
(Theme.of(context).brightness == Brightness.dark
? Theme.of(context).colorScheme.onPrimaryContainer
: Theme.of(context).colorScheme.primaryContainer)
.withOpacity(kForegroundOpacity),
Theme.of(context).colorScheme.surface),
color: Theme.of(context).colorScheme.surfaceContainerLow,
border: Border.all(
color: Theme.of(context).colorScheme.surfaceContainerHighest),
borderRadius: kBorderRadius8,

View File

@ -29,10 +29,7 @@ showHistoryRetentionDialog(
child: Text(
"Select the duration for which you want to retain your request history",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
color: Theme.of(context)
.colorScheme
.onSurface
.withOpacity(0.8),
color: Theme.of(context).colorScheme.outline,
),
),
),
@ -49,10 +46,7 @@ showHistoryRetentionDialog(
secondary: Icon(e.icon,
color: selectedRetentionPeriod == e
? Theme.of(context).colorScheme.primary
: Theme.of(context)
.colorScheme
.onSurface
.withOpacity(0.6)),
: Theme.of(context).colorScheme.outline),
value: e,
groupValue: selectedRetentionPeriod,
onChanged: (value) {

View File

@ -23,8 +23,9 @@ class DropdownButtonHttpMethod extends StatelessWidget {
EdgeInsets.only(left: context.isMediumWindow ? 8 : 16),
dropdownMenuItemtextStyle: (HTTPVerb v) => kCodeStyle.copyWith(
fontWeight: FontWeight.bold,
color: getHTTPMethodColor(
v,
color: getAPIColor(
APIType.rest,
method: v,
brightness: Theme.of(context).brightness,
),
),

View File

@ -86,16 +86,12 @@ class _TextFieldEditorState extends State<TextFieldEditor> {
decoration: InputDecoration(
hintText: widget.hintText ?? kHintContent,
hintStyle: TextStyle(
color: Theme.of(context).colorScheme.outline.withOpacity(
kHintOpacity,
),
color: Theme.of(context).colorScheme.outlineVariant,
),
focusedBorder: OutlineInputBorder(
borderRadius: kBorderRadius8,
borderSide: BorderSide(
color: Theme.of(context).colorScheme.primary.withOpacity(
kHintOpacity,
),
color: Theme.of(context).colorScheme.outlineVariant,
),
),
enabledBorder: OutlineInputBorder(
@ -106,12 +102,7 @@ class _TextFieldEditorState extends State<TextFieldEditor> {
),
filled: true,
hoverColor: kColorTransparent,
fillColor: Color.alphaBlend(
(Theme.of(context).brightness == Brightness.dark
? Theme.of(context).colorScheme.onPrimaryContainer
: Theme.of(context).colorScheme.primaryContainer)
.withOpacity(kForegroundOpacity),
Theme.of(context).colorScheme.surface),
fillColor: Theme.of(context).colorScheme.surfaceContainerLow,
),
),
);

View File

@ -31,9 +31,7 @@ class ObscurableCellField extends HookWidget {
obscureText: obscureText.value,
decoration: InputDecoration(
hintStyle: kCodeStyle.copyWith(
color: clrScheme.outline.withOpacity(
kHintOpacity,
),
color: clrScheme.outlineVariant,
),
hintText: hintText,
suffixIcon: IconButton(
@ -50,9 +48,7 @@ class ObscurableCellField extends HookWidget {
contentPadding: const EdgeInsets.only(bottom: 12),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: clrScheme.primary.withOpacity(
kHintOpacity,
),
color: clrScheme.outline,
),
),
enabledBorder: UnderlineInputBorder(

View File

@ -80,15 +80,12 @@ class _HeaderFieldState extends State<HeaderField> {
color: colorScheme.onSurface,
),
decoration: InputDecoration(
hintStyle: kCodeStyle.copyWith(
color: colorScheme.outline.withOpacity(kHintOpacity)),
hintStyle: kCodeStyle.copyWith(color: colorScheme.outlineVariant),
hintText: widget.hintText,
contentPadding: const EdgeInsets.only(bottom: 12),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: colorScheme.primary.withOpacity(
kHintOpacity,
),
color: colorScheme.outline,
),
),
enabledBorder: UnderlineInputBorder(

View File

@ -25,9 +25,7 @@ class URLField extends StatelessWidget {
decoration: InputDecoration(
hintText: kHintTextUrlCard,
hintStyle: kCodeStyle.copyWith(
color: Theme.of(context).colorScheme.outline.withOpacity(
kHintOpacity,
),
color: Theme.of(context).colorScheme.outlineVariant,
),
border: InputBorder.none,
),

View File

@ -16,7 +16,7 @@ class OverlayWidgetTemplate {
_overlay = OverlayEntry(
// replace with your own layout
builder: (context) => ColoredBox(
color: kColorBlack.withOpacity(kOverlayBackgroundOpacity),
color: kColorBlack.withValues(alpha: kOverlayBackgroundOpacity),
child: widget),
);
_overlayState!.insert(_overlay!);

View File

@ -405,14 +405,10 @@ class _BodySuccessState extends State<BodySuccess> {
? kLightCodeTheme
: kDarkCodeTheme;
final textContainerdecoration = BoxDecoration(
color: Color.alphaBlend(
(Theme.of(context).brightness == Brightness.dark
? Theme.of(context).colorScheme.onPrimaryContainer
: Theme.of(context).colorScheme.primaryContainer)
.withOpacity(kForegroundOpacity),
Theme.of(context).colorScheme.surface),
color: Theme.of(context).colorScheme.surfaceContainerLow,
border: Border.all(
color: Theme.of(context).colorScheme.surfaceContainerHighest),
color: Theme.of(context).colorScheme.surfaceContainerHighest,
),
borderRadius: kBorderRadius8,
);

View File

@ -1,4 +1,3 @@
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:multi_split_view/multi_split_view.dart';
@ -35,10 +34,9 @@ class DashboardSplitViewState extends State<DashboardSplitView> {
data: MultiSplitViewThemeData(
dividerThickness: 3,
dividerPainter: DividerPainters.background(
color: Theme.of(context).colorScheme.surfaceContainerHighest,
highlightedColor: Theme.of(context).colorScheme.outline.withOpacity(
kHintOpacity,
),
color: Theme.of(context).colorScheme.surfaceContainer,
highlightedColor:
Theme.of(context).colorScheme.surfaceContainerHighest,
animationEnabled: false,
),
),

View File

@ -1,4 +1,3 @@
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:multi_split_view/multi_split_view.dart';
@ -30,10 +29,9 @@ class EqualSplitView extends StatelessWidget {
data: MultiSplitViewThemeData(
dividerThickness: 3,
dividerPainter: DividerPainters.background(
color: Theme.of(context).colorScheme.surfaceContainerHighest,
highlightedColor: Theme.of(context).colorScheme.outline.withOpacity(
kHintOpacity,
),
color: Theme.of(context).colorScheme.surfaceContainer,
highlightedColor:
Theme.of(context).colorScheme.surfaceContainerHighest,
animationEnabled: false,
),
),

View File

@ -1,4 +1,3 @@
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:multi_split_view/multi_split_view.dart';
@ -35,10 +34,9 @@ class HistorySplitViewState extends State<HistorySplitView> {
data: MultiSplitViewThemeData(
dividerThickness: 3,
dividerPainter: DividerPainters.background(
color: Theme.of(context).colorScheme.surfaceContainerHighest,
highlightedColor: Theme.of(context).colorScheme.outline.withOpacity(
kHintOpacity,
),
color: Theme.of(context).colorScheme.surfaceContainer,
highlightedColor:
Theme.of(context).colorScheme.surfaceContainerHighest,
animationEnabled: false,
),
),

View File

@ -35,8 +35,7 @@ class SegmentedTabbar extends StatelessWidget {
dividerColor: Colors.transparent,
indicatorWeight: 0.0,
indicatorSize: TabBarIndicatorSize.tab,
unselectedLabelColor:
Theme.of(context).colorScheme.onSurface.withOpacity(0.4),
unselectedLabelColor: Theme.of(context).colorScheme.outline,
labelStyle: kTextStyleTab.copyWith(
fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.onPrimary,

View File

@ -45,9 +45,7 @@ class RequestDataTable extends StatelessWidget {
contentPadding: const EdgeInsets.only(bottom: 12),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: clrScheme.primary.withOpacity(
kHintOpacity,
),
color: clrScheme.outlineVariant,
),
),
enabledBorder: UnderlineInputBorder(

View File

@ -47,9 +47,7 @@ class RequestFormDataTable extends StatelessWidget {
contentPadding: const EdgeInsets.only(bottom: 12),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: clrScheme.primary.withOpacity(
kHintOpacity,
),
color: clrScheme.outlineVariant,
),
),
enabledBorder: UnderlineInputBorder(

View File

@ -25,13 +25,11 @@ class SidebarRequestCardTextBox extends StatelessWidget {
style: TextStyle(
fontSize: 8,
fontWeight: FontWeight.bold,
color: switch (apiType) {
APIType.rest => getHTTPMethodColor(
method,
brightness: Theme.of(context).brightness,
),
APIType.graphql => kColorGQL,
},
color: getAPIColor(
apiType,
method: method,
brightness: Theme.of(context).brightness,
),
),
),
);

View File

@ -1,5 +1,4 @@
import 'dart:io';
import 'dart:typed_data';
import 'package:apidash/consts.dart';
import 'package:fvp/fvp.dart' as fvp;
import 'package:flutter/material.dart';
@ -20,42 +19,43 @@ class VideoPreviewer extends StatefulWidget {
}
class _VideoPreviewerState extends State<VideoPreviewer> {
VideoPlayerController? _videoController;
late VideoPlayerController _videoController;
late Future<void> _initializeVideoPlayerFuture;
bool _isPlaying = false;
File? _tempVideoFile;
late File _tempVideoFile;
bool _showControls = false;
@override
void initState() {
super.initState();
registerWithAllPlatforms();
_initializeVideoPlayer();
_initializeVideoPlayerFuture = _initializeVideoPlayer();
}
void registerWithAllPlatforms() {
try {
fvp.registerWith();
} catch (e) {
// pass
debugPrint("VideoPreviewer registerWithAllPlatforms(): $e");
}
}
void _initializeVideoPlayer() async {
Future<void> _initializeVideoPlayer() async {
final tempDir = await getTemporaryDirectory();
_tempVideoFile = File(
'${tempDir.path}/temp_video_${DateTime.now().millisecondsSinceEpoch}');
try {
await _tempVideoFile?.writeAsBytes(widget.videoBytes);
_videoController = VideoPlayerController.file(_tempVideoFile!)
..initialize().then((_) {
if (mounted) {
setState(() {
_videoController!.play();
_videoController!.setLooping(true);
});
}
await _tempVideoFile.writeAsBytes(widget.videoBytes);
_videoController = VideoPlayerController.file(_tempVideoFile);
await _videoController.initialize();
if (mounted) {
setState(() {
_videoController.play();
_videoController.setLooping(true);
});
}
} catch (e) {
debugPrint("VideoPreviewer _initializeVideoPlayer(): $e");
return;
}
}
@ -65,79 +65,84 @@ class _VideoPreviewerState extends State<VideoPreviewer> {
final iconColor = Theme.of(context).iconTheme.color;
final progressBarColors = VideoProgressColors(
playedColor: iconColor!,
bufferedColor: iconColor.withOpacity(0.5),
backgroundColor: iconColor.withOpacity(0.3),
bufferedColor: iconColor.withValues(alpha: 0.5),
backgroundColor: iconColor.withValues(alpha: 0.3),
);
return Scaffold(
body: MouseRegion(
onEnter: (_) => setState(() => _showControls = true),
onExit: (_) => setState(() => _showControls = false),
child: Stack(
children: [
Center(
child: _videoController?.value.isInitialized == true
? AspectRatio(
aspectRatio: _videoController!.value.aspectRatio,
child: VideoPlayer(_videoController!),
)
: const CircularProgressIndicator(),
),
Positioned(
left: 0,
right: 0,
bottom: 0,
child: _videoController?.value.isInitialized == true
? SizedBox(
height: 50.0,
child: VideoProgressIndicator(
_videoController!,
allowScrubbing: true,
padding: const EdgeInsets.all(20),
colors: progressBarColors,
body: FutureBuilder(
future: _initializeVideoPlayerFuture,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (_videoController.value.isInitialized) {
return MouseRegion(
onEnter: (_) => setState(() => _showControls = true),
onExit: (_) => setState(() => _showControls = false),
child: Stack(
children: [
Center(
child: AspectRatio(
aspectRatio: _videoController.value.aspectRatio,
child: VideoPlayer(_videoController),
),
)
: Container(height: 0),
),
if (_showControls)
Center(
child: GestureDetector(
onTap: () {
if (_videoController!.value.isPlaying) {
_videoController!.pause();
} else {
_videoController!.play();
}
setState(() {
_isPlaying = !_isPlaying;
});
},
child: Container(
color: Colors.transparent,
child: Icon(
_isPlaying ? Icons.play_arrow : Icons.pause,
size: 64,
color: iconColor,
),
),
Positioned(
left: 0,
right: 0,
bottom: 0,
child: SizedBox(
height: 50.0,
child: VideoProgressIndicator(
_videoController,
allowScrubbing: true,
padding: const EdgeInsets.all(20),
colors: progressBarColors,
),
),
),
if (_showControls)
Center(
child: GestureDetector(
onTap: () {
if (_videoController.value.isPlaying) {
_videoController.pause();
} else {
_videoController.play();
}
setState(() {
_isPlaying = !_isPlaying;
});
},
child: Container(
color: Colors.transparent,
child: Icon(
_isPlaying ? Icons.play_arrow : Icons.pause,
size: 64,
color: iconColor,
),
),
),
),
],
),
),
],
),
);
}
}
return const Center(child: CircularProgressIndicator());
},
),
);
}
@override
void dispose() {
_videoController?.pause();
_videoController?.dispose();
_videoController.pause();
_videoController.dispose();
if (!kIsRunningTests) {
Future.delayed(const Duration(seconds: 1), () async {
try {
if (_tempVideoFile != null) {
await _tempVideoFile!.delete();
}
await _tempVideoFile.delete();
} catch (e) {
debugPrint("VideoPreviewer dispose(): $e");
return;
}
});

View File

@ -1,5 +1,4 @@
import 'package:apidash_core/consts.dart';
import 'package:collection/collection.dart';
import 'package:seed/seed.dart';
import '../models/models.dart';
import 'graphql_utils.dart';
@ -52,7 +51,7 @@ List<Map<String, String>>? rowsToFormDataMapList(
"value": formData.value,
"type": formData.type.name,
})
.whereNotNull()
.nonNulls
.toList();
return finalMap;
}

View File

@ -15,12 +15,12 @@ dependencies:
curl_parser:
path: ../curl_parser
freezed_annotation: ^2.4.1
http: ^1.2.1
http_parser: ^4.0.2
postman:
path: ../postman
http: ^1.3.0
http_parser: ^4.1.2
insomnia_collection:
path: ../insomnia_collection
postman:
path: ../postman
seed: ^0.0.3
xml: ^6.3.0

View File

@ -1,4 +1,4 @@
# melos_managed_dependency_overrides: curl_parser,postman,seed,insomnia_collection
# melos_managed_dependency_overrides: curl_parser,insomnia_collection,postman,seed
dependency_overrides:
curl_parser:
path: ../curl_parser

View File

@ -6,7 +6,7 @@ const kColorTransparent = Colors.transparent;
const kColorWhite = Colors.white;
const kColorBlack = Colors.black;
const kColorRed = Colors.red;
final kColorLightDanger = Colors.red.withOpacity(0.9);
final kColorLightDanger = Colors.red.withValues(alpha: 0.9);
const kColorDarkDanger = Color(0xffcf6679);
const kColorSchemeSeed = Colors.blue;

View File

@ -71,19 +71,13 @@ class ADOutlinedTextField extends StatelessWidget {
hintStyle: hintTextStyle ??
kCodeStyle.copyWith(
fontSize: hintTextFontSize,
color: hintTextColor ??
clrScheme.outline.withOpacity(
kHintOpacity,
),
color: hintTextColor ?? clrScheme.outlineVariant,
),
hintText: hintText,
contentPadding: contentPadding ?? kP10,
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: focussedBorderColor ??
clrScheme.primary.withOpacity(
kHintOpacity,
),
color: focussedBorderColor ?? clrScheme.outline,
),
),
enabledBorder: OutlineInputBorder(

View File

@ -88,7 +88,7 @@ JsonExplorer(
fontSize: 16,
),
propertyKeyTextStyle: GoogleFonts.inconsolata(
color: Colors.black.withOpacity(0.7),
color: Colors.grey,
fontWeight: FontWeight.bold,
fontSize: 16,
),

View File

@ -284,7 +284,7 @@ class _JsonExplorerPageState extends State<JsonExplorerPage> {
fontSize: 16,
),
propertyKeyTextStyle: GoogleFonts.inconsolata(
color: Colors.black.withOpacity(0.7),
color: Colors.grey,
fontWeight: FontWeight.bold,
fontSize: 16,
),

View File

@ -46,8 +46,8 @@ void main() {
fontWeight: FontWeight.bold,
fontSize: 18,
),
propertyKeyTextStyle: TextStyle(
color: Colors.black.withOpacity(0.7),
propertyKeyTextStyle: const TextStyle(
color: Colors.grey,
fontWeight: FontWeight.bold,
fontSize: 18,
),

View File

@ -5,42 +5,42 @@ packages:
dependency: transitive
description:
name: async
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
url: "https://pub.dev"
source: hosted
version: "2.11.0"
version: "2.12.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
version: "2.1.2"
characters:
dependency: transitive
description:
name: characters
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
url: "https://pub.dev"
source: hosted
version: "1.3.0"
version: "1.4.0"
clock:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
version: "1.1.1"
version: "1.1.2"
collection:
dependency: transitive
description:
name: collection
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
url: "https://pub.dev"
source: hosted
version: "1.18.0"
version: "1.19.1"
crypto:
dependency: transitive
description:
@ -61,10 +61,10 @@ packages:
dependency: transitive
description:
name: fake_async
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
url: "https://pub.dev"
source: hosted
version: "1.3.1"
version: "1.3.2"
ffi:
dependency: transitive
description:
@ -135,18 +135,18 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
url: "https://pub.dev"
source: hosted
version: "10.0.5"
version: "10.0.8"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
url: "https://pub.dev"
source: hosted
version: "3.0.5"
version: "3.0.9"
leak_tracker_testing:
dependency: transitive
description:
@ -167,10 +167,10 @@ packages:
dependency: transitive
description:
name: matcher
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
url: "https://pub.dev"
source: hosted
version: "0.12.16+1"
version: "0.12.17"
material_color_utilities:
dependency: transitive
description:
@ -183,10 +183,10 @@ packages:
dependency: transitive
description:
name: meta
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
url: "https://pub.dev"
source: hosted
version: "1.15.0"
version: "1.16.0"
multi_trigger_autocomplete_plus:
dependency: "direct main"
description:
@ -198,10 +198,10 @@ packages:
dependency: transitive
description:
name: path
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
url: "https://pub.dev"
source: hosted
version: "1.9.0"
version: "1.9.1"
path_provider:
dependency: transitive
description:
@ -270,55 +270,55 @@ packages:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
version: "0.0.0"
source_span:
dependency: transitive
description:
name: source_span
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
url: "https://pub.dev"
source: hosted
version: "1.10.0"
version: "1.10.1"
stack_trace:
dependency: transitive
description:
name: stack_trace
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.dev"
source: hosted
version: "1.11.1"
version: "1.12.1"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
version: "2.1.4"
string_scanner:
dependency: transitive
description:
name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
version: "1.4.1"
term_glyph:
dependency: transitive
description:
name: term_glyph
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
url: "https://pub.dev"
source: hosted
version: "1.2.1"
version: "1.2.2"
test_api:
dependency: transitive
description:
name: test_api
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
url: "https://pub.dev"
source: hosted
version: "0.7.2"
version: "0.7.4"
typed_data:
dependency: transitive
description:
@ -339,10 +339,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
url: "https://pub.dev"
source: hosted
version: "14.2.5"
version: "14.3.1"
web:
dependency: transitive
description:
@ -360,5 +360,5 @@ packages:
source: hosted
version: "1.1.0"
sdks:
dart: ">=3.5.0 <4.0.0"
dart: ">=3.7.0-0 <4.0.0"
flutter: ">=3.24.0"

View File

@ -5,23 +5,18 @@ packages:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab"
sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57
url: "https://pub.dev"
source: hosted
version: "76.0.0"
_macros:
dependency: transitive
description: dart
source: sdk
version: "0.3.3"
version: "80.0.0"
analyzer:
dependency: transitive
description:
name: analyzer
sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e"
sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e"
url: "https://pub.dev"
source: hosted
version: "6.11.0"
version: "7.3.0"
ansi_styles:
dependency: transitive
description:
@ -56,10 +51,10 @@ packages:
dependency: transitive
description:
name: archive
sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d
sha256: "0c64e928dcbefddecd234205422bcfc2b5e6d31be0b86fef0d0dd48d7b4c9742"
url: "https://pub.dev"
source: hosted
version: "3.6.1"
version: "4.0.4"
args:
dependency: transitive
description:
@ -80,10 +75,10 @@ packages:
dependency: transitive
description:
name: audio_session
sha256: b2a26ba8b7efa1790d6460e82971fde3e398cfbe2295df9dea22f3499d2c12a7
sha256: "2b7fff16a552486d078bfc09a8cde19f426dc6d6329262b684182597bec5b1ac"
url: "https://pub.dev"
source: hosted
version: "0.1.23"
version: "0.1.25"
barcode:
dependency: transitive
description:
@ -100,6 +95,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.12"
binary_codec:
dependency: transitive
description:
name: binary_codec
sha256: "368144225d749e1e33f2f4628d0c70bffff99b99b1d6c0777b039f8967365b07"
url: "https://pub.dev"
source: hosted
version: "2.0.3"
boolean_selector:
dependency: transitive
description:
@ -112,10 +115,10 @@ packages:
dependency: transitive
description:
name: build
sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0
url: "https://pub.dev"
source: hosted
version: "2.4.1"
version: "2.4.2"
build_config:
dependency: transitive
description:
@ -136,26 +139,26 @@ packages:
dependency: transitive
description:
name: build_resolvers
sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a"
sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0
url: "https://pub.dev"
source: hosted
version: "2.4.2"
version: "2.4.4"
build_runner:
dependency: "direct dev"
description:
name: build_runner
sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d"
sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99"
url: "https://pub.dev"
source: hosted
version: "2.4.13"
version: "2.4.15"
build_runner_core:
dependency: transitive
description:
name: build_runner_core
sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0
sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021"
url: "https://pub.dev"
source: hosted
version: "7.3.2"
version: "8.0.0"
built_collection:
dependency: transitive
description:
@ -176,10 +179,10 @@ packages:
dependency: transitive
description:
name: characters
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
url: "https://pub.dev"
source: hosted
version: "1.3.0"
version: "1.4.0"
charcode:
dependency: transitive
description:
@ -204,6 +207,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.3.0"
ci:
dependency: transitive
description:
name: ci
sha256: "145d095ce05cddac4d797a158bc4cf3b6016d1fe63d8c3d2fbd7212590adca13"
url: "https://pub.dev"
source: hosted
version: "0.1.0"
cli_launcher:
dependency: transitive
description:
@ -240,10 +251,10 @@ packages:
dependency: transitive
description:
name: collection
sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
url: "https://pub.dev"
source: hosted
version: "1.19.0"
version: "1.19.1"
conventional_commit:
dependency: transitive
description:
@ -311,10 +322,10 @@ packages:
dependency: "direct main"
description:
name: dart_style
sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab"
sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac"
url: "https://pub.dev"
source: hosted
version: "2.3.7"
version: "3.0.1"
dartx:
dependency: transitive
description:
@ -335,10 +346,10 @@ packages:
dependency: "direct main"
description:
name: desktop_drop
sha256: d55a010fe46c8e8fcff4ea4b451a9ff84a162217bdb3b2a0aa1479776205e15d
sha256: "03abf1c0443afdd1d65cf8fa589a2f01c67a11da56bbb06f6ea1de79d5628e94"
url: "https://pub.dev"
source: hosted
version: "0.4.4"
version: "0.5.0"
equatable:
dependency: transitive
description:
@ -471,18 +482,18 @@ packages:
dependency: "direct main"
description:
name: flex_color_scheme
sha256: "32914024a4f404d90ff449f58d279191675b28e7c08824046baf06826e99d984"
sha256: ae638050fceb35b6040a43cf67892f9b956022068e736284919d93322fdd4ba2
url: "https://pub.dev"
source: hosted
version: "7.3.1"
version: "8.1.1"
flex_seed_scheme:
dependency: transitive
description:
name: flex_seed_scheme
sha256: "4cee2f1d07259f77e8b36f4ec5f35499d19e74e17c7dce5b819554914082bc01"
sha256: d3ba3c5c92d2d79d45e94b4c6c71d01fac3c15017da1545880c53864da5dfeb0
url: "https://pub.dev"
source: hosted
version: "1.5.0"
version: "3.5.0"
flutter:
dependency: "direct main"
description: flutter
@ -497,10 +508,10 @@ packages:
dependency: "direct main"
description:
name: flutter_hooks
sha256: cde36b12f7188c85286fba9b38cc5a902e7279f36dd676967106c041dc9dde70
sha256: b772e710d16d7a20c0740c4f855095026b31c7eb5ba3ab67d2bd52021cd9461d
url: "https://pub.dev"
source: hosted
version: "0.20.5"
version: "0.21.2"
flutter_keyboard_visibility:
dependency: transitive
description:
@ -553,34 +564,34 @@ packages:
dependency: "direct dev"
description:
name: flutter_launcher_icons
sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea"
sha256: bfa04787c85d80ecb3f8777bde5fc10c3de809240c48fa061a2c2bf15ea5211c
url: "https://pub.dev"
source: hosted
version: "0.13.1"
version: "0.14.3"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c"
sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1"
url: "https://pub.dev"
source: hosted
version: "4.0.0"
version: "5.0.0"
flutter_markdown:
dependency: "direct main"
description:
name: flutter_markdown
sha256: "255b00afa1a7bad19727da6a7780cf3db6c3c12e68d302d85e0ff1fdf173db9e"
sha256: e7bbc718adc9476aa14cfddc1ef048d2e21e4e8f18311aaac723266db9f9e7b5
url: "https://pub.dev"
source: hosted
version: "0.7.4+3"
version: "0.7.6+2"
flutter_native_splash:
dependency: "direct dev"
description:
name: flutter_native_splash
sha256: "1152ab0067ca5a2ebeb862fe0a762057202cceb22b7e62692dcbabf6483891bb"
sha256: edb09c35ee9230c4b03f13dd45bb3a276d0801865f0a4650b7e2a3bba61a803a
url: "https://pub.dev"
source: hosted
version: "2.4.3"
version: "2.4.5"
flutter_portal:
dependency: "direct main"
description:
@ -601,10 +612,10 @@ packages:
dependency: "direct main"
description:
name: flutter_svg
sha256: "54900a1a1243f3c4a5506d853a2b5c2dbc38d5f27e52a52618a8054401431123"
sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b
url: "https://pub.dev"
source: hosted
version: "2.0.16"
version: "2.0.17"
flutter_test:
dependency: "direct dev"
description: flutter
@ -627,10 +638,10 @@ packages:
dependency: "direct dev"
description:
name: freezed
sha256: "44c19278dd9d89292cf46e97dc0c1e52ce03275f40a97c5a348e802a924bf40e"
sha256: "59a584c24b3acdc5250bb856d0d3e9c0b798ed14a4af1ddb7dc1c7b41df91c9c"
url: "https://pub.dev"
source: hosted
version: "2.5.7"
version: "2.5.8"
freezed_annotation:
dependency: transitive
description:
@ -656,10 +667,10 @@ packages:
dependency: "direct main"
description:
name: fvp
sha256: "040aa12beccd5bc60631259f27a481c4abc11a389aa4f57a47b643f58fe0b060"
sha256: f5012756985f7c8c19caaea2d65baf8a6cf5fee9fe520e1fabb8bc61e1d5f468
url: "https://pub.dev"
source: hosted
version: "0.26.1"
version: "0.30.0"
glob:
dependency: transitive
description:
@ -716,6 +727,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.6.1"
hotreloader:
dependency: transitive
description:
name: hotreloader
sha256: bc167a1163807b03bada490bfe2df25b0d744df359227880220a5cbd04e5734b
url: "https://pub.dev"
source: hosted
version: "4.3.0"
html:
dependency: transitive
description:
@ -736,10 +755,10 @@ packages:
dependency: transitive
description:
name: http
sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
url: "https://pub.dev"
source: hosted
version: "1.2.2"
version: "1.3.0"
http_multi_server:
dependency: transitive
description:
@ -752,18 +771,18 @@ packages:
dependency: transitive
description:
name: http_parser
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
url: "https://pub.dev"
source: hosted
version: "4.0.2"
version: "4.1.2"
image:
dependency: transitive
description:
name: image
sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d
sha256: "13d3349ace88f12f4a0d175eb5c12dcdd39d35c4c109a8a13dfeb6d0bd9e31c3"
url: "https://pub.dev"
source: hosted
version: "4.3.0"
version: "4.5.3"
insomnia_collection:
dependency: transitive
description:
@ -792,22 +811,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.5"
jaspr:
dependency: transitive
description:
name: jaspr
sha256: "1bc6dfd4e00ac45e85efff80e457ff5fb7a40ed05828f8046b130cc6bfe7fd36"
url: "https://pub.dev"
source: hosted
version: "0.15.2"
jinja:
dependency: "direct main"
description:
name: jinja
sha256: ee379abb8106faec4898d7a8b712f7085474c8d8dea43d06c52def04fbe5aa67
sha256: "157a05d22c1b60aaf21e3e9f0b26ec27315cd2892f7ac9571e9478eb0d5d62f9"
url: "https://pub.dev"
source: hosted
version: "0.6.0"
version: "0.6.1"
js:
dependency: transitive
description:
name: js
sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
url: "https://pub.dev"
source: hosted
version: "0.7.1"
version: "0.6.7"
json_annotation:
dependency: "direct main"
description:
@ -827,10 +854,10 @@ packages:
dependency: "direct dev"
description:
name: json_serializable
sha256: c2fcb3920cf2b6ae6845954186420fca40bc0a8abcc84903b7801f17d7050d7c
sha256: "81f04dee10969f89f604e1249382d46b97a1ccad53872875369622b5bfc9e58a"
url: "https://pub.dev"
source: hosted
version: "6.9.0"
version: "6.9.4"
json_text_field:
dependency: "direct main"
description:
@ -843,10 +870,10 @@ packages:
dependency: "direct main"
description:
name: just_audio
sha256: a49e7120b95600bd357f37a2bb04cd1e88252f7cdea8f3368803779b925b1049
sha256: f978d5b4ccea08f267dae0232ec5405c1b05d3f3cd63f82097ea46c015d5c09e
url: "https://pub.dev"
source: hosted
version: "0.9.42"
version: "0.9.46"
just_audio_mpv:
dependency: "direct main"
description:
@ -859,18 +886,18 @@ packages:
dependency: transitive
description:
name: just_audio_platform_interface
sha256: "0243828cce503c8366cc2090cefb2b3c871aa8ed2f520670d76fd47aa1ab2790"
sha256: "271b93b484c6f494ecd72a107fffbdb26b425f170c665b9777a0a24a726f2f24"
url: "https://pub.dev"
source: hosted
version: "4.3.0"
version: "4.4.0"
just_audio_web:
dependency: transitive
description:
name: just_audio_web
sha256: "9a98035b8b24b40749507687520ec5ab404e291d2b0937823ff45d92cb18d448"
sha256: "58915be64509a7683c44bf11cd1a23c15a48de104927bee116e3c63c8eeea0d4"
url: "https://pub.dev"
source: hosted
version: "0.4.13"
version: "0.4.14"
just_audio_windows:
dependency: "direct main"
description:
@ -907,10 +934,10 @@ packages:
dependency: transitive
description:
name: lints
sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235"
sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7
url: "https://pub.dev"
source: hosted
version: "4.0.0"
version: "5.1.1"
logging:
dependency: transitive
description:
@ -923,34 +950,26 @@ packages:
dependency: "direct main"
description:
name: lottie
sha256: fa39707f36786707b01eca7626d2c16c32aa603b3f3a146518518458847dc127
sha256: c5fa04a80a620066c15cf19cc44773e19e9b38e989ff23ea32e5903ef1015950
url: "https://pub.dev"
source: hosted
version: "3.2.0"
macros:
dependency: transitive
description:
name: macros
sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656"
url: "https://pub.dev"
source: hosted
version: "0.1.3-main.0"
version: "3.3.1"
markdown:
dependency: "direct main"
description:
name: markdown
sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051
sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1"
url: "https://pub.dev"
source: hosted
version: "7.2.2"
version: "7.3.0"
matcher:
dependency: transitive
description:
name: matcher
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
url: "https://pub.dev"
source: hosted
version: "0.12.16+1"
version: "0.12.17"
material_color_utilities:
dependency: transitive
description:
@ -963,18 +982,18 @@ packages:
dependency: "direct dev"
description:
name: melos
sha256: a62abfa8c7826cec927f8585572bb9adf591be152150494d879ca2c75118809d
sha256: "3f3ab3f902843d1e5a1b1a4dd39a4aca8ba1056f2d32fd8995210fa2843f646f"
url: "https://pub.dev"
source: hosted
version: "6.2.0"
version: "6.3.2"
meta:
dependency: transitive
description:
name: meta
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
url: "https://pub.dev"
source: hosted
version: "1.15.0"
version: "1.16.0"
mime:
dependency: transitive
description:
@ -1058,18 +1077,18 @@ packages:
dependency: "direct main"
description:
name: package_info_plus
sha256: "70c421fe9d9cc1a9a7f3b05ae56befd469fe4f8daa3b484823141a55442d858d"
sha256: "7976bfe4c583170d6cdc7077e3237560b364149fcd268b5f53d95a991963b191"
url: "https://pub.dev"
source: hosted
version: "8.1.2"
version: "8.3.0"
package_info_plus_platform_interface:
dependency: transitive
description:
name: package_info_plus_platform_interface
sha256: a5ef9986efc7bf772f2696183a3992615baa76c1ffb1189318dd8803778fb05b
sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c"
url: "https://pub.dev"
source: hosted
version: "3.0.2"
version: "3.2.0"
path:
dependency: "direct main"
description:
@ -1138,10 +1157,10 @@ packages:
dependency: transitive
description:
name: pdf
sha256: "05df53f8791587402493ac97b9869d3824eccbc77d97855f4545cf72df3cae07"
sha256: "28eacad99bffcce2e05bba24e50153890ad0255294f4dd78a17075a2ba5c8416"
url: "https://pub.dev"
source: hosted
version: "3.11.1"
version: "3.11.3"
pdf_widget_wrapper:
dependency: "direct overridden"
description:
@ -1214,6 +1233,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.5.1"
posix:
dependency: transitive
description:
name: posix
sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a
url: "https://pub.dev"
source: hosted
version: "6.0.1"
postman:
dependency: transitive
description:
@ -1254,7 +1281,7 @@ packages:
source: hosted
version: "6.1.2"
pub_semver:
dependency: transitive
dependency: "direct main"
description:
name: pub_semver
sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd"
@ -1269,22 +1296,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.4.0"
pubspec:
dependency: transitive
description:
name: pubspec
sha256: f534a50a2b4d48dc3bc0ec147c8bd7c304280fff23b153f3f11803c4d49d927e
url: "https://pub.dev"
source: hosted
version: "2.3.0"
pubspec_parse:
dependency: transitive
description:
name: pubspec_parse
sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8
sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082"
url: "https://pub.dev"
source: hosted
version: "1.3.0"
version: "1.5.0"
qr:
dependency: transitive
description:
@ -1293,14 +1312,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.0.2"
quiver:
dependency: transitive
description:
name: quiver
sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2
url: "https://pub.dev"
source: hosted
version: "3.2.2"
riverpod:
dependency: "direct main"
description:
@ -1393,10 +1404,10 @@ packages:
dependency: "direct main"
description:
name: shared_preferences
sha256: "3c7e73920c694a436afaf65ab60ce3453d91f84208d761fbd83fc21182134d93"
sha256: "846849e3e9b68f3ef4b60c60cf4b3e02e9321bc7f4d8c4692cf87ffa82fc8a3a"
url: "https://pub.dev"
source: hosted
version: "2.3.4"
version: "2.5.2"
shared_preferences_android:
dependency: transitive
description:
@ -1453,6 +1464,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.4.1"
shelf_gzip:
dependency: transitive
description:
name: shelf_gzip
sha256: "4f4b793c0f969f348aece1ab4cc05fceba9fea431c1ce76b1bc0fa369cecfc15"
url: "https://pub.dev"
source: hosted
version: "4.1.0"
shelf_packages_handler:
dependency: transitive
description:
@ -1461,6 +1480,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.0.2"
shelf_proxy:
dependency: transitive
description:
name: shelf_proxy
sha256: a71d2307f4393211930c590c3d2c00630f6c5a7a77edc1ef6436dfd85a6a7ee3
url: "https://pub.dev"
source: hosted
version: "1.0.4"
shelf_static:
dependency: transitive
description:
@ -1494,10 +1521,10 @@ packages:
dependency: transitive
description:
name: source_gen
sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832"
sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b"
url: "https://pub.dev"
source: hosted
version: "1.5.0"
version: "2.0.0"
source_helper:
dependency: transitive
description:
@ -1526,18 +1553,18 @@ packages:
dependency: transitive
description:
name: source_span
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
url: "https://pub.dev"
source: hosted
version: "1.10.0"
version: "1.10.1"
spot:
dependency: "direct dev"
description:
name: spot
sha256: "648cd3e9f9b336d005a4dcde24538e44edc72b8d548e0416fa93c0541655f219"
sha256: "8743e97055bbd22d0eb33d25673aa6dafee7c6eaa869860d0f5a68b7348e12bc"
url: "https://pub.dev"
source: hosted
version: "0.13.0"
version: "0.17.0"
sprintf:
dependency: transitive
description:
@ -1550,10 +1577,10 @@ packages:
dependency: transitive
description:
name: stack_trace
sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.dev"
source: hosted
version: "1.12.0"
version: "1.12.1"
state_notifier:
dependency: transitive
description:
@ -1566,10 +1593,10 @@ packages:
dependency: transitive
description:
name: stream_channel
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
version: "2.1.4"
stream_transform:
dependency: transitive
description:
@ -1582,10 +1609,10 @@ packages:
dependency: transitive
description:
name: string_scanner
sha256: "0bd04f5bb74fcd6ff0606a888a30e917af9bd52820b178eaa464beb11dca84b6"
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
url: "https://pub.dev"
source: hosted
version: "1.4.0"
version: "1.4.1"
sync_http:
dependency: transitive
description:
@ -1598,34 +1625,34 @@ packages:
dependency: transitive
description:
name: term_glyph
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
url: "https://pub.dev"
source: hosted
version: "1.2.1"
version: "1.2.2"
test:
dependency: "direct dev"
description:
name: test
sha256: "713a8789d62f3233c46b4a90b174737b2c04cb6ae4500f2aa8b1be8f03f5e67f"
sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e"
url: "https://pub.dev"
source: hosted
version: "1.25.8"
version: "1.25.15"
test_api:
dependency: transitive
description:
name: test_api
sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
url: "https://pub.dev"
source: hosted
version: "0.7.3"
version: "0.7.4"
test_core:
dependency: transitive
description:
name: test_core
sha256: "12391302411737c176b0b5d6491f466b0dd56d4763e347b6714efbaa74d7953d"
sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa"
url: "https://pub.dev"
source: hosted
version: "0.6.5"
version: "0.6.8"
textwrap:
dependency: transitive
description:
@ -1666,14 +1693,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.2.2"
uri:
dependency: transitive
description:
name: uri
sha256: "889eea21e953187c6099802b7b4cf5219ba8f3518f604a1033064d45b1b8268a"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
url_launcher:
dependency: "direct main"
description:
@ -1782,10 +1801,10 @@ packages:
dependency: "direct main"
description:
name: video_player
sha256: "4a8c3492d734f7c39c2588a3206707a05ee80cef52e8c7f3b2078d430c84bc17"
sha256: "48941c8b05732f9582116b1c01850b74dbee1d8520cd7e34ad4609d6df666845"
url: "https://pub.dev"
source: hosted
version: "2.9.2"
version: "2.9.3"
video_player_android:
dependency: transitive
description:
@ -1806,10 +1825,10 @@ packages:
dependency: "direct main"
description:
name: video_player_platform_interface
sha256: "229d7642ccd9f3dc4aba169609dd6b5f3f443bb4cc15b82f7785fcada5af9bbb"
sha256: df534476c341ab2c6a835078066fc681b8265048addd853a1e3c78740316a844
url: "https://pub.dev"
source: hosted
version: "6.2.3"
version: "6.3.0"
video_player_web:
dependency: transitive
description:
@ -1838,10 +1857,10 @@ packages:
dependency: "direct overridden"
description:
name: web
sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
url: "https://pub.dev"
source: hosted
version: "0.5.1"
version: "1.1.1"
web_socket:
dependency: transitive
description:
@ -1919,10 +1938,10 @@ packages:
dependency: transitive
description:
name: yaml
sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
url: "https://pub.dev"
source: hosted
version: "3.1.2"
version: "3.1.3"
yaml_edit:
dependency: transitive
description:
@ -1932,5 +1951,5 @@ packages:
source: hosted
version: "2.2.1"
sdks:
dart: ">=3.5.3 <3.999.0"
flutter: ">=3.24.2"
dart: ">=3.7.0-0 <3.999.0"
flutter: ">=3.29.0"

View File

@ -5,7 +5,7 @@ version: 0.5.0+5
environment:
sdk: ">=3.0.0 <4.0.0"
flutter: ">=3.24.2"
flutter: ">=3.29.0"
dependencies:
flutter:
@ -17,74 +17,75 @@ dependencies:
code_builder: ^4.10.0
csv: ^6.0.0
data_table_2: 2.5.16
dart_style: ^2.3.7
desktop_drop: ^0.4.4
dart_style: ^3.0.1
desktop_drop: ^0.5.0
extended_text_field: ^16.0.0
file_selector: ^1.0.3
flex_color_scheme: ^7.3.1
flutter_hooks: ^0.20.5
flutter_markdown: ^0.7.3+1
flex_color_scheme: ^8.1.1
flutter_hooks: ^0.21.2
flutter_markdown: ^0.7.6+2
flutter_portal: ^1.1.4
flutter_riverpod: ^2.5.1
flutter_svg: ^2.0.10+1
flutter_svg: ^2.0.17
flutter_typeahead: ^5.2.0
fvp: ^0.26.1
fvp: ^0.30.0
highlighter: ^0.1.1
hive_flutter: ^1.1.0
hooks_riverpod: ^2.5.2
intl: ^0.19.0
jinja: ^0.6.0
jinja: ^0.6.1
json_annotation: ^4.9.0
json_explorer:
path: packages/json_explorer
json_text_field: ^1.2.0
just_audio: ^0.9.40
just_audio: ^0.9.46
just_audio_mpv: ^0.1.7
just_audio_windows: ^0.2.0
lottie: ^3.1.0
markdown: ^7.2.2
lottie: ^3.3.1
markdown: ^7.3.0
mime_dart: ^3.0.0
multi_split_view: ^3.2.2
multi_trigger_autocomplete_plus:
path: packages/multi_trigger_autocomplete_plus
package_info_plus: ^8.0.2
package_info_plus: ^8.3.0
path: ^1.8.3
path_provider: ^2.1.2
printing: ^5.13.4
provider: ^6.1.2
pub_semver: ^2.1.5
riverpod: ^2.5.1
scrollable_positioned_list: ^0.3.8
shared_preferences: ^2.3.2
share_plus: ^10.1.4
shared_preferences: ^2.5.2
url_launcher: ^6.2.5
uuid: ^4.5.0
vector_graphics_compiler: ^1.1.9+1
video_player: ^2.8.7
video_player_platform_interface: ^6.2.2
video_player: ^2.9.3
video_player_platform_interface: ^6.3.0
window_manager: ^0.4.2
window_size:
git:
url: https://github.com/google/flutter-desktop-embedding.git
path: plugins/window_size
share_plus: ^10.1.4
dependency_overrides:
extended_text_field: ^16.0.0
pdf_widget_wrapper: ^1.0.4
web: ^0.5.0
web: ^1.1.1
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^2.4.12
flutter_launcher_icons: ^0.13.1
flutter_lints: ^4.0.0
flutter_native_splash: ^2.4.1
build_runner: ^2.4.15
flutter_launcher_icons: ^0.14.3
flutter_lints: ^5.0.0
flutter_native_splash: ^2.4.5
freezed: ^2.5.7
json_serializable: ^6.7.1
json_serializable: ^6.9.4
integration_test:
sdk: flutter
melos: ^6.2.0
spot: ^0.13.0
melos: ^6.3.2
spot: ^0.17.0
test: ^1.25.2
flutter:

View File

@ -115,7 +115,6 @@ void main() {
label.style?.color,
equals(Theme.of(tester.element(find.byKey(testKey)))
.colorScheme
.onSurface
.withOpacity(0.65)));
.onSurfaceVariant));
});
}

View File

@ -71,77 +71,115 @@ void main() {
});
});
group("Testing getAPIColor function", () {
HTTPVerb methodGet = HTTPVerb.get;
Color colMethodGetDarkModeExpected = getDarkModeColor(kColorHttpMethodGet);
test('Test getAPIColor for GET method dark mode', () {
expect(
getAPIColor(
APIType.rest,
method: methodGet,
brightness: dark,
),
colMethodGetDarkModeExpected);
});
HTTPVerb methodHead = HTTPVerb.head;
Color colMethodHeadDarkModeExpected =
getDarkModeColor(kColorHttpMethodHead);
test('Test getHTTPMethodColor for HEAD Method dark mode', () {
expect(
getAPIColor(
APIType.rest,
method: methodHead,
brightness: dark,
),
colMethodHeadDarkModeExpected);
});
HTTPVerb methodPatch = HTTPVerb.patch;
Color colMethodPatchDarkModeExpected =
getDarkModeColor(kColorHttpMethodPatch);
test('Test getHTTPMethodColor for PATCH Method dark mode', () {
expect(
getAPIColor(
APIType.rest,
method: methodPatch,
brightness: dark,
),
colMethodPatchDarkModeExpected);
});
HTTPVerb methodPut = HTTPVerb.put;
Color colMethodPutDarkModeExpected = getDarkModeColor(kColorHttpMethodPut);
test('Test getHTTPMethodColor for PUT Method dark mode', () {
expect(
getAPIColor(
APIType.rest,
method: methodPut,
brightness: dark,
),
colMethodPutDarkModeExpected);
});
HTTPVerb methodPost = HTTPVerb.post;
Color colMethodPostDarkModeExpected =
getDarkModeColor(kColorHttpMethodPost);
test('Test getHTTPMethodColor for POST Method dark mode', () {
expect(
getAPIColor(
APIType.rest,
method: methodPost,
brightness: dark,
),
colMethodPostDarkModeExpected);
});
HTTPVerb methodDelete = HTTPVerb.delete;
Color colMethodDeleteDarkModeExpected =
getDarkModeColor(kColorHttpMethodDelete);
test('Test getHTTPMethodColor for DELETE Method dark mode', () {
expect(
getAPIColor(
APIType.rest,
method: methodDelete,
brightness: dark,
),
colMethodDeleteDarkModeExpected);
});
});
group("Testing getHTTPMethodColor function", () {
HTTPVerb methodGet = HTTPVerb.get;
test('Test getHTTPMethodColor for GET method', () {
expect(getHTTPMethodColor(methodGet), kColorHttpMethodGet);
});
Color colMethodGetDarkModeExpected = getDarkModeColor(kColorHttpMethodGet);
test('Test getHTTPMethodColor for GET method dark mode', () {
expect(getHTTPMethodColor(methodGet, brightness: dark),
colMethodGetDarkModeExpected);
});
HTTPVerb methodHead = HTTPVerb.head;
test('Test getHTTPMethodColor for HEAD Method', () {
expect(getHTTPMethodColor(methodHead), kColorHttpMethodHead);
});
Color colMethodHeadDarkModeExpected =
getDarkModeColor(kColorHttpMethodHead);
test('Test getHTTPMethodColor for HEAD Method dark mode', () {
expect(getHTTPMethodColor(methodHead, brightness: dark),
colMethodHeadDarkModeExpected);
});
HTTPVerb methodPatch = HTTPVerb.patch;
test('Test getHTTPMethodColor for PATCH Method', () {
expect(getHTTPMethodColor(methodPatch), kColorHttpMethodPatch);
});
Color colMethodPatchDarkModeExpected =
getDarkModeColor(kColorHttpMethodPatch);
test('Test getHTTPMethodColor for PATCH Method dark mode', () {
expect(getHTTPMethodColor(methodPatch, brightness: dark),
colMethodPatchDarkModeExpected);
});
HTTPVerb methodPut = HTTPVerb.put;
test('Test getHTTPMethodColor for PUT Method', () {
expect(getHTTPMethodColor(methodPut), kColorHttpMethodPut);
});
Color colMethodPutDarkModeExpected = getDarkModeColor(kColorHttpMethodPut);
test('Test getHTTPMethodColor for PUT Method dark mode', () {
expect(getHTTPMethodColor(methodPut, brightness: dark),
colMethodPutDarkModeExpected);
});
HTTPVerb methodPost = HTTPVerb.post;
test('Test getHTTPMethodColor for POST Method', () {
expect(getHTTPMethodColor(methodPost), kColorHttpMethodPost);
});
Color colMethodPostDarkModeExpected =
getDarkModeColor(kColorHttpMethodPost);
test('Test getHTTPMethodColor for POST Method dark mode', () {
expect(getHTTPMethodColor(methodPost, brightness: dark),
colMethodPostDarkModeExpected);
});
HTTPVerb methodDelete = HTTPVerb.delete;
test('Test getHTTPMethodColor for DELETE Method', () {
expect(getHTTPMethodColor(methodDelete), kColorHttpMethodDelete);
});
Color colMethodDeleteDarkModeExpected =
getDarkModeColor(kColorHttpMethodDelete);
test('Test getHTTPMethodColor for DELETE Method dark mode', () {
expect(getHTTPMethodColor(methodDelete, brightness: dark),
colMethodDeleteDarkModeExpected);
});
});
group('Testing getScaffoldKey function', () {