@rbxts/app-forge 0.7.2-alpha.26 → 0.7.2-alpha.27

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.
@@ -77,7 +77,7 @@ local function usePx(target, baseResolution, minScale)
77
77
  if baseResolution then
78
78
  BASE_RESOLUTION(baseResolution)
79
79
  end
80
- if minScale ~= nil then
80
+ if minScale ~= 0 and minScale == minScale and minScale then
81
81
  MIN_SCALE(minScale)
82
82
  end
83
83
  if target then
@@ -13,13 +13,20 @@ export default class Renders extends Rules {
13
13
  * Decides render strategy based on props.
14
14
  */
15
15
  protected renderMount(this: AppForge, props: Types.Props.Main): Vide.Node;
16
+ /**
17
+ * Render multiple apps by name, avoiding duplicates.
18
+ */
16
19
  private renderNames;
20
+ /**
21
+ * Render children of a parent app recursively
22
+ */
23
+ private renderChildren;
17
24
  private collectByGroup;
18
25
  private normalizeGroups;
19
- protected renderApp(this: AppForge, props: Types.Props.Main): Vide.Node;
20
- protected renderApps(this: AppForge, props: Types.Props.Main): Vide.Node[] | undefined;
21
- protected renderGroup(this: AppForge, props: Types.Props.Main): Vide.Node[] | undefined;
22
- protected renderGroupByName(this: AppForge, props: Types.Props.Main): Vide.Node[] | undefined;
23
- protected renderGroupByNames(this: AppForge, props: Types.Props.Main): Vide.Node[] | undefined;
24
- protected renderAll(this: AppForge, props: Types.Props.Main): Vide.Node[] | undefined;
26
+ protected renderApp(this: AppForge, props: Types.Props.Main, renderedSet?: Set<AppNames>): Vide.Node;
27
+ protected renderApps(this: AppForge, props: Types.Props.Main, renderedSet?: Set<AppNames>): Instance[];
28
+ protected renderGroup(this: AppForge, props: Types.Props.Main, renderedSet?: Set<AppNames>): Instance[];
29
+ protected renderGroupByName(this: AppForge, props: Types.Props.Main, renderedSet?: Set<AppNames>): Instance[];
30
+ protected renderGroupByNames(this: AppForge, props: Types.Props.Main, renderedSet?: Set<AppNames>): Instance[];
31
+ protected renderAll(this: AppForge, props: Types.Props.Main, renderedSet?: Set<AppNames>): Instance[];
25
32
  }
@@ -58,6 +58,8 @@ do
58
58
  else
59
59
  forge.debug:logTag("px", "global", "Skipped duplicate px initialization")
60
60
  end
61
+ -- Track rendered apps for this render pass
62
+ local renderedSet = {}
61
63
  if render then
62
64
  local _condition = render.name
63
65
  if _condition ~= "" and _condition then
@@ -65,32 +67,32 @@ do
65
67
  end
66
68
  if _condition ~= "" and _condition then
67
69
  forge.debug:logTag("render", "global", "Rendering group by name", render)
68
- return forge:renderGroupByName(props)
70
+ return self:renderGroupByName(props, renderedSet)
69
71
  end
70
72
  local _value = render.names and render.group
71
73
  if _value ~= "" and _value then
72
74
  forge.debug:logTag("render", "global", "Rendering group by names", render)
73
- return forge:renderGroupByNames(props)
75
+ return self:renderGroupByNames(props, renderedSet)
74
76
  end
75
77
  local _value_1 = render.name
76
78
  if _value_1 ~= "" and _value_1 then
77
79
  forge.debug:logTag("render", render.name, "Rendering single app")
78
- return forge:renderApp(props)
80
+ return self:renderApp(props, renderedSet)
79
81
  end
80
82
  if render.names then
81
83
  forge.debug:logTag("render", "global", "Rendering multiple apps", render.names)
82
- return forge:renderApps(props)
84
+ return self:renderApps(props, renderedSet)
83
85
  end
84
86
  local _value_2 = render.group
85
87
  if _value_2 ~= "" and _value_2 then
