ar_sync 1.0.1 → 1.0.2
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/Gemfile.lock +5 -2
- data/README.md +6 -6
- data/ar_sync.gemspec +2 -2
- data/bin/console +1 -2
- data/core/ActioncableAdapter.d.ts +26 -2
- data/core/ActioncableAdapter.js +3 -3
- data/core/ArSyncApi.d.ts +7 -4
- data/core/ArSyncApi.js +9 -4
- data/core/{ArSyncModelBase.d.ts → ArSyncModel.d.ts} +13 -18
- data/core/{ArSyncModelBase.js → ArSyncModel.js} +33 -10
- data/{graph → core}/ArSyncStore.d.ts +3 -3
- data/{graph → core}/ArSyncStore.js +188 -57
- data/core/DataType.d.ts +17 -13
- data/core/hooks.d.ts +28 -0
- data/core/hooks.js +105 -0
- data/index.d.ts +2 -0
- data/index.js +6 -0
- data/lib/ar_sync.rb +1 -18
- data/lib/ar_sync/class_methods.rb +31 -89
- data/lib/ar_sync/collection.rb +4 -29
- data/lib/ar_sync/core.rb +35 -67
- data/lib/ar_sync/instance_methods.rb +40 -86
- data/lib/ar_sync/rails.rb +18 -27
- data/lib/ar_sync/type_script.rb +39 -18
- data/lib/ar_sync/version.rb +1 -1
- data/lib/generators/ar_sync/install/install_generator.rb +33 -32
- data/lib/generators/ar_sync/types/types_generator.rb +6 -3
- data/package-lock.json +21 -10
- data/package.json +1 -1
- data/src/core/ActioncableAdapter.ts +28 -3
- data/src/core/ArSyncApi.ts +8 -4
- data/src/core/{ArSyncModelBase.ts → ArSyncModel.ts} +51 -20
- data/src/{graph → core}/ArSyncStore.ts +199 -84
- data/src/core/DataType.ts +33 -20
- data/src/core/hooks.ts +108 -0
- data/src/index.ts +2 -0
- data/vendor/assets/javascripts/{ar_sync_tree.js.erb → ar_sync.js.erb} +6 -7
- metadata +33 -38
- data/core/hooksBase.d.ts +0 -29
- data/core/hooksBase.js +0 -80
- data/graph/ArSyncModel.d.ts +0 -10
- data/graph/ArSyncModel.js +0 -22
- data/graph/hooks.d.ts +0 -3
- data/graph/hooks.js +0 -10
- data/graph/index.d.ts +0 -2
- data/graph/index.js +0 -4
- data/src/core/hooksBase.ts +0 -86
- data/src/graph/ArSyncModel.ts +0 -21
- data/src/graph/hooks.ts +0 -7
- data/src/graph/index.ts +0 -2
- data/src/tree/ArSyncModel.ts +0 -145
- data/src/tree/ArSyncStore.ts +0 -323
- data/src/tree/hooks.ts +0 -7
- data/src/tree/index.ts +0 -2
- data/tree/ArSyncModel.d.ts +0 -39
- data/tree/ArSyncModel.js +0 -143
- data/tree/ArSyncStore.d.ts +0 -21
- data/tree/ArSyncStore.js +0 -365
- data/tree/hooks.d.ts +0 -3
- data/tree/hooks.js +0 -10
- data/tree/index.d.ts +0 -2
- data/tree/index.js +0 -4
- data/vendor/assets/javascripts/ar_sync_graph.js.erb +0 -17
data/lib/ar_sync/core.rb
CHANGED
@@ -4,14 +4,9 @@ require_relative 'class_methods'
|
|
4
4
|
require_relative 'instance_methods'
|
5
5
|
|
6
6
|
module ArSync
|
7
|
-
ArSync::
|
7
|
+
ArSync::ModelBase.module_eval do
|
8
8
|
extend ActiveSupport::Concern
|
9
|
-
include ArSync::
|
10
|
-
end
|
11
|
-
|
12
|
-
ArSync::GraphSync.module_eval do
|
13
|
-
extend ActiveSupport::Concern
|
14
|
-
include ArSync::GraphSync::InstanceMethods
|
9
|
+
include ArSync::ModelBase::InstanceMethods
|
15
10
|
end
|
16
11
|
|
17
12
|
def self.on_notification(&block)
|
@@ -41,20 +36,15 @@ module ArSync
|
|
41
36
|
Thread.current[key] = flag_was
|
42
37
|
end
|
43
38
|
|
44
|
-
def self.
|
45
|
-
key = sync_key to,
|
46
|
-
|
47
|
-
|
48
|
-
if
|
49
|
-
|
50
|
-
|
51
|
-
@sync_send_block&.call [event]
|
39
|
+
def self.sync_send(to:, action:, model:, path: nil, field: nil, to_user: nil)
|
40
|
+
key = sync_key to, to_user, signature: false
|
41
|
+
e = { action: action }
|
42
|
+
e[:field] = field if field
|
43
|
+
if model
|
44
|
+
e[:class_name] = model.class.base_class.name
|
45
|
+
e[:id] = model.id
|
52
46
|
end
|
53
|
-
|
54
|
-
|
55
|
-
def self.sync_graph_send(to:, action:, model:, path: nil, to_user: nil)
|
56
|
-
key = sync_graph_key to, to_user, signature: false
|
57
|
-
event = ["#{key}#{path}", action: action, class_name: model.class.base_class.name, id: model.id]
|
47
|
+
event = ["#{key}#{path}", e]
|
58
48
|
buffer = Thread.current[:ar_sync_compact_notifications]
|
59
49
|
if buffer
|
60
50
|
buffer << event
|
@@ -63,23 +53,20 @@ module ArSync
|
|
63
53
|
end
|
64
54
|
end
|
65
55
|
|
66
|
-
def self.
|
67
|
-
sync_key(model,
|
68
|
-
end
|
69
|
-
|
70
|
-
def self.sync_graph_keys(model, user)
|
71
|
-
[sync_graph_key(model), sync_graph_key(model, user)]
|
56
|
+
def self.sync_keys(model, user)
|
57
|
+
[sync_key(model), sync_key(model, user)]
|
72
58
|
end
|
73
59
|
|
74
|
-
def self.sync_key(model,
|
60
|
+
def self.sync_key(model, to_user = nil, signature: true)
|
75
61
|
if model.is_a? ArSync::Collection
|
76
|
-
key = [to_user&.id, model.klass.name, model.name
|
62
|
+
key = [to_user&.id, model.klass.name, model.name].join '/'
|
77
63
|
else
|
78
|
-
key = [to_user&.id, model.class.name, model.id
|
64
|
+
key = [to_user&.id, model.class.name, model.id].join '/'
|
79
65
|
end
|
80
66
|
key = Digest::SHA256.hexdigest("#{config.key_secret}#{key}")[0, 32] if config.key_secret
|
81
67
|
key = "#{config.key_prefix}#{key}" if config.key_prefix
|
82
|
-
signature && config.key_expires_in ? signed_key(key, Time.now.to_i.to_s) : key
|
68
|
+
key = signature && config.key_expires_in ? signed_key(key, Time.now.to_i.to_s) : key
|
69
|
+
key + ';/'
|
83
70
|
end
|
84
71
|
|
85
72
|
def self.validate_expiration(signed_key)
|
@@ -94,45 +81,26 @@ module ArSync
|
|
94
81
|
"#{key};#{time};#{Digest::SHA256.hexdigest("#{config.key_secret}#{key};#{time}")[0, 16]}"
|
95
82
|
end
|
96
83
|
|
97
|
-
def self.
|
98
|
-
|
99
|
-
keys = paths.flat_map do |path|
|
100
|
-
[sync_key(collection, path), sync_key(collection, path, current_user)]
|
101
|
-
end
|
102
|
-
{
|
103
|
-
keys: keys,
|
104
|
-
data: serialize(collection.to_a, args, user: current_user)
|
105
|
-
}
|
106
|
-
end
|
107
|
-
|
108
|
-
def self.sync_api(model, current_user, args)
|
109
|
-
paths = _extract_paths args
|
110
|
-
keys = paths.flat_map do |path|
|
111
|
-
[sync_key(model, path), sync_key(model, path, current_user)]
|
112
|
-
end
|
113
|
-
{
|
114
|
-
keys: keys,
|
115
|
-
data: serialize(model, args, user: current_user)
|
116
|
-
}
|
84
|
+
def self.serialize(record_or_records, query, user: nil)
|
85
|
+
ArSerializer.serialize record_or_records, query, context: user, include_id: true, use: :sync
|
117
86
|
end
|
118
87
|
|
119
|
-
def self.
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
88
|
+
def self.sync_serialize(target, user, query)
|
89
|
+
case target
|
90
|
+
when ArSync::Collection, ArSync::ModelBase
|
91
|
+
serialized = ArSerializer.serialize target, query, context: user, include_id: true, use: :sync
|
92
|
+
return serialized if target.is_a? ArSync::ModelBase
|
93
|
+
{
|
94
|
+
sync_keys: ArSync.sync_keys(target, user),
|
95
|
+
order: { mode: target.order, limit: target.limit },
|
96
|
+
collection: serialized
|
97
|
+
}
|
98
|
+
when ActiveRecord::Relation, Array
|
99
|
+
ArSync.serialize target.to_a, query, user: user
|
100
|
+
when ArSerializer::Serializable
|
101
|
+
ArSync.serialize target, query, user: user
|
102
|
+
else
|
103
|
+
target
|
130
104
|
end
|
131
|
-
extract.call [], parsed[:attributes]
|
132
|
-
paths
|
133
|
-
end
|
134
|
-
|
135
|
-
def self.serialize(record_or_records, query, user: nil)
|
136
|
-
ArSerializer.serialize record_or_records, query, context: user, include_id: true, use: :sync
|
137
105
|
end
|
138
106
|
end
|
@@ -1,83 +1,31 @@
|
|
1
|
-
module ArSync::
|
1
|
+
module ArSync::ModelBase::InstanceMethods
|
2
2
|
def _sync_notify(action)
|
3
|
-
if self.class._sync_self?
|
4
|
-
data = action == :destroy ? nil : _sync_data
|
5
|
-
ArSync.sync_tree_send to: self, action: action, path: [], data: data
|
6
|
-
end
|
7
3
|
_sync_notify_parent action
|
4
|
+
_sync_notify_self if self.class._sync_self? && action == :update
|
8
5
|
end
|
9
6
|
|
10
|
-
def
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
if new_record
|
16
|
-
fallbacks[name] = [] if info.type == :many
|
17
|
-
fallbacks[name] = nil if info.type == :one
|
7
|
+
def _sync_current_watch_values
|
8
|
+
values = {}
|
9
|
+
self.class._each_sync_parent do |_, info|
|
10
|
+
[*info[:watch]].each do |watch|
|
11
|
+
values[watch] = watch.is_a?(Proc) ? instance_exec(&watch) : send(watch)
|
18
12
|
end
|
19
13
|
end
|
20
|
-
|
21
|
-
fallbacks.update data
|
22
|
-
end
|
23
|
-
|
24
|
-
def sync_send_event(type:, relation: nil, to_user: nil, data:)
|
25
|
-
path = [*relation]
|
26
|
-
event_data = { type: type, data: data }
|
27
|
-
if self.class._sync_self?
|
28
|
-
ArSync.sync_tree_send to: self, action: :event, path: path, data: event_data, to_user: to_user
|
29
|
-
end
|
30
|
-
_sync_notify_parent(:event, path: path, data: event_data, only_to_user: to_user)
|
31
|
-
end
|
32
|
-
|
33
|
-
def _sync_notify_parent(action, path: nil, data: nil, order_param: nil, only_to_user: nil)
|
34
|
-
self.class._each_sync_parent do |parent, inverse_name:, only_to:|
|
35
|
-
parent = send(parent) if parent.is_a? Symbol
|
36
|
-
parent = instance_exec(&parent) if parent.is_a? Proc
|
37
|
-
next unless parent
|
38
|
-
next if parent.respond_to?(:destroyed?) && parent.destroyed?
|
39
|
-
inverse_name = instance_exec(&inverse_name) if inverse_name.is_a? Proc
|
40
|
-
next unless inverse_name
|
41
|
-
association_field = parent.class._sync_child_info inverse_name
|
42
|
-
next if association_field.skip_propagation? parent, self, path
|
43
|
-
action2 = association_field.action_convert action
|
44
|
-
only_to_user2 = only_to_user
|
45
|
-
if only_to
|
46
|
-
to_user = only_to.is_a?(Symbol) ? instance_eval(&only_to) : instance_exec(&only_to)
|
47
|
-
next unless to_user
|
48
|
-
next if only_to_user && only_to_user != to_user
|
49
|
-
only_to_user2 = to_user
|
50
|
-
end
|
51
|
-
data2 = path || action2 == :destroy ? data : association_field.data(parent, self, to_user: to_user, action: action)
|
52
|
-
order_param2 = path ? order_param : association_field.order_param
|
53
|
-
path2 = [*association_field.path(self), *path]
|
54
|
-
ArSync.sync_tree_send(
|
55
|
-
to: parent, action: action2, path: path2, data: data2,
|
56
|
-
to_user: only_to_user2,
|
57
|
-
ordering: order_param2
|
58
|
-
)
|
59
|
-
parent._sync_notify_parent action2, path: path2, data: data2, order_param: order_param2, only_to_user: to_user || only_to_user
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
module ArSync::GraphSync::InstanceMethods
|
65
|
-
def _sync_notify(action)
|
66
|
-
_sync_notify_parent action
|
67
|
-
_sync_notify_self if self.class._sync_self? && action == :update
|
14
|
+
values
|
68
15
|
end
|
69
16
|
|
70
17
|
def _sync_current_parents_info
|
71
18
|
parents = []
|
72
|
-
self.class._each_sync_parent do |parent, inverse_name:, only_to:|
|
19
|
+
self.class._each_sync_parent do |parent, inverse_name:, only_to:, watch:|
|
73
20
|
parent = send parent if parent.is_a? Symbol
|
74
21
|
parent = instance_exec(&parent) if parent.is_a? Proc
|
75
22
|
if only_to
|
76
23
|
to_user = only_to.is_a?(Symbol) ? instance_eval(&only_to) : instance_exec(&only_to)
|
77
24
|
parent = nil unless to_user
|
78
25
|
end
|
26
|
+
inverse_name = instance_exec(&inverse_name) if inverse_name.is_a? Proc
|
79
27
|
owned = parent.class._sync_child_info(inverse_name).present? if parent
|
80
|
-
parents << [parent, [inverse_name, to_user, owned]]
|
28
|
+
parents << [parent, [inverse_name, to_user, owned, watch]]
|
81
29
|
end
|
82
30
|
parents
|
83
31
|
end
|
@@ -121,36 +69,42 @@ module ArSync::GraphSync::InstanceMethods
|
|
121
69
|
else
|
122
70
|
parents_was = _sync_parents_info_before_mutation
|
123
71
|
parents = _sync_current_parents_info
|
72
|
+
column_values_was = _sync_watch_values_before_mutation
|
73
|
+
column_values = _sync_current_watch_values
|
124
74
|
end
|
125
75
|
parents_was.zip(parents).each do |(parent_was, info_was), (parent, info)|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
76
|
+
name, to_user, owned, watch = info
|
77
|
+
name_was, to_user_was, owned_was = info_was
|
78
|
+
if parent_was != parent || info_was != info
|
79
|
+
if owned_was
|
80
|
+
parent_was&._sync_notify_child_removed self, name_was, to_user_was
|
81
|
+
else
|
82
|
+
parent_was&._sync_notify_child_changed name_was, to_user_was
|
83
|
+
end
|
84
|
+
if owned
|
85
|
+
parent&._sync_notify_child_added self, name, to_user
|
86
|
+
else
|
87
|
+
parent&._sync_notify_child_changed name, to_user
|
88
|
+
end
|
89
|
+
elsif parent
|
90
|
+
changed = [*watch].any? do |w|
|
91
|
+
column_values_was[w] != column_values[w]
|
92
|
+
end
|
93
|
+
parent._sync_notify_child_changed name, to_user if changed
|
131
94
|
end
|
132
95
|
end
|
133
96
|
end
|
134
97
|
|
135
|
-
def _sync_notify_child_removed(child, name, to_user
|
136
|
-
|
137
|
-
ArSync.sync_graph_send to: self, action: :remove, model: child, path: name, to_user: to_user
|
138
|
-
else
|
139
|
-
ArSync.sync_graph_send to: self, action: :update, model: self, to_user: to_user
|
140
|
-
end
|
98
|
+
def _sync_notify_child_removed(child, name, to_user)
|
99
|
+
ArSync.sync_send to: self, action: :remove, model: child, path: name, to_user: to_user
|
141
100
|
end
|
142
101
|
|
143
|
-
def _sync_notify_child_added(child, name, to_user
|
144
|
-
|
145
|
-
ArSync.sync_graph_send to: self, action: :add, model: child, path: name, to_user: to_user
|
146
|
-
else
|
147
|
-
ArSync.sync_graph_send to: self, action: :update, model: self, to_user: to_user
|
148
|
-
end
|
102
|
+
def _sync_notify_child_added(child, name, to_user)
|
103
|
+
ArSync.sync_send to: self, action: :add, model: child, path: name, to_user: to_user
|
149
104
|
end
|
150
105
|
|
151
|
-
def _sync_notify_child_changed(
|
152
|
-
|
153
|
-
ArSync.sync_graph_send(to: self, action: :update, model: self, to_user: to_user)
|
106
|
+
def _sync_notify_child_changed(name, to_user)
|
107
|
+
ArSync.sync_send to: self, action: :update, model: self, field: name, to_user: to_user
|
154
108
|
end
|
155
109
|
|
156
110
|
def _sync_notify_self
|
@@ -159,9 +113,9 @@ module ArSync::GraphSync::InstanceMethods
|
|
159
113
|
belongs.each do |name, info|
|
160
114
|
next if belongs_was[name] == info
|
161
115
|
value = info.key?(:value) ? info[:value] : _serializer_field_value(name)
|
162
|
-
_sync_notify_child_added value, name, nil
|
163
|
-
_sync_notify_child_removed value, name, nil
|
116
|
+
_sync_notify_child_added value, name, nil if value.is_a? ArSerializer::Serializable
|
117
|
+
_sync_notify_child_removed value, name, nil if value.nil?
|
164
118
|
end
|
165
|
-
ArSync.
|
119
|
+
ArSync.sync_send to: self, action: :update, model: self
|
166
120
|
end
|
167
121
|
end
|
data/lib/ar_sync/rails.rb
CHANGED
@@ -28,47 +28,37 @@ module ArSync
|
|
28
28
|
around_action :action_with_compact_ar_sync_notification
|
29
29
|
end
|
30
30
|
|
31
|
+
class SyncSchemaBase
|
32
|
+
include ArSerializer::Serializable
|
33
|
+
serializer_field :__schema do
|
34
|
+
ArSerializer::GraphQL::SchemaClass.new self.class
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
31
38
|
module ApiControllerConcern
|
32
39
|
extend ActiveSupport::Concern
|
33
|
-
include ArSerializer::Serializable
|
34
40
|
|
35
41
|
included do
|
36
42
|
protect_from_forgery except: %i[sync_call static_call graphql_call]
|
37
|
-
|
38
|
-
|
39
|
-
|
43
|
+
end
|
44
|
+
|
45
|
+
def schema
|
46
|
+
raise 'you must implement method `schema`'
|
40
47
|
end
|
41
48
|
|
42
49
|
def sync_call
|
43
50
|
_api_call :sync do |model, current_user, query|
|
44
|
-
|
45
|
-
when ArSync::Collection::Graph, ArSync::GraphSync
|
46
|
-
serialized = ArSerializer.serialize model, query, context: current_user, include_id: true, use: :sync
|
47
|
-
next serialized if model.is_a? ArSync::GraphSync
|
48
|
-
{
|
49
|
-
sync_keys: ArSync.sync_graph_keys(model, current_user),
|
50
|
-
order: { mode: model.order, limit: model.limit },
|
51
|
-
collection: serialized
|
52
|
-
}
|
53
|
-
when ArSync::Collection::Tree
|
54
|
-
ArSync.sync_collection_api model, current_user, query
|
55
|
-
when ActiveRecord::Relation, Array
|
56
|
-
ArSync.serialize model.to_a, query, user: current_user
|
57
|
-
when ActiveRecord::Base
|
58
|
-
ArSync.sync_api model, current_user, query
|
59
|
-
else
|
60
|
-
model
|
61
|
-
end
|
51
|
+
ArSync.sync_serialize model, current_user, query
|
62
52
|
end
|
63
53
|
end
|
64
54
|
|
65
55
|
def graphql_schema
|
66
|
-
render plain: ArSerializer::GraphQL.definition(
|
56
|
+
render plain: ArSerializer::GraphQL.definition(schema.class)
|
67
57
|
end
|
68
58
|
|
69
59
|
def graphql_call
|
70
60
|
render json: ArSerializer::GraphQL.serialize(
|
71
|
-
|
61
|
+
schema,
|
72
62
|
params[:query],
|
73
63
|
operation_name: params[:operationName],
|
74
64
|
variables: (params[:variables] || {}).as_json,
|
@@ -83,7 +73,7 @@ module ArSync
|
|
83
73
|
case model
|
84
74
|
when ArSync::Collection, ActiveRecord::Relation, Array
|
85
75
|
ArSerializer.serialize model.to_a, query, context: current_user
|
86
|
-
when
|
76
|
+
when ArSerializer::Serializable
|
87
77
|
ArSerializer.serialize model, query, context: current_user
|
88
78
|
else
|
89
79
|
model
|
@@ -100,10 +90,11 @@ module ArSync
|
|
100
90
|
responses = params[:requests].map do |request|
|
101
91
|
begin
|
102
92
|
api_name = request[:api]
|
103
|
-
|
93
|
+
sch = schema
|
94
|
+
info = sch.class._serializer_field_info api_name
|
104
95
|
raise ArSync::ApiNotFound, "#{type.to_s.capitalize} API named `#{api_name}` not configured" unless info
|
105
96
|
api_params = (request[:params].as_json || {}).transform_keys(&:to_sym)
|
106
|
-
model = instance_exec(current_user, api_params, &info.data_block)
|
97
|
+
model = sch.instance_exec(current_user, api_params, &info.data_block)
|
107
98
|
{ data: yield(model, current_user, request[:query].as_json) }
|
108
99
|
rescue StandardError => e
|
109
100
|
{ error: handle_exception(e) }
|
data/lib/ar_sync/type_script.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
module ArSync::TypeScript
|
2
|
-
def self.generate_typed_files(api_class, dir:,
|
3
|
-
mode ||= :graph if ActiveRecord::Base.include? ArSync::GraphSync
|
4
|
-
mode ||= :tree if ActiveRecord::Base.include? ArSync::TreeSync
|
5
|
-
raise 'ar_sync mode: graph or tree, is not specified.' unless mode
|
2
|
+
def self.generate_typed_files(api_class, dir:, comment: nil)
|
6
3
|
{
|
7
4
|
'types.ts' => generate_type_definition(api_class),
|
8
|
-
'ArSyncModel.ts' => generate_model_script
|
9
|
-
'
|
5
|
+
'ArSyncModel.ts' => generate_model_script,
|
6
|
+
'ArSyncApi.ts' => generate_api_script,
|
7
|
+
'hooks.ts' => generate_hooks_script,
|
8
|
+
'DataTypeFromRequest.ts' => generate_type_util_script
|
10
9
|
}.each { |file, code| File.write File.join(dir, file), "#{comment}#{code}" }
|
11
10
|
end
|
12
11
|
|
@@ -52,28 +51,50 @@ module ArSync::TypeScript
|
|
52
51
|
].join("\n")
|
53
52
|
end
|
54
53
|
|
55
|
-
def self.generate_model_script
|
54
|
+
def self.generate_model_script
|
56
55
|
<<~CODE
|
57
|
-
import { TypeRequest
|
58
|
-
import
|
59
|
-
import ArSyncModelBase from 'ar_sync
|
60
|
-
|
61
|
-
constructor(r: R
|
62
|
-
|
56
|
+
import { TypeRequest } from './types'
|
57
|
+
import DataTypeFromRequest from './DataTypeFromRequest'
|
58
|
+
import { default as ArSyncModelBase } from 'ar_sync/core/ArSyncModel'
|
59
|
+
declare class ArSyncModel<R extends TypeRequest> extends ArSyncModelBase<DataTypeFromRequest<R>> {
|
60
|
+
constructor(r: R, option?: { immutable: boolean })
|
61
|
+
}
|
62
|
+
export default ArSyncModelBase as typeof ArSyncModel
|
63
|
+
CODE
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.generate_api_script
|
67
|
+
<<~CODE
|
68
|
+
import { TypeRequest } from './types'
|
69
|
+
import DataTypeFromRequest from './DataTypeFromRequest'
|
70
|
+
import ArSyncApi from 'ar_sync/core/ArSyncApi'
|
71
|
+
export function fetch<R extends TypeRequest>(request: R) {
|
72
|
+
return ArSyncApi.fetch(request) as Promise<DataTypeFromRequest<R>>
|
63
73
|
}
|
64
74
|
CODE
|
65
75
|
end
|
66
76
|
|
67
|
-
def self.
|
77
|
+
def self.generate_type_util_script
|
68
78
|
<<~CODE
|
69
79
|
import { TypeRequest, ApiNameRequests } from './types'
|
70
|
-
import { DataTypeFromRequest } from 'ar_sync/core/DataType'
|
71
|
-
|
80
|
+
import { DataTypeFromRequest as DataTypeFromRequestPair } from 'ar_sync/core/DataType'
|
81
|
+
type DataTypeFromRequest<R extends TypeRequest> = DataTypeFromRequestPair<ApiNameRequests[R['api']], R>
|
82
|
+
export default DataTypeFromRequest
|
83
|
+
CODE
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.generate_hooks_script
|
87
|
+
<<~CODE
|
88
|
+
import { useState, useEffect, useMemo } from 'react'
|
89
|
+
import { TypeRequest } from './types'
|
90
|
+
import DataTypeFromRequest from './DataTypeFromRequest'
|
91
|
+
import { initializeHooks, useArSyncModel as useArSyncModelBase, useArSyncFetch as useArSyncFetchBase } from 'ar_sync/core/hooks'
|
92
|
+
initializeHooks({ useState, useEffect, useMemo })
|
72
93
|
export function useArSyncModel<R extends TypeRequest>(request: R | null) {
|
73
|
-
return useArSyncModelBase<DataTypeFromRequest<
|
94
|
+
return useArSyncModelBase<DataTypeFromRequest<R>>(request)
|
74
95
|
}
|
75
96
|
export function useArSyncFetch<R extends TypeRequest>(request: R | null) {
|
76
|
-
return useArSyncFetchBase<DataTypeFromRequest<
|
97
|
+
return useArSyncFetchBase<DataTypeFromRequest<R>>(request)
|
77
98
|
}
|
78
99
|
CODE
|
79
100
|
end
|