{"record":{"id":"220bbeabb7146833","repo":"perspective-dev/perspective","slug":"tilesourcespec-key-must-be-a-positive-number","errorCode":null,"errorMessage":"TileSourceSpec.${key} must be a positive number","messagePattern":"TileSourceSpec\\.(.+?) must be a positive number","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/viewer-charts/src/ts/map/tile-source.ts","lineNumber":182,"sourceCode":"            \"TileSourceSpec.subdomains must be an array of non-empty strings\",\n        );\n    }\n\n    const subdomains = Object.freeze([...rawSubdomains] as string[]);\n    if (template.includes(\"{s}\") && subdomains.length === 0) {\n        throw new TypeError(\n            'TileSourceSpec.template uses \"{s}\" but no subdomains were given',\n        );\n    }\n\n    const num = (key: string, dflt: number): number => {\n        const v = raw[key];\n        if (v === undefined) {\n            return dflt;\n        }\n\n        if (typeof v !== \"number\" || !Number.isFinite(v) || v <= 0) {\n            throw new TypeError(\n                `TileSourceSpec.${key} must be a positive number`,\n            );\n        }\n\n        return v;\n    };\n\n    return Object.freeze({\n        id,\n        label,\n        template,\n        subdomains,\n        attribution,\n        tile_size: num(\"tile_size\", 256),\n        max_zoom: num(\"max_zoom\", 19),\n    });\n}\n","sourceCodeStart":164,"sourceCodeEnd":200,"githubUrl":"https://github.com/perspective-dev/perspective/blob/11c8238c0c9c0b9e490b5a6a2dc277afad1e980a/packages/viewer-charts/src/ts/map/tile-source.ts#L164-L200","documentation":"The local helper num(key, dflt) inside parseTileSourceSpec validates optional numeric fields (tile_size, max_zoom): missing keys fall back to the default, but any present value must be a finite positive number. Zero, negative values, NaN, Infinity, or non-numbers (e.g. \"256\" as a string from JSON) trigger this TypeError.","triggerScenarios":"Thrown at packages/viewer-charts/src/ts/map/tile-source.ts:182 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Pass the field as a real number (tile_size: 256), not a numeric string","Remove non-positive or non-finite values; omit the key to accept the documented default","Coerce/validate JSON input with Number() before registering the spec"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"11c8238c0c9c0b9e490b5a6a2dc277afad1e980a","analyzedAt":"2026-09-09T00:35:19.377Z","contentChangedAt":"2026-09-09T00:35:19.377Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}