diff --git a/e2e/playwright/test-utils.ts b/e2e/playwright/test-utils.ts index acae6a564..7e8e8778e 100644 --- a/e2e/playwright/test-utils.ts +++ b/e2e/playwright/test-utils.ts @@ -27,6 +27,7 @@ import { import * as TOML from '@iarna/toml' import { SaveSettingsPayload } from 'lib/settings/settingsTypes' import { SETTINGS_FILE_NAME } from 'lib/constants' +import { isArray } from 'lib/utils' type TestColor = [number, number, number] export const TEST_COLORS = { @@ -582,7 +583,7 @@ const _makeTemplate = ( templateParts: TemplateStringsArray, ...options: TemplateOptions ) => { - const length = Math.max(...options.map((a) => (Array.isArray(a) ? a[0] : 0))) + const length = Math.max(...options.map((a) => (isArray(a) ? a[0] : 0))) let reExpTemplate = '' for (let i = 0; i < length; i++) { const currentStr = templateParts.map((str, index) => { @@ -590,7 +591,7 @@ const _makeTemplate = ( return ( escapeRegExp(str) + String( - Array.isArray(currentOptions) + isArray(currentOptions) ? currentOptions[i] : typeof currentOptions === 'number' ? currentOptions diff --git a/src/clientSideScene/sceneEntities.ts b/src/clientSideScene/sceneEntities.ts index 957698905..d677d50ef 100644 --- a/src/clientSideScene/sceneEntities.ts +++ b/src/clientSideScene/sceneEntities.ts @@ -75,7 +75,13 @@ import { changeSketchArguments, updateStartProfileAtArgs, } from 'lang/std/sketch' -import { isOverlap, normaliseAngle, roundOff, throttle } from 'lib/utils' +import { + isArray, + isOverlap, + normaliseAngle, + roundOff, + throttle, +} from 'lib/utils' import { addStartProfileAt, createArrayExpression, @@ -99,6 +105,7 @@ import { import { getThemeColorForThreeJs } from 'lib/theme' import { err, trap } from 'lib/trap' import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer' +import { Point3d } from 'wasm-lib/kcl/bindings/Point3d' type DraftSegment = 'line' | 'tangentialArcTo' @@ -116,6 +123,8 @@ export const SEGMENT_WIDTH_PX = 1.6 export const HIDE_SEGMENT_LENGTH = 75 // in pixels export const HIDE_HOVER_SEGMENT_LENGTH = 60 // in pixels +type Vec3Array = [number, number, number] + // This singleton Class is responsible for all of the things the user sees and interacts with. // That mostly mean sketch elements. // Cameras, controls, raycasters, etc are handled by sceneInfra @@ -384,7 +393,7 @@ export class SceneEntities { if (err(sketchGroup)) return Promise.reject(sketchGroup) if (!sketchGroup) return Promise.reject('sketchGroup not found') - if (!Array.isArray(sketchGroup?.value)) + if (!isArray(sketchGroup?.value)) return { truncatedAst, programMemoryOverride, @@ -1838,6 +1847,7 @@ export function getSketchQuaternion( }) if (err(sketchGroup)) return sketchGroup const zAxis = sketchGroup?.on.zAxis || sketchNormalBackUp + if (!zAxis) return Error('SketchGroup zAxis not found') return getQuaternionFromZAxis(massageFormats(zAxis)) } @@ -1962,8 +1972,6 @@ export function getQuaternionFromZAxis(zAxis: Vector3): Quaternion { return quaternion } -function massageFormats(a: any): Vector3 { - return Array.isArray(a) - ? new Vector3(a[0], a[1], a[2]) - : new Vector3(a.x, a.y, a.z) +function massageFormats(a: Vec3Array | Point3d): Vector3 { + return isArray(a) ? new Vector3(a[0], a[1], a[2]) : new Vector3(a.x, a.y, a.z) } diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 4201fc81b..b9085d6d6 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -4,6 +4,13 @@ import { v4 } from 'uuid' export const uuidv4 = v4 +/** + * A safer type guard for arrays since the built-in Array.isArray() asserts `any[]`. + */ +export function isArray(val: any): val is unknown[] { + return Array.isArray(val) +} + export function isOverlap(a: SourceRange, b: SourceRange) { const [startingRange, secondRange] = a[0] < b[0] ? [a, b] : [b, a] const [lastOfFirst, firstOfSecond] = [startingRange[1], secondRange[0]]