foobara-typescript-remote-command-generator 1.2.6 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/lib/foobara/typescript_remote_command_generator.rb +1 -6
  4. data/src/{remote_generator/generate_typescript.rb → generate_typescript.rb} +13 -4
  5. data/src/{remote_generator/services → generators}/aggregate_entity_generator.rb +2 -2
  6. data/src/{remote_generator/services → generators}/aggregate_model_generator.rb +3 -3
  7. data/src/{remote_generator/services → generators}/atom_entity_generator.rb +3 -3
  8. data/src/{remote_generator/services → generators}/atom_model_generator.rb +3 -3
  9. data/src/{remote_generator/services → generators}/auth/access_tokens_generator.rb +1 -1
  10. data/src/generators/auth/login_command_generator.rb +29 -0
  11. data/src/{remote_generator/services → generators}/auth/login_generator.rb +4 -2
  12. data/src/generators/auth/logout_command_generator.rb +29 -0
  13. data/src/{remote_generator/services → generators}/auth/logout_generator.rb +4 -2
  14. data/src/{remote_generator/services → generators}/auth/refresh_login_generator.rb +4 -2
  15. data/src/generators/auth/requires_auth_command_generator.rb +27 -0
  16. data/src/{remote_generator/services → generators}/auth/requires_auth_generator.rb +4 -2
  17. data/src/{remote_generator/services → generators}/command_cast_result_generator.rb +33 -25
  18. data/src/{remote_generator/services → generators}/command_errors_generator.rb +2 -2
  19. data/src/{remote_generator/services → generators}/command_errors_index_generator.rb +1 -1
  20. data/src/generators/command_generator.rb +209 -0
  21. data/src/{remote_generator/services → generators}/command_inputs_generator.rb +1 -1
  22. data/src/{remote_generator/services → generators}/command_manifest_generator.rb +1 -1
  23. data/src/{remote_generator/services → generators}/command_result_generator.rb +1 -1
  24. data/src/{remote_generator/services → generators}/dependency_group.rb +2 -2
  25. data/src/{remote_generator/services → generators}/domain_config_generator.rb +1 -1
  26. data/src/{remote_generator/services → generators}/domain_generator.rb +1 -1
  27. data/src/{remote_generator/services → generators}/domain_manifest_generator.rb +1 -1
  28. data/src/{remote_generator/services → generators}/entity_generator.rb +1 -1
  29. data/src/{remote_generator/services → generators}/entity_manifest_generator.rb +1 -1
  30. data/src/{remote_generator/services → generators}/entity_variants_generator.rb +1 -1
  31. data/src/{remote_generator/services → generators}/error_generator.rb +1 -1
  32. data/src/{remote_generator/services → generators}/loaded_entity_generator.rb +1 -1
  33. data/src/{remote_generator/services → generators}/manifest_generator.rb +1 -1
  34. data/src/{remote_generator/services → generators}/model_generator.rb +1 -1
  35. data/src/{remote_generator/services → generators}/model_manifest_generator.rb +1 -1
  36. data/src/{remote_generator/services → generators}/model_variants_generator.rb +1 -1
  37. data/src/{remote_generator/services → generators}/organization_config_generator.rb +1 -1
  38. data/src/{remote_generator/services → generators}/organization_generator.rb +1 -1
  39. data/src/{remote_generator/services → generators}/organization_manifest_generator.rb +1 -1
  40. data/src/{remote_generator/services → generators}/processor_class_generator.rb +1 -1
  41. data/src/generators/remote_command_generator.rb +41 -0
  42. data/src/{remote_generator/services → generators}/root_manifest_generator.rb +1 -1
  43. data/src/{remote_generator/services → generators}/type_generator.rb +3 -3
  44. data/src/{remote_generator/services → generators}/typescript_from_manifest_base_generator.rb +42 -38
  45. data/src/{remote_generator/services → generators}/unloaded_entity_generator.rb +1 -1
  46. data/src/remote_generator.rb +21 -0
  47. data/src/{remote_generator/write_typescript_to_disk.rb → write_typescript_to_disk.rb} +10 -1
  48. data/templates/Command.ts.erb +39 -1
  49. data/templates/base/{RemoteCommand.ts → RemoteCommand.ts.erb} +28 -0
  50. metadata +46 -45
  51. data/src/remote_generator/services/auth/login_command_generator.rb +0 -17
  52. data/src/remote_generator/services/auth/logout_command_generator.rb +0 -17
  53. data/src/remote_generator/services/auth/requires_auth_command_generator.rb +0 -15
  54. data/src/remote_generator/services/command_generator.rb +0 -87
  55. /data/src/{remote_generator/association_depth.rb → association_depth.rb} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e9da9e5402f377488227d8a3d9911e0b5aaecb17c377e7209668993fcac7580
4
- data.tar.gz: 7910689c819504d3d902ee61b433f1b10765c67b75f24cfad052f55141a89c8f
3
+ metadata.gz: 63a56366d8d763f7a5945acb31f26942889b8801d87d473f1cf80670492984ea
4
+ data.tar.gz: f743ce22ffdf47ece2df4d68763a76c959072098fb50c2314da236c667cbc7e6
5
5
  SHA512:
6
- metadata.gz: fd073a89e550986306bcf2ba57d2cb5c7bf7b13e0d3c244517e09223b9106000c429cec615e4f985359f6548c7aca8b3533e7bf0f4e53dd777228a4bb999367b
7
- data.tar.gz: 36dd52e22fbaf4c2cc193fa67ac7a7de8126e75b950a4850e9c1d896bf7e814ba4eb8b4b4936879d8cf8d508e5584153ccedad726834e13a76c6a9a6d55f1e44
6
+ metadata.gz: 3296bab04a57c964281ee3e8b5e4b5db4f3cda345bfbbbf6c9667cbc1eba4cd2e75266a1be6d9cc38836d44b310355201f4590bec04fcf87a33f96e7e988c6fd
7
+ data.tar.gz: 18a1e5716e44579286b0251cbc9b30fc4814c5c7033578ff33d00b91a6640e7e20042acc0a93ded4ff2cc4d001c310f605a3eed448c839d7391b40dad0abf6ea
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## [1.3.0] - 2026-02-26
2
+
3
+ - Add auto-dirty queries feature
4
+
5
+ ## [1.2.7] - 2026-02-16
6
+
7
+ - Make generated castJsonResult.ts files undefined-safe
8
+
1
9
  ## [1.2.6] - 2026-02-16
2
10
 
3
11
  - Make use of guaranteed_to_exist to avoid marking present delegates as optional
@@ -5,9 +5,4 @@ require "erb"
5
5
  require "json"
6
6
  require "open-uri"
7
7
 
8
- src = "#{__dir__}/../../src/"
9
-
10
- Foobara::Util.require_directory(src)
11
-
12
- module TypescriptRemoteCommandGenerator
13
- end
8
+ Foobara::Util.require_directory("#{__dir__}/../../src/")
@@ -8,8 +8,11 @@ module Foobara
8
8
 
9
9
  possible_error MissingManifestError
10
10
 
11
- inputs raw_manifest: :associative_array,
12
- manifest_url: :string
11
+ inputs do
12
+ raw_manifest :associative_array
13
+ manifest_url :string
14
+ auto_dirty_queries :boolean, default: false
15
+ end
13
16
 
14
17
  def execute
15
18
  load_manifest_if_needed
@@ -38,11 +41,11 @@ module Foobara
38
41
  attr_accessor :command_manifest, :manifest_data
39
42
 
40
43
  def base_generator
41
- Services::TypescriptFromManifestBaseGenerator
44
+ Generators::TypescriptFromManifestBaseGenerator
42
45
  end
43
46
 
44
47
  def templates_dir
45
- "#{__dir__}/../../templates"
48
+ "#{__dir__}/../templates"
46
49
  end
47
50
 
48
51
  def load_manifest_if_needed
@@ -74,6 +77,12 @@ module Foobara
74
77
  end
75
78
  end
76
79
 
80
+ def generate_element
81
+ RemoteGenerator.auto_dirty_queries(auto_dirty_queries) do
82
+ super
83
+ end
84
+ end
85
+
77
86
  def add_root_manifest_to_set_of_elements_to_generate
78
87
  elements_to_generate << manifest
79
88
  end
@@ -2,7 +2,7 @@ require_relative "loaded_entity_generator"
2
2
 
3
3
  module Foobara
4
4
  module RemoteGenerator
5
- class Services
5
+ module Generators
6
6
  class AggregateEntityGenerator < LoadedEntityGenerator
7
7
  class << self
8
8
  def new(relevant_manifest)
@@ -26,7 +26,7 @@ module Foobara
26
26
 
27
27
  def model_generators
28
28
  @model_generators ||= types_depended_on.select(&:model?).map do |model|
29
- Services::AggregateModelGenerator.new(model)
29
+ AggregateModelGenerator.new(model)
30
30
  end
31
31
  end
32
32
 
@@ -1,6 +1,6 @@
1
1
  module Foobara
2
2
  module RemoteGenerator
3
- class Services
3
+ module Generators
4
4
  class AggregateModelGenerator < ModelGenerator
5
5
  class << self
6
6
  def new(relevant_manifest)
@@ -27,9 +27,9 @@ module Foobara
27
27
  def model_generators
28
28
  @model_generators ||= types_depended_on.select(&:model?).map do |model|
29
29
  if model.detached_entity?
30
- Services::AggregateEntityGenerator.new(model)
30
+ AggregateEntityGenerator.new(model)
31
31
  else
32
- Services::AggregateModelGenerator.new(model)
32
+ AggregateModelGenerator.new(model)
33
33
  end
34
34
  end
35
35
  end
@@ -1,6 +1,6 @@
1
1
  module Foobara
2
2
  module RemoteGenerator
3
- class Services
3
+ module Generators
4
4
  class AtomEntityGenerator < LoadedEntityGenerator
5
5
  class << self
6
6
  def new(relevant_manifest)
@@ -25,9 +25,9 @@ module Foobara
25
25
  def model_generators
26
26
  @model_generators ||= types_depended_on.select(&:model?).map do |model|
27
27
  if model.detached_entity?
28
- Services::UnloadedEntityGenerator.new(model)
28
+ UnloadedEntityGenerator.new(model)
29
29
  else
30
- Services::AtomModelGenerator.new(model)
30
+ AtomModelGenerator.new(model)
31
31
  end
32
32
  end
33
33
  end
@@ -1,6 +1,6 @@
1
1
  module Foobara
2
2
  module RemoteGenerator
3
- class Services
3
+ module Generators
4
4
  class AtomModelGenerator < ModelGenerator
5
5
  class << self
6
6
  def new(relevant_manifest)
@@ -27,9 +27,9 @@ module Foobara
27
27
  def model_generators
28
28
  @model_generators ||= types_depended_on.select(&:model?).map do |model|
29
29
  if model.detached_entity?
30
- Services::UnloadedEntityGenerator.new(model)
30
+ UnloadedEntityGenerator.new(model)
31
31
  else
32
- Services::AtomModelGenerator.new(model)
32
+ AtomModelGenerator.new(model)
33
33
  end
34
34
  end
35
35
  end
@@ -1,6 +1,6 @@
1
1
  module Foobara
2
2
  module RemoteGenerator
3
- class Services
3
+ module Generators
4
4
  module Auth
5
5
  class AccessTokensGenerator < TypescriptFromManifestBaseGenerator
6
6
  def template_path
@@ -0,0 +1,29 @@
1
+ module Foobara
2
+ module RemoteGenerator
3
+ module Generators
4
+ module Auth
5
+ class LoginCommandGenerator < TypescriptFromManifestBaseGenerator
6
+ def import_destructure
7
+ ts_instance_path.first
8
+ end
9
+
10
+ def ts_instance_path
11
+ ["LoginCommand"]
12
+ end
13
+
14
+ def ts_instance_full_path
15
+ ["Foobara", "Auth", "LoginCommand"]
16
+ end
17
+
18
+ def template_path
19
+ ["Foobara", "Auth", "LoginCommand.ts.erb"]
20
+ end
21
+
22
+ def dependencies
23
+ super + [AccessTokensGenerator.new(relevant_manifest)]
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,6 +1,6 @@
1
1
  module Foobara
2
2
  module RemoteGenerator
3
- class Services
3
+ module Generators
4
4
  module Auth
5
5
  class LoginGenerator < CommandGenerator
6
6
  def base_class_path
@@ -8,7 +8,9 @@ module Foobara
8
8
  end
9
9
 
10
10
  def dependencies
11
- super + [LoginCommandGenerator.new(relevant_manifest)]
11
+ super.reject do |generator|
12
+ generator.is_a?(RemoteCommandGenerator)
13
+ end + [LoginCommandGenerator.new(relevant_manifest)]
12
14
  end
13
15
  end
14
16
  end
@@ -0,0 +1,29 @@
1
+ module Foobara
2
+ module RemoteGenerator
3
+ module Generators
4
+ module Auth
5
+ class LogoutCommandGenerator < TypescriptFromManifestBaseGenerator
6
+ def import_destructure
7
+ ts_instance_path.first
8
+ end
9
+
10
+ def ts_instance_path
11
+ ["LogoutCommand"]
12
+ end
13
+
14
+ def ts_instance_full_path
15
+ ["Foobara", "Auth", "LogoutCommand"]
16
+ end
17
+
18
+ def template_path
19
+ ["Foobara", "Auth", "LogoutCommand.ts.erb"]
20
+ end
21
+
22
+ def dependencies
23
+ super + [AccessTokensGenerator.new(relevant_manifest)]
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,6 +1,6 @@
1
1
  module Foobara
