Skip to content

Commit 5606f3a

Browse files
committed
Enable noForEach
1 parent 9d749d1 commit 5606f3a

File tree

7 files changed

+110
-101
lines changed

7 files changed

+110
-101
lines changed

apps/dashboard/app/(main)/billing/cost-breakdown/components/consumption-chart.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,9 @@ export function ConsumptionChart({
8484
{} as Record<string, number>
8585
);
8686

87-
return Array.from(dailyDataMap.entries()).map(([date, eventCounts]) => {
87+
const entries = Array.from(dailyDataMap.entries());
88+
89+
return entries.map(([date, eventCounts]) => {
8890
const dayData: any = {
8991
date: new Date(date).toLocaleDateString('en-US', {
9092
month: 'short',
@@ -94,10 +96,10 @@ export function ConsumptionChart({
9496
};
9597

9698
// Use real data from ClickHouse, not approximations
97-
Object.keys(EVENT_TYPE_COLORS).forEach((eventType) => {
99+
for (const eventType of Object.keys(EVENT_TYPE_COLORS)) {
98100
if (hiddenTypes[eventType]) {
99101
dayData[eventType] = 0;
100-
return;
102+
continue;
101103
}
102104
const actualAmount = eventCounts[eventType] || 0;
103105

@@ -107,7 +109,7 @@ export function ConsumptionChart({
107109
} else {
108110
dayData[eventType] = actualAmount;
109111
}
110-
});
112+
}
111113

112114
return dayData;
113115
});

apps/dashboard/app/(main)/websites/[id]/_components/tabs/overview-tab.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,9 @@ export function WebsiteOverviewTab({
255255

256256
const hiddenMetrics = useMemo(() => {
257257
const result: Record<string, boolean> = {};
258-
Object.keys(visibleMetrics).forEach((key) => {
258+
for (const key of Object.keys(visibleMetrics)) {
259259
result[key] = !visibleMetrics[key as keyof typeof visibleMetrics];
260-
});
260+
}
261261
return result;
262262
}, [visibleMetrics]);
263263

apps/database/components/data-table-view.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,11 +290,11 @@ export function DataTableView({
290290

291291
const handleDeleteSelected = () => {
292292
const selectedRows = table.getSelectedRowModel().rows;
293-
selectedRows.forEach((row) => {
293+
for (const row of selectedRows) {
294294
if (onDeleteRow) {
295295
onDeleteRow(row.original);
296296
}
297-
});
297+
}
298298
setRowSelection({});
299299
};
300300

apps/database/components/data-table.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,16 @@ export function DataTable({
102102
);
103103
}
104104

105+
const entries = Object.entries(columnFilters);
106+
105107
// Apply column filters
106-
Object.entries(columnFilters).forEach(([column, filter]) => {
108+
for (const [column, filter] of entries) {
107109
if (filter) {
108110
filtered = filtered.filter((row) =>
109111
String(row[column]).toLowerCase().includes(filter.toLowerCase())
110112
);
111113
}
112-
});
114+
}
113115

114116
// Apply sorting
115117
if (sortColumn) {

apps/docs/components/structured-data.tsx

Lines changed: 54 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -87,66 +87,66 @@ function planToOffer(plan: RawPlan, baseUrl: string) {
8787
});
8888
}
8989

90+
const items = plan.items.filter(
91+
(i): i is Extract<RawItem, { type: 'priced_feature' }> =>
92+
i.type === 'priced_feature'
93+
);
94+
9095
// priced_feature with tiers (events, extra websites, etc.)
91-
plan.items
92-
.filter(
93-
(i): i is Extract<RawItem, { type: 'priced_feature' }> =>
94-
i.type === 'priced_feature'
95-
)
96-
.forEach((pf) => {
97-
// Event overage tiers → convert per-event micro price to per-1,000 events
98-
if (pf.feature?.id === 'events' && pf.tiers?.length) {
99-
// Start tier ranges right after included quota (if any)
100-
let prevMax: number | undefined =
101-
typeof pf.included_usage === 'number' ? pf.included_usage : undefined;
102-
103-
pf.tiers.forEach((t) => {
104-
const minValue = prevMax != null ? prevMax + 1 : undefined;
105-
const maxValue = t.to === 'inf' ? undefined : (t.to as number);
106-
107-
priceSpecs.push({
108-
'@type': 'UnitPriceSpecification',
109-
price: priceStr(t.amount * BLOCK_UNITS_FOR_EVENTS, 2), // e.g. "0.03" per 1,000 events
110-
priceCurrency: 'USD',
111-
referenceQuantity: {
112-
'@type': 'QuantitativeValue',
113-
value: BLOCK_UNITS_FOR_EVENTS,
114-
unitText: 'events',
115-
},
116-
eligibleQuantity: {
117-
'@type': 'QuantitativeValue',
118-
minValue,
119-
maxValue,
120-
unitText: 'events',
121-
},
122-
unitText: 'per 1,000 events (overage)',
123-
});
124-
125-
if (t.to !== 'inf') {
126-
prevMax = t.to as number;
127-
}
128-
});
129-
}
130-
// Other priced features (e.g., extra websites per month)
131-
else if (typeof pf.price === 'number') {
132-
const refUnit = toUnitCode(pf.interval);
96+
for (const pf of items) {
97+
// Event overage tiers → convert per-event micro price to per-1,000 events
98+
if (pf.feature?.id === 'events' && pf.tiers?.length) {
99+
// Start tier ranges right after included quota (if any)
100+
let prevMax: number | undefined =
101+
typeof pf.included_usage === 'number' ? pf.included_usage : undefined;
102+
103+
for (const t of pf.tiers) {
104+
const minValue = prevMax != null ? prevMax + 1 : undefined;
105+
const maxValue = t.to === 'inf' ? undefined : (t.to as number);
106+
133107
priceSpecs.push({
134108
'@type': 'UnitPriceSpecification',
135-
price: priceStr(pf.price, 2), // e.g. "0.50"
109+
price: priceStr(t.amount * BLOCK_UNITS_FOR_EVENTS, 2), // e.g. "0.03" per 1,000 events
136110
priceCurrency: 'USD',
137-
unitText: `per ${pf.feature?.display?.singular ?? 'unit'}`,
138-
...(refUnit
139-
? {
140-
referenceQuantity: {
141-
'@type': 'QuantitativeValue',
142-
value: 1,
143-
unitCode: refUnit, // MON or DAY
144-
},
145-
}
146-
: {}),
111+
referenceQuantity: {
112+
'@type': 'QuantitativeValue',
113+
value: BLOCK_UNITS_FOR_EVENTS,
114+
unitText: 'events',
115+
},
116+
eligibleQuantity: {
117+
'@type': 'QuantitativeValue',
118+
minValue,
119+
maxValue,
120+
unitText: 'events',
121+
},
122+
unitText: 'per 1,000 events (overage)',
147123
});
124+
125+
if (t.to !== 'inf') {
126+
prevMax = t.to as number;
127+
}
148128
}
149-
});
129+
}
130+
// Other priced features (e.g., extra websites per month)
131+
else if (typeof pf.price === 'number') {
132+
const refUnit = toUnitCode(pf.interval);
133+
priceSpecs.push({
134+
'@type': 'UnitPriceSpecification',
135+
price: priceStr(pf.price, 2), // e.g. "0.50"
136+
priceCurrency: 'USD',
137+
unitText: `per ${pf.feature?.display?.singular ?? 'unit'}`,
138+
...(refUnit
139+
? {
140+
referenceQuantity: {
141+
'@type': 'QuantitativeValue',
142+
value: 1,
143+
unitCode: refUnit, // MON or DAY
144+
},
145+
}
146+
: {}),
147+
});
148+
}
149+
}
150150

151151
return {
152152
'@type': 'Offer',

biome.jsonc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@
3636
"useFilenamingConvention": "off"
3737
},
3838
"complexity": {
39-
"noExcessiveCognitiveComplexity": "off",
40-
"noForEach": "off"
39+
"noExcessiveCognitiveComplexity": "off"
4140
},
4241
"performance": {
4342
"useTopLevelRegex": "off",

packages/sdk/src/react/flags/flag-storage.ts

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,46 @@
11
class FlagStorage {
22
private ttl = 24 * 60 * 60 * 1000; // 24 hours in milliseconds
33

4-
get(key: string): any {
4+
get(key: string) {
55
return this.getFromLocalStorage(key);
66
}
77

8-
set(key: string, value: unknown): void {
8+
set(key: string, value: unknown) {
99
this.setToLocalStorage(key, value);
1010
}
1111

1212
getAll(): Record<string, unknown> {
1313
const result: Record<string, unknown> = {};
1414
const now = Date.now();
15-
Object.keys(localStorage)
16-
.filter((key) => key.startsWith('db-flag-'))
17-
.forEach((key) => {
18-
const flagKey = key.replace('db-flag-', '');
19-
try {
20-
const item = localStorage.getItem(key);
21-
if (item) {
22-
const parsed = JSON.parse(item);
23-
if (parsed.expiresAt && now > parsed.expiresAt) {
24-
localStorage.removeItem(key);
25-
} else {
26-
result[flagKey] = parsed.value || parsed; // Support both new and old format
27-
}
15+
16+
const keys = Object.keys(localStorage).filter((key) =>
17+
key.startsWith('db-flag-')
18+
);
19+
20+
for (const key of keys) {
21+
const flagKey = key.replace('db-flag-', '');
22+
try {
23+
const item = localStorage.getItem(key);
24+
if (item) {
25+
const parsed = JSON.parse(item);
26+
if (parsed.expiresAt && now > parsed.expiresAt) {
27+
localStorage.removeItem(key);
28+
} else {
29+
result[flagKey] = parsed.value || parsed; // Support both new and old format
2830
}
29-
} catch {}
30-
});
31+
}
32+
} catch {}
33+
}
3134
return result;
3235
}
3336

3437
clear(): void {
35-
Object.keys(localStorage)
36-
.filter((key) => key.startsWith('db-flag-'))
37-
.forEach((key) => {
38-
localStorage.removeItem(key);
39-
});
38+
const keys = Object.keys(localStorage).filter((key) =>
39+
key.startsWith('db-flag-')
40+
);
41+
for (const key of keys) {
42+
localStorage.removeItem(key);
43+
}
4044
}
4145

4246
private getFromLocalStorage(key: string): any {
@@ -108,21 +112,23 @@ class FlagStorage {
108112

109113
cleanupExpired(): void {
110114
const now = Date.now();
111-
Object.keys(localStorage)
112-
.filter((key) => key.startsWith('db-flag-'))
113-
.forEach((key) => {
114-
try {
115-
const item = localStorage.getItem(key);
116-
if (item) {
117-
const parsed = JSON.parse(item);
118-
if (parsed.expiresAt && now > parsed.expiresAt) {
119-
localStorage.removeItem(key);
120-
}
115+
const keys = Object.keys(localStorage).filter((key) =>
116+
key.startsWith('db-flag-')
117+
);
118+
119+
for (const key of keys) {
120+
try {
121+
const item = localStorage.getItem(key);
122+
if (item) {
123+
const parsed = JSON.parse(item);
124+
if (parsed.expiresAt && now > parsed.expiresAt) {
125+
localStorage.removeItem(key);
121126
}
122-
} catch {
123-
localStorage.removeItem(key);
124127
}
125-
});
128+
} catch {
129+
localStorage.removeItem(key);
130+
}
131+
}
126132
}
127133
}
128134

0 commit comments

Comments
 (0)