foobara-typescript-remote-command-generator 0.0.1 → 0.0.3
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/src/remote_generator/services/command_inputs_generator.rb +4 -8
- data/src/remote_generator/services/command_result_generator.rb +17 -1
- data/src/remote_generator/services/domain_generator.rb +13 -1
- data/src/remote_generator/services/error_generator.rb +1 -0
- data/src/remote_generator/services/model_generator.rb +4 -48
- data/src/remote_generator/services/type_generator.rb +112 -0
- data/src/remote_generator/services/typescript_from_manifest_base_generator.rb +29 -0
- data/templates/Type/Type.ts.erb +5 -0
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0778047e7295db9856a2f2c5907aa62e320857f514a29b68bd9eaf9a5f0c9df4'
|
4
|
+
data.tar.gz: 2a2e997115c42c315725afe2632c73359819a642d48f311d8efb14fee53798d9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cdc5356fa30759987e1d854a7aab83aa9ad0bb7dd3194aa2d8156cf9871990e2d2904bd6bd3a2f2fb487e7125fe81d6677180f85726b7887300451bb71a97b74
|
7
|
+
data.tar.gz: 1bb61a8659f0816ffa2ebbd42065b2e3f34471820012a5c5528081229d83be1e857155c4a5655457890b5c30d622340e4b68b9b8e26b6f71734f3315c62aa0c5
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## [unreleased] - 2024-08-2x
|
2
|
+
|
3
|
+
- Add type generators to command result generator
|
4
|
+
- Add type generators to domain generator
|
5
|
+
|
6
|
+
## [0.0.2] - 2024-08-21
|
7
|
+
|
8
|
+
- Add a TypeGenerator for custom non-model types
|
9
|
+
|
1
10
|
## [0.0.1] - 2024-06-17
|
2
11
|
|
3
12
|
- Add Apache-2.0 license
|
@@ -14,18 +14,14 @@ module Foobara
|
|
14
14
|
"Command/Inputs.ts.erb"
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
@
|
19
|
-
|
20
|
-
Services::EntityGenerator.new(model)
|
21
|
-
else
|
22
|
-
Services::ModelGenerator.new(model)
|
23
|
-
end
|
17
|
+
def type_generators
|
18
|
+
@type_generators ||= inputs_types_depended_on.reject(&:builtin?).uniq.map do |type|
|
19
|
+
TypeGenerator.new(type)
|
24
20
|
end
|
25
21
|
end
|
26
22
|
|
27
23
|
def dependencies
|
28
|
-
|
24
|
+
type_generators
|
29
25
|
end
|
30
26
|
end
|
31
27
|
end
|
@@ -53,6 +53,22 @@ module Foobara
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
+
def type_generators
|
57
|
+
@type_generators ||= begin
|
58
|
+
type = result_type
|
59
|
+
type = type.to_type if result_type.is_a?(Manifest::TypeDeclaration)
|
60
|
+
|
61
|
+
if !type.builtin? && !type.model?
|
62
|
+
# TODO: Test this!!
|
63
|
+
# :nocov:
|
64
|
+
[TypeGenerator.new(type)]
|
65
|
+
# :nocov:
|
66
|
+
else
|
67
|
+
[]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
56
72
|
def atom?
|
57
73
|
serializers&.any? { |s| s == "Foobara::CommandConnectors::Serializers::AtomicSerializer" }
|
58
74
|
end
|
@@ -72,7 +88,7 @@ module Foobara
|
|
72
88
|
end
|
73
89
|
|
74
90
|
def dependencies
|
75
|
-
model_generators
|
91
|
+
model_generators + type_generators
|
76
92
|
end
|
77
93
|
end
|
78
94
|
end
|
@@ -34,6 +34,18 @@ module Foobara
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
def type_generators
|
38
|
+
@type_generators ||= begin
|
39
|
+
# TODO: create a Manifest::Domain#custom_types
|
40
|
+
only_custom_types = domain_manifest.types.reject(&:model?)
|
41
|
+
only_custom_types.reject!(&:builtin?)
|
42
|
+
|
43
|
+
only_custom_types.map do |type|
|
44
|
+
TypeGenerator.new(type)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
37
49
|
def model_generators
|
38
50
|
@model_generators ||= begin
|
39
51
|
only_models = domain_manifest.models.reject(&:entity?)
|
@@ -45,7 +57,7 @@ module Foobara
|
|
45
57
|
end
|
46
58
|
|
47
59
|
def dependencies
|
48
|
-
[*command_generators, *model_generators, *entity_generators, *organization]
|
60
|
+
[*command_generators, *model_generators, *entity_generators, *type_generators, *organization]
|
49
61
|
end
|
50
62
|
|
51
63
|
def domain_name
|
@@ -1,9 +1,10 @@
|
|
1
1
|
require_relative "typescript_from_manifest_base_generator"
|
2
|
+
require_relative "type_generator"
|
2
3
|
|
3
4
|
module Foobara
|
4
5
|
module RemoteGenerator
|
5
6
|
class Services
|
6
|
-
class ModelGenerator <
|
7
|
+
class ModelGenerator < TypeGenerator
|
7
8
|
class << self
|
8
9
|
def new(relevant_manifest)
|
9
10
|
return super unless self == ModelGenerator
|
@@ -26,57 +27,12 @@ module Foobara
|
|
26
27
|
["Model", "Model.ts.erb"]
|
27
28
|
end
|
28
29
|
|
29
|
-
def scoped_full_path(points = nil)
|
30
|
-
full_path = model_manifest.scoped_full_path
|
31
|
-
|
32
|
-
if points
|
33
|
-
start_at = full_path.size - points - 1
|
34
|
-
full_path[start_at..]
|
35
|
-
else
|
36
|
-
full_path
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
30
|
def model_name(points = nil)
|
41
|
-
|
42
|
-
scoped_full_path(points).join(".")
|
43
|
-
else
|
44
|
-
scoped_path.join(".")
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# Do models have associations??
|
49
|
-
def model_generators
|
50
|
-
types_depended_on.select(&:model?).map do |model|
|
51
|
-
Services::ModelGenerator.new(model)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def dependencies
|
56
|
-
model_generators
|
31
|
+
type_name(points)
|
57
32
|
end
|
58
33
|
|
59
34
|
def model_name_downcase
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
def attributes_type_ts_type
|
64
|
-
association_depth = AssociationDepth::AMBIGUOUS
|
65
|
-
foobara_type_to_ts_type(attributes_type, association_depth:, dependency_group:)
|
66
|
-
end
|
67
|
-
|
68
|
-
def atom_attributes_ts_type
|
69
|
-
association_depth = AssociationDepth::ATOM
|
70
|
-
foobara_type_to_ts_type(attributes_type, association_depth:, dependency_group:)
|
71
|
-
end
|
72
|
-
|
73
|
-
def aggregate_attributes_ts_type
|
74
|
-
association_depth = AssociationDepth::AGGREGATE
|
75
|
-
foobara_type_to_ts_type(attributes_type, association_depth:, dependency_group:)
|
76
|
-
end
|
77
|
-
|
78
|
-
def attribute_names
|
79
|
-
attributes_type.attribute_names
|
35
|
+
type_name_downcase
|
80
36
|
end
|
81
37
|
end
|
82
38
|
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require_relative "typescript_from_manifest_base_generator"
|
2
|
+
|
3
|
+
module Foobara
|
4
|
+
module RemoteGenerator
|
5
|
+
class Services
|
6
|
+
class TypeGenerator < TypescriptFromManifestBaseGenerator
|
7
|
+
class << self
|
8
|
+
def new(relevant_manifest)
|
9
|
+
return super unless self == TypeGenerator
|
10
|
+
|
11
|
+
if relevant_manifest.entity?
|
12
|
+
EntityGenerator.new(relevant_manifest)
|
13
|
+
elsif relevant_manifest.model?
|
14
|
+
ModelGenerator.new(relevant_manifest)
|
15
|
+
else
|
16
|
+
super
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
alias type_manifest relevant_manifest
|
22
|
+
|
23
|
+
def target_path
|
24
|
+
[*domain.scoped_full_path, "types", "#{type_name}.ts"]
|
25
|
+
end
|
26
|
+
|
27
|
+
def template_path
|
28
|
+
["Type", "Type.ts.erb"]
|
29
|
+
end
|
30
|
+
|
31
|
+
def scoped_full_path(points = nil)
|
32
|
+
full_path = type_manifest.scoped_full_path
|
33
|
+
|
34
|
+
if points
|
35
|
+
start_at = full_path.size - points - 1
|
36
|
+
full_path[start_at..]
|
37
|
+
else
|
38
|
+
full_path
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def type_name(points = nil)
|
43
|
+
if points
|
44
|
+
scoped_full_path(points).join(".")
|
45
|
+
else
|
46
|
+
scoped_path.join(".")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def type_guts
|
51
|
+
guts = if declaration_data.key?("one_of")
|
52
|
+
declaration_data["one_of"].map do |enum_item|
|
53
|
+
value_to_ts_value(enum_item)
|
54
|
+
end.join(" | ")
|
55
|
+
else
|
56
|
+
# :nocov:
|
57
|
+
raise "Haven't implemented other types yet"
|
58
|
+
# :nocov:
|
59
|
+
end
|
60
|
+
|
61
|
+
if declaration_data["allows_nil"]
|
62
|
+
# TODO: add a custom type to the fixture manifest that includes allows_nil
|
63
|
+
# :nocov:
|
64
|
+
guts += " | undefined"
|
65
|
+
# :nocov:
|
66
|
+
end
|
67
|
+
|
68
|
+
guts
|
69
|
+
end
|
70
|
+
|
71
|
+
def model_generators
|
72
|
+
@model_generators ||= types_depended_on.select(&:model?).map do |model|
|
73
|
+
Services::ModelGenerator.new(model)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def custom_type_generators
|
78
|
+
@custom_type_generators ||= types_depended_on.reject(&:builtin?).reject(&:model?).map do |type|
|
79
|
+
Services::TypeGenerator.new(type)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def dependencies
|
84
|
+
custom_type_generators + model_generators
|
85
|
+
end
|
86
|
+
|
87
|
+
def type_name_downcase
|
88
|
+
type_name[0].downcase + type_name[1..]
|
89
|
+
end
|
90
|
+
|
91
|
+
def attributes_type_ts_type
|
92
|
+
association_depth = AssociationDepth::AMBIGUOUS
|
93
|
+
foobara_type_to_ts_type(attributes_type, association_depth:, dependency_group:)
|
94
|
+
end
|
95
|
+
|
96
|
+
def atom_attributes_ts_type
|
97
|
+
association_depth = AssociationDepth::ATOM
|
98
|
+
foobara_type_to_ts_type(attributes_type, association_depth:, dependency_group:)
|
99
|
+
end
|
100
|
+
|
101
|
+
def aggregate_attributes_ts_type
|
102
|
+
association_depth = AssociationDepth::AGGREGATE
|
103
|
+
foobara_type_to_ts_type(attributes_type, association_depth:, dependency_group:)
|
104
|
+
end
|
105
|
+
|
106
|
+
def attribute_names
|
107
|
+
attributes_type.attribute_names
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -66,6 +66,8 @@ module Foobara
|
|
66
66
|
Services::ProcessorClassGenerator
|
67
67
|
when Manifest::RootManifest
|
68
68
|
Services::RootManifestGenerator
|
69
|
+
when Manifest::Type
|
70
|
+
Services::TypeGenerator
|
69
71
|
else
|
70
72
|
# :nocov:
|
71
73
|
raise "Not sure how build a generator for a #{manifest}"
|
@@ -224,6 +226,10 @@ module Foobara
|
|
224
226
|
else
|
225
227
|
if type_declaration.model?
|
226
228
|
model_to_ts_model_name(type_declaration, association_depth:, initial:)
|
229
|
+
elsif can_convert_type_declaration_to_ts_type?(type_declaration)
|
230
|
+
type = type_declaration.to_type
|
231
|
+
|
232
|
+
custom_type_to_ts_type_name(type)
|
227
233
|
end
|
228
234
|
end
|
229
235
|
end
|
@@ -245,6 +251,22 @@ module Foobara
|
|
245
251
|
end
|
246
252
|
end
|
247
253
|
|
254
|
+
def can_convert_type_declaration_to_ts_type?(type_declaration)
|
255
|
+
type = type_declaration.to_type
|
256
|
+
|
257
|
+
return false if BuiltinTypes.builtin_reference?(type.reference)
|
258
|
+
|
259
|
+
allowed_keys = %w[type one_of allows_nil]
|
260
|
+
|
261
|
+
declaration_data = type.declaration_data
|
262
|
+
|
263
|
+
bad_keys = declaration_data.keys - allowed_keys
|
264
|
+
|
265
|
+
return false unless bad_keys.empty?
|
266
|
+
|
267
|
+
BuiltinTypes.builtin_reference?(declaration_data["type"])
|
268
|
+
end
|
269
|
+
|
248
270
|
def attributes_to_ts_type(attributes, dependency_group:, association_depth: AssociationDepth::AMBIGUOUS)
|
249
271
|
guts = attributes.attribute_declarations.map do |attribute_name, attribute_declaration|
|
250
272
|
" #{attribute_name}#{"?" unless attributes.required?(attribute_name)}: #{
|
@@ -280,6 +302,13 @@ module Foobara
|
|
280
302
|
dependency_group.non_colliding_type(generator)
|
281
303
|
end
|
282
304
|
|
305
|
+
def custom_type_to_ts_type_name(type)
|
306
|
+
type = type.to_type if type.is_a?(Manifest::TypeDeclaration)
|
307
|
+
generator = TypeGenerator.new(type)
|
308
|
+
|
309
|
+
dependency_group.non_colliding_type(generator)
|
310
|
+
end
|
311
|
+
|
283
312
|
def ==(other)
|
284
313
|
self.class == other.class && path == other.path && root_manifest == other.root_manifest
|
285
314
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foobara-typescript-remote-command-generator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miles Georgi
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-08-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: foobara
|
@@ -38,7 +38,7 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
description:
|
41
|
+
description:
|
42
42
|
email:
|
43
43
|
- azimux@gmail.com
|
44
44
|
executables: []
|
@@ -82,6 +82,7 @@ files:
|
|
82
82
|
- src/remote_generator/services/organization_manifest_generator.rb
|
83
83
|
- src/remote_generator/services/processor_class_generator.rb
|
84
84
|
- src/remote_generator/services/root_manifest_generator.rb
|
85
|
+
- src/remote_generator/services/type_generator.rb
|
85
86
|
- src/remote_generator/services/typescript_from_manifest_base_generator.rb
|
86
87
|
- src/remote_generator/services/unloaded_entity_generator.rb
|
87
88
|
- src/remote_generator/write_typescript_to_disk.rb
|
@@ -105,6 +106,7 @@ files:
|
|
105
106
|
- templates/ModelVariants.ts.erb
|
106
107
|
- templates/Organization.ts.erb
|
107
108
|
- templates/Organization/config.ts.erb
|
109
|
+
- templates/Type/Type.ts.erb
|
108
110
|
- templates/base/DataPath.ts
|
109
111
|
- templates/base/Entity.ts
|
110
112
|
- templates/base/Error.ts
|
@@ -120,7 +122,7 @@ metadata:
|
|
120
122
|
source_code_uri: https://github.com/foobara/typescript-remote-command-generator
|
121
123
|
changelog_uri: https://github.com/foobara/typescript-remote-command-generator/CHANGELOG.md
|
122
124
|
rubygems_mfa_required: 'true'
|
123
|
-
post_install_message:
|
125
|
+
post_install_message:
|
124
126
|
rdoc_options: []
|
125
127
|
require_paths:
|
126
128
|
- lib
|
@@ -136,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
138
|
version: '0'
|
137
139
|
requirements: []
|
138
140
|
rubygems_version: 3.4.10
|
139
|
-
signing_key:
|
141
|
+
signing_key:
|
140
142
|
specification_version: 4
|
141
143
|
summary: Generates remote commands for Typescript from a foobara manifest
|
142
144
|
test_files: []
|