diff --git a/CHANGELOG.md b/CHANGELOG.md index e006bb5..f1c4139 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 0.1.0 +- Breaking: Renamed `Client` to `PostgresClient` to avoid conflict with class from `dart:html`. + ## 0.0.4 - Fixed links in docs. - Updated supported platforms. diff --git a/add_imports.yaml b/add_imports.yaml index 6f4f168..0f160b0 100644 --- a/add_imports.yaml +++ b/add_imports.yaml @@ -1,9 +1,10 @@ -file_url_prefix: 'https://deno.land/x/postgres@v0.17.0/' +file_url_prefix: https://deno.land/x/postgres@v0.17.0/ classes_map: - 'query/query.ts': + query/query.ts: - QueryObjectResult - 'mod.ts': + mod.ts: - QueryClient - Client + - Client: PostgresClient - Transaction diff --git a/bin/add_imports.dart b/bin/add_imports.dart index 1f8f8fe..1c0c06d 100644 --- a/bin/add_imports.dart +++ b/bin/add_imports.dart @@ -37,14 +37,17 @@ String createNewSource(String sourceString, Config config) { .map((e) => e.group(1)) .whereNotNull() .toSet() - .intersection(config.classes) - .whereNot((e) => sourceString.contains('import { $e }')) + .where((alias) => config.classes.any((e) => e.alias == alias)) + .whereNot((e) => sourceString.contains('self.$e = ')) + .map((alias) => config.classes.firstWhere((e) => e.alias == alias)) .toList(); + final imports = classes.map((e) => config.importStringForClass(e.jsName)); + final assignments = classes.map((e) => 'self.${e.alias} = ${e.jsName};'); + return [ - ...[config.importStringForClass, (e) => 'self.$e = $e;'] - .map(classes.map) - .flattened, + ...imports, + ...assignments, sourceString, ].join('\n'); } diff --git a/example/lib/main.dart b/example/lib/main.dart index 14e4c30..9cfb810 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -7,7 +7,7 @@ Future fetch(Request _) async { final dbUrl = Deno.env.get('SUPABASE_DB_URL'); if (dbUrl == null) return Response.error(); - final client = Client(dbUrl); + final client = PostgresClient(dbUrl); await client.connect(); try { final result = await client.transaction( diff --git a/lib/deno_postgres_interop.dart b/lib/deno_postgres_interop.dart index 6b97815..cea5a36 100644 --- a/lib/deno_postgres_interop.dart +++ b/lib/deno_postgres_interop.dart @@ -1,7 +1,6 @@ /// An interop for [deno-postgres@v​0.17.0](https://deno.land/x/postgres@v0.17.0). library; -export 'src/client.dart'; export 'src/client_configuration.dart'; export 'src/client_options.dart'; export 'src/column.dart'; @@ -19,6 +18,7 @@ export 'src/partial/partial_connection_options.dart'; export 'src/partial/partial_tls_options.dart'; export 'src/pool.dart'; export 'src/pool_client.dart'; +export 'src/postgres_client.dart'; export 'src/query.dart'; export 'src/query_array_result.dart'; export 'src/query_client.dart'; diff --git a/lib/src/add_imports/better_map.dart b/lib/src/add_imports/better_map.dart new file mode 100644 index 0000000..dfaddae --- /dev/null +++ b/lib/src/add_imports/better_map.dart @@ -0,0 +1,11 @@ +// This is an internal implementation so it is okay here. +// ignore_for_file: public_member_api_docs +typedef Predicate = bool Function(T); + +extension BetterMap on Map { + Map mapValues(V1 Function(V) f) => + map((k, v) => MapEntry(k, f(v))); + + MapEntry firstWhereValue(Predicate predicate) => + entries.firstWhere((e) => predicate(e.value)); +} diff --git a/lib/src/add_imports/class_interop_data.dart b/lib/src/add_imports/class_interop_data.dart new file mode 100644 index 0000000..6816460 --- /dev/null +++ b/lib/src/add_imports/class_interop_data.dart @@ -0,0 +1,24 @@ +// This is an internal implementation so it is okay here. +// ignore_for_file: public_member_api_docs + +import 'package:yaml/yaml.dart'; + +class ClassInteropData { + final String jsName; + final String alias; + + ClassInteropData({required this.jsName, required this.alias}); + + ClassInteropData.noAlias(this.jsName) : alias = jsName; + + static List fromYamlList(YamlList list) => list + .map( + (e) => e is YamlMap + ? ClassInteropData( + jsName: e.keys.first as String, + alias: e.values.first as String, + ) + : ClassInteropData.noAlias(e as String), + ) + .toList(); +} diff --git a/lib/src/add_imports/config.dart b/lib/src/add_imports/config.dart index 1146c91..f820565 100644 --- a/lib/src/add_imports/config.dart +++ b/lib/src/add_imports/config.dart @@ -2,38 +2,41 @@ // ignore_for_file: public_member_api_docs import 'package:collection/collection.dart'; +import 'package:deno_postgres_interop/src/add_imports/better_map.dart'; +import 'package:deno_postgres_interop/src/add_imports/class_interop_data.dart'; import 'package:yaml/yaml.dart'; class Config { final String fileUrlPrefix; - final Map> classesMap; + final Map> classesMap; - Set get classes => classesMap.values.flattened.toSet(); + Set get classes => classesMap.values.flattened.toSet(); Config({required this.fileUrlPrefix, required this.classesMap}); factory Config.fromYaml(String yamlString) { try { - final parsedYaml = loadYaml(yamlString) as YamlMap; + final { + 'classes_map': YamlMap classesYamlMap, + 'file_url_prefix': String fileUrlPrefix, + } = loadYaml(yamlString) as YamlMap; - final classesMap = (parsedYaml['classes_map'] as YamlMap).map( - (key, value) => MapEntry( - key as String, - [...value as YamlList].cast(), - ), - ); + final classesMap = classesYamlMap + .cast() + .mapValues(ClassInteropData.fromYamlList); return Config( classesMap: classesMap, - fileUrlPrefix: parsedYaml['file_url_prefix'] as String, + fileUrlPrefix: fileUrlPrefix, ); } catch (_) { throw YamlException('', null); } } - String _filenameForClass(String classname) => - classesMap.entries.firstWhere((e) => e.value.contains(classname)).key; + String _filenameForClass(String classname) => classesMap + .firstWhereValue((v) => v.map((e) => e.jsName).contains(classname)) + .key; String importStringForClass(String classname) { final filename = _filenameForClass(classname); diff --git a/lib/src/client.dart b/lib/src/postgres_client.dart similarity index 69% rename from lib/src/client.dart rename to lib/src/postgres_client.dart index 6e988b2..4d63d38 100644 --- a/lib/src/client.dart +++ b/lib/src/postgres_client.dart @@ -6,14 +6,14 @@ import 'package:deno_postgres_interop/src/query_client.dart'; /// [deno-postgres@v​0.17.0/Client](https://deno.land/x/postgres@v0.17.0/mod.ts?s=Client). @JS() -class Client extends QueryClient { +class PostgresClient extends QueryClient { /// [deno-postgres@v​0.17.0/Client/constructor](https://deno.land/x/postgres@v0.17.0/mod.ts?s=Client#ctor_0). - external factory Client(String dbUrl); + external factory PostgresClient(String dbUrl); /// [deno-postgres@v​0.17.0/Client/constructor](https://deno.land/x/postgres@v0.17.0/mod.ts?s=Client#ctor_0). - factory Client.config(ClientOptions config) => - callConstructor('Client', [config]); + factory PostgresClient.config(ClientOptions config) => + callConstructor('PostgresClient', [config]); /// [deno-postgres@v​0.17.0/Client/constructor](https://deno.land/x/postgres@v0.17.0/mod.ts?s=Client#ctor_0). - factory Client.empty() => callConstructor('Client', null); + factory PostgresClient.empty() => callConstructor('PostgresClient', null); } diff --git a/pubspec.yaml b/pubspec.yaml index 18d3298..90b8e7b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: deno_postgres_interop description: An interop for js package deno-postgres - PostgreSQL driver that can be used in deno-deploy (supabase edge functions). -version: 0.0.4 +version: 0.1.0 repository: https://github.com/solid-software/deno_postgres_interop environment: