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

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 inside parent container
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>, parentContainer?: Instance): 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,39 +58,34 @@ do
58
58
  else
59
59
  forge.debug:logTag("px", "global", "Skipped duplicate px initialization")
60
60
  end
61
+ local renderedSet = {}
61
62
  if render then
62
63
  local _condition = render.name
63
64
  if _condition ~= "" and _condition then
64
65
  _condition = render.group
65
66
  end
66
67
  if _condition ~= "" and _condition then
67
- forge.debug:logTag("render", "global", "Rendering group by name", render)
68
- return forge:renderGroupByName(props)
68
+ return self:renderGroupByName(props, renderedSet)
69
69
  end
70
70
  local _value = render.names and render.group
71
71
  if _value ~= "" and _value then
72
- forge.debug:logTag("render", "global", "Rendering group by names", render)
73
- return forge:renderGroupByNames(props)
72
+ return self:renderGroupByNames(props, renderedSet)
74
73
  end
75
74
  local _value_1 = render.name
76
75
  if _value_1 ~= "" and _value_1 then
77
- forge.debug:logTag("render", render.name, "Rendering single app")
78
- return forge:renderApp(props)
76
+ return self:renderApp(props, renderedSet)
79
77
  end
80
78
  if render.names then
81
- forge.debug:logTag("render", "global", "Rendering multiple apps", render.names)
82
- return forge:renderApps(props)
79
+ return self:renderApps(props, renderedSet)
83
80
  end
84
81
  local _value_2 = render.group
85
82
  if _value_2 ~= "" and _value_2 then
86
- forge.debug:logTag("render", "global", "Rendering group", render.group)
87
- return forge:renderGroup(props)
83
+ return self:renderGroup(props, renderedSet)
88
84
  end
89
85
  end
90
- forge.debug:logTag("render", "global", "Rendering all apps")
91
- return self:renderAll(props)
86
+ return self:renderAll(props, renderedSet)
92
87
  end
93
- function Renders:renderNames(props, names, forge, context, details)
88
+ function Renders:renderNames(props, names, forge, context, renderedSet, details, parentContainer)
94
89
  if not names then
95
90
  local _logger = forge.logger
96
91
  local _exp = `Renderer resolved 0 apps ({context})`
@@ -99,24 +94,60 @@ do
99
94
  _condition = props.render
100
95
  end
101
96
  _logger:log("WARN", _exp, _condition)
102
- return nil
97
+ return {}
103
98
  end
104
- -- ReadonlyArray.map
105
- local _newValue = table.create(#names)
106
- local _callback = function(name)
99
+ local rendered = {}
100
+ for _, name in names do
101
+ if renderedSet[name] ~= nil then
102
+ continue
103
+ end
104
+ renderedSet[name] = true
107
105
  local _forge = forge
108
106
  local _object = table.clone(props)
109
107
  setmetatable(_object, nil)
110
108
  _object.render = {
111
109
  name = name,
112
110
  }
113
- return _forge:renderApp(_object)
111
+ local appRender = _forge:renderApp(_object, renderedSet, parentContainer)
112
+ table.insert(rendered, appRender)
113
+ -- Render children inside this container
114
+ self:renderChildren(props, name, forge, renderedSet, rendered, appRender)
115
+ end
116
+ return rendered
117
+ end
118
+ function Renders:renderChildren(props, parentName, forge, renderedSet, accumulated, parentContainer)
119
+ -- ▼ ReadonlyMap.forEach ▼
120
+ local _callback = function(app, childName)
121
+ local _result = app.rules
122
+ if _result ~= nil then
123
+ _result = _result.parent
124
+ end
125
+ local _condition = _result == parentName
126
+ if _condition then
127
+ local _renderedSet = renderedSet
128
+ local _childName = childName
129
+ _condition = not (_renderedSet[_childName] ~= nil)
130
+ end
131
+ if _condition then
132
+ local _renderedSet = renderedSet
133
+ local _childName = childName
134
+ _renderedSet[_childName] = true
135
+ local _forge = forge
136
+ local _object = table.clone(props)
137
+ setmetatable(_object, nil)
138
+ _object.render = {
139
+ name = childName,
140
+ }
141
+ local childRender = _forge:renderApp(_object, renderedSet, parentContainer)
142
+ table.insert(accumulated, childRender)
143
+ -- recursively render grandchildren
144
+ self:renderChildren(props, childName, forge, renderedSet, accumulated, childRender)
145
+ end
114
146
  end
115
- for _k, _v in names do
116
- _newValue[_k] = _callback(_v, _k - 1, names)
147
+ for _k, _v in AppRegistry do
148
+ _callback(_v, _k, AppRegistry)
117
149
  end
118
- -- ▲ ReadonlyArray.map
119
- return _newValue
150
+ -- ▲ ReadonlyMap.forEach
120
151
  end
121
152
  function Renders:collectByGroup(groups, filter)
122
153
  local result = {}
@@ -154,7 +185,7 @@ do
154
185
  end
155
186
  return _result
156
187
  end
157
- function Renders:renderApp(props)
188
+ function Renders:renderApp(props, renderedSet, parentContainer)
158
189
  local _name = props.render
159
190
  if _name ~= nil then
160
191
  _name = _name.name
@@ -170,6 +201,9 @@ do
170
201
  self.debug:time("render", name)
171
202
  if not (self.loaded[name] ~= nil) then
172
203
  local render = appClass.constructor.new(props, name):render()
204
+ if not render then
205
+ error(`App "{name}" returned undefined from render()`, 2)
206
+ end
173
207
  apply(render)({
174
208
  Name = "Render",
175
209
  })
@@ -181,6 +215,9 @@ do
181
215
  Size = UDim2.fromScale(1, 1),
182
216
  [0] = render,
183
217
  })
