diff --git a/examples/rss-reader/src/index.tsx b/examples/rss-reader/src/index.tsx index 2b269cb81..920f57bc9 100644 --- a/examples/rss-reader/src/index.tsx +++ b/examples/rss-reader/src/index.tsx @@ -27,12 +27,12 @@ function decodeEntities(value: string): string { return value.replace(/&(#x?[0-9a-fA-F]+|[a-zA-Z]+);/g, (match, entity: string) => { if (entity.startsWith('#x')) { - const codePoint = Number.parseInt(entity.slice(2), 16); + const codePoint = Number.parseInt(entity.slice(2, 10), 16); return Number.isFinite(codePoint) ? String.fromCodePoint(codePoint) : match; } if (entity.startsWith('#')) { - const codePoint = Number.parseInt(entity.slice(1), 10); + const codePoint = Number.parseInt(entity.slice(1, 10), 10); return Number.isFinite(codePoint) ? String.fromCodePoint(codePoint) : match; } @@ -188,7 +188,7 @@ function ErrorScreen({ message }: { message: string }) { function FeedListPane({ items, state }: { items: FeedEntry[]; state: ReturnType }) { const listRef = useRef(null); - const mappedItems: ListItem[] = items.map((entry) => ({ label: entry.title, value: entry.link })); + const mappedItems: ListItem[] = (items ?? []).map((entry) => ({ label: entry.title, value: entry.link })); const list = listRef.current ??= new List( { items: mappedItems, state }, diff --git a/examples/showcase/src/index.tsx b/examples/showcase/src/index.tsx index 444be6698..47a52a3e3 100644 --- a/examples/showcase/src/index.tsx +++ b/examples/showcase/src/index.tsx @@ -128,7 +128,7 @@ class ShowcaseApp extends Widget { if (event.key === 'q' || (event.ctrl && event.key === 'c')) return false; // Tab switching: 1-5 - const num = parseInt(event.key); + const num = parseInt(event.key, 10); if (num >= 1 && num <= 5) { this.switchTab(num - 1); return true; diff --git a/examples/widget-gallery/src/index.ts b/examples/widget-gallery/src/index.ts index 57b141244..ec688a7fc 100644 --- a/examples/widget-gallery/src/index.ts +++ b/examples/widget-gallery/src/index.ts @@ -129,7 +129,7 @@ class WidgetGalleryApp extends Widget { } // Tab switching: 1-6 - const num = parseInt(event.key); + const num = parseInt(event.key, 10); if (num >= 1 && num <= 6) { this._switchTab(num - 1); return true; diff --git a/packages/ui/src/TreeSelect.ts b/packages/ui/src/TreeSelect.ts index 652ede256..aabe6cff6 100644 --- a/packages/ui/src/TreeSelect.ts +++ b/packages/ui/src/TreeSelect.ts @@ -182,8 +182,8 @@ function _pathsEqual(a: number[], b: number[]): boolean { function _valuesEqual(a: string[], b: string[]): boolean { if (a.length !== b.length) return false; - const sortedA = [...a].sort(); - const sortedB = [...b].sort(); + const sortedA = [...a].sort((a, b) => a - b); + const sortedB = [...b].sort((a, b) => a - b); for (let i = 0; i < sortedA.length; i++) { if (sortedA[i] !== sortedB[i]) return false; } diff --git a/scripts/build-registry.ts b/scripts/build-registry.ts index f84844538..b4cecbd00 100644 --- a/scripts/build-registry.ts +++ b/scripts/build-registry.ts @@ -44,7 +44,7 @@ export function collectDeps(content: string): string[] { const deps = new Set(); let m: RegExpExecArray | null; while ((m = re.exec(content)) !== null) deps.add(m[1]!); - return [...deps].sort(); + return [...deps].sort((a, b) => a - b); } export function toSlug(name: string): string { @@ -289,7 +289,7 @@ function parseOptionsInterface(content: string, optionsTypeName: string): ApiPro } const local = parseFields(m[2]!); // Prepend inherited fields; a locally-redeclared field overrides the parent. - const localNames = new Set(local.map(p => p.name)); + const localNames = new Set((local ?? []).map(p => p.name)); return [...inherited.filter(p => !localNames.has(p.name)), ...local]; }