{"record":{"id":"aa475d6c3388555b","repo":"withastro/astro","slug":"maxduration-must-be-a-positive-number","errorCode":null,"errorMessage":"maxDuration must be a positive number","messagePattern":"maxDuration must be a positive number","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/integrations/vercel/src/index.ts","lineNumber":259,"sourceCode":"\tdevImageService = 'sharp',\n\tmiddlewareMode,\n\tedgeMiddleware,\n\tmaxDuration,\n\tisr = false,\n\tskewProtection = process.env.VERCEL_SKEW_PROTECTION_ENABLED === '1',\n\tstaticHeaders = false,\n}: VercelServerlessConfig = {}): AstroIntegration {\n\t// Resolve middleware mode with backward compatibility\n\tconst resolvedMiddlewareMode = middlewareMode ?? (edgeMiddleware ? 'edge' : 'classic');\n\n\tif (maxDuration) {\n\t\tif (typeof maxDuration !== 'number') {\n\t\t\tthrow new TypeError(`maxDuration must be a number`, {\n\t\t\t\tcause: maxDuration,\n\t\t\t});\n\t\t}\n\t\tif (maxDuration <= 0) {\n\t\t\tthrow new TypeError(`maxDuration must be a positive number`, {\n\t\t\t\tcause: maxDuration,\n\t\t\t});\n\t\t}\n\t}\n\n\tlet _config: AstroConfig;\n\tlet _buildTempFolder: URL;\n\tlet _serverEntry: string;\n\tlet _middlewareEntryPoint: URL | undefined;\n\tlet _routeToHeaders: RouteToHeaders | undefined = undefined;\n\t// Extra files to be merged with `includeFiles` during build\n\tconst extraFilesToInclude: URL[] = [];\n\t// Secret used to verify that the caller is the astro-generated edge middleware and not a third-party\n\tconst middlewareSecret = crypto.randomUUID();\n\n\tlet _buildOutput: 'server' | 'static';\n\n\tlet staticDir: URL | undefined;","sourceCodeStart":241,"sourceCodeEnd":277,"githubUrl":"https://github.com/withastro/astro/blob/d081033d5fe8e8a68c4bbbad4af9d2deb9c74bca/packages/integrations/vercel/src/index.ts#L241-L277","documentation":"Thrown by the Vercel serverless adapter when `maxDuration` is a number but less than or equal to zero. Vercel function timeouts must be a positive integer representing seconds; zero or negative values are meaningless and rejected.","triggerScenarios":"Passing `maxDuration: 0`, a negative number, or a coerced NaN-from-empty-string that happens to be `<= 0`. Reaches this branch only after the type check passes.","commonSituations":"Setting `maxDuration` to 0 intending 'default' (use `undefined` instead). Math error computing the value. Env var resolving to '0'.","solutions":["Use a positive integer: `maxDuration: 60`.","Omit `maxDuration` entirely to keep Vercel's platform default.","Validate and clamp: `const d = Number(raw); maxDuration: d > 0 ? d : undefined`."],"exampleFix":"// before\nvercel({ serverless: { maxDuration: 0 } })\n// after\nvercel({ serverless: { maxDuration: 60 } })","handlingStrategy":"validation","validationCode":"function asPositiveMaxDuration(v: unknown): number | undefined {\n  if (v == null) return undefined;\n  const n = Number(v);\n  if (!Number.isFinite(n) || n <= 0) throw new TypeError('maxDuration must be a positive number');\n  return n;\n}","typeGuard":"function isPositiveInt(v: unknown): v is number {\n  return typeof v === 'number' && Number.isInteger(v) && v > 0;\n}","tryCatchPattern":null,"preventionTips":["Use positive integers only for `maxDuration`.","Omit the option rather than passing 0 to get the platform default.","Validate config values in a shared helper."],"tags":["vercel","serverless","config","validation"],"backgroundTag":null,"analyzedSha":"d081033d5fe8e8a68c4bbbad4af9d2deb9c74bca","analyzedAt":"2026-08-12T13:37:29.035Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}