Skip to content

Commit f97a743

Browse files
committed
Optimize
1 parent 162573b commit f97a743

File tree

6 files changed

+122
-97
lines changed

6 files changed

+122
-97
lines changed

src/codegen/Codegen.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,20 +155,22 @@ export class Codegen {
155155
}
156156

157157
getComponentsCodes() {
158-
return Array.from(this.components.values()).map(
159-
({ node, code, variants }) => {
160-
const name = getComponentName(node)
161-
return [name, renderComponent(name, code, variants)] as const
162-
},
163-
)
158+
const result: Array<readonly [string, string]> = []
159+
for (const { node, code, variants } of this.components.values()) {
160+
const name = getComponentName(node)
161+
result.push([name, renderComponent(name, code, variants)])
162+
}
163+
return result
164164
}
165165

166166
/**
167167
* Get the component nodes (SceneNode values from components Map).
168168
* Useful for generating responsive codes for each component.
169169
*/
170170
getComponentNodes() {
171-
return Array.from(this.components.values()).map(({ node }) => node)
171+
const result: SceneNode[] = []
172+
for (const { node } of this.components.values()) result.push(node)
173+
return result
172174
}
173175

174176
/**

src/codegen/props/selector.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,8 @@ async function computeSelectorProps(node: ComponentSetNode): Promise<{
183183
}
184184
}
185185
if (transition?.type === 'SMART_ANIMATE' && diffKeys.size > 0) {
186-
const keys = Array.from(diffKeys).map(toTransitionPropertyName)
186+
const keys: string[] = []
187+
for (const key of diffKeys) keys.push(toTransitionPropertyName(key))
187188
keys.sort()
188189
result.props.transition = `${fmtPct(transition.duration)}ms ${transition.easing.type.toLocaleLowerCase().replaceAll('_', '-')}`
189190
result.props.transitionProperty = keys.join(',')
@@ -313,7 +314,8 @@ async function computeSelectorPropsForGroup(
313314
?.flatMap(getTransition)
314315
.flat()[0]
315316
if (transition?.type === 'SMART_ANIMATE') {
316-
const keys = Array.from(diffKeys).map(toTransitionPropertyName)
317+
const keys: string[] = []
318+
for (const key of diffKeys) keys.push(toTransitionPropertyName(key))
317319
keys.sort()
318320
result.transition = `${fmtPct(transition.duration)}ms ${transition.easing.type.toLocaleLowerCase().replaceAll('_', '-')}`
319321
result.transitionProperty = keys.join(',')

src/codegen/render/text.ts

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -58,27 +58,30 @@ export async function renderText(node: TextNode): Promise<{
5858
},
5959
seg.textStyleId,
6060
)
61-
propsArray.push(
62-
Object.fromEntries(
63-
Object.entries(typo)
64-
.filter(([_, value]) => Boolean(value))
65-
.map(([key, value]) => [key, String(value)]),
66-
),
67-
)
61+
const filtered: Record<string, string> = {}
62+
for (const key in typo) {
63+
const v = typo[key]
64+
if (v) filtered[key] = String(v)
65+
}
66+
propsArray.push(filtered)
6867
}
69-
let defaultTypographyCount = 0
68+
const _defaultTypographyCount = 0
7069
let defaultProps: Record<string, string> = {}
7170

7271
// Check if any segment contains Korean text
7372
const hasKorean = segs.some((seg) => containsKorean(seg.characters))
7473

75-
propsArray.forEach((props) => {
76-
if (props.characters.length >= defaultTypographyCount) {
77-
defaultProps = { ...props }
78-
delete defaultProps.characters
79-
defaultTypographyCount = props.characters.length
74+
let longestIdx = 0
75+
for (let i = 0; i < propsArray.length; i++) {
76+
if (
77+
propsArray[i].characters.length >=
78+
propsArray[longestIdx].characters.length
79+
) {
80+
longestIdx = i
8081
}
81-
})
82+
}
83+
defaultProps = { ...propsArray[longestIdx] }
84+
delete defaultProps.characters
8285

8386
// Add wordBreak: keep-all for Korean text
8487
if (hasKorean) {

src/codegen/responsive/ResponsiveCodegen.ts

Lines changed: 33 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -315,32 +315,30 @@ export class ResponsiveCodegen {
315315
componentSet: ComponentSetNode,
316316
componentName: string,
317317
): Promise<ReadonlyArray<readonly [string, string]>> {
318-
// Find viewport variant key
319-
const viewportKey = Object.keys(
320-
componentSet.componentPropertyDefinitions,
321-
).find((key) => key.toLowerCase() === 'viewport')
318+
// Find viewport and effect variant keys
319+
let viewportKey: string | undefined
320+
let effectKey: string | undefined
321+
for (const key in componentSet.componentPropertyDefinitions) {
322+
const lower = key.toLowerCase()
323+
if (lower === 'viewport') viewportKey = key
324+
else if (lower === 'effect') effectKey = key
325+
}
322326

323327
if (!viewportKey) {
324328
return []
325329
}
326330

327331
// Get variants excluding viewport
328332
const variants: Record<string, string> = {}
329-
for (const [name, definition] of Object.entries(
330-
componentSet.componentPropertyDefinitions,
331-
)) {
333+
for (const name in componentSet.componentPropertyDefinitions) {
334+
const definition = componentSet.componentPropertyDefinitions[name]
332335
if (name.toLowerCase() !== 'viewport' && definition.type === 'VARIANT') {
333336
const sanitizedName = sanitizePropertyName(name)
334337
variants[sanitizedName] =
335338
definition.variantOptions?.map((opt) => `'${opt}'`).join(' | ') || ''
336339
}
337340
}
338341

339-
// Find effect variant key (to exclude from grouping)
340-
const effectKey = Object.keys(
341-
componentSet.componentPropertyDefinitions,
342-
).find((key) => key.toLowerCase() === 'effect')
343-
344342
// Group components by non-viewport, non-effect variants
345343
const groups = new Map<string, Map<BreakpointKey, ComponentNode>>()
346344

@@ -358,16 +356,15 @@ export class ResponsiveCodegen {
358356

359357
const breakpoint = viewportToBreakpoint(viewportValue)
360358
// Create group key from non-viewport, non-effect variants
361-
const otherVariants = Object.entries(variantProps)
362-
.filter(([key]) => {
363-
const lowerKey = key.toLowerCase()
364-
return lowerKey !== 'viewport' && lowerKey !== 'effect'
365-
})
366-
.sort(([a], [b]) => a.localeCompare(b))
367-
.map(([key, value]) => `${key}=${value}`)
368-
.join('|')
369-
370-
const groupKey = otherVariants || '__default__'
359+
const parts: string[] = []
360+
for (const key in variantProps) {
361+
const lowerKey = key.toLowerCase()
362+
if (lowerKey !== 'viewport' && lowerKey !== 'effect') {
363+
parts.push(`${key}=${variantProps[key]}`)
364+
}
365+
}
366+
parts.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))
367+
const groupKey = parts.join('|') || '__default__'
371368

372369
if (!groups.has(groupKey)) {
373370
groups.set(groupKey, new Map())
@@ -415,7 +412,7 @@ export class ResponsiveCodegen {
415412
)
416413
perfEnd('getSelectorPropsForGroup(viewport)', t)
417414
if (Object.keys(selectorProps).length > 0) {
418-
tree.props = { ...tree.props, ...selectorProps }
415+
tree.props = Object.assign({}, tree.props, selectorProps)
419416
}
420417
}
421418

@@ -454,24 +451,22 @@ export class ResponsiveCodegen {
454451
)
455452
const tTotal = perfStart()
456453

457-
// Find viewport variant key
458-
const viewportKey = Object.keys(
459-
componentSet.componentPropertyDefinitions,
460-
).find((key) => key.toLowerCase() === 'viewport')
461-
462-
// Find effect variant key
463-
const effectKey = Object.keys(
464-
componentSet.componentPropertyDefinitions,
465-
).find((key) => key.toLowerCase() === 'effect')
454+
// Find viewport and effect variant keys
455+
let viewportKey: string | undefined
456+
let effectKey: string | undefined
457+
for (const key in componentSet.componentPropertyDefinitions) {
458+
const lower = key.toLowerCase()
459+
if (lower === 'viewport') viewportKey = key
460+
else if (lower === 'effect') effectKey = key
461+
}
466462

467463
// Get all variant keys excluding viewport and effect
468464
const otherVariantKeys: string[] = []
469465
const variants: Record<string, string> = {}
470466
// Map from original name to sanitized name
471467
const variantKeyToSanitized: Record<string, string> = {}
472-
for (const [name, definition] of Object.entries(
473-
componentSet.componentPropertyDefinitions,
474-
)) {
468+
for (const name in componentSet.componentPropertyDefinitions) {
469+
const definition = componentSet.componentPropertyDefinitions[name]
475470
if (definition.type === 'VARIANT') {
476471
const lowerName = name.toLowerCase()
477472
// Exclude both viewport and effect from variant keys
@@ -628,7 +623,7 @@ export class ResponsiveCodegen {
628623
)
629624
perfEnd('getSelectorPropsForGroup()', t)
630625
if (Object.keys(selectorProps).length > 0) {
631-
tree.props = { ...tree.props, ...selectorProps }
626+
tree.props = Object.assign({}, tree.props, selectorProps)
632627
}
633628
}
634629

@@ -672,7 +667,7 @@ export class ResponsiveCodegen {
672667
// Get pseudo-selector props (hover, active, disabled, etc.)
673668
const selectorProps = await getSelectorPropsForGroup(componentSet, {})
674669
if (Object.keys(selectorProps).length > 0) {
675-
tree.props = { ...tree.props, ...selectorProps }
670+
tree.props = Object.assign({}, tree.props, selectorProps)
676671
}
677672

678673
// Render the tree to JSX
@@ -742,7 +737,7 @@ export class ResponsiveCodegen {
742737
perfEnd('Codegen.getTree(nonViewportVariant)', t)
743738
// Add pseudo-selector props to tree — create NEW props to avoid mutating cached tree
744739
if (selectorProps && Object.keys(selectorProps).length > 0) {
745-
tree.props = { ...tree.props, ...selectorProps }
740+
tree.props = Object.assign({}, tree.props, selectorProps)
746741
}
747742
treesByVariant.set(variantValue, tree)
748743
}

0 commit comments

Comments
 (0)