86
88
  forge.debug:logTag("render", "global", "Rendering group", render.group)
87
- return forge:renderGroup(props)
89
+ return self:renderGroup(props, renderedSet)
88
90
  end
89
91
  end
90
92
  forge.debug:logTag("render", "global", "Rendering all apps")
91
- return self:renderAll(props)
93
+ return self:renderAll(props, renderedSet)
92
94
  end
93
- function Renders:renderNames(props, names, forge, context, details)
95
+ function Renders:renderNames(props, names, forge, context, renderedSet, details)
94
96
  if not names then
95
97
  local _logger = forge.logger
96
98
  local _exp = `Renderer resolved 0 apps ({context})`
@@ -99,24 +101,58 @@ do
99
101
  _condition = props.render
100
102
  end
101
103
  _logger:log("WARN", _exp, _condition)
102
- return nil
104
+ return {}
103
105
  end
104
- -- ReadonlyArray.map
105
- local _newValue = table.create(#names)
106
- local _callback = function(name)
106
+ local rendered = {}
107
+ for _, name in names do
108
+ if renderedSet[name] ~= nil then
109
+ continue
110
+ end
111
+ renderedSet[name] = true
107
112
  local _forge = forge
108
113
  local _object = table.clone(props)
109
114
  setmetatable(_object, nil)
110
115
  _object.render = {
111
116
  name = name,
112
117
  }
113
- return _forge:renderApp(_object)
118
+ local appRender = _forge:renderApp(_object, renderedSet)
119
+ table.insert(rendered, appRender)
120
+ self:renderChildren(props, name, forge, renderedSet, rendered)
114
121
  end
115
- for _k, _v in names do
116
- _newValue[_k] = _callback(_v, _k - 1, names)
122
+ return rendered
123
+ end
124
+ function Renders:renderChildren(props, parentName, forge, renderedSet, accumulated)
125
+ -- ▼ ReadonlyMap.forEach ▼
126
+ local _callback = function(app, childName)
127
+ local _result = app.rules
128
+ if _result ~= nil then
129
+ _result = _result.parent
130
+ end
131
+ local _condition = _result == parentName
132
+ if _condition then
133
+ local _renderedSet = renderedSet
134
+ local _childName = childName
135
+ _condition = not (_renderedSet[_childName] ~= nil)
136
+ end
137
+ if _condition then
138
+ local _renderedSet = renderedSet
139
+ local _childName = childName
140
+ _renderedSet[_childName] = true
141
+ local _forge = forge
142
+ local _object = table.clone(props)
143
+ setmetatable(_object, nil)
144
+ _object.render = {
145
+ name = childName,
146
+ }
147
+ local childRender = _forge:renderApp(_object, renderedSet)
148
+ table.insert(accumulated, childRender)
149
+ self:renderChildren(props, childName, forge, renderedSet, accumulated)
150
+ end
151
+ end
152
+ for _k, _v in AppRegistry do
153
+ _callback(_v, _k, AppRegistry)
117
154
  end
118
- -- ▲ ReadonlyArray.map
119
- return _newValue
155
+ -- ▲ ReadonlyMap.forEach
120
156
  end
121
157
  function Renders:collectByGroup(groups, filter)
122
158
  local result = {}
@@ -154,7 +190,7 @@ do
154
190
  end
155
191
  return _result
156
192
  end
157
- function Renders:renderApp(props)
193
+ function Renders:renderApp(props, renderedSet)
158
194
  local _name = props.render
159
195
  if _name ~= nil then
160
196
  _name = _name.name
@@ -170,6 +206,9 @@ do
170
206
  self.debug:time("render", name)
171
207
  if not (self.loaded[name] ~= nil) then
172
208
  local render = appClass.constructor.new(props, name):render()
209
+ if not render then
210
+ error(`App "{name}" returned undefined from render()`, 2)
211
+ end
173
212
  apply(render)({
174
213
  Name = "Render",
175
214
  })
@@ -190,11 +229,19 @@ do
190
229
  else
191
230
  self.debug:logTag("render", name, "Reusing existing render instance")
192
231
  end
232
+ -- mark as rendered
233
+ local _result = renderedSet
234
+ if _result ~= nil then
235
+ _result[name] = true
236
+ end
193
237
  self:renderRules(name, props)
194
238
  self.debug:timeEnd("render", name)
195
239
  return self.loaded[name].container
196
240
  end
197
- function Renders:renderApps(props)
241
+ function Renders:renderApps(props, renderedSet)
242
+ if renderedSet == nil then
243
+ renderedSet = {}
244
+ end
198
245
  local _names = props.render
199
246
  if _names ~= nil then
200
247
  _names = _names.names
@@ -203,9 +250,12 @@ do
203
250
  if not names then
204
251
  error("renderApps requires app names", 2)
205
252
  end
206
- return self:renderNames(props, names, self, "renderApps", names)
253
+ return self:renderNames(props, names, self, "renderApps", renderedSet, names)
207
254
  end
208
- function Renders:renderGroup(props)
255
+ function Renders:renderGroup(props, renderedSet)
256
+ if renderedSet == nil then
257
+ renderedSet = {}
258
+ end
209
259
  local _group = props.render
210
260
  if _group ~= nil then
211
261
  _group = _group.group
@@ -215,9 +265,12 @@ do
215
265
  error("renderGroup requires a group", 2)
216
266
  end
217
267
  local groups = self:normalizeGroups(group)
218
- return self:renderNames(props, self:collectByGroup(groups), self, "renderGroup", group)
268
+ return self:renderNames(props, self:collectByGroup(groups), self, "renderGroup", renderedSet, group)
219
269
  end
220
- function Renders:renderGroupByName(props)
270
+ function Renders:renderGroupByName(props, renderedSet)
271
+ if renderedSet == nil then
272
+ renderedSet = {}
273
+ end
221
274
  local _binding = props.render or {}
222
275
  local group = _binding.group
223
276
  local name = _binding.name
@@ -227,12 +280,15 @@ do
227
280
  local groups = self:normalizeGroups(group)
228
281
  return self:renderNames(props, self:collectByGroup(groups, function(n)
229
282
  return n == name
230
- end), self, "renderGroupByName", {
283
+ end), self, "renderGroupByName", renderedSet, {
231
284
  group = group,
232
285
  name = name,
233
286
  })
234
287
  end
235
- function Renders:renderGroupByNames(props)
288
+ function Renders:renderGroupByNames(props, renderedSet)
289
+ if renderedSet == nil then
290
+ renderedSet = {}
291
+ end
236
292
  local _binding = props.render or {}
237
293
  local group = _binding.group
238
294
  local names = _binding.names
@@ -243,12 +299,15 @@ do
243
299
  return self:renderNames(props, self:collectByGroup(groups, function(n)
244
300
  local _n = n
245
301
  return table.find(names, _n) ~= nil
246
- end), self, "renderGroupByNames", {
302
+ end), self, "renderGroupByNames", renderedSet, {
247
303
  group = group,
248
304
  names = names,
249
305
  })
250
306
  end
251
- function Renders:renderAll(props)
307
+ function Renders:renderAll(props, renderedSet)
308
+ if renderedSet == nil then
309
+ renderedSet = {}
310
+ end
252
311
  local names = {}
253
312
  -- ▼ ReadonlyMap.forEach ▼
254
313
  local _callback = function(_, name)
@@ -260,7 +319,7 @@ do
260
319
  _callback(_v, _k, AppRegistry)
261
320
  end
262
321
  -- ▲ ReadonlyMap.forEach ▲
263
- return self:renderNames(props, names, self, "renderAll")
322
+ return self:renderNames(props, names, self, "renderAll", renderedSet)
264
323
  end
265
324
  end
266
325
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rbxts/app-forge",
3
- "version": "0.7.2-alpha.26",
3
+ "version": "0.7.2-alpha.27",
4
4
  "description": "An App Manager for Vide",
5
5
  "main": "out/init.lua",
6
6
  "types": "out/index.d.ts",