218
+ if parentContainer then
219
+ container.Parent = parentContainer
220
+ end
184
221
  local _loaded = self.loaded
185
222
  local _arg1 = {
186
223
  container = container,
@@ -190,11 +227,18 @@ do
190
227
  else
191
228
  self.debug:logTag("render", name, "Reusing existing render instance")
192
229
  end
230
+ local _result = renderedSet
231
+ if _result ~= nil then
232
+ _result[name] = true
233
+ end
193
234
  self:renderRules(name, props)
194
235
  self.debug:timeEnd("render", name)
195
236
  return self.loaded[name].container
196
237
  end
197
- function Renders:renderApps(props)
238
+ function Renders:renderApps(props, renderedSet)
239
+ if renderedSet == nil then
240
+ renderedSet = {}
241
+ end
198
242
  local _names = props.render
199
243
  if _names ~= nil then
200
244
  _names = _names.names
@@ -203,9 +247,12 @@ do
203
247
  if not names then
204
248
  error("renderApps requires app names", 2)
205
249
  end
206
- return self:renderNames(props, names, self, "renderApps", names)
250
+ return self:renderNames(props, names, self, "renderApps", renderedSet, names)
207
251
  end
208
- function Renders:renderGroup(props)
252
+ function Renders:renderGroup(props, renderedSet)
253
+ if renderedSet == nil then
254
+ renderedSet = {}
255
+ end
209
256
  local _group = props.render
210
257
  if _group ~= nil then
211
258
  _group = _group.group
@@ -215,9 +262,12 @@ do
215
262
  error("renderGroup requires a group", 2)
216
263
  end
217
264
  local groups = self:normalizeGroups(group)
218
- return self:renderNames(props, self:collectByGroup(groups), self, "renderGroup", group)
265
+ return self:renderNames(props, self:collectByGroup(groups), self, "renderGroup", renderedSet, group)
219
266
  end
220
- function Renders:renderGroupByName(props)
267
+ function Renders:renderGroupByName(props, renderedSet)
268
+ if renderedSet == nil then
269
+ renderedSet = {}
270
+ end
221
271
  local _binding = props.render or {}
222
272
  local group = _binding.group
223
273
  local name = _binding.name
@@ -227,12 +277,15 @@ do
227
277
  local groups = self:normalizeGroups(group)
228
278
  return self:renderNames(props, self:collectByGroup(groups, function(n)
229
279
  return n == name
230
- end), self, "renderGroupByName", {
280
+ end), self, "renderGroupByName", renderedSet, {
231
281
  group = group,
232
282
  name = name,
233
283
  })
234
284
  end
235
- function Renders:renderGroupByNames(props)
285
+ function Renders:renderGroupByNames(props, renderedSet)
286
+ if renderedSet == nil then
287
+ renderedSet = {}
288
+ end
236
289
  local _binding = props.render or {}
237
290
  local group = _binding.group
238
291
  local names = _binding.names
@@ -243,12 +296,15 @@ do
243
296
  return self:renderNames(props, self:collectByGroup(groups, function(n)
244
297
  local _n = n
245
298
  return table.find(names, _n) ~= nil
246
- end), self, "renderGroupByNames", {
299
+ end), self, "renderGroupByNames", renderedSet, {
247
300
  group = group,
248
301
  names = names,
249
302
  })
250
303
  end
251
- function Renders:renderAll(props)
304
+ function Renders:renderAll(props, renderedSet)
305
+ if renderedSet == nil then
306
+ renderedSet = {}
307
+ end
252
308
  local names = {}
253
309
  -- ▼ ReadonlyMap.forEach ▼
254
310
  local _callback = function(_, name)
@@ -260,7 +316,7 @@ do
260
316
  _callback(_v, _k, AppRegistry)
261
317
  end
262
318
  -- ▲ ReadonlyMap.forEach ▲
263
- return self:renderNames(props, names, self, "renderAll")
319
+ return self:renderNames(props, names, self, "renderAll", renderedSet)
264
320
  end
265
321
  end
266
322
  return {
@@ -42,11 +42,6 @@ do
42
42
  })
43
43
  self:anchor(name, rules.parent, props)
44
44
  end
45
- -- Index
46
- if rules.zIndex ~= nil then
47
- self.debug:logTag("rules", name, "Applying ZIndex", rules.zIndex)
48
- self:index(name, rules.zIndex)
49
- end
50
45
  end
51
46
  function Rules:checkRules(name)
52
47
  local _processing = self.processing
package/out/types.d.ts CHANGED
@@ -68,12 +68,10 @@ declare namespace Types {
68
68
 
69
69
  export type Static = {
70
70
  exclusiveGroup?: string;
71
- zIndex?: number;
72
71
  } & (WithParent<string> | WithoutParent);
73
72
 
74
73
  export type Generic<N extends AppNames = AppNames> = {
75
74
  exclusiveGroup?: AppGroups;
76
- zIndex?: number;
77
75
  } & (WithParent<Exclude<AppNames, N>> | WithoutParent);
78
76
  }
79
77
  }
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.28",
4
4
  "description": "An App Manager for Vide",
5
5
  "main": "out/init.lua",
6
6
  "types": "out/index.d.ts",