2
2
  module RemoteGenerator
3
- class Services
3
+ module Generators
4
4
  module Auth
5
5
  class LogoutGenerator < CommandGenerator
6
6
  def base_class_path
@@ -8,7 +8,9 @@ module Foobara
8
8
  end
9
9
 
10
10
  def dependencies
11
- super + [LogoutCommandGenerator.new(relevant_manifest)]
11
+ super.reject do |generator|
12
+ generator.is_a?(RemoteCommandGenerator)
13
+ end + [LogoutCommandGenerator.new(relevant_manifest)]
12
14
  end
13
15
  end
14
16
  end
@@ -2,7 +2,7 @@ require_relative "../command_generator"
2
2
 
3
3
  module Foobara
4
4
  module RemoteGenerator
5
- class Services
5
+ module Generators
6
6
  module Auth
7
7
  class RefreshLoginGenerator < CommandGenerator
8
8
  def base_class_path
@@ -10,7 +10,9 @@ module Foobara
10
10
  end
11
11
 
12
12
  def dependencies
13
- super + [LoginCommandGenerator.new(relevant_manifest)]
13
+ super.reject do |generator|
14
+ generator.is_a?(RemoteCommandGenerator)
15
+ end + [LoginCommandGenerator.new(relevant_manifest)]
14
16
  end
15
17
  end
16
18
  end
@@ -0,0 +1,27 @@
1
+ require_relative "../typescript_from_manifest_base_generator"
2
+
3
+ module Foobara
4
+ module RemoteGenerator
5
+ module Generators
6
+ module Auth
7
+ class RequiresAuthCommandGenerator < TypescriptFromManifestBaseGenerator
8
+ def import_destructure
9
+ ts_instance_path.first
10
+ end
11
+
12
+ def ts_instance_path
13
+ ["RequiresAuthCommand"]
14
+ end
15
+
16
+ def ts_instance_full_path
17
+ ["Foobara", "Auth", "RequiresAuthCommand"]
18
+ end
19
+
20
+ def template_path
21
+ ["Foobara", "Auth", "RequiresAuthCommand.ts.erb"]
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -2,7 +2,7 @@ require_relative "../command_generator"
2
2
 
3
3
  module Foobara
4
4
  module RemoteGenerator
5
- class Services
5
+ module Generators
6
6
  module Auth
7
7
  class RequiresAuthGenerator < CommandGenerator
8
8
  def base_class_path
@@ -10,7 +10,9 @@ module Foobara
10
10
  end
11
11
 
12
12
  def dependencies
13
- super + [RequiresAuthCommandGenerator.new(relevant_manifest)]
13
+ super.reject do |generator|
14
+ generator.is_a?(RemoteCommandGenerator)
15
+ end + [RequiresAuthCommandGenerator.new(relevant_manifest)]
14
16
  end
15
17
  end
16
18
  end
@@ -2,7 +2,7 @@ require_relative "command_result_generator"
2
2
 
3
3
  module Foobara
4
4
  module RemoteGenerator
5
- class Services
5
+ module Generators
6
6
  class CommandCastResultGenerator < CommandResultGenerator
7
7
  class CastTree
8
8
  attr_accessor :children, :declaration_to_cast, :initial
@@ -43,20 +43,20 @@ module Foobara
43
43
 
44
44
  if result_type.detached_entity? && atom?
45
45
  declaration = result_type.is_a?(Manifest::TypeDeclaration) ? result_type.to_type : result_type
46
- return @nested_model_generators = Set[Services::AtomEntityGenerator.new(declaration)]
46
+ return @nested_model_generators = Set[AtomEntityGenerator.new(declaration)]
47
47
  end
48
48
 
49
49
  _models_reachable_from_declaration(result_type, initial: true)&.each do |model|
50
50
  generator_class = if atom?
51
51
  if model.detached_entity?
52
- Services::UnloadedEntityGenerator
52
+ UnloadedEntityGenerator
53
53
  else
54
- Services::AtomModelGenerator
54
+ AtomModelGenerator
55
55
  end
56
56
  elsif aggregate?
57
- Services::AggregateModelGenerator
57
+ AggregateModelGenerator
58
58
  else
59
- Services::ModelGenerator
59
+ ModelGenerator
60
60
  end
61
61
 
62
62
  new_generator = generator_class.new(model)
