From 5eccf080b0f4ef37319af2b77fa75264601d7dbd Mon Sep 17 00:00:00 2001 From: tompng Date: Sun, 22 Dec 2019 02:04:47 +0900 Subject: [PATCH 1/6] have typescript generator itself (don't use ar_serializer's ts generator) --- lib/ar_sync/type_script.rb | 43 +++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/lib/ar_sync/type_script.rb b/lib/ar_sync/type_script.rb index 9996352..0520f9f 100644 --- a/lib/ar_sync/type_script.rb +++ b/lib/ar_sync/type_script.rb @@ -10,8 +10,11 @@ def self.generate_typed_files(api_class, dir:, comment: nil) end def self.generate_type_definition(api_class) + classes = api_related_classes api_class + types = ArSerializer::TypeScript.related_serializer_types classes.flatten [ - ArSerializer::TypeScript.generate_type_definition(api_related_classes(api_class)), + types.map { |t| data_type_definition t }, + types.map { |t| query_type_definition t }, request_type_definition(api_class) ].join "\n" end @@ -98,4 +101,42 @@ def self.generate_hooks_script } CODE end + + def self.query_type_definition(type) + field_definitions = type.fields.map do |field| + association_type = field.type.association_type + if association_type + qname = "Type#{association_type.name}Query" + if field.args.empty? + "#{field.name}?: true | #{qname} | { as?: string; attributes?: #{qname} }" + else + "#{field.name}?: true | #{qname} | { as?: string; params: #{field.args_ts_type}; attributes?: #{qname} }" + end + else + "#{field.name}?: true | { as: string }" + end + end + field_definitions << "'*'?: true" + query_type_name = "Type#{type.name}Query" + base_query_type_name = "Type#{type.name}QueryBase" + <<~TYPE + export type #{query_type_name} = keyof (#{base_query_type_name}) | Readonly<(keyof (#{base_query_type_name}))[]> | #{base_query_type_name} + export interface #{base_query_type_name} { + #{field_definitions.map { |line| " #{line}" }.join("\n")} + } + TYPE + end + + def self.data_type_definition(type) + field_definitions = [] + type.fields.each do |field| + field_definitions << "#{field.name}: #{field.type.ts_type}" + end + field_definitions << "_meta?: { name: '#{type.name}'; query: Type#{type.name}QueryBase }" + <<~TYPE + export interface Type#{type.name} { + #{field_definitions.map { |line| " #{line}" }.join("\n")} + } + TYPE + end end From a31c5d0932419b510f71bb420645bf8250049b44 Mon Sep 17 00:00:00 2001 From: tompng Date: Sun, 22 Dec 2019 02:11:24 +0900 Subject: [PATCH 2/6] use ar_serializer >=1.0.0, not ==1.0.0 --- Gemfile.lock | 2 +- ar_sync.gemspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2db8f75..2e4791a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,7 +3,7 @@ PATH specs: ar_sync (1.0.3) activerecord - ar_serializer (= 1.0.0) + ar_serializer GEM remote: https://rubygems.org/ diff --git a/ar_sync.gemspec b/ar_sync.gemspec index d9b6022..904a356 100644 --- a/ar_sync.gemspec +++ b/ar_sync.gemspec @@ -21,7 +21,7 @@ Gem::Specification.new do |spec| spec.require_paths = ['lib'] spec.add_dependency 'activerecord' - spec.add_dependency 'ar_serializer', '1.0.0' + spec.add_dependency 'ar_serializer' %w[rake pry sqlite3 activerecord-import].each do |gem_name| spec.add_development_dependency gem_name end From ba9e2c53fccfc8167b1daede3096016124c21a39 Mon Sep 17 00:00:00 2001 From: tompng Date: Sun, 22 Dec 2019 02:31:23 +0900 Subject: [PATCH 3/6] simplify target class search on type generating --- lib/ar_sync/type_script.rb | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/lib/ar_sync/type_script.rb b/lib/ar_sync/type_script.rb index 0520f9f..fa40b8b 100644 --- a/lib/ar_sync/type_script.rb +++ b/lib/ar_sync/type_script.rb @@ -10,8 +10,7 @@ def self.generate_typed_files(api_class, dir:, comment: nil) end def self.generate_type_definition(api_class) - classes = api_related_classes api_class - types = ArSerializer::TypeScript.related_serializer_types classes.flatten + types = ArSerializer::TypeScript.related_serializer_types([api_class]).reject { |t| t.type == api_class } [ types.map { |t| data_type_definition t }, types.map { |t| query_type_definition t }, @@ -19,11 +18,6 @@ def self.generate_type_definition(api_class) ].join "\n" end - def self.api_related_classes(api_class) - classes = ArSerializer::TypeScript.related_serializer_types([api_class]).map(&:type) - classes - [api_class] - end - def self.request_type_definition(api_class) type = ArSerializer::GraphQL::TypeClass.from api_class definitions = [] From 277d51258512f2716e96e59dbfe0f10d536a4ef7 Mon Sep 17 00:00:00 2001 From: tompng Date: Sun, 5 Jan 2020 22:18:44 +0900 Subject: [PATCH 4/6] rm {as: aliasname} from generated type(calculating return type does not support alias) --- lib/ar_sync/type_script.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ar_sync/type_script.rb b/lib/ar_sync/type_script.rb index fa40b8b..777ba03 100644 --- a/lib/ar_sync/type_script.rb +++ b/lib/ar_sync/type_script.rb @@ -102,12 +102,12 @@ def self.query_type_definition(type) if association_type qname = "Type#{association_type.name}Query" if field.args.empty? - "#{field.name}?: true | #{qname} | { as?: string; attributes?: #{qname} }" + "#{field.name}?: true | #{qname} | { attributes?: #{qname} }" else - "#{field.name}?: true | #{qname} | { as?: string; params: #{field.args_ts_type}; attributes?: #{qname} }" + "#{field.name}?: true | #{qname} | { params: #{field.args_ts_type}; attributes?: #{qname} }" end else - "#{field.name}?: true | { as: string }" + "#{field.name}?: true" end end field_definitions << "'*'?: true" From 5eaeb9269c05516076d58494c5a5368d4b9a9f42 Mon Sep 17 00:00:00 2001 From: tompng Date: Sun, 5 Jan 2020 22:46:41 +0900 Subject: [PATCH 5/6] use ar_serializer 1.1.0 --- Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2e4791a..ce36fcc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -21,7 +21,7 @@ GEM i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) - ar_serializer (1.0.0) + ar_serializer (1.1.0) activerecord top_n_loader arel (9.0.0) @@ -37,7 +37,7 @@ GEM rake (12.3.2) sqlite3 (1.3.13) thread_safe (0.3.6) - top_n_loader (1.0.0) + top_n_loader (1.0.1) activerecord tzinfo (1.2.5) thread_safe (~> 0.1) @@ -53,4 +53,4 @@ DEPENDENCIES sqlite3 BUNDLED WITH - 1.16.1 + 2.1.2 From 05e5e67a54d2db63402a3a3b44c62351b8600138 Mon Sep 17 00:00:00 2001 From: tompng Date: Sun, 5 Jan 2020 22:47:07 +0900 Subject: [PATCH 6/6] keyword parameter warn fix --- lib/ar_sync/class_methods.rb | 6 +++--- lib/ar_sync/instance_methods.rb | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/ar_sync/class_methods.rb b/lib/ar_sync/class_methods.rb index 9dab500..f0ee62c 100644 --- a/lib/ar_sync/class_methods.rb +++ b/lib/ar_sync/class_methods.rb @@ -64,14 +64,14 @@ def _sync_has_many(name, order: :asc, limit: nil, preload: nil, association: nil raise "order not in [:asc, :desc] : #{order}" unless %i[asc desc].include? order if data_block.nil? && preload.nil? underscore_name = name.to_s.underscore.to_sym - preload = lambda do |records, _context, params| + preload = lambda do |records, _context, **params| ArSerializer::Field.preload_association( self, records, association || underscore_name, order: (!limit && params && params[:order]) || order, limit: [params && params[:limit]&.to_i, limit].compact.min ) end - data_block = lambda do |preloaded, _context, params| + data_block = lambda do |preloaded, _context, **params| records = preloaded ? preloaded[id] || [] : send(name) next records unless limit || order == :asc ArSync::CollectionWithOrder.new( @@ -80,7 +80,7 @@ def _sync_has_many(name, order: :asc, limit: nil, preload: nil, association: nil limit: [params && params[:limit]&.to_i, limit].compact.min ) end - serializer_data_block = lambda do |preloaded, _context, _params| + serializer_data_block = lambda do |preloaded, _context, **_params| preloaded ? preloaded[id] || [] : send(name) end params_type = { limit?: :int, order?: [{ :* => %w[asc desc] }, 'asc', 'desc'] } diff --git a/lib/ar_sync/instance_methods.rb b/lib/ar_sync/instance_methods.rb index ee19492..c052291 100644 --- a/lib/ar_sync/instance_methods.rb +++ b/lib/ar_sync/instance_methods.rb @@ -33,10 +33,10 @@ def _sync_current_parents_info def _serializer_field_value(name) field = self.class._serializer_field_info name preloadeds = field.preloaders.map do |preloader| - args = [[self], nil, {}] + args = [[self], nil] preloader.call(*(preloader.arity < 0 ? args : args.take(preloader.arity))) end - instance_exec(*preloadeds, nil, {}, &field.data_block) + instance_exec(*preloadeds, nil, &field.data_block) end def _sync_current_belongs_to_info