diff --git a/CHANGELOG.md b/CHANGELOG.md index f2c6eb7..9aaaa87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [5.9.0] - 2023-11-22 + +* New ability to create dio Interceptors using Metro. E.g. `metro make:interceptor auth_token` +* Update stubs for creating pages and api services +* Small refactor to Metro class +* Remove ny_base_networking.dart +* Update pubspec.yaml + ## [5.8.0] - 2023-11-04 * Fix `make:api_service` when using Postman flag diff --git a/example/pubspec.lock b/example/pubspec.lock index f6455e7..56c5eef 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -53,18 +53,18 @@ packages: dependency: transitive description: name: collection - sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.17.2" + version: "1.18.0" dio: dependency: transitive description: name: dio - sha256: "417e2a6f9d83ab396ec38ff4ea5da6c254da71e4db765ad737a42af6930140b7" + sha256: "01870acd87986f768e0c09cc4d7a19a59d814af7b34cbeb0b437d2c33bdfea4c" url: "https://pub.dev" source: hosted - version: "5.3.3" + version: "5.3.4" equatable: dependency: transitive description: @@ -225,25 +225,25 @@ packages: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" nylo_framework: dependency: "direct dev" description: path: ".." relative: true source: path - version: "5.8.0" + version: "5.9.0" nylo_support: dependency: transitive description: name: nylo_support - sha256: d680d8d4b413d297b7b86210c3751d8f2ab87d8c56df5344ecd529725740e3bf + sha256: c20052ebd9849fa4c6908dcf0f693437647bbd56761f2cb39a3e504e0ad947e9 url: "https://pub.dev" source: hosted - version: "5.14.0" + version: "5.15.0" page_transition: dependency: transitive description: @@ -324,6 +324,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.5" + pretty_dio_logger: + dependency: transitive + description: + name: pretty_dio_logger + sha256: "00b80053063935cf9a6190da344c5373b9d0e92da4c944c878ff2fbef0ef6dc2" + url: "https://pub.dev" + source: hosted + version: "1.3.1" pull_to_refresh_flutter3: dependency: transitive description: @@ -421,18 +429,18 @@ packages: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" string_scanner: dependency: transitive description: @@ -453,10 +461,10 @@ packages: dependency: transitive description: name: test_api - sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "0.6.1" theme_provider: dependency: transitive description: @@ -493,10 +501,10 @@ packages: dependency: transitive description: name: web - sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 url: "https://pub.dev" source: hosted - version: "0.1.4-beta" + version: "0.3.0" win32: dependency: transitive description: @@ -514,5 +522,5 @@ packages: source: hosted version: "1.0.2" sdks: - dart: ">=3.1.0 <4.0.0" + dart: ">=3.2.0-194.0.dev <4.0.0" flutter: ">=3.7.0" diff --git a/lib/metro/menu.dart b/lib/metro/menu.dart index 14b5be7..254e72f 100644 --- a/lib/metro/menu.dart +++ b/lib/metro/menu.dart @@ -20,6 +20,7 @@ All commands: make:provider make:event make:api_service + make:interceptor make:theme make:route_guard make:config diff --git a/lib/metro/metro.dart b/lib/metro/metro.dart index c54285d..dacc6f3 100644 --- a/lib/metro/metro.dart +++ b/lib/metro/metro.dart @@ -6,6 +6,7 @@ import 'dart:io'; import 'package:args/args.dart'; import 'package:nylo_framework/json_dart_generator/dart_code_generator.dart'; import 'package:nylo_framework/metro/stubs/config_stub.dart'; +import 'package:nylo_framework/metro/stubs/interceptor_stub.dart'; import 'package:nylo_framework/metro/stubs/route_guard_stub.dart'; import 'package:nylo_support/metro/models/ny_command.dart'; import 'package:nylo_framework/metro/stubs/api_service_stub.dart'; @@ -76,6 +77,12 @@ List allCommands = [ arguments: ["-h", "-f", "-model", "-resource"], category: "make", action: _makeApiService), + NyCommand( + name: "interceptor", + options: 1, + arguments: ["-h", "-f"], + category: "make", + action: _makeInterceptor), NyCommand( name: "theme", options: 1, @@ -397,6 +404,34 @@ _makeApiService(List arguments) async { hasForceFlag: hasForceFlag); } +/// Creates an Interceptor for Nylo projects +/// E.g. run: `dart run nylo_framework:main make:interceptor auth_token` +_makeInterceptor(List arguments) async { + parser.addFlag(helpFlag, + abbr: 'h', help: 'e.g. make:interceptor auth_token', negatable: false); + parser.addFlag(forceFlag, + abbr: 'f', + help: 'Creates a new Interceptor even if it already exists.', + negatable: false); + + final ArgResults argResults = parser.parse(arguments); + + bool? hasForceFlag = argResults[forceFlag]; + + MetroService.hasHelpFlag(argResults[helpFlag], parser.usage); + + MetroService.checkArguments(arguments, + 'You are missing the \'name\' of the interceptor that you want to create.\ne.g. make:interceptor auth_token'); + + String interceptorName = + argResults.arguments.first.replaceAll(RegExp(r'(_?interceptor)'), ""); + + ReCase classReCase = ReCase(interceptorName); + String stubInterceptor = interceptorStub(interceptorName: classReCase); + await MetroService.makeInterceptor(classReCase.snakeCase, stubInterceptor, + forceCreate: hasForceFlag ?? false); +} + /// Creates an API Service from Postman v2 schema _makePostmanApiService( {required dynamic json, @@ -638,17 +673,37 @@ _makePostmanApiService( if (file.contains(apiServiceName)) { return ""; } - RegExp reg = RegExp( - r'final Map apiDecoders = \{([^}]*)\};'); - String temp = - """final Map apiDecoders = {${reg.allMatches(file).map((e) => e.group(1)).toList()[0]} + + if (file.contains("final Map apiDecoders =")) { + RegExp reg = RegExp( + r'final Map apiDecoders = \{([^}]*)\};'); + String temp = + """final Map apiDecoders = {${reg.allMatches(file).map((e) => e.group(1)).toList()[0]} $apiServiceName: $apiServiceName(), };"""; - return file.replaceFirst( - RegExp(r'final Map apiDecoders = \{([^}]*)\};'), - temp, - ); + return file.replaceFirst( + RegExp( + r'final Map apiDecoders = \{([^}]*)\};'), + temp, + ); + } + + if (file.contains("final Map apiDecoders =")) { + RegExp reg = RegExp( + r'final Map apiDecoders = \{([^}]*)\};'); + String temp = + """final Map apiDecoders = {${reg.allMatches(file).map((e) => e.group(1)).toList()[0]} + $apiServiceName: $apiServiceName(), +};"""; + + return file.replaceFirst( + RegExp(r'final Map apiDecoders = \{([^}]*)\};'), + temp, + ); + } + + return file; }); } @@ -827,7 +882,7 @@ _makePage(List arguments) async { await MetroService.makeController(className.snakeCase, stubController, forceCreate: hasForceFlag ?? false); } else { - String stubPage = pageStub(pageName: classReCase); + String stubPage = pageStub(className: classReCase); await MetroService.makePage(className.snakeCase, stubPage, forceCreate: hasForceFlag ?? false, addToRoute: true); } diff --git a/lib/metro/stubs/api_service_stub.dart b/lib/metro/stubs/api_service_stub.dart index 11aa9d0..259895a 100644 --- a/lib/metro/stubs/api_service_stub.dart +++ b/lib/metro/stubs/api_service_stub.dart @@ -3,14 +3,13 @@ import 'package:recase/recase.dart'; /// This stub is used to create a new API Service. String apiServiceStub(ReCase rc, {required ReCase model, required String baseUrl}) => - ''' -import 'package:flutter/material.dart'; -import '/app/networking/dio/base_api_service.dart'; + '''import 'package:flutter/material.dart'; +import '/config/decoders.dart'; ${baseUrl == "getEnv('API_BASE_URL')" ? "import 'package:nylo_framework/nylo_framework.dart';" : ""} -${model.originalText != 'Model' ? "import '../../app/models/${model.snakeCase}.dart';" : ""} +${model.originalText != 'Model' ? "import '/app/models/${model.snakeCase}.dart';" : ""} -class ${rc.pascalCase}ApiService extends BaseApiService { - ${rc.pascalCase}ApiService({BuildContext? buildContext}) : super(buildContext); +class ${rc.pascalCase}ApiService extends NyApiService { + ${rc.pascalCase}ApiService({BuildContext? buildContext}) : super(buildContext, decoders: modelDecoders); @override String get baseUrl => $baseUrl; diff --git a/lib/metro/stubs/interceptor_stub.dart b/lib/metro/stubs/interceptor_stub.dart new file mode 100644 index 0000000..fba56d3 --- /dev/null +++ b/lib/metro/stubs/interceptor_stub.dart @@ -0,0 +1,23 @@ +import 'package:recase/recase.dart'; + +/// This stub is used to create an Interceptor. +String interceptorStub({required ReCase interceptorName}) => ''' +import 'package:nylo_framework/nylo_framework.dart'; + +class ${interceptorName.pascalCase}Interceptor extends Interceptor { + @override + void onRequest(RequestOptions options, RequestInterceptorHandler handler) { + return super.onRequest(options, handler); + } + + @override + void onResponse(Response response, ResponseInterceptorHandler handler) { + handler.next(response); + } + + @override + void onError(DioException dioException, ErrorInterceptorHandler handler) { + handler.next(dioException); + } +} +'''; diff --git a/lib/metro/stubs/page_stub.dart b/lib/metro/stubs/page_stub.dart index 366a640..8f5111a 100644 --- a/lib/metro/stubs/page_stub.dart +++ b/lib/metro/stubs/page_stub.dart @@ -1,25 +1,29 @@ import 'package:recase/recase.dart'; /// This stub is used to create a new Page. -String pageStub({required ReCase pageName}) => ''' +String pageStub({required ReCase className}) => ''' import 'package:flutter/material.dart'; import 'package:nylo_framework/nylo_framework.dart'; -class ${pageName.pascalCase}Page extends NyPage { +class ${className.pascalCase}Page extends NyStatefulWidget { + static const path = '/${className.paramCase}'; + + ${className.pascalCase}Page() : super(path, child: _${className.pascalCase}PageState()); +} - static String path = '/${pageName.paramCase}'; +class _${className.pascalCase}PageState extends NyState<${className.pascalCase}Page> { @override init() async { - // To update the state, - // use: refreshPage(setState: () { }); + super.init(); + } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text("${pageName.titleCase}") + title: Text("${className.titleCase}") ), body: SafeArea( child: Container(), diff --git a/lib/metro/stubs/page_w_controller_stub.dart b/lib/metro/stubs/page_w_controller_stub.dart index 4d14769..c35b0d0 100644 --- a/lib/metro/stubs/page_w_controller_stub.dart +++ b/lib/metro/stubs/page_w_controller_stub.dart @@ -6,14 +6,18 @@ import 'package:flutter/material.dart'; import 'package:nylo_framework/nylo_framework.dart'; import '/app/controllers/${className.snakeCase}_controller.dart'; -class ${className.pascalCase}Page extends NyPage<${className.pascalCase}Controller> { +class ${className.pascalCase}Page extends NyStatefulWidget<${className.pascalCase}Controller> { + static const path = '/${className.paramCase}'; - static String path = '/${className.paramCase}'; + ${className.pascalCase}Page() : super(path, child: _${className.pascalCase}PageState()); +} + +class _${className.pascalCase}PageState extends NyState<${className.pascalCase}Page> { @override init() async { - // To update the state, - // use: refreshPage(setState: () { }); + super.init(); + } @override diff --git a/lib/metro/stubs/postman_api_service_stub.dart b/lib/metro/stubs/postman_api_service_stub.dart index 1f9ad3b..c690278 100644 --- a/lib/metro/stubs/postman_api_service_stub.dart +++ b/lib/metro/stubs/postman_api_service_stub.dart @@ -6,12 +6,12 @@ String postmanApiServiceStub(ReCase rc, required, required String imports, required String baseUrl}) => - ''' -${baseUrl == "getEnv('API_BASE_URL')" ? "import 'package:nylo_framework/nylo_framework.dart';\n" : ""}import 'package:flutter/material.dart'; -${imports != "" ? imports + '\n' : ''}import '/app/networking/dio/base_api_service.dart'; + '''import 'package:flutter/material.dart'; +import 'package:nylo_framework/nylo_framework.dart'; +import '/config/decoders.dart';${imports != "" ? '\n' + imports + '' : ''} -class ${rc.pascalCase}ApiService extends BaseApiService { - ${rc.pascalCase}ApiService({BuildContext? buildContext}) : super(buildContext); +class ${rc.pascalCase}ApiService extends NyApiService { + ${rc.pascalCase}ApiService({BuildContext? buildContext}) : super(buildContext, decoders: modelDecoders); @override String get baseUrl => $baseUrl; diff --git a/lib/networking/ny_base_networking.dart b/lib/networking/ny_base_networking.dart deleted file mode 100644 index a08a245..0000000 --- a/lib/networking/ny_base_networking.dart +++ /dev/null @@ -1,179 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:nylo_framework/nylo_framework.dart'; - -/// Base API Service class -class NyBaseApiService { - late Dio _api; - - BuildContext? _context; - BaseOptions? baseOptions; - - final String baseUrl = ""; - bool get useInterceptors => interceptors.isNotEmpty; - final bool useHttpOnResponse = true; - final Map interceptors = {}; - final Map decoders = {}; - - NyBaseApiService(BuildContext? context) { - this._context = context; - this.init(); - } - - /// Set the build context (optional) - setContext(BuildContext context) { - _context = context; - } - - /// Get the build context - BuildContext? getContext() => _context; - - /// Set new [headers] to the baseOptions variable. - setHeaders(Map headers) { - _api.options.headers.addAll(headers); - } - - /// Set a bearer token [headers] to the baseOptions variable. - setBearerToken(String bearerToken) { - _api.options.headers.addAll({"Authorization": "Bearer $bearerToken"}); - } - - /// Set a [baseUrl] for the request. - setBaseUrl(String baseUrl) { - _api.options.baseUrl = baseUrl; - } - - /// Apply a pagination query to the HTTP request - setPagination(int page, - {String? paramPage, String? paramPerPage, String? perPage}) { - Map query = {(paramPage ?? "page"): page}; - if (perPage != null) { - query.addAll({(paramPerPage ?? "per_page"): perPage}); - } - _api.options.queryParameters.addAll(query); - } - - /// Initialize class - void init() { - baseOptions = BaseOptions( - baseUrl: baseUrl, - headers: { - "Content-type": "application/json", - "Accept": "application/json", - }, - connectTimeout: Duration(seconds: 5), - ); - - _api = Dio(baseOptions); - - if (useInterceptors) { - _addInterceptors(); - } - } - - /// Networking class to handle API requests - /// Use the [request] callback to call an API - /// [handleSuccess] overrides the response on a successful status code - /// [handleFailure] overrides the response on a failure - /// - /// Usage: - /// Future?> fetchUsers() async { - /// return await network>( - /// request: (request) => request.get("/users"), - /// ); - /// } - Future network( - {required Function(Dio api) request, - Function(Response response)? handleSuccess, - Function(DioException error)? handleFailure, - String? bearerToken, - String? baseUrl, - bool useUndefinedResponse = true, - Map headers = const {}}) async { - try { - Map oldHeader = _api.options.headers; - Map newValuesToAddToHeader = {}; - if (headers.isNotEmpty) { - for (var header in headers.entries) { - if (!oldHeader.containsKey(header.key)) { - newValuesToAddToHeader.addAll({header.key: header.value}); - } - } - } - if (bearerToken != null && !oldHeader.containsKey('Authorization')) { - newValuesToAddToHeader.addAll({"Authorization": "Bearer $bearerToken"}); - } - _api.options.headers.addAll(newValuesToAddToHeader); - String oldBaseUrl = _api.options.baseUrl; - if (baseUrl != null) { - _api.options.baseUrl = baseUrl; - } - Response response = await request(_api); - _api.options.headers = oldHeader; // reset headers - _api.options.baseUrl = oldBaseUrl; // reset base url - _api.options.queryParameters = {}; // reset query parameters - - dynamic data = handleResponse(response, handleSuccess: handleSuccess); - if (data != T && useUndefinedResponse) { - onUndefinedResponse(data, response, _context); - } - _context = null; - return data; - } on DioException catch (dioError) { - NyLogger.error(dioError.toString()); - onError(dioError); - if (_context != null) { - displayError(dioError, _context!); - } - - if (handleFailure != null) { - return handleFailure(dioError); - } - - return null; - } on Exception catch (e) { - NyLogger.error(e.toString()); - return null; - } - } - - /// Handle the [DioException] response if there is an issue. - onError(DioException dioException) {} - - /// Display a error to the user - /// This method is only called if you provide the API service - /// with a [BuildContext]. - displayError(DioException dioException, BuildContext context) {} - - /// Handle the undefined response's for HTTP requests. - /// The [data] parameter contains what was returned from your decoder. - onUndefinedResponse(dynamic data, Response response, BuildContext? context) {} - - /// Handles an API network response from [Dio]. - /// [handleSuccess] overrides the return value - /// [handleFailure] is called then the response status is not 200. - /// You can return a different value using this callback. - handleResponse(Response response, - {Function(Response response)? handleSuccess}) { - bool wasSuccessful = response.statusCode == 200; - - if (wasSuccessful == true && handleSuccess != null) { - return handleSuccess(response); - } - - if (T.toString() != 'dynamic') { - return _morphJsonResponse(response.data); - } else { - return response.data; - } - } - - /// Morphs json into Object using 'config/decoders.dart'. - _morphJsonResponse(dynamic json) { - DefaultResponse defaultResponse = - DefaultResponse.fromJson(json, decoders, type: T); - return defaultResponse.data; - } - - /// Adds all the [interceptors] to [dio]. - _addInterceptors() => _api.interceptors.addAll(interceptors.values); -} diff --git a/lib/nylo_framework.dart b/lib/nylo_framework.dart index b55f7c3..31ab478 100644 --- a/lib/nylo_framework.dart +++ b/lib/nylo_framework.dart @@ -17,7 +17,8 @@ export 'package:nylo_support/themes/base_theme_config.dart'; export 'package:nylo_support/alerts/toast_enums.dart'; export 'package:nylo_support/alerts/toast_notification.dart'; export 'package:nylo_support/alerts/toast_meta.dart'; -export 'package:nylo_support/networking/default_response.dart'; +export 'package:nylo_support/networking/models/default_response.dart'; +export 'package:nylo_support/networking/dio_api_service.dart'; export 'package:nylo_support/providers/providers.dart'; export 'package:nylo_support/events/events.dart'; export 'package:nylo_support/events/auth_user_event.dart'; @@ -35,7 +36,9 @@ export 'package:nylo_support/widgets/ny_pull_to_refresh.dart'; export 'package:nylo_support/widgets/ny_switch.dart'; export 'package:nylo_support/widgets/ny_list_view.dart'; export 'package:nylo_support/widgets/ny_page.dart'; +export 'package:nylo_support/networking/ny_api_service.dart'; +export 'package:nylo_support/networking/ny_base_api_service.dart'; export 'package:dio/dio.dart'; /// Nylo version -const String nyloVersion = 'v5.8.0'; +const String nyloVersion = 'v5.9.0'; diff --git a/pubspec.lock b/pubspec.lock index ed8e52a..168bb05 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -53,18 +53,18 @@ packages: dependency: "direct main" description: name: collection - sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.17.2" + version: "1.18.0" dio: dependency: "direct main" description: name: dio - sha256: "417e2a6f9d83ab396ec38ff4ea5da6c254da71e4db765ad737a42af6930140b7" + sha256: "01870acd87986f768e0c09cc4d7a19a59d814af7b34cbeb0b437d2c33bdfea4c" url: "https://pub.dev" source: hosted - version: "5.3.3" + version: "5.3.4" equatable: dependency: transitive description: @@ -225,18 +225,18 @@ packages: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" nylo_support: dependency: "direct main" description: name: nylo_support - sha256: d680d8d4b413d297b7b86210c3751d8f2ab87d8c56df5344ecd529725740e3bf + sha256: c20052ebd9849fa4c6908dcf0f693437647bbd56761f2cb39a3e504e0ad947e9 url: "https://pub.dev" source: hosted - version: "5.14.0" + version: "5.15.0" page_transition: dependency: "direct main" description: @@ -317,6 +317,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.5" + pretty_dio_logger: + dependency: transitive + description: + name: pretty_dio_logger + sha256: "00b80053063935cf9a6190da344c5373b9d0e92da4c944c878ff2fbef0ef6dc2" + url: "https://pub.dev" + source: hosted + version: "1.3.1" pull_to_refresh_flutter3: dependency: transitive description: @@ -414,18 +422,18 @@ packages: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" string_scanner: dependency: transitive description: @@ -446,10 +454,10 @@ packages: dependency: transitive description: name: test_api - sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "0.6.1" theme_provider: dependency: "direct main" description: @@ -486,10 +494,10 @@ packages: dependency: transitive description: name: web - sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 url: "https://pub.dev" source: hosted - version: "0.1.4-beta" + version: "0.3.0" win32: dependency: transitive description: @@ -507,5 +515,5 @@ packages: source: hosted version: "1.0.2" sdks: - dart: ">=3.1.0 <4.0.0" + dart: ">=3.2.0-194.0.dev <4.0.0" flutter: ">=3.7.0" diff --git a/pubspec.yaml b/pubspec.yaml index efebec0..45a86ae 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: nylo_framework description: Micro-framework for Flutter that's built to simplify app development for Flutter projects. -version: 5.8.0 +version: 5.9.0 homepage: https://nylo.dev repository: https://github.com/nylo-core/framework/tree/5.x issue_tracker: https://github.com/nylo-core/framework/issues @@ -15,13 +15,13 @@ environment: sdk: '>=2.14.0 <4.0.0' dependencies: - dio: ^5.3.3 flutter_dotenv: ^5.1.0 - nylo_support: ^5.14.0 + nylo_support: ^5.15.0 theme_provider: ^0.6.0 page_transition: ^2.1.0 collection: ^1.17.1 args: ^2.4.2 + dio: ^5.3.4 recase: ^4.1.0 flutter: sdk: flutter