@@ -116,24 +116,24 @@ module Foobara
116
116
  value: "element")
117
117
  result << "})"
118
118
  elsif child_cast_tree.is_a?(::Hash)
119
- # TODO: either test this codepath or delete it
119
+ # TODO: either test this code path or delete it
120
120
  # :nocov:
121
121
  property = path_part =~ /\A\d+\z/ ? path_part.to_i : "\"#{path_part}\""
122
122
 
123
123
  result << cast_json_result_function_body(child_cast_tree,
124
124
  parent:,
125
125
  property:,
126
- value: "#{parent}.#{path_part}")
126
+ value: "#{parent}?.#{path_part}")
127
127
  # :nocov:
128
128
  elsif child_cast_tree.is_a?(CastTree)
129
129
  result << cast_json_result_function_body(child_cast_tree.children,
130
- parent: "#{parent}.#{path_part}")
130
+ parent: "#{parent}?.#{path_part}")
131
131
 
132
132
  property = path_part =~ /\A\d+\z/ ? path_part.to_i : "\"#{path_part}\""
133
133
  result << _ts_cast_expression(child_cast_tree,
134
134
  parent:,
135
135
  property:,
136
- value: "#{parent}.#{path_part}")
136
+ value: "#{parent}?.#{path_part}")
137
137
  else
138
138
  # :nocov:
139
139
  raise "Not sure how to handle a #{cast_tree.class}: #{cast_tree}"
@@ -164,9 +164,9 @@ module Foobara
164
164
  if property.nil?
165
165
  parent
166
166
  elsif property =~ /\A"(.*)"\z/
167
- "#{parent}.#{$1}"
167
+ "#{parent}?.#{$1}"
168
168
  else
169
- "#{parent}[#{property}]"
169
+ "#{parent}?.[#{property}]"
170
170
  end
171
171
  else
172
172
  # TODO: either test this path or raise
@@ -183,21 +183,29 @@ module Foobara
183
183
 
184
184
  type_symbol = type.type_symbol
185
185
 
186
- value ||= lvalue
186
+ value ||= lvalue.dup
187
+ lvalue = lvalue.gsub("?.[", "[").gsub("?.", ".")
188
+ present_value = value.gsub("?.[", "[").gsub("?.", ".")
187
189
 
188
- if type_symbol == :date || type_symbol == :datetime
189
- "#{lvalue} = new Date(#{value})"
190
- elsif type.model?
191
- ts_model_name = model_to_ts_model_name(type,
192
- association_depth:,
193
- initial: cast_tree.initial)
190
+ expression = "if (#{value} !== undefined) {\n"
194
191
 
195
- "#{lvalue} = new #{ts_model_name}(#{value})"
196
- else
197
- # :nocov:
198
- raise "Not sure how to cast type #{type} to a Typescript expression"
199
- # :nocov:
200
- end
192
+ expression += if type_symbol == :date || type_symbol == :datetime
193
+ "#{lvalue} = new Date(#{present_value})"
194
+ elsif type.model?
195
+ ts_model_name = model_to_ts_model_name(type,
196
+ association_depth:,
197
+ initial: cast_tree.initial)
198
+
199
+ "#{lvalue} = new #{ts_model_name}(#{present_value})"
200
+ else
201
+ # :nocov:
202
+ raise "Not sure how to cast type #{type} to a Typescript expression"
203
+ # :nocov:
204
+ end
205
+
206
+ expression += "\n}"
207
+
208
+ expression
201
209
  end
202
210
 
203
211
  def _construct_cast_tree(type_declaration, initial: false)
@@ -3,7 +3,7 @@ require_relative "command_generator"
3
3
 
4
4
  module Foobara
5
5
  module RemoteGenerator
6
- class Services
6
+ module Generators
7
7
  class CommandErrorsGenerator < CommandGenerator
8
8
  alias command_manifest relevant_manifest
9
9
 
@@ -21,7 +21,7 @@ module Foobara
21
21
 
22
22
  def error_generators
23
23
  @error_generators ||= possible_errors.values.map(&:error).sort_by(&:error_name).uniq.map do |error|
24
- Services::ErrorGenerator.new(error)
24
+ ErrorGenerator.new(error)
25
25
  end
26
26
  end
27
27
 
@@ -2,7 +2,7 @@ require_relative "command_errors_generator"
2
2
 
3
3
  module Foobara
4
4
  module RemoteGenerator
5
- class Services
5
+ module Generators
6
6
  class CommandErrorsIndexGenerator < CommandErrorsGenerator
7
7
  alias command_manifest relevant_manifest
8
8