diff --git a/.github/snippet-typecheck/.npmrc b/.github/snippet-typecheck/.npmrc new file mode 100644 index 00000000..756225e5 --- /dev/null +++ b/.github/snippet-typecheck/.npmrc @@ -0,0 +1,4 @@ +# Always typecheck against the latest releases, so no lockfile. +package-lock=false +# Only the type declarations are used, so unpinned packages never run install scripts. +ignore-scripts=true diff --git a/.github/snippet-typecheck/package.json b/.github/snippet-typecheck/package.json new file mode 100644 index 00000000..9977609f --- /dev/null +++ b/.github/snippet-typecheck/package.json @@ -0,0 +1,17 @@ +{ + "name": "snippet-typecheck", + "private": true, + "description": "Typechecks the docs' code snippets against the latest Checkly CLI. Install or refresh with `npm update` in this folder.", + "type": "module", + "scripts": { + "check": "node typecheck-snippets.mjs ../..", + "test": "node --test typecheck-snippets.test.mjs" + }, + "dependencies": { + "@checkly/playwright-helpers": "latest", + "@playwright/test": "latest", + "@types/node": "latest", + "checkly": "latest", + "typescript": "^6.0.0" + } +} diff --git a/.github/snippet-typecheck/typecheck-snippets.mjs b/.github/snippet-typecheck/typecheck-snippets.mjs new file mode 100644 index 00000000..3fd04084 --- /dev/null +++ b/.github/snippet-typecheck/typecheck-snippets.mjs @@ -0,0 +1,212 @@ +// Typechecks MDX code snippets that import from `checkly` against the +// installed Checkly CLI constructs, so docs examples don't drift from the CLI. +// +// Complete snippets (ones with a `checkly` import) are checked, and so are +// fragments that use a checkly export. Property fragments like `request: {...}` +// are checked when `{/* typecheck-wrap: ApiCheck */}` (or `{/* typecheck-wrap */}` +// for other statements) is on the line before their fence. Snippets with a `/* More options... */` comment may omit required +// props. Opt a block out with `{/* typecheck-skip */}` on the line before it. +// +// Usage: npm update && npm run check (in .github/snippet-typecheck) +import { readdirSync, readFileSync, existsSync } from 'node:fs'; +import { dirname, join, relative, sep } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import ts from 'typescript'; + +// Modules resolve from this folder's node_modules, which installs the latest +// checkly release independently of the docs project's own dependencies. +const toolRoot = dirname(fileURLToPath(import.meta.url)); +const SKIP_MARKER = '{/* typecheck-skip */}'; +const WRAP_MARKER = /^\{\/\* typecheck-wrap(?:: (\w+))? \*\/\}$/; +const LANGS = { ts: 'ts', typescript: 'ts', js: 'js', javascript: 'js' }; +const CHECKLY_IMPORT = /(from\s+|require\(\s*)['"]checkly(\/[\w-]+)?['"]/; + +export function extractSnippets(mdx, file) { + const lines = mdx.split('\n'); + const snippets = []; + let open = null; + + lines.forEach((text, i) => { + if (!open) { + const match = text.match(/^(\s*)```(\S*)/); + if (!match) return; + let prev = i - 1; + while (prev >= 0 && lines[prev].trim() === '') prev--; + const marker = prev >= 0 ? lines[prev].trim() : ''; + const wrap = marker.match(WRAP_MARKER); + open = { indent: match[1].length, ext: LANGS[match[2]], start: i + 1, body: [], skip: marker === SKIP_MARKER, wrap: wrap ? wrap[1] ?? true : undefined }; + return; + } + if (/^\s*```\s*$/.test(text)) { + const code = open.body.join('\n'); + const imports = CHECKLY_IMPORT.test(code); + const wrap = open.wrap ?? (!imports && CHECKLY_USE.test(code) ? true : undefined); + if (open.ext && !open.skip && (wrap || imports)) { + snippets.push({ file, line: open.start + 1, ext: open.ext, code, ...(wrap && { wrap }) }); + } + open = null; + return; + } + open.body.push(text.slice(Math.min(open.indent, text.length - text.trimStart().length))); + }); + + return snippets; +} + +const compilerOptions = { + target: ts.ScriptTarget.ES2022, + module: ts.ModuleKind.ESNext, + moduleResolution: ts.ModuleResolutionKind.Bundler, + allowJs: true, + checkJs: true, + skipLibCheck: true, + noEmit: true, + types: ['node'], + // Snippets read `process.env.X` without null checks, as checks usually do. + // TypeScript 6 turns strict on by default, so keep it off explicitly. + strict: false, +}; + +// Multi-file examples import siblings like `./group.check`. Those can't +// resolve here; the imports become `any`, which keeps the `checkly` usage checked. +const isUnresolvedRelativeImport = d => d.code === 2307 && /module '\.\.?\//.test(ts.flattenDiagnosticMessageText(d.messageText, '\n')); + +// Usage snippets mark omitted props with `/* More options... */`. In those, +// a missing required prop is intended; wrong or unknown props still fail. +const PARTIAL_MARKER = /\/\*\s*More options/i; +const MISSING_PROPS = new Set([2739, 2740, 2741]); +const MORE_OPTIONS_HINT = 'Shortened on purpose? Add `/* More options... */` where the props are left out.'; +const isOnlyMissingProps = d => MISSING_PROPS.has(d.code) || (d.code === 2345 && typeof d.messageText === 'object' + && d.messageText.next?.length > 0 && d.messageText.next.every(n => MISSING_PROPS.has(n.code))); + +// Exports of a module read from its type declarations, split into values and +// types, because JavaScript files can't import types. +function moduleExports(specifiers) { + const files = specifiers.map(s => ts.resolveModuleName(s, join(toolRoot, 'index.ts'), compilerOptions, ts.sys).resolvedModule.resolvedFileName); + const program = ts.createProgram(files, compilerOptions); + const checker = program.getTypeChecker(); + return files.map(f => { + const symbols = checker.getExportsOfModule(checker.getSymbolAtLocation(program.getSourceFile(f))); + const isValue = s => ((s.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(s) : s).flags & ts.SymbolFlags.Value) !== 0; + return { all: symbols.map(s => s.name), values: symbols.filter(isValue).map(s => s.name) }; + }); +} + +// Marked fragments get every export of `checkly/constructs` and +// `checkly/util` imported, plus `defineConfig` and `path` for +// `path.join(__dirname, ...)` entrypoints. Property fragments (first code line +// is `key: ...`) are wrapped in the named construct as a partial snippet; +// statements like `new ApiCheck(...)` or `const x = ...` only get the imports. +const [constructExports, utilExports] = moduleExports(['checkly/constructs', 'checkly/util']); +const autoImports = kind => [ + `import { ${constructExports[kind].join(', ')} } from 'checkly/constructs'`, + `import { ${utilExports[kind].join(', ')} } from 'checkly/util'`, + `import { defineConfig } from 'checkly'`, + `import * as path from 'node:path'`, +].join('; '); +const AUTO_IMPORTS = { ts: autoImports('all'), js: autoImports('values') }; + +// Blocks without a `checkly` import are checked as statement fragments when +// they use a checkly export (`new BrowserCheck(`, `Frequency.EVERY_5M`). +// Exports that are also globals, like `Request`, don't count. +const usableExports = [...constructExports.values, ...utilExports.values].filter(name => !(name in globalThis)).join('|'); +const CHECKLY_USE = new RegExp(`(? code.split(EQUIVALENT_TO)[0]; + +// Fragments reference values defined elsewhere on the page (`statusPage`, +// `group`). Checkly exports are auto-imported, so an unknown lowercase name is +// page context; an unknown PascalCase name is a missing or misspelled construct. +const isPageContextName = d => (d.code === 2304 || d.code === 18004) + && /'[a-z_$][\w$]*'/.test(ts.flattenDiagnosticMessageText(d.messageText, '\n')); + +const isPropertyFragment = code => /^\w+\??:\s/.test(code.split('\n').map(l => l.trim()).find(l => l && !l.startsWith('//')) ?? ''); + +function source(snippet) { + const code = withoutEquivalent(snippet.code); + if (!snippet.wrap) return { code, offset: 0 }; + const imports = AUTO_IMPORTS[snippet.ext]; + if (typeof snippet.wrap !== 'string' || !isPropertyFragment(code)) return { code: `${imports}\n${code}`, offset: 1 }; + return { code: `${imports}\nnew ${snippet.wrap}('snippet', {\n/* More options... */\n${code}\n})`, offset: 3 }; +} + +export function typecheckSnippets(snippets) { + const virtual = new Map(snippets.map((s, i) => [join(toolRoot, '.snippets', `${i}.${s.ext}`).split(sep).join('/'), { ...s, ...source(s) }])); + const host = ts.createCompilerHost(compilerOptions); + const { getSourceFile, fileExists, readFile } = host; + host.fileExists = f => virtual.has(f) || fileExists(f); + host.readFile = f => virtual.get(f)?.code ?? readFile(f); + host.getSourceFile = (f, lang, ...rest) => virtual.has(f) + ? ts.createSourceFile(f, virtual.get(f).code, lang, true) + : getSourceFile(f, lang, ...rest); + + const program = ts.createProgram([...virtual.keys()], compilerOptions, host); + const errors = []; + + for (const [path, snippet] of virtual) { + const sourceFile = program.getSourceFile(path); + const syntactic = program.getSyntacticDiagnostics(sourceFile); + // Type errors on code that doesn't parse are noise; report the parse errors only. + const partial = PARTIAL_MARKER.test(snippet.code); + const diagnostics = syntactic.length > 0 ? syntactic : program.getSemanticDiagnostics(sourceFile) + .filter(d => !isUnresolvedRelativeImport(d) && !(partial && isOnlyMissingProps(d)) && !(snippet.wrap && isPageContextName(d))); + for (const d of diagnostics) { + const { line, character } = sourceFile.getLineAndCharacterOfPosition(d.start ?? 0); + // Errors in generated wrapper lines point at the fragment's first line. + errors.push({ + file: snippet.file, + line: snippet.line + Math.max(0, line - snippet.offset), + column: line < snippet.offset ? 1 : character + 1, + message: `TS${d.code}: ${ts.flattenDiagnosticMessageText(d.messageText, '\n')}${isOnlyMissingProps(d) ? `\n${MORE_OPTIONS_HINT}` : ''}`, + }); + } + } + + return errors; +} + +export function mdxFiles(root) { + const ignoredDirs = ['samples', '.git']; + const mintignore = join(root, '.mintignore'); + if (existsSync(mintignore)) { + for (const entry of readFileSync(mintignore, 'utf8').split('\n')) { + const dir = entry.trim().match(/^([^*#][^*]*?)\/\*\*/)?.[1]; + if (dir) ignoredDirs.push(dir); + } + } + + const files = []; + const walk = dir => { + for (const entry of readdirSync(dir, { withFileTypes: true })) { + const path = join(dir, entry.name); + if (entry.isDirectory()) { + if (entry.name !== 'node_modules' && !ignoredDirs.includes(relative(root, path).split(sep).join('/'))) walk(path); + } else if (entry.name.endsWith('.mdx')) { + files.push(path); + } + } + }; + walk(root); + return files; +} + +if (process.argv[1] === fileURLToPath(import.meta.url)) { + const root = process.argv[2] ?? process.cwd(); + const snippets = mdxFiles(root).flatMap(path => extractSnippets(readFileSync(path, 'utf8'), relative(root, path).split(sep).join('/'))); + const errors = typecheckSnippets(snippets); + + for (const e of errors) { + if (process.env.GITHUB_ACTIONS) { + console.log(`::error file=${e.file},line=${e.line},col=${e.column}::${e.message.replace(/\n/g, '%0A')}`); + } else { + console.error(`${e.file}:${e.line}:${e.column} - ${e.message}`); + } + } + + const checklyVersion = JSON.parse(readFileSync(join(toolRoot, 'node_modules/checkly/package.json'), 'utf8')).version; + console.log(`Typechecked ${snippets.length} snippets against checkly@${checklyVersion}: ${errors.length} error(s).`); + if (errors.length > 0) process.exitCode = 1; +} diff --git a/.github/snippet-typecheck/typecheck-snippets.test.mjs b/.github/snippet-typecheck/typecheck-snippets.test.mjs new file mode 100644 index 00000000..a3977327 --- /dev/null +++ b/.github/snippet-typecheck/typecheck-snippets.test.mjs @@ -0,0 +1,360 @@ +import assert from 'node:assert/strict'; +import { mkdirSync, mkdtempSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import test from 'node:test'; +import { extractSnippets, mdxFiles, typecheckSnippets } from './typecheck-snippets.mjs'; + +const fence = '```'; + +test('extracts only code blocks that import from checkly, with their MDX start line', () => { + const mdx = [ + '---', + 'title: Test', + '---', + '', + `${fence}ts api.check.ts`, + `import { ApiCheck } from 'checkly/constructs'`, + `new ApiCheck('a', { name: 'A', request: { method: 'GET', url: 'https://x.dev' } })`, + fence, + '', + `${fence}ts`, + `request: { method: 'GET' }`, + fence, + '', + `${fence}bash`, + `npx checkly test`, + fence, + ].join('\n'); + + const snippets = extractSnippets(mdx, 'constructs/api-check.mdx'); + + assert.equal(snippets.length, 1); + assert.equal(snippets[0].file, 'constructs/api-check.mdx'); + assert.equal(snippets[0].line, 6); + assert.equal(snippets[0].ext, 'ts'); + assert.match(snippets[0].code, /^import \{ ApiCheck \}/); +}); + +test('strips fence indentation and maps js fences to .js', () => { + const mdx = [ + '', + ' ', + ` ${fence}javascript`, + ` const { ApiCheck } = {}`, + ` import { Frequency } from "checkly/constructs"`, + ` ${fence}`, + ' ', + '', + ].join('\n'); + + const [snippet] = extractSnippets(mdx, 'page.mdx'); + + assert.equal(snippet.ext, 'js'); + assert.equal(snippet.line, 4); + assert.equal(snippet.code, 'const { ApiCheck } = {}\nimport { Frequency } from "checkly/constructs"'); +}); + +test('extracts JavaScript blocks that require checkly', () => { + const mdx = [`${fence}js api.check.js`, `const { ApiCheck } = require('checkly/constructs')`, fence].join('\n'); + + const snippets = extractSnippets(mdx, 'page.mdx'); + + assert.equal(snippets.length, 1); + assert.equal(snippets[0].ext, 'js'); +}); + +test('reports construct API mismatches in CommonJS snippets', () => { + const errors = typecheckSnippets([{ ...snippet([ + `const { ApiCheck } = require('checkly/constructs')`, + `new ApiCheck('a', {`, + ` name: 'A',`, + ` request: { method: 'Foo', url: 'https://x.dev' },`, + `})`, + ].join('\n')), ext: 'js' }]); + + assert.equal(errors.length, 1); + assert.equal(errors[0].line, 13); + assert.match(errors[0].message, /Foo/); +}); + +test('extracts unmarked blocks that use a checkly export as statement fragments', () => { + const mdx = [ + `${fence}ts Login Flow`, + `new BrowserCheck('login', { name: 'Login' })`, + fence, + '', + `${fence}ts`, + `UrlAssertionBuilder.statusCode().equals(200)`, + fence, + '', + `${fence}js`, + `const res = await fetch(new Request('https://x.dev'))`, + fence, + '', + `${fence}ts`, + `const frequency = 'often'`, + fence, + ].join('\n'); + + const snippets = extractSnippets(mdx, 'page.mdx'); + + assert.deepEqual(snippets.map(s => [s.line, s.wrap]), [[2, true], [6, true]]); +}); + +test('ignores the object literal after an "Equivalent to" comment', () => { + const errors = typecheckSnippets([ + fragment(`UrlAssertionBuilder.statusCode().equals(200)\n// Equivalent to:\n{ source: 'STATUS_CODE', comparison: 'EQUALS', target: '200' }`, true), + fragment(`UrlAssertionBuilder.statusCode().isFast()\n// Equivalent to:\n{ source: 'STATUS_CODE' }`, true, 30), + ]); + + assert.deepEqual(errors.map(e => e.line), [30]); +}); + +test('skips a block preceded by a typecheck-skip comment', () => { + const mdx = [ + '{/* typecheck-skip */}', + `${fence}ts`, + `import { ApiCheck } from 'checkly/constructs'`, + fence, + '', + `${fence}ts`, + `import { ApiCheck } from 'checkly/constructs'`, + fence, + ].join('\n'); + + const snippets = extractSnippets(mdx, 'page.mdx'); + + assert.equal(snippets.length, 1); + assert.equal(snippets[0].line, 7); +}); + +test('extracts fragments marked with typecheck-wrap even without a checkly import', () => { + const mdx = [ + '{/* typecheck-wrap: ApiCheck */}', + `${fence}ts REST API`, + `request: { method: 'GET', url: 'https://x.dev' },`, + fence, + ].join('\n'); + + const [fragment] = extractSnippets(mdx, 'page.mdx'); + + assert.equal(fragment.wrap, 'ApiCheck'); + assert.equal(fragment.line, 3); +}); + +test('finds MDX files outside node_modules folders at any depth', () => { + const root = mkdtempSync(join(tmpdir(), 'snippets-')); + for (const dir of ['docs', 'node_modules/pkg', 'tools/node_modules/pkg']) mkdirSync(join(root, dir), { recursive: true }); + for (const file of ['docs/page.mdx', 'node_modules/pkg/readme.mdx', 'tools/node_modules/pkg/readme.mdx']) writeFileSync(join(root, file), ''); + + assert.deepEqual(mdxFiles(root).map(f => f.slice(root.length + 1)), ['docs/page.mdx']); +}); + +function snippet(code, line = 10) { + return { file: 'page.mdx', line, ext: 'ts', code }; +} + +test('reports no errors for a valid construct', () => { + const errors = typecheckSnippets([snippet([ + `import { ApiCheck, AssertionBuilder } from 'checkly/constructs'`, + `new ApiCheck('a', {`, + ` name: 'A',`, + ` request: { method: 'GET', url: 'https://x.dev', assertions: [AssertionBuilder.statusCode().equals(200)] },`, + `})`, + ].join('\n'))]); + + assert.deepEqual(errors, []); +}); + +test('reports a construct API mismatch at the MDX line', () => { + const errors = typecheckSnippets([snippet([ + `import { ApiCheck } from 'checkly/constructs'`, + `new ApiCheck('a', {`, + ` name: 'A',`, + ` doesNotExist: true,`, + ` request: { method: 'GET', url: 'https://x.dev' },`, + `})`, + ].join('\n'))]); + + assert.equal(errors.length, 1); + assert.equal(errors[0].file, 'page.mdx'); + assert.equal(errors[0].line, 13); + assert.match(errors[0].message, /doesNotExist/); +}); + +test('reports a missing construct export', () => { + const errors = typecheckSnippets([snippet(`import { NotAConstruct } from 'checkly/constructs'`)]); + + assert.equal(errors.length, 1); + assert.match(errors[0].message, /NotAConstruct/); +}); + +test('ignores unresolvable relative imports from multi-file examples', () => { + const errors = typecheckSnippets([snippet([ + `import { ApiCheck } from 'checkly/constructs'`, + `import { group } from './group.check'`, + `new ApiCheck('a', { name: 'A', group, request: { method: 'GET', url: 'https://x.dev' } })`, + ].join('\n'))]); + + assert.deepEqual(errors, []); +}); + +test('allows missing required props in snippets marked with a "More options" comment', () => { + const errors = typecheckSnippets([ + snippet(`import { BrowserCheck, Frequency } from 'checkly/constructs'\nnew BrowserCheck('a', {\n frequency: Frequency.EVERY_5M,\n /* More options... */\n})`), + snippet(`import { TcpMonitor } from 'checkly/constructs'\nnew TcpMonitor('a', {\n /* More options ... */\n})`), + ]); + + assert.deepEqual(errors, []); +}); + +test('allows missing required props on typed variables marked with a "More options" comment', () => { + const errors = typecheckSnippets([ + fragment(`const trigger: IncidentTrigger = {\n service: searchService,\n /* More options... */\n}`, true), + ]); + + assert.deepEqual(errors, []); +}); + +test('still reports wrong props in snippets marked with a "More options" comment', () => { + const errors = typecheckSnippets([ + snippet(`import { BrowserCheck } from 'checkly/constructs'\nnew BrowserCheck('a', {\n frequency: 'often',\n /* More options... */\n})`), + snippet(`import { BrowserCheck } from 'checkly/constructs'\nnew BrowserCheck('a', {\n doesNotExist: true,\n /* More options... */\n})`, 50), + ]); + + assert.deepEqual(errors.map(e => e.line), [12, 52]); +}); + +test('reports missing required props in complete snippets', () => { + const errors = typecheckSnippets([snippet(`import { BrowserCheck } from 'checkly/constructs'\nnew BrowserCheck('a', { name: 'A' })`)]); + + assert.equal(errors.length, 1); + assert.match(errors[0].message, /'code' is missing/); +}); + +test('suggests a "More options" comment for missing props, and only for those', () => { + const errors = typecheckSnippets([ + snippet(`import { BrowserCheck } from 'checkly/constructs'\nnew BrowserCheck('a', { name: 'A' })`), + snippet(`import { BrowserCheck } from 'checkly/constructs'\nnew BrowserCheck('a', { name: 'A', code: { content: '' }, doesNotExist: true })`, 30), + ]); + + assert.equal(errors.length, 2); + assert.match(errors[0].message, /'code' is missing[\s\S]*Shortened on purpose\? Add `\/\* More options\.\.\. \*\/`/); + assert.doesNotMatch(errors[1].message, /More options/); +}); + +function fragment(code, wrap = 'ApiCheck', line = 10) { + return { file: 'page.mdx', line, ext: 'ts', code, wrap }; +} + +test('typechecks a property fragment inside the wrap construct with auto-imports', () => { + const errors = typecheckSnippets([fragment([ + `request: {`, + ` method: 'GET',`, + ` url: 'https://x.dev',`, + ` assertions: [AssertionBuilder.statusCode().equals(200)],`, + `},`, + `frequency: Frequency.EVERY_5M,`, + ].join('\n'))]); + + assert.deepEqual(errors, []); +}); + +test('reports wrong props in a wrapped fragment at the MDX line', () => { + const errors = typecheckSnippets([fragment([ + `request: {`, + ` method: 'GTE',`, + ` url: 'https://x.dev',`, + `},`, + ].join('\n'))]); + + assert.equal(errors.length, 1); + assert.equal(errors[0].line, 11); + assert.match(errors[0].message, /GTE/); +}); + +test('auto-imports node:path for fragments that reference entrypoint files', () => { + const errors = typecheckSnippets([fragment(`setupScript: { entrypoint: path.join(__dirname, 'setup.ts') },`)]); + + assert.deepEqual(errors, []); +}); + +test('extracts fragments marked with typecheck-wrap without a construct name', () => { + const mdx = ['{/* typecheck-wrap */}', `${fence}ts`, `UrlAssertionBuilder.statusCode().equals(200)`, fence].join('\n'); + + const [marked] = extractSnippets(mdx, 'page.mdx'); + + assert.equal(marked.wrap, true); +}); + +test('only adds imports to statement fragments', () => { + const errors = typecheckSnippets([ + fragment(`const alert = AlertEscalationBuilder.runBasedEscalation(2)`, true), + fragment(`UrlAssertionBuilder.statusCode().equals(200)`, true), + fragment(`UrlAssertionBuilder.statusCode().isFast()`, true, 30), + ]); + + assert.deepEqual(errors.map(e => e.line), [30]); +}); + +test('ignores undeclared lowercase names in fragments, which refer to page context', () => { + const errors = typecheckSnippets([ + fragment(`new ApiCheck('api', {\n group,\n name: 'API',\n alertChannels: [slackChannel],\n request: { method: 'GET', url: 'https://x.dev' },\n})`), + fragment(`new NotAConstruct('a', {})`, true, 30), + snippet(`import { ApiCheck } from 'checkly/constructs'\nnew ApiCheck('a', { name: 'A', group, request: { method: 'GET', url: 'https://x.dev' } })`, 50), + ]); + + assert.deepEqual(errors.map(e => e.line), [30, 51]); +}); + +test('auto-imports type-only exports like IncidentTrigger', () => { + const errors = typecheckSnippets([ + fragment(`const trigger: IncidentTrigger = {\n name: 'Search down',\n description: 'Search is failing',\n severity: 'MAJOR',\n notifySubscribers: true,\n service: searchService,\n}`, true), + fragment(`const trigger: NotAType = {}`, true, 30), + ]); + + assert.deepEqual(errors.map(e => e.line), [30]); +}); + +test('auto-imports only value exports into JavaScript fragments', () => { + const errors = typecheckSnippets([{ ...fragment(`UrlAssertionBuilder.statusCode().equals(200)`, true), ext: 'js' }]); + + assert.deepEqual(errors, []); +}); + +test('auto-imports defineConfig from checkly', () => { + const errors = typecheckSnippets([fragment(`export default defineConfig({\n projectName: 'P',\n logicalId: 'p',\n})`, true)]); + + assert.deepEqual(errors, []); +}); + +test('wraps property fragments that start with a comment', () => { + const errors = typecheckSnippets([fragment(`// Fail fast\nmaxResponseTime: 'slow',`)]); + + assert.equal(errors.length, 1); + assert.equal(errors[0].line, 11); +}); + +test('only adds imports to a marked fragment that already calls the constructor', () => { + const errors = typecheckSnippets([fragment([ + `new ApiCheck('a', {`, + ` name: 'A',`, + ` maxResponseTime: 'slow',`, + ` request: { method: 'GET', url: 'https://x.dev' },`, + `})`, + ].join('\n'))]); + + assert.equal(errors.length, 1); + assert.equal(errors[0].line, 12); +}); + +test('reports syntax errors without hiding type errors in other snippets', () => { + const errors = typecheckSnippets([ + snippet(`import { ApiCheck } from 'checkly/constructs'\nnew ApiCheck('a', {\n ...\n})`, 10), + snippet(`import { NotAConstruct } from 'checkly/constructs'`, 50), + ]); + + // TypeScript reports the bare `...` at the next token, the closing `}`. + assert.deepEqual(errors.map(e => e.line), [13, 50]); +}); diff --git a/.github/workflows/deploy-checks.yml b/.github/workflows/deploy-checks.yml index 1b39f70f..6e3590bf 100644 --- a/.github/workflows/deploy-checks.yml +++ b/.github/workflows/deploy-checks.yml @@ -30,7 +30,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '22' cache: 'npm' - name: Install dependencies diff --git a/.github/workflows/preview-checks.yml b/.github/workflows/preview-checks.yml index 8947341c..6c3e2942 100644 --- a/.github/workflows/preview-checks.yml +++ b/.github/workflows/preview-checks.yml @@ -147,7 +147,7 @@ jobs: if: steps.preview.outputs.url != '' uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '22' cache: 'npm' - name: Verify schema-generated API pages on preview diff --git a/.github/workflows/static-docs-checks.yml b/.github/workflows/static-docs-checks.yml index 651b2674..18329fb8 100644 --- a/.github/workflows/static-docs-checks.yml +++ b/.github/workflows/static-docs-checks.yml @@ -45,6 +45,14 @@ jobs: echo "openapi_changed=false" >> "$GITHUB_OUTPUT" fi + # A change to the snippet checker re-runs the snippet typecheck even + # when no docs changed. + if echo "$CHANGED" | grep -q '^\.github/snippet-typecheck/'; then + echo "snippets_tooling_changed=true" >> "$GITHUB_OUTPUT" + else + echo "snippets_tooling_changed=false" >> "$GITHUB_OUTPUT" + fi + # Same docs-detection regex as docs-gate / preview-checks NON_DOCS_RE='^(\.github/|.*\.sh$|[^/]+\.md$|package(-lock)?\.json$|node_modules/|checkly\.config\.ts$|block-headless\.js$|__checks__/)' if echo "$CHANGED" | grep -vE "$NON_DOCS_RE" | grep -q .; then @@ -56,7 +64,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '22' cache: 'npm' - name: Install dependencies @@ -70,6 +78,20 @@ jobs: - name: Test API navigation tooling run: npm run test:api-docs + # Typechecks MDX snippets that use `checkly`, and fragments marked with + # {/* typecheck-wrap */}, against the latest CLI constructs, so examples + # don't drift from the CLI API. The checker has its own package.json + # without a lockfile, so every run installs the latest checkly release + # rather than the docs project's pinned version. Errors show up as + # inline annotations on the PR. + - name: Typecheck checkly snippets + if: steps.detect.outputs.docs_changed == 'true' || steps.detect.outputs.snippets_tooling_changed == 'true' + working-directory: .github/snippet-typecheck + run: | + npm install --no-audit --no-fund + npm test + npm run check + - name: Check API group badges match the schema run: npm run sync:api-group-tags -- --check diff --git a/.gitignore b/.gitignore index 0d47d6c5..2524bcfc 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,7 @@ samples/**/.captures/ # Guide screenshot harness: saved Checkly session and raw captures scripts/guides/screenshots/.auth/ scripts/guides/screenshots/output/ + +# Local browser automation scratch +.playwright-cli/ +.playwright-mcp/ diff --git a/AGENTS.md b/AGENTS.md index 41e10d5f..2f80c891 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -54,7 +54,6 @@ ## Writing standards - Second-person voice ("you") -- Prerequisites at start of procedural content - ALWAYS wrap prerequisites in an Accordion component - Test all code examples before publishing - Match style and formatting of existing pages - Include both basic and advanced use cases @@ -63,12 +62,21 @@ - Relative paths for internal links ## Component usage rules -- Prerequisites Should Always be wrapped in an Accordion component with title "Prerequisites" or "Before you begin" - Use Steps component for sequential procedures sparingly. - Don't use Cards to display information. Only for navigation on Overview type pages - Use CodeGroups and Dropdowns for code examples that show the same example in different languages - Use Note/Tip/Warning callouts appropriately +## Code snippet typecheck +CI typechecks Checkly CLI snippets in `.mdx` files against the latest `checkly` release. Run it locally with `npm run check:snippets`. + +- Complete snippets (with a `checkly` import or `require`) and fragments that use a checkly export (`new ApiCheck(`, `Frequency.EVERY_5M`) are checked automatically. +- `/* More options... */` marks a shortened snippet. Missing required props are allowed; wrong or unknown props still fail. +- Add a marker comment on the line before the code fence when you need one: + - `{/* typecheck-wrap: ApiCheck */}`: checks a property fragment like `request: {...}` inside that construct. + - `{/* typecheck-wrap */}`: checks a statement like `export default defineConfig(...)`, adding imports only. + - `{/* typecheck-skip */}`: opts the block out. Use it only when the snippet can't match the latest CLI. + ## CodeGroup Dropdown - Use `` for code examples that show the same functionality in different programming languages - The dropdown automatically creates a language selector based on the code block language identifiers @@ -86,6 +94,9 @@ - This replaces the older `` pattern for language-specific code examples +## Guides +- Any change under `guides/`, `samples/guides/`, or `images/guides/` follows the `guide-authoring` skill in `.claude/skills/guide-authoring/SKILL.md`: agent path first, tested samples, real screenshots, brand diagrams. + ## Git workflow - NEVER use --no-verify when committing - Ask how to handle uncommitted changes before starting diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 793079d4..00000000 --- a/CLAUDE.md +++ /dev/null @@ -1,103 +0,0 @@ -# Mintlify documentation - -## Working relationship -- You can push back on ideas-this can lead to better documentation. Cite sources and explain your reasoning when you do so -- ALWAYS ask for clarification rather than making assumptions -- NEVER lie, guess, or make up information - -## Project context -- Framework: Mintlify. https://mintlify.com/docs/llms.txt -- Format: MDX files with YAML frontmatter -- Config: docs.json for navigation, theme, settings. Tabs set top level navigation, Groups set sidebar navigation within Tabs. -- Components: We use Mintlify components and documentation. - -- Headers and text - -- Images and embeds - -- Lists and tables - -- Code - -- Reusable snippets - -- Accordions - -- Callouts - -- Cards - -- Columns - -- Code groups - -- Examples - -- Expandables - -- Fields - -- Frames - -- Icons - -- Mermaid - -- Panel - -- Steps - -- Tabs - -- Tooltips - -- Update - -## Content strategy -- Search for existing information before adding new content. Avoid duplication unless it is done for a strategic reason -- Check existing patterns for consistency -- Start by making the smallest reasonable changes -- Document just enough for user success - not too much. Don't be verbose. -- Prioritize accuracy and usability of information -- Make content evergreen - -## docs.json - -- Refer to the [docs.json schema](https://mintlify.com/docs.json) when building the docs.json file and site navigation -- Tabs --- Groups ---- Pages - -## Frontmatter requirements for pages -- title: Clear, descriptive page title -- sidebarTitle: Concise title for sidebar -- description: Concise summary for SEO/navigation - -## Writing standards -- Second-person voice ("you") -- Test all code examples before publishing -- Match style and formatting of existing pages -- Include both basic and advanced use cases -- Language tags on all code blocks -- Alt text on all images -- Relative paths for internal links - -## Component usage rules -- Use Steps component for sequential procedures sparingly. -- Don't use Cards to display information. Only for navigation on Overview type pages -- Use CodeGroups and Dropdowns for code examples that show the same example in different languages -- Use Note/Tip/Warning callouts appropriately - -## CodeGroup Dropdown -- Use `` for code examples that show the same functionality in different programming languages -- The dropdown automatically creates a language selector based on the code block language identifiers -- Example usage: - - -```typescript example.ts -// TypeScript code here -``` - -```javascript example.js -// JavaScript code here -``` - - -- This replaces the older `` pattern for language-specific code examples - -## Guides -- Any change under `guides/`, `samples/guides/`, or `images/guides/` follows the `guide-authoring` skill in `.claude/skills/guide-authoring/SKILL.md`: agent path first, tested samples, real screenshots, brand diagrams. - -## Git workflow -- NEVER use --no-verify when committing -- Ask how to handle uncommitted changes before starting -- Create a new branch when no clear branch exists for changes -- Commit frequently throughout development -- NEVER skip or disable pre-commit hooks - -## Do not -- Skip frontmatter on any MDX file -- Use absolute URLs for internal links -- Include untested code examples -- Make assumptions - always ask for clarification -- overuse components like Cards or Accordion -​ diff --git a/CLAUDE.md b/CLAUDE.md new file mode 120000 index 00000000..47dc3e3d --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +AGENTS.md \ No newline at end of file diff --git a/__checks__/no-console-errors.spec.ts b/__checks__/no-console-errors.spec.ts index 6c15b6d9..4e71a9f5 100644 --- a/__checks__/no-console-errors.spec.ts +++ b/__checks__/no-console-errors.spec.ts @@ -9,6 +9,7 @@ const paths = ['/', '/api-reference', '/cli'] const ignoredUrls = [ /\/_vercel\/insights\//, /cdn\.segment\.com/, + /facebook\.(com|net)/, /px\.ads\.linkedin\.com/, /unifyintent\.com/, ] diff --git a/cli/checkly-runtimes.mdx b/cli/checkly-runtimes.mdx index b1c8dade..02afcd74 100644 --- a/cli/checkly-runtimes.mdx +++ b/cli/checkly-runtimes.mdx @@ -61,11 +61,12 @@ Common packages included in Checkly runtimes: Specify a runtime version in your `checkly.config.ts`: -```typescript checkly.config.ts highlight={6} +```typescript checkly.config.ts highlight={7} import { defineConfig } from 'checkly' export default defineConfig({ projectName: 'My Project', + logicalId: 'my-project', checks: { runtimeId: '2025.04', } @@ -82,6 +83,7 @@ new ApiCheck('books-api-check-2', { name: 'Books API', runtimeId: '2025.04', /* More options... */ +}) ``` Or in your check groups: diff --git a/cli/importing.mdx b/cli/importing.mdx index b005c3c2..25952715 100644 --- a/cli/importing.mdx +++ b/cli/importing.mdx @@ -73,12 +73,11 @@ new BrowserCheck('check-landing-page-3eNrQgOb', { code: { entrypoint: './check-landing-page.spec.ts', }, - ... alertChannels: [ // Note the usage of the imported alert channel here emailAlert1, ], - ... + /* More options... */ }) ``` diff --git a/cli/installation.mdx b/cli/installation.mdx index 2347b89c..c85474d9 100644 --- a/cli/installation.mdx +++ b/cli/installation.mdx @@ -62,7 +62,7 @@ Create a minimal `checkly.config.ts` (or `checkly.config.js`) at the root of you const { defineConfig } = require('checkly') const { Frequency } = require('checkly/constructs') - const config = { + module.exports = defineConfig({ projectName: 'Website Monitoring', logicalId: 'website-monitoring-1', repoUrl: 'https://github.com/acme/website', @@ -83,9 +83,7 @@ Create a minimal `checkly.config.ts` (or `checkly.config.js`) at the root of you cli: { runLocation: 'eu-central-1', } - } - - module.exports = defineConfig(config); + }) ``` diff --git a/concepts/environments.mdx b/concepts/environments.mdx index 48c6b9cb..3115aa2c 100644 --- a/concepts/environments.mdx +++ b/concepts/environments.mdx @@ -196,6 +196,7 @@ The following example deploys one shared API check to development, staging, and When an environment needs additional or different checks, keep shared checks in one directory and select the environment-specific directory from your configuration: +{/* typecheck-wrap */} ```typescript checkly.config.ts const sharedChecks = "**/__checks__/shared/**/*.check.ts" const environmentChecks = `**/__checks__/${environment}/**/*.check.ts` diff --git a/constructs/agentic-check.mdx b/constructs/agentic-check.mdx index 9589c031..26c6c8f5 100644 --- a/constructs/agentic-check.mdx +++ b/constructs/agentic-check.mdx @@ -30,6 +30,7 @@ For additional setup information, see [CLI overview](/cli/overview). +{/* typecheck-skip */} ```typescript Basic Example import { AgenticCheck, Frequency } from 'checkly/constructs' @@ -41,6 +42,7 @@ new AgenticCheck('homepage-health', { }) ``` +{/* typecheck-skip */} ```typescript Skills import { AgenticCheck, Frequency } from 'checkly/constructs' @@ -167,6 +169,7 @@ Keep prompts focused on one flow. If you want to monitor navigation, login, and How often the Agentic Check should run. Use one of the supported `Frequency` constants or the equivalent number of minutes. +{/* typecheck-skip */} ```typescript import { AgenticCheck, Frequency } from 'checkly/constructs' diff --git a/constructs/alert-escalation-policy.mdx b/constructs/alert-escalation-policy.mdx index 002388cb..78cd8573 100644 --- a/constructs/alert-escalation-policy.mdx +++ b/constructs/alert-escalation-policy.mdx @@ -65,6 +65,7 @@ Creates an alert escalation policy that triggers after a specified number of con **Usage:** +{/* typecheck-wrap */} ```ts AlertEscalationBuilder.runBasedEscalation( failedRuns, @@ -85,6 +86,7 @@ AlertEscalationBuilder.runBasedEscalation( +{/* typecheck-wrap */} ```ts Immediate Alert // Alert immediately on first failure const immediateAlert = AlertEscalationBuilder.runBasedEscalation( @@ -102,6 +104,7 @@ new ApiCheck("critical-service-check", { }) ``` +{/* typecheck-wrap */} ```ts Conservative Alert // Wait for multiple failures before alerting const conservativeAlert = AlertEscalationBuilder.runBasedEscalation( @@ -133,6 +136,7 @@ Creates an alert escalation policy that triggers after a specified duration of c **Usage:** +{/* typecheck-wrap */} ```ts AlertEscalationBuilder.timeBasedEscalation( minutesFailing, @@ -153,6 +157,7 @@ AlertEscalationBuilder.timeBasedEscalation( +{/* typecheck-wrap */} ```ts Alert after 15 minutes // Wait for batch jobs or slow services const timeBasedAlert = AlertEscalationBuilder.timeBasedEscalation( @@ -252,6 +257,7 @@ parallelRunFailureThreshold: { +{/* typecheck-wrap */} ```ts Regional Redundancy // Only alert if majority of regions fail const regionalAlert = AlertEscalationBuilder.runBasedEscalation( @@ -272,6 +278,7 @@ new ApiCheck("global-service-check", { }) ``` +{/* typecheck-wrap */} ```ts CDN Monitoring // Alert if 10% of CDN edges are failing const cdnAlert = AlertEscalationBuilder.runBasedEscalation( diff --git a/constructs/api-check.mdx b/constructs/api-check.mdx index 18ac4fa2..2008b670 100644 --- a/constructs/api-check.mdx +++ b/constructs/api-check.mdx @@ -123,6 +123,7 @@ The HTTP request configuration that defines the API endpoint to monitor. This is **Usage:** +{/* typecheck-wrap: ApiCheck */} ```ts request: { method: 'GET', @@ -149,6 +150,7 @@ request: { +{/* typecheck-wrap: ApiCheck */} ```ts REST API request: { method: "GET", @@ -165,6 +167,7 @@ request: { }, ``` +{/* typecheck-wrap: ApiCheck */} ```ts GraphQL API request: { method: "POST", @@ -190,6 +193,7 @@ request: { }, ``` +{/* typecheck-wrap: ApiCheck */} ```ts Form POST request: { method: "POST", @@ -205,6 +209,7 @@ request: { }, ``` +{/* typecheck-wrap: ApiCheck */} ```ts API with Authentication request: { method: "GET", @@ -230,6 +235,7 @@ Response time threshold in milliseconds for marking the check as degraded. This **Usage:** +{/* typecheck-wrap: ApiCheck */} ```ts highlight={3} new ApiCheck("performance-check", { name: "Performance Monitoring", @@ -250,6 +256,7 @@ Maximum response time in milliseconds before marking the check as failed. This s **Usage:** +{/* typecheck-wrap: ApiCheck */} ```ts highlight={3} new ApiCheck("timeout-check", { name: "API Timeout Check", @@ -269,6 +276,7 @@ Whether a failure should count as a pass. When set to `true`, HTTP status codes **Usage:** +{/* typecheck-wrap: ApiCheck */} ```ts highlight={3} new ApiCheck("negative-test", { name: "Test Error Handling", @@ -284,6 +292,7 @@ new ApiCheck("negative-test", { +{/* typecheck-wrap: ApiCheck */} ```ts Error Testing new ApiCheck("error-handling-test", { name: "Error Handling Test", @@ -297,6 +306,7 @@ new ApiCheck("error-handling-test", { }) ``` +{/* typecheck-wrap: ApiCheck */} ```ts Rate Limit Testing new ApiCheck("rate-limit-test", { name: "Rate Limit Behavior", @@ -324,6 +334,7 @@ Script to run before the API Check execution. Useful for setting up test data or +{/* typecheck-wrap: ApiCheck */} ```ts File Reference highlight={3-5} new ApiCheck("api-with-setup", { name: "API with Setup Script", @@ -337,6 +348,7 @@ new ApiCheck("api-with-setup", { }) ``` +{/* typecheck-wrap: ApiCheck */} ```ts Inline Script highlight={3-8} new ApiCheck('inline-setup', { name: 'API with Inline Setup', @@ -347,6 +359,7 @@ new ApiCheck('inline-setup', { ` }, request: { + method: 'GET', url: 'https://api.example.com/users' } }) @@ -377,6 +390,7 @@ Script to run after the API Check execution. Useful for cleaning up test data or +{/* typecheck-wrap: ApiCheck */} ```ts File Reference highlight={3-5} new ApiCheck("api-with-teardown", { name: "API with Teardown Script", @@ -390,6 +404,7 @@ new ApiCheck("api-with-teardown", { }) ``` +{/* typecheck-wrap: ApiCheck */} ```ts Inline Script highlight={3-9} new ApiCheck("inline-teardown", { name: "API with Inline Teardown", @@ -451,7 +466,7 @@ AssertionBuilder.statusCode().equals(200) - Asserting a part of a JSON response body using a JSON path expression ```ts -AssertionBuilder.jsonBody('$.data').greaterThan(2000), +AssertionBuilder.jsonBody('$.data').greaterThan(2000) // Equivalent to: { source: 'JSON_BODY', property: '$.data', comparison: 'GREATER_THAN', target: '2000' } ``` @@ -459,7 +474,7 @@ AssertionBuilder.jsonBody('$.data').greaterThan(2000), - Asserting the value of a part of an HTTP response header. Note that you can pass in a regex as the second argument ```ts -AssertionBuilder.headers('strict-transport-security', 'max-age=(\\d+)').greaterThan(10000), +AssertionBuilder.headers('strict-transport-security', 'max-age=(\\d+)').greaterThan(10000) // Equivalent to: { source: 'HEADERS', regex: 'max-age=(\d+)', property: 'strict-transport-security', comparison: 'GREATER_THAN', target: '10000' } ``` @@ -472,6 +487,7 @@ AssertionBuilder.headers('strict-transport-security', 'max-age=(\\d+)').greaterT +{/* typecheck-wrap: ApiCheck */} ```ts REST API Check new ApiCheck("users-api-check", { name: "Users API Check", @@ -493,6 +509,7 @@ new ApiCheck("users-api-check", { }) ``` +{/* typecheck-wrap: ApiCheck */} ```ts GraphQL API Check new ApiCheck("graphql-api-check", { name: "GraphQL API Check", @@ -521,6 +538,7 @@ new ApiCheck("graphql-api-check", { }) ``` +{/* typecheck-wrap: ApiCheck */} ```ts Form Submission Check new ApiCheck("form-api-check", { name: "Form Submission Check", @@ -539,6 +557,7 @@ new ApiCheck("form-api-check", { }) ``` +{/* typecheck-wrap: ApiCheck */} ```ts Authenticated API Check new ApiCheck("protected-api-check", { name: "Protected API Check", diff --git a/constructs/browser-check.mdx b/constructs/browser-check.mdx index 7392a64f..7b76b942 100644 --- a/constructs/browser-check.mdx +++ b/constructs/browser-check.mdx @@ -146,6 +146,7 @@ You must provide either `entrypoint` or `content`, but not both. +{/* typecheck-wrap: BrowserCheck */} ```ts File Reference new BrowserCheck("login-flow-check", { name: "User Login Flow", @@ -173,7 +174,9 @@ new BrowserCheck("quick-test", { ``` ```ts Complex Test File +import { BrowserCheck } from "checkly/constructs" import { secret } from "checkly/util" +import * as path from "path" new BrowserCheck("e2e-purchase", { name: "E-commerce Purchase Flow", @@ -199,6 +202,7 @@ Friendly name for your Browser Check that will be displayed in the Checkly dashb **Usage:** +{/* typecheck-wrap: BrowserCheck */} ```ts highlight={2} new BrowserCheck("my-check", { name: "User Login Flow Test", @@ -214,7 +218,7 @@ How often the Browser Check should run. Use the `Frequency` enum to set the chec **Usage:** ```ts highlight={5} -import { Frequency } from 'checkly/constructs' +import { BrowserCheck, Frequency } from 'checkly/constructs' new BrowserCheck("my-check", { name: "My Browser Check", @@ -227,6 +231,7 @@ new BrowserCheck("my-check", { +{/* typecheck-wrap: BrowserCheck */} ```ts High Frequency // For critical user journeys new BrowserCheck("critical-login", { @@ -237,6 +242,7 @@ new BrowserCheck("critical-login", { }) ``` +{/* typecheck-wrap: BrowserCheck */} ```ts Standard Frequency // For regular monitoring new BrowserCheck("standard-check", { @@ -260,6 +266,7 @@ Use `runtimeId` for Browser Checks and Multistep Checks. For Playwright Check Su **Usage:** +{/* typecheck-wrap: BrowserCheck */} ```ts highlight={3} new BrowserCheck("my-check", { name: "My Browser Check", @@ -277,6 +284,7 @@ Array of public location codes where the Browser Check should run. Multiple loca **Usage:** +{/* typecheck-wrap: BrowserCheck */} ```ts highlight={3} new BrowserCheck("my-check", { name: "My Browser Check", @@ -289,6 +297,7 @@ new BrowserCheck("my-check", { +{/* typecheck-wrap: BrowserCheck */} ```ts Global Coverage // Comprehensive global monitoring new BrowserCheck("global-check", { @@ -304,6 +313,7 @@ new BrowserCheck("global-check", { }) ``` +{/* typecheck-wrap: BrowserCheck */} ```ts Regional Focus // Focus on specific regions new BrowserCheck("europe-check", { @@ -323,6 +333,7 @@ Whether the browser check is enabled and will run according to its schedule. **Usage:** +{/* typecheck-wrap: BrowserCheck */} ```ts highlight={3} new BrowserCheck("my-check", { name: "My Browser Check", @@ -339,6 +350,7 @@ Array of tags to organize and categorize your Browser Checks in the Checkly infr **Usage:** +{/* typecheck-wrap: BrowserCheck */} ```ts highlight={3} new BrowserCheck("my-check", { name: "My Browser Check", @@ -351,6 +363,7 @@ new BrowserCheck("my-check", { +{/* typecheck-wrap: BrowserCheck */} ```ts Functional Tags new BrowserCheck("login-test", { name: "User Authentication", @@ -360,6 +373,7 @@ new BrowserCheck("login-test", { }) ``` +{/* typecheck-wrap: BrowserCheck */} ```ts Priority Tags new BrowserCheck("checkout-flow", { name: "Checkout Process", @@ -369,6 +383,7 @@ new BrowserCheck("checkout-flow", { }) ``` +{/* typecheck-wrap: BrowserCheck */} ```ts Environment Tags new BrowserCheck("staging-test", { name: "Staging Environment Test", @@ -387,7 +402,8 @@ Check-level environment variables that will be available during test execution. **Usage:** -```ts highlight={5-8} +```ts highlight={6-9} +import { BrowserCheck } from "checkly/constructs" import { secret } from "checkly/util" new BrowserCheck("my-check", { @@ -413,7 +429,9 @@ new BrowserCheck("my-check", { ```ts Test Credentials +import { BrowserCheck } from "checkly/constructs" import { secret } from "checkly/util" +import * as path from "path" new BrowserCheck("user-flow", { name: "User Account Flow", @@ -426,6 +444,7 @@ new BrowserCheck("user-flow", { }) ``` +{/* typecheck-wrap: BrowserCheck */} ```ts Feature Flags new BrowserCheck("feature-test", { name: "Feature Flag Test", diff --git a/constructs/check-group-v2.mdx b/constructs/check-group-v2.mdx index 9eb56e5f..e45b0a65 100644 --- a/constructs/check-group-v2.mdx +++ b/constructs/check-group-v2.mdx @@ -111,6 +111,7 @@ Friendly name for your check group that will be displayed in the Checkly dashboa **Usage:** +{/* typecheck-wrap: CheckGroupV2 */} ```ts highlight={2} const group = new CheckGroupV2("api-monitoring-group", { name: "API Monitoring Group", @@ -126,6 +127,7 @@ Whether checks in the group are running. When false, all checks in the group are **Usage:** +{/* typecheck-wrap: CheckGroupV2 */} ```ts highlight={3} const group = new CheckGroupV2("api-monitoring-group", { name: "API Monitoring Group", @@ -142,6 +144,7 @@ Whether to mute alerts for all checks in the group. Checks will still run but wo **Usage:** +{/* typecheck-wrap: CheckGroupV2 */} ```ts highlight={3} const group = new CheckGroupV2("api-monitoring-group", { name: "API Monitoring Group", @@ -158,7 +161,7 @@ How often to run checks within the group. Checks in your project that don't set **Usage:** ```ts highlight={5} -import { Frequency } from 'checkly/constructs' +import { CheckGroupV2, Frequency } from 'checkly/constructs' const group = new CheckGroupV2('api-monitoring-group', { name: "API Monitoring Group", @@ -176,6 +179,7 @@ Public locations for all checks in the group. If this or `privateLocations` is s **Usage:** +{/* typecheck-wrap: CheckGroupV2 */} ```ts highlight={3} const group = new CheckGroupV2("api-monitoring-group", { name: "API Monitoring Group", @@ -192,6 +196,7 @@ Setting to automatically create and apply Browser Checks to a group. **Usage:** +{/* typecheck-wrap: CheckGroupV2 */} ```ts highlight={3-5} const group = new CheckGroupV2("api-monitoring-group", { name: "API Monitoring Group", @@ -210,6 +215,7 @@ Setting to automatically create and apply MultiStep Checks to a group. **Usage:** +{/* typecheck-wrap: CheckGroupV2 */} ```ts highlight={3-5} const group = new CheckGroupV2("api-multistep-group", { name: "API Multistep Monitoring Group", @@ -247,6 +253,7 @@ To add checks to an existing group in your account, find the group ID in the Che +{/* typecheck-wrap */} ```ts Using Existing Group highlight={2,6} // Reference an existing group by ID const existingGroup = CheckGroupV2.fromId(123) @@ -280,6 +287,7 @@ See [Mixing Checks and Monitors in a Group](/platform/groups/#mixing-checks-and- + {/* typecheck-wrap: CheckGroupV2 */} ```ts const apiGroup = new CheckGroupV2("api-monitoring-group", { name: "API Monitoring", @@ -316,6 +324,7 @@ See [Mixing Checks and Monitors in a Group](/platform/groups/#mixing-checks-and- + {/* typecheck-wrap: CheckGroupV2 */} ```ts const servicesGroup = new CheckGroupV2("services-monitoring", { name: "Core Services Monitoring", @@ -364,6 +373,7 @@ See [Mixing Checks and Monitors in a Group](/platform/groups/#mixing-checks-and- + {/* typecheck-wrap: CheckGroupV2 */} ```ts const regionalGroup = new CheckGroupV2("us-east-monitoring", { name: "US East Region Monitoring", diff --git a/constructs/check-group.mdx b/constructs/check-group.mdx index 8dc2a81d..e78f8cbe 100644 --- a/constructs/check-group.mdx +++ b/constructs/check-group.mdx @@ -112,6 +112,7 @@ Friendly name for your check group that will be displayed in the Checkly dashboa **Usage:** +{/* typecheck-wrap: CheckGroup */} ```ts highlight={2} const group = new CheckGroup("api-monitoring-group", { name: "API Monitoring Group", @@ -126,6 +127,7 @@ Whether checks in the group are running. When false, all checks in the group are **Usage:** +{/* typecheck-wrap: CheckGroup */} ```ts highlight={3} const group = new CheckGroup("api-monitoring-group", { name: "API Monitoring Group", @@ -142,6 +144,7 @@ Whether to mute alerts for all checks in the group. Checks will still run but wo **Usage:** +{/* typecheck-wrap: CheckGroup */} ```ts highlight={3} const group = new CheckGroup("api-monitoring-group", { name: "API Monitoring Group", @@ -159,7 +162,7 @@ How often to run checks within the group. This frequency applies to all checks i **Usage:** ```ts highlight={5} -import { Frequency } from 'checkly/constructs' +import { CheckGroup, Frequency } from 'checkly/constructs' const group = new CheckGroup("api-monitoring-group", { name: "API Monitoring Group", @@ -177,6 +180,7 @@ Public locations for all checks in the group. Checks inherit these locations unl **Usage:** +{/* typecheck-wrap: CheckGroup */} ```ts highlight={3} const group = new CheckGroup("api-monitoring-group", { name: "API Monitoring Group", @@ -193,6 +197,7 @@ Setting to automatically create and apply Browser Checks to a group. **Usage:** +{/* typecheck-wrap: CheckGroup */} ```ts highlight={3-5} const group = new CheckGroup("api-monitoring-group", { name: "API Monitoring Group", @@ -211,6 +216,7 @@ Setting to automatically create and apply MultiStep Checks to a group. **Usage:** +{/* typecheck-wrap: CheckGroup */} ```ts highlight={3-5} const group = new CheckGroup("api-multistep-group", { name: "API Multistep Monitoring Group", @@ -227,6 +233,7 @@ const group = new CheckGroup("api-multistep-group", { + {/* typecheck-wrap: CheckGroup */} ```ts const apiGroup = new CheckGroup("api-monitoring-group", { name: "API Monitoring", @@ -262,6 +269,7 @@ const group = new CheckGroup("api-multistep-group", { + {/* typecheck-wrap: CheckGroup */} ```ts const servicesGroup = new CheckGroup("services-monitoring", { name: "Core Services Monitoring", @@ -309,6 +317,7 @@ const group = new CheckGroup("api-multistep-group", { + {/* typecheck-wrap: CheckGroup */} ```ts const regionalGroup = new CheckGroup("us-east-monitoring", { name: "US East Region Monitoring", diff --git a/constructs/dashboard.mdx b/constructs/dashboard.mdx index 2642f1bb..9eeab13a 100644 --- a/constructs/dashboard.mdx +++ b/constructs/dashboard.mdx @@ -93,6 +93,7 @@ Text displayed at the top of your dashboard as the main title. **Usage:** +{/* typecheck-wrap: Dashboard */} ```ts highlight={2} new Dashboard('my-dashboard', { header: 'Production Services Status' @@ -108,6 +109,7 @@ Text displayed below the header providing additional context about the dashboard **Usage:** +{/* typecheck-wrap: Dashboard */} ```ts highlight={3} new Dashboard('my-dashboard', { header: 'Production Services', @@ -123,6 +125,7 @@ Tags that filter which checks appear on the dashboard. Empty array shows all che **Usage:** +{/* typecheck-wrap: Dashboard */} ```ts highlight={2} new Dashboard('my-dashboard', { tags: ['production', 'api'] @@ -131,6 +134,7 @@ new Dashboard('my-dashboard', { **Examples:** +{/* typecheck-wrap: Dashboard */} ```ts // Service-specific tags new Dashboard('api-dashboard', { @@ -161,6 +165,7 @@ Subdomain under "checklyhq.com" for your dashboard (e.g., "my-status" becomes "m **Usage:** +{/* typecheck-wrap: Dashboard */} ```ts highlight={2} new Dashboard('my-dashboard', { customUrl: 'service-status' @@ -181,6 +186,7 @@ Custom domain for your dashboard (e.g., "status.example.com"). Must be verified **Usage:** +{/* typecheck-wrap: Dashboard */} ```ts highlight={2} new Dashboard('my-dashboard', { customDomain: 'status.example.com' @@ -195,6 +201,7 @@ Custom CSS styling for your dashboard. Only available on Team and Enterprise pla **Usage:** +{/* typecheck-wrap: Dashboard */} ```ts highlight={3-5,10-20} // Using file reference new Dashboard("styled-dashboard", { @@ -237,6 +244,7 @@ You must provide either `entrypoint` or `content`, but not both. + {/* typecheck-wrap: Dashboard */} ```ts new Dashboard("production-monitoring", { header: "Production Services", @@ -254,6 +262,7 @@ You must provide either `entrypoint` or `content`, but not both. + {/* typecheck-wrap: Dashboard */} ```ts new Dashboard("api-dashboard", { header: "API Endpoints Status", @@ -270,6 +279,7 @@ You must provide either `entrypoint` or `content`, but not both. + {/* typecheck-wrap: Dashboard */} ```ts new Dashboard("us-east-dashboard", { header: "US East Region Status", @@ -286,6 +296,7 @@ You must provide either `entrypoint` or `content`, but not both. + {/* typecheck-wrap: Dashboard */} ```ts new Dashboard("platform-team-dashboard", { header: "Platform Team Services", @@ -303,6 +314,7 @@ You must provide either `entrypoint` or `content`, but not both. + {/* typecheck-wrap: Dashboard */} ```ts new Dashboard("branded-dashboard", { header: "ACME Corporation Status", diff --git a/constructs/dns-monitor.mdx b/constructs/dns-monitor.mdx index 375c7d56..9701a92b 100644 --- a/constructs/dns-monitor.mdx +++ b/constructs/dns-monitor.mdx @@ -107,6 +107,7 @@ DNS request configuration that defines the DNS query to perform and how to valid **Usage:** +{/* typecheck-wrap: DnsMonitor */} ```ts new DnsMonitor("dns-monitor", { name: "DNS A Record Monitor", @@ -138,6 +139,7 @@ Response time threshold in milliseconds for marking the DNS Monitor as degraded **Usage:** +{/* typecheck-wrap: DnsMonitor */} ```ts highlight={3} new DnsMonitor("dns-performance-tiers", { name: "DNS Performance Tiers", @@ -158,6 +160,7 @@ Maximum response time in milliseconds before the DNS Monitor is marked as failed **Usage:** +{/* typecheck-wrap: DnsMonitor */} ```ts highlight={3} new DnsMonitor("fast-dns", { name: "Fast DNS Resolution", @@ -214,6 +217,7 @@ Friendly name for your DNS Monitor that will be displayed in the Checkly dashboa **Usage:** +{/* typecheck-wrap: DnsMonitor */} ```ts highlight={2} new DnsMonitor("my-monitor", { name: "DNS Resolution Monitor", @@ -228,6 +232,7 @@ How often the DNS Monitor should run. Use the `Frequency` enum to set the check **Usage:** +{/* typecheck-wrap: DnsMonitor */} ```ts highlight={2} new DnsMonitor("my-monitor", { frequency: Frequency.EVERY_1M, @@ -243,9 +248,11 @@ Array of [public location codes](/concepts/locations/#public-locations) where th **Usage:** +{/* typecheck-wrap: DnsMonitor */} ```ts highlight={2} new DnsMonitor("global-dns-monitor", { - locations: ["us-east-1", "eu-central-1", "ap-southeast-1"] + locations: ["us-east-1", "eu-central-1", "ap-southeast-1"], + /* More options... */ }) ``` @@ -255,9 +262,11 @@ Whether the DNS Monitor is enabled and will run according to its schedule. **Usage:** +{/* typecheck-wrap: DnsMonitor */} ```ts highlight={2} new DnsMonitor("my-monitor", { - activated: false // Disabled monitor + activated: false, // Disabled monitor + /* More options... */ }) ``` diff --git a/constructs/grpc-monitor.mdx b/constructs/grpc-monitor.mdx index c1c18b28..b370fe8a 100644 --- a/constructs/grpc-monitor.mdx +++ b/constructs/grpc-monitor.mdx @@ -116,6 +116,7 @@ gRPC connection and call configuration. **Usage:** +{/* typecheck-wrap: GrpcMonitor */} ```ts new GrpcMonitor('grpc-monitor', { name: 'My gRPC Service', @@ -171,6 +172,7 @@ Response time in milliseconds at which the monitor is marked as degraded (warnin **Usage:** +{/* typecheck-wrap: GrpcMonitor */} ```ts highlight={3} new GrpcMonitor('grpc-thresholds', { name: 'gRPC Latency Thresholds', @@ -191,6 +193,7 @@ Response time in milliseconds at which the monitor is marked as failed. Maximum: **Usage:** +{/* typecheck-wrap: GrpcMonitor */} ```ts highlight={3} new GrpcMonitor('grpc-thresholds', { name: 'gRPC Latency Thresholds', @@ -267,6 +270,7 @@ Friendly name for your gRPC Monitor displayed in the Checkly dashboard and used **Usage:** +{/* typecheck-wrap: GrpcMonitor */} ```ts highlight={2} new GrpcMonitor('my-grpc-monitor', { name: 'User Service Health', @@ -281,6 +285,7 @@ How often the gRPC Monitor should run. Use the `Frequency` enum to set the check **Usage:** +{/* typecheck-wrap: GrpcMonitor */} ```ts highlight={3} new GrpcMonitor('my-grpc-monitor', { name: 'User Service Health', @@ -297,6 +302,7 @@ Array of [public location codes](/concepts/locations/#public-locations) where th **Usage:** +{/* typecheck-wrap: GrpcMonitor */} ```ts highlight={3} new GrpcMonitor('global-grpc-monitor', { name: 'Global gRPC Health', @@ -312,6 +318,7 @@ Whether the gRPC Monitor is enabled and will run according to its schedule. **Usage:** +{/* typecheck-wrap: GrpcMonitor */} ```ts highlight={3} new GrpcMonitor('my-grpc-monitor', { name: 'User Service Health', diff --git a/constructs/heartbeat-monitor.mdx b/constructs/heartbeat-monitor.mdx index 8d380d0a..3259957d 100644 --- a/constructs/heartbeat-monitor.mdx +++ b/constructs/heartbeat-monitor.mdx @@ -100,6 +100,7 @@ The expected period between pings from your external service. This defines how o **Usage:** +{/* typecheck-wrap: HeartbeatMonitor */} ```ts highlight={3} new HeartbeatMonitor('my-heartbeat', { name: "My heartbeat", @@ -114,6 +115,7 @@ new HeartbeatMonitor('my-heartbeat', { +{/* typecheck-wrap: HeartbeatMonitor */} ```ts // Daily backup job new HeartbeatMonitor("backup-job", { @@ -128,6 +130,7 @@ new HeartbeatMonitor("backup-job", { +{/* typecheck-wrap: HeartbeatMonitor */} ```ts // Hourly data sync new HeartbeatMonitor("data-sync", { @@ -142,6 +145,7 @@ new HeartbeatMonitor("data-sync", { +{/* typecheck-wrap: HeartbeatMonitor */} ```ts // Every 5 minutes new HeartbeatMonitor("frequent-task", { @@ -164,6 +168,7 @@ The time unit for the period. Defines whether the period is in seconds, minutes, **Usage:** +{/* typecheck-wrap: HeartbeatMonitor */} ```ts highlight={4} new HeartbeatMonitor("my-heartbeat", { name: "My heartbeat", @@ -181,12 +186,14 @@ The grace period to wait before alerting after the expected ping time has passed **Usage:** +{/* typecheck-wrap: HeartbeatMonitor */} ```ts highlight={4} new HeartbeatMonitor('my-heartbeat', { period: 1, periodUnit: 'hours', grace: 10, - graceUnit: 'minutes' // 10 minute grace period + graceUnit: 'minutes', // 10 minute grace period + /* More options... */ }) ``` @@ -195,6 +202,7 @@ new HeartbeatMonitor('my-heartbeat', { +{/* typecheck-wrap: HeartbeatMonitor */} ```ts // Strict timing requirements new HeartbeatMonitor("critical-task", { @@ -209,6 +217,7 @@ new HeartbeatMonitor("critical-task", { +{/* typecheck-wrap: HeartbeatMonitor */} ```ts // Standard tolerance new HeartbeatMonitor("standard-job", { @@ -223,6 +232,7 @@ new HeartbeatMonitor("standard-job", { +{/* typecheck-wrap: HeartbeatMonitor */} ```ts // Flexible timing for complex jobs new HeartbeatMonitor("complex-job", { @@ -245,12 +255,14 @@ The time unit for the grace period. Defines whether the grace period is in secon **Usage:** +{/* typecheck-wrap: HeartbeatMonitor */} ```ts highlight={5} new HeartbeatMonitor('my-heartbeat', { period: 6, periodUnit: 'hours', grace: 30, - graceUnit: 'minutes' // 30 minute grace period + graceUnit: 'minutes', // 30 minute grace period + /* More options... */ }) ``` @@ -264,6 +276,7 @@ Friendly name for your heartbeat monitor that will be displayed in the Checkly d **Usage:** +{/* typecheck-wrap: HeartbeatMonitor */} ```ts highlight={2} new HeartbeatMonitor('my-heartbeat', { name: 'Daily Backup Job Monitor', @@ -277,6 +290,7 @@ new HeartbeatMonitor('my-heartbeat', { + {/* typecheck-wrap: HeartbeatMonitor */} ```ts new HeartbeatMonitor("backup-job-heartbeat", { name: "Daily Database Backup", @@ -293,6 +307,7 @@ new HeartbeatMonitor('my-heartbeat', { + {/* typecheck-wrap: HeartbeatMonitor */} ```ts new HeartbeatMonitor("sync-job-heartbeat", { name: "Hourly Data Synchronization", @@ -316,6 +331,7 @@ new HeartbeatMonitor('my-heartbeat', { + {/* typecheck-wrap: HeartbeatMonitor */} ```ts new HeartbeatMonitor('deployment-heartbeat', { name: 'Production Deployment Pipeline', @@ -335,6 +351,7 @@ new HeartbeatMonitor('my-heartbeat', { + {/* typecheck-wrap: HeartbeatMonitor */} ```ts new HeartbeatMonitor('log-processing-heartbeat', { name: 'Log Processing Job', @@ -366,6 +383,7 @@ new HeartbeatMonitor('my-heartbeat', { + {/* typecheck-wrap: HeartbeatMonitor */} ```ts new HeartbeatMonitor('frequent-task-heartbeat', { name: 'Every Minute Task', diff --git a/constructs/icmp-monitor.mdx b/constructs/icmp-monitor.mdx index 1936b2de..76475606 100644 --- a/constructs/icmp-monitor.mdx +++ b/constructs/icmp-monitor.mdx @@ -95,6 +95,7 @@ ICMP request configuration, including ping settings and response validation. **Usage:** +{/* typecheck-wrap: IcmpMonitor */} ```ts new IcmpMonitor('icmp-monitor', { name: 'ICMP Latency Monitor', @@ -124,6 +125,7 @@ Packet loss percentage at which the monitor is marked as degraded (warning state **Usage:** +{/* typecheck-wrap: IcmpMonitor */} ```ts highlight={3} new IcmpMonitor("icmp-performance-tiers", { name: "ICMP Performance Tiers", @@ -141,6 +143,7 @@ Packet loss percentage at which the monitor is marked as failed **Usage:** +{/* typecheck-wrap: IcmpMonitor */} ```ts highlight={3} new IcmpMonitor("icmp-performance-tiers", { name: "ICMP Performance Tiers", @@ -188,6 +191,7 @@ Friendly name for your ICMP Monitor that will be displayed in the Checkly dashbo **Usage:** +{/* typecheck-wrap: IcmpMonitor */} ```ts highlight={2} new IcmpMonitor("my-monitor", { name: "ICMP Ping Monitor", @@ -202,6 +206,7 @@ How often the ICMP Monitor should run. Use the `Frequency` enum to set the check **Usage:** +{/* typecheck-wrap: IcmpMonitor */} ```ts highlight={3} new IcmpMonitor("my-monitor", { name: "ICMP Ping Monitor", @@ -218,10 +223,12 @@ Array of [public location codes](/concepts/locations/#public-locations) where th **Usage:** +{/* typecheck-wrap: IcmpMonitor */} ```ts highlight={3} new IcmpMonitor("global-icmp-monitor", { name: "ICMP Ping Monitor", - locations: ["us-east-1", "eu-central-1", "ap-southeast-1"] + locations: ["us-east-1", "eu-central-1", "ap-southeast-1"], + /* More options... */ }) ``` @@ -231,10 +238,12 @@ Whether the ICMP Monitor is enabled and will run according to its schedule. **Usage:** +{/* typecheck-wrap: IcmpMonitor */} ```ts highlight={3} new IcmpMonitor("my-monitor", { name: "ICMP Ping Monitor", - activated: false // Disabled monitor + activated: false, // Disabled monitor + /* More options... */ }) ``` diff --git a/constructs/incident-trigger.mdx b/constructs/incident-trigger.mdx index f84d9df6..c1dccf16 100644 --- a/constructs/incident-trigger.mdx +++ b/constructs/incident-trigger.mdx @@ -71,6 +71,7 @@ The status page service that this incident will be associated with. When a check **Usage:** +{/* typecheck-wrap: StatusPageService */} ```ts highlight={6} const searchService = new StatusPageService("search-service", { name: "Search Service", diff --git a/constructs/incidentio-alert-channel.mdx b/constructs/incidentio-alert-channel.mdx index fe66ac5e..37bc7568 100644 --- a/constructs/incidentio-alert-channel.mdx +++ b/constructs/incidentio-alert-channel.mdx @@ -70,6 +70,7 @@ We have [handlebar helpers and variables](/integrations/alerts/webhooks/#using-v Here's an example payload, using the default one that we provide: +{/* typecheck-wrap: IncidentioAlertChannel */} ```ts highlight={5-26} new IncidentioAlertChannel('incidentio-channel-1', { name: 'ACME alerts', diff --git a/constructs/including-checks.mdx b/constructs/including-checks.mdx index c082dafa..1d56ca57 100644 --- a/constructs/including-checks.mdx +++ b/constructs/including-checks.mdx @@ -24,8 +24,11 @@ Here are some best practices: 2. Store any Checkly related Checks inside a `__checks__` folder. This neatly indicates where your Checks are organized. 3. Use multiple `__checks__` folders throughout your code base, near the functionality it should be checking. -```ts checkly.config.ts highlight={4} +{/* typecheck-wrap */} +```ts checkly.config.ts highlight={6} const config = defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', checks: { // A glob pattern that matches the Checks inside your repo. checkMatch: "**/__checks__/**/*.check.ts", @@ -52,8 +55,11 @@ again the new `logicalId` will trigger a deletion of the "old" Check and a creat any historical metrics. -```ts checkly.config.ts highlight={7} +{/* typecheck-wrap */} +```ts checkly.config.ts highlight={9} const config = defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', checks: { checkMatch: "**/__checks__/**/*.check.ts", browserChecks: { @@ -65,6 +71,7 @@ const config = defineConfig({ }) ``` +{/* typecheck-wrap: CheckGroupV2 */} ```ts group.check.ts highlight={6} const group = new CheckGroupV2("api-monitoring-group", { name: "Browser Check Monitoring Group", @@ -87,8 +94,11 @@ to prevent loading the wrong check type. For example using `browserChecks.testMa in all checks created as Browser checks. -```ts checkly.config.ts highlight={7} +{/* typecheck-wrap */} +```ts checkly.config.ts highlight={9} const config = defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', checks: { checkMatch: "**/__checks__/**/*.check.ts", // A glob pattern matches any Playwright .spec.ts files @@ -100,6 +110,7 @@ const config = defineConfig({ }) ``` +{/* typecheck-wrap: CheckGroupV2 */} ```ts group.check.ts highlight={6} const group = new CheckGroupV2("api-multistep-group", { name: "API Multistep Monitoring Group", diff --git a/constructs/maintenance-window.mdx b/constructs/maintenance-window.mdx index 510cfe60..a27c9b81 100644 --- a/constructs/maintenance-window.mdx +++ b/constructs/maintenance-window.mdx @@ -63,6 +63,7 @@ A name for the maintenance window that will be displayed in the Checkly dashboar Usage: +{/* typecheck-wrap: MaintenanceWindow */} ```ts highlight={2} new MaintenanceWindow("my-maintenance", { name: "Weekly Database Backup", @@ -79,6 +80,7 @@ Tags that filter which checks are affected by this maintenance window. Checks wi **Usage:** +{/* typecheck-wrap: MaintenanceWindow */} ```ts highlight={3} new MaintenanceWindow("my-maintenance", { name: "API Maintenance", @@ -99,6 +101,7 @@ Start date and time for the maintenance window in UTC (ISO 8601 timestamp). **Usage:** +{/* typecheck-wrap: MaintenanceWindow */} ```ts highlight={3} new MaintenanceWindow("my-maintenance", { name: "Database Maintenance", @@ -116,6 +119,7 @@ End date and time for the maintenance window in UTC (ISO 8601 timestamp). **Usage:** +{/* typecheck-wrap: MaintenanceWindow */} ```ts highlight={4} new MaintenanceWindow("my-maintenance", { name: "Database Maintenance", @@ -133,6 +137,7 @@ Repeat interval from the first occurrence. Used with `repeatUnit` to create recu **Usage:** +{/* typecheck-wrap: MaintenanceWindow */} ```ts highlight={3} new MaintenanceWindow("recurring-maintenance", { name: "Weekly Maintenance", @@ -151,6 +156,7 @@ Repeat strategy that defines the time unit for recurring maintenance windows (`D **Usage:** +{/* typecheck-wrap: MaintenanceWindow */} ```ts highlight={4} new MaintenanceWindow('recurring-maintenance', { name: "Bi-weekly Maintenance", @@ -164,6 +170,7 @@ new MaintenanceWindow('recurring-maintenance', { +{/* typecheck-wrap: MaintenanceWindow */} ```ts Daily Maintenance new MaintenanceWindow("daily-updates", { name: "Daily Database Sync", @@ -175,6 +182,7 @@ new MaintenanceWindow("daily-updates", { }) ``` +{/* typecheck-wrap: MaintenanceWindow */} ```ts Weekly Maintenance new MaintenanceWindow("weekly-updates", { name: "Weekly System Updates", @@ -186,6 +194,7 @@ new MaintenanceWindow("weekly-updates", { }) ``` +{/* typecheck-wrap: MaintenanceWindow */} ```ts Monthly Maintenance new MaintenanceWindow("monthly-db", { name: "Monthly Database Maintenance", @@ -207,6 +216,7 @@ When to stop repeating the maintenance window (ISO 8601 timestamp in UTC). If no **Usage:** +{/* typecheck-wrap: MaintenanceWindow */} ```ts highlight={5} new MaintenanceWindow("limited-recurring", { name: "Limited Time Maintenance", @@ -227,6 +237,7 @@ The named [IANA time zone](https://en.wikipedia.org/wiki/List_of_tz_database_tim **Usage:** +{/* typecheck-wrap: MaintenanceWindow */} ```ts highlight={4} new MaintenanceWindow("nightly-maintenance", { name: "Nightly Maintenance", @@ -251,6 +262,7 @@ Pause every check in the account during the maintenance window, regardless of `t **Usage:** +{/* typecheck-wrap: MaintenanceWindow */} ```ts highlight={3} new MaintenanceWindow("platform-migration", { name: "Platform Migration", @@ -267,6 +279,7 @@ Tags that filter which checks have their alerts silenced during the maintenance **Usage:** +{/* typecheck-wrap: MaintenanceWindow */} ```ts highlight={3} new MaintenanceWindow("degraded-api", { name: "Expected API Degradation", @@ -283,6 +296,7 @@ Silence alerts for every check in the account during the maintenance window, reg **Usage:** +{/* typecheck-wrap: MaintenanceWindow */} ```ts highlight={3} new MaintenanceWindow("quiet-period", { name: "Quiet Period", @@ -298,6 +312,7 @@ new MaintenanceWindow("quiet-period", { + {/* typecheck-wrap: MaintenanceWindow */} ```ts new MaintenanceWindow("database-maintenance", { name: "Monthly Database Maintenance", @@ -312,6 +327,7 @@ new MaintenanceWindow("quiet-period", { + {/* typecheck-wrap: MaintenanceWindow */} ```ts new MaintenanceWindow("system-updates", { name: "Weekly System Updates", @@ -326,6 +342,7 @@ new MaintenanceWindow("quiet-period", { + {/* typecheck-wrap */} ```ts // For immediate one-time maintenance const now = new Date() @@ -342,6 +359,7 @@ new MaintenanceWindow("quiet-period", { + {/* typecheck-wrap: MaintenanceWindow */} ```ts // API service maintenance new MaintenanceWindow("api-maintenance", { diff --git a/constructs/msteams-alert-channel.mdx b/constructs/msteams-alert-channel.mdx index 484b96d3..ba1be7a7 100644 --- a/constructs/msteams-alert-channel.mdx +++ b/constructs/msteams-alert-channel.mdx @@ -178,6 +178,7 @@ We have [handlebar helpers and variables](/integrations/alerts/webhooks/#using-v Here's an example payload, using the default one that we provide: +{/* typecheck-wrap: MSTeamsAlertChannel */} ```ts highlight={4-120} expandable new MSTeamsAlertChannel('msteams-channel-01', { name: 'ACME alerts', diff --git a/constructs/multistep-check.mdx b/constructs/multistep-check.mdx index 42f3896c..37f5795a 100644 --- a/constructs/multistep-check.mdx +++ b/constructs/multistep-check.mdx @@ -269,9 +269,11 @@ Friendly name for your multistep check that will be displayed in the Checkly das **Usage:** +{/* typecheck-wrap: MultiStepCheck */} ```ts highlight={2} new MultiStepCheck("my-multistep", { - name: "Complete User Journey Test" + name: "Complete User Journey Test", + /* More options... */ }) ``` @@ -283,6 +285,7 @@ The Checkly runtime version used to execute the Multistep Check. Runtimes are ma Multistep checks require runtime `2023.09` or later. Usage: +{/* typecheck-wrap: MultiStepCheck */} ```ts highlight={3} new MultiStepCheck("my-multistep", { name: 'My Multistep Check', @@ -301,7 +304,7 @@ How often the multistep check should run. Use the `Frequency` enum to set the ch Usage: ```ts highlight={5} -import { Frequency } from 'checkly/constructs' +import { Frequency, MultiStepCheck } from 'checkly/constructs' new MultiStepCheck("my-multistep", { name: "My Multistep Check", @@ -317,6 +320,7 @@ new MultiStepCheck("my-multistep", { Array of public location codes where the multistep check should run. Multiple locations provide geographic coverage and user experience insights. Usage: +{/* typecheck-wrap: MultiStepCheck */} ```ts highlight={3} new MultiStepCheck("global-check", { name: "Global Multistep Check", @@ -330,6 +334,7 @@ Examples: +{/* typecheck-wrap: MultiStepCheck */} ```ts // Worldwide API testing new MultiStepCheck("global-journey", { @@ -348,6 +353,7 @@ new MultiStepCheck("global-journey", { +{/* typecheck-wrap: MultiStepCheck */} ```ts // European user focus new MultiStepCheck("eu-workflow", { diff --git a/constructs/overview.mdx b/constructs/overview.mdx index edb026fd..0137d551 100644 --- a/constructs/overview.mdx +++ b/constructs/overview.mdx @@ -133,8 +133,9 @@ Find a full reference of all check properties in [the `ApiCheck` construct](/con Assigning a `logicalId` is crucial when creating a construct. Remember the following rules when creating and updating constructs: 1. Every construct needs to have a `logicalId`. This is the first argument when instantiating a class, i.e. +{/* typecheck-wrap: ApiCheck */} ```ts -const check = new ApiCheck('my-logical-id', { name: 'My API check' }) +const check = new ApiCheck('my-logical-id', { name: 'My API check', /* More options... */ }) ``` 2. Every `logicalId` needs to be unique within the scope of a `Project`. 3. A `Project` also has a `logicalId`. This needs to be unique within the scope of the Checkly account. diff --git a/constructs/phone-call-alert-channel.mdx b/constructs/phone-call-alert-channel.mdx index ea39cdc3..fdfb810f 100644 --- a/constructs/phone-call-alert-channel.mdx +++ b/constructs/phone-call-alert-channel.mdx @@ -54,6 +54,7 @@ Each `PhoneCallAlertChannel` supports only one phone number. Phone numbers need We only support phone numbers from certain [countries and regions](/integrations/alerts/phone-calls/#supported-countries-and-regions). +{/* typecheck-wrap: PhoneCallAlertChannel */} ```ts highlight={2} new PhoneCallAlertChannel('call-channel-1', { phoneNumber: '+31061234567890', diff --git a/constructs/playwright-check.mdx b/constructs/playwright-check.mdx index be29b8d6..fbd54544 100644 --- a/constructs/playwright-check.mdx +++ b/constructs/playwright-check.mdx @@ -106,6 +106,7 @@ The path to the Playwright configuration file (`playwright.config.js/ts`) which **Usage:** +{/* typecheck-wrap: PlaywrightCheck */} ```ts highlight={3} new PlaywrightCheck("critical-e2e-monitor", { name: "Critical E2E Monitor", @@ -123,6 +124,7 @@ Checkly defaults to using npm, but automatically detects other package managers **Usage:** +{/* typecheck-wrap: PlaywrightCheck */} ```ts highlight={4} new PlaywrightCheck("critical-e2e-monitor", { name: "Critical E2E Monitor", @@ -139,6 +141,7 @@ The command to execute Playwright tests when running `npx checkly test` or runni **Usage:** +{/* typecheck-wrap: PlaywrightCheck */} ```ts highlight={4} new PlaywrightCheck("critical-e2e-monitor", { name: "Critical E2E Monitor", @@ -163,6 +166,7 @@ The defined projects to run from your Playwright configuration. +{/* typecheck-wrap: PlaywrightCheck */} ```ts Single project highlight={4} new PlaywrightCheck("critical-e2e-monitor", { name: "Critical E2E Monitor", @@ -171,6 +175,7 @@ new PlaywrightCheck("critical-e2e-monitor", { }) ``` +{/* typecheck-wrap: PlaywrightCheck */} ```ts Multiple projects highlight={4} new PlaywrightCheck("critical-e2e-monitor", { name: "Critical E2E Monitor", @@ -195,6 +200,7 @@ Tests matching any of these tags will be executed. +{/* typecheck-wrap: PlaywrightCheck */} ```ts Single project highlight={4} new PlaywrightCheck("critical-e2e-monitor", { name: "Critical E2E Monitor", @@ -203,6 +209,7 @@ new PlaywrightCheck("critical-e2e-monitor", { }) ``` +{/* typecheck-wrap: PlaywrightCheck */} ```ts Multiple projects highlight={4} new PlaywrightCheck("critical-e2e-monitor", { name: "Critical E2E Monitor", @@ -223,6 +230,7 @@ Defines the glob patterns for files and directories that should be included when **Usage:** +{/* typecheck-wrap: PlaywrightCheck */} ```ts highlight={4} new PlaywrightCheck("critical-e2e-monitor", { name: "Critical E2E Monitor", @@ -299,6 +307,7 @@ Friendly name for your Playwright Check Suite that will be displayed in the Chec **Usage:** +{/* typecheck-wrap: PlaywrightCheck */} ```ts highlight={2} new PlaywrightCheck("critical-e2e-monitor", { name: "Critical E2E Monitor", @@ -314,6 +323,7 @@ How often the Playwright Check Suite should run. Use the `Frequency` enum to set **Usage:** +{/* typecheck-wrap: PlaywrightCheck */} ```ts highlight={4} new PlaywrightCheck("my-pwt-check-suite", { name: "My Playwright Check Suite", @@ -326,6 +336,7 @@ new PlaywrightCheck("my-pwt-check-suite", { +{/* typecheck-wrap: PlaywrightCheck */} ```ts High Frequency // For critical user journeys new PlaywrightCheck("my-pwt-check-suite", { @@ -336,6 +347,7 @@ new PlaywrightCheck("my-pwt-check-suite", { }) ``` +{/* typecheck-wrap: PlaywrightCheck */} ```ts Standard Frequency // For regular monitoring new PlaywrightCheck("my-pwt-check-suite", { @@ -357,6 +369,7 @@ Array of public location codes where the Playwright Check Suite should run. Mult **Usage:** +{/* typecheck-wrap: PlaywrightCheck */} ```ts highlight={4} new PlaywrightCheck("my-pwt-check-suite", { name: "My Playwright Check Suite", @@ -369,6 +382,7 @@ new PlaywrightCheck("my-pwt-check-suite", { +{/* typecheck-wrap: PlaywrightCheck */} ```ts Global Coverage // Comprehensive global monitoring new PlaywrightCheck("global-pwt-check-suite", { @@ -384,6 +398,7 @@ new PlaywrightCheck("global-pwt-check-suite", { }) ``` +{/* typecheck-wrap: PlaywrightCheck */} ```ts Regional Focus // Focus on specific regions new PlaywrightCheck("europe-pwt-check-suite", { @@ -404,6 +419,7 @@ Whether the Playwright Check Suite is enabled and will run according to its sche **Usage:** +{/* typecheck-wrap: PlaywrightCheck */} ```ts highlight={4} new PlaywrightCheck("disabled-pwt-check-suite", { name: "Disabled Playwright Check Suite", @@ -420,6 +436,7 @@ Array of Checkly tags to organize and categorize your Playwright Check Suite in **Usage:** +{/* typecheck-wrap: PlaywrightCheck */} ```ts highlight={4} new PlaywrightCheck("my-check-suite", { name: "My Playwright Check Suite", @@ -432,6 +449,7 @@ new PlaywrightCheck("my-check-suite", { +{/* typecheck-wrap: PlaywrightCheck */} ```ts Priority Tags new PlaywrightCheck("my-check-suite", { name: "My Playwright Check Suite", @@ -440,6 +458,7 @@ new PlaywrightCheck("my-check-suite", { }) ``` +{/* typecheck-wrap: PlaywrightCheck */} ```ts Environment Tags new PlaywrightCheck("staging-check-suite", { name: "Staging Playwright Check Suite", @@ -467,7 +486,8 @@ Check-level environment variables that will be available during test execution. **Usage:** -```ts highlight={6-9} +```ts highlight={7-10} +import { PlaywrightCheck } from "checkly/constructs" import { secret } from "checkly/util" new PlaywrightCheck("user-flow-pwt-check-suite", { @@ -493,6 +513,7 @@ new PlaywrightCheck("user-flow-pwt-check-suite", { ```ts Test Credentials +import { PlaywrightCheck } from "checkly/constructs" import { secret } from "checkly/util" new PlaywrightCheck("user-flow-pwt-check-suite", { @@ -505,6 +526,7 @@ new PlaywrightCheck("user-flow-pwt-check-suite", { }) ``` +{/* typecheck-wrap: PlaywrightCheck */} ```ts Environment settings new PlaywrightCheck("feature-test", { name: "Feature Flag Test", @@ -529,6 +551,7 @@ new PlaywrightCheck("feature-test", { +{/* typecheck-wrap: PlaywrightCheck */} ```ts Multi-browser Support const playwrightChecks = new PlaywrightCheck("multi-browser-check", { name: "Multi-browser check suite", @@ -539,6 +562,7 @@ const playwrightChecks = new PlaywrightCheck("multi-browser-check", { }) ``` +{/* typecheck-wrap: PlaywrightCheck */} ```ts Project-dependency Support // Often, it makes sense to define different Playwright projects // in your `playwright.config` and make them depend on each other diff --git a/constructs/private-location.mdx b/constructs/private-location.mdx index 253a2039..6b8fe2b9 100644 --- a/constructs/private-location.mdx +++ b/constructs/private-location.mdx @@ -74,6 +74,7 @@ Friendly name for your private location that will be displayed in the Checkly da **Usage:** +{/* typecheck-wrap: PrivateLocation */} ```ts new PrivateLocation("my-location", { name: "Corporate Data Center", @@ -88,6 +89,7 @@ Unique slug identifier for your private location. This must be unique across you **Usage:** +{/* typecheck-wrap: PrivateLocation */} ```ts new PrivateLocation("my-location", { name: "My Location", @@ -100,6 +102,7 @@ new PrivateLocation("my-location", { +{/* typecheck-wrap: PrivateLocation */} ```ts // Descriptive and stable slugs new PrivateLocation("corp-vpc-east", { @@ -121,6 +124,7 @@ new PrivateLocation("datacenter-west", { +{/* typecheck-wrap: PrivateLocation */} ```ts // Too generic or likely to change new PrivateLocation("location-1", { @@ -147,6 +151,7 @@ The `slugName` must be unique across your entire Checkly account and cannot be c Octicon name to visually distinguish the location in the Checkly UI. Choose icons that represent your infrastructure type or purpose. Usage: +{/* typecheck-wrap: PrivateLocation */} ```ts new PrivateLocation("my-location", { name: "Database Zone", @@ -162,6 +167,7 @@ new PrivateLocation("my-location", { Proxy URL for outgoing HTTP calls from this private location. Use when your infrastructure requires all external traffic to go through a corporate proxy. Usage: +{/* typecheck-wrap: PrivateLocation */} ```ts new PrivateLocation('corporate-location', { name: 'Corporate Network', @@ -177,6 +183,7 @@ Reference private locations by using their construct reference or by slug names +{/* typecheck-wrap: PrivateLocation */} ```ts const privateLocationVpcEast = new PrivateLocation("corp-vpc-east", { name: "Corporate VPC East", @@ -197,6 +204,7 @@ new ApiCheck("existing-location-reference", { +{/* typecheck-wrap: ApiCheck */} ```ts new ApiCheck("existing-location-check", { name: "Check Using Existing Location", @@ -211,6 +219,7 @@ new ApiCheck("existing-location-check", { +{/* typecheck-wrap: PrivateLocation */} ```ts // Combine new and existing private locations const newLocation = new PrivateLocation("new-location", { @@ -241,6 +250,7 @@ new ApiCheck("mixed-locations-check", { +{/* typecheck-wrap: PrivateLocation */} ```ts new PrivateLocation("corp-proxy-location", { name: "Corporate Network with Proxy", @@ -252,6 +262,7 @@ new PrivateLocation("corp-proxy-location", { +{/* typecheck-wrap: PrivateLocation */} ```ts new PrivateLocation("secure-proxy-location", { name: "Secure Corporate Proxy", @@ -263,6 +274,7 @@ new PrivateLocation("secure-proxy-location", { +{/* typecheck-wrap: PrivateLocation */} ```ts new PrivateLocation("auth-proxy-location", { name: "Authenticated Proxy Location", @@ -316,6 +328,7 @@ When `proxyUrl` is configured, all HTTP calls from API checks running in this pr + {/* typecheck-wrap: PrivateLocation */} ```ts const eastDatacenter = new PrivateLocation("dc-east", { name: "East Coast Datacenter", @@ -358,6 +371,7 @@ When `proxyUrl` is configured, all HTTP calls from API checks running in this pr + {/* typecheck-wrap: PrivateLocation */} ```ts const devEnvironment = new PrivateLocation("dev-env", { name: "Development Environment", @@ -395,6 +409,7 @@ When `proxyUrl` is configured, all HTTP calls from API checks running in this pr + {/* typecheck-wrap: PrivateLocation */} ```ts const corporateLocation = new PrivateLocation("corporate-with-proxy", { name: "Corporate Network with Proxy", diff --git a/constructs/project.mdx b/constructs/project.mdx index 997c90d4..cec65c8f 100644 --- a/constructs/project.mdx +++ b/constructs/project.mdx @@ -84,6 +84,7 @@ Friendly name for your project that will be displayed in the Checkly dashboard a **Usage:** +{/* typecheck-wrap */} ```ts highlight={2} export default defineConfig({ projectName: 'Website Monitoring', @@ -100,6 +101,7 @@ Unique identifier for this project that should remain stable across deployments. **Usage:** +{/* typecheck-wrap */} ```ts highlight={2} export default defineConfig({ logicalId: 'website-monitoring-prod', @@ -120,6 +122,7 @@ Optional URL to a Git repository for documentation and team collaboration purpos **Usage:** +{/* typecheck-wrap */} ```ts highlight={2} export default defineConfig({ repoUrl: 'https://github.com/acme/website', @@ -136,6 +139,7 @@ Defaults for CLI commands like `checkly test` and `checkly trigger`. **Usage:** +{/* typecheck-wrap */} ```ts highlight={4-7} export default defineConfig({ projectName: "Website Monitoring", @@ -167,6 +171,7 @@ Top-level defaults for all checks in this project. Individual checks and groups **Usage:** +{/* typecheck-wrap */} ```ts highlight={5-13} export default defineConfig({ projectName: "Website Monitoring", @@ -219,6 +224,7 @@ Whether the checks and monitors are enabled and will run according to its schedu **Usage:** +{/* typecheck-wrap */} ```ts highlight={5} export default defineConfig({ projectName: "Website Monitoring", @@ -237,6 +243,7 @@ Default alert channels for all checks and monitors. **Usage:** +{/* typecheck-wrap: SmsAlertChannel */} ```ts highlight={9} const smsAlertChannel = new SmsAlertChannel("sms-alert-channel", { phoneNumber: "+1234567890", @@ -259,6 +266,7 @@ Glob pattern where the CLI looks for files containing Check constructs, i.e. all **Usage:** +{/* typecheck-wrap */} ```ts highlight={5} export default defineConfig({ projectName: "Website Monitoring", @@ -279,6 +287,7 @@ Environment variables available to the check script and monitors. **Usage:** +{/* typecheck-wrap */} ```ts highlight={5-10} export default defineConfig({ projectName: "Website Monitoring", @@ -302,6 +311,7 @@ Default frequency at which the checks and monitors are executed. **Usage:** +{/* typecheck-wrap */} ```ts highlight={5} export default defineConfig({ projectName: "Website Monitoring", @@ -324,6 +334,7 @@ Directories to ignore when looking for check files. **Usage:** +{/* typecheck-wrap */} ```ts highlight={6} export default defineConfig({ projectName: "Website Monitoring", @@ -340,6 +351,7 @@ export default defineConfig({ Array of public location codes where the URL monitor should run from. Multiple locations provide geographic coverage. +{/* typecheck-wrap */} ```ts highlight={5} export default defineConfig({ projectName: "Website Monitoring", @@ -362,6 +374,7 @@ Determine if any notifications will be sent out when a check fails and/or recove **Usage:** +{/* typecheck-wrap */} ```ts highlight={5} export default defineConfig({ projectName: "Website Monitoring", @@ -380,6 +393,7 @@ Global configuration options for the Playwright Test Runner use in [Browser Chec **Usage:** +{/* typecheck-wrap */} ```ts highlight={5-16} export default defineConfig({ projectName: "Website Monitoring", @@ -413,6 +427,7 @@ Playwright config path to be used during [Playwright Check Suite](/detect/synthe **Usage:** +{/* typecheck-wrap */} ```ts highlight={5} export default defineConfig({ projectName: "Website Monitoring", @@ -431,6 +446,7 @@ Private Locations to run your monitors and checks from. **Usage:** +{/* typecheck-wrap: PrivateLocation */} ```ts highlight={12} const datacenterLocation = new PrivateLocation("datacenter-east-1", { name: "East Coast Datacenter", @@ -458,6 +474,7 @@ Set a retry policy for your checks and monitors. [Use `RetryStrategyBuilder`](/c **Usage:** +{/* typecheck-wrap */} ```ts highlight={5} export default defineConfig({ projectName: "Website Monitoring", @@ -482,6 +499,7 @@ The runtime version used to execute checks and monitors. **Usage:** +{/* typecheck-wrap */} ```ts highlight={5} export default defineConfig({ projectName: "Website Monitoring", @@ -502,6 +520,7 @@ The tags assigned to the checks and monitors. **Usage:** +{/* typecheck-wrap */} ```ts highlight={5} export default defineConfig({ projectName: "Website Monitoring", @@ -528,6 +547,7 @@ If your project doesn't require specific configuration and you want to quickly t **Example:** +{/* typecheck-wrap */} ```ts highlight={6} export default defineConfig({ projectName: "Website Monitoring", @@ -556,6 +576,7 @@ If your project doesn't require specific configuration and you want to quickly t **Example:** +{/* typecheck-wrap */} ```ts highlight={6} export default defineConfig({ projectName: "API Monitoring", @@ -576,6 +597,7 @@ export default defineConfig({ **Usage:** +{/* typecheck-wrap */} ```ts highlight={5-14} export default defineConfig({ projectName: "Website Monitoring", @@ -642,6 +664,7 @@ export default defineConfig({ + {/* typecheck-wrap */} ```ts export default defineConfig({ projectName: "Acme Website", diff --git a/constructs/retry-strategy.mdx b/constructs/retry-strategy.mdx index 1df6e858..fdd52221 100644 --- a/constructs/retry-strategy.mdx +++ b/constructs/retry-strategy.mdx @@ -92,6 +92,7 @@ Disables all retries for a check. When a check fails, it immediately triggers an **Usage:** +{/* typecheck-wrap: ApiCheck */} ```ts highlight={4} // Critical endpoint that should alert immediately new ApiCheck("critical-endpoint", { @@ -112,6 +113,7 @@ Performs exactly one retry after a failure. **Usage:** +{/* typecheck-wrap: ApiCheck */} ```ts highlight={4-6} new ApiCheck("single-retry-check", { name: "Single Retry Check", @@ -135,6 +137,7 @@ Time between retries with five seconds `baseBackoffSeconds` and three retries: ` +{/* typecheck-wrap: ApiCheck */} ```ts highlight={4-8} // Stable API with predictable retry pattern new ApiCheck("stable-api", { @@ -152,6 +155,7 @@ new ApiCheck("stable-api", { +{/* typecheck-wrap: ApiCheck */} ```ts highlight={4-8} // Database connectivity with consistent intervals new ApiCheck("database-health", { @@ -182,6 +186,7 @@ Time between retries with five seconds `baseBackoffSeconds` and three retries: ` +{/* typecheck-wrap: ApiCheck */} ```ts highlight={4-8} // API with gradual backoff strategy new ApiCheck("gradual-backoff", { @@ -199,6 +204,7 @@ new ApiCheck("gradual-backoff", { +{/* typecheck-wrap: ApiCheck */} ```ts highlight={4-8} // Service that might need time to recover new ApiCheck("recovering-service", { @@ -229,6 +235,7 @@ Time between retries with five seconds `baseBackoffSeconds` and three retries: ` +{/* typecheck-wrap: ApiCheck */} ```ts highlight={4-9} // Service that might be overloaded new ApiCheck("overloaded-api", { @@ -247,6 +254,7 @@ new ApiCheck("overloaded-api", { +{/* typecheck-wrap: ApiCheck */} ```ts highlight={4-9} // API with rate limiting new ApiCheck("rate-limited-api", { @@ -275,6 +283,7 @@ Time to wait before the first retry attempt. Also used as the base value for cal **Usage:** +{/* typecheck-wrap */} ```ts highlight={3,8,13} // Quick retries for fast services RetryStrategyBuilder.fixedStrategy({ @@ -298,6 +307,7 @@ Maximum number of retry attempts after the initial failure. The total number of **Usage:** +{/* typecheck-wrap */} ```ts highlight={2} RetryStrategyBuilder.linearStrategy({ maxRetries: 3, // 3 retry attempts after initial failure @@ -312,6 +322,7 @@ Maximum total time to spend on all retry attempts. If the calculated retry sched **Usage:** +{/* typecheck-wrap */} ```ts highlight={2} RetryStrategyBuilder.exponentialStrategy({ maxDurationSeconds: 300, // Stop retrying after 5 minutes total @@ -324,6 +335,7 @@ Whether retry attempts should run from the same region as the original failed ch **Usage:** +{/* typecheck-wrap */} ```ts highlight={2} RetryStrategyBuilder.linearStrategy({ sameRegion: false, // Try different regions for retries @@ -342,6 +354,7 @@ Apply the retry strategy only when the failure cause matches the specified condi **Usage:** +{/* typecheck-wrap */} ```ts highlight={3} RetryStrategyBuilder.fixedStrategy({ maxRetries: 3, @@ -503,6 +516,7 @@ Currently supports `'NETWORK_ERROR'` for `ApiCheck` and `UrlMonitor` constructs + {/* typecheck-wrap */} ```ts // For stable APIs - minimal retries const stableApiRetry = RetryStrategyBuilder.fixedStrategy({ @@ -521,6 +535,7 @@ Currently supports `'NETWORK_ERROR'` for `ApiCheck` and `UrlMonitor` constructs + {/* typecheck-wrap */} ```ts // Critical endpoints - fail fast to alert quickly const criticalRetry = RetryStrategyBuilder.fixedStrategy({ @@ -539,6 +554,7 @@ Currently supports `'NETWORK_ERROR'` for `ApiCheck` and `UrlMonitor` constructs + {/* typecheck-wrap */} ```ts // Browser checks - longer backoff due to complexity const browserRetry = RetryStrategyBuilder.linearStrategy({ diff --git a/constructs/slack-alert-channel.mdx b/constructs/slack-alert-channel.mdx index 5158ecfd..312f6cfc 100644 --- a/constructs/slack-alert-channel.mdx +++ b/constructs/slack-alert-channel.mdx @@ -52,6 +52,7 @@ const slackChannel = new SlackAlertChannel('slack-channel-1', { The Slack incoming webhook URL where Checkly will send alert notifications. +{/* typecheck-wrap: SlackAlertChannel */} ```ts highlight={2} new SlackAlertChannel('slack-channel-1', { url: new URL('https://hooks.slack.com/services/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'), diff --git a/constructs/slack-app-alert-channel.mdx b/constructs/slack-app-alert-channel.mdx index b18b7135..7724eb73 100644 --- a/constructs/slack-app-alert-channel.mdx +++ b/constructs/slack-app-alert-channel.mdx @@ -50,6 +50,7 @@ const slackAppChannel = new SlackAppAlertChannel('slack-channel-1', { The Slack channels to alert. Can also include DM handles, e.g. "@John Doe" +{/* typecheck-wrap: SlackAppAlertChannel */} ```ts highlight={2} new SlackAppAlertChannel('slack-channel-1', { slackChannels: ['#ops','@John Doe'] diff --git a/constructs/sms-alert-channel.mdx b/constructs/sms-alert-channel.mdx index 692fd770..a4f2caf9 100644 --- a/constructs/sms-alert-channel.mdx +++ b/constructs/sms-alert-channel.mdx @@ -55,6 +55,7 @@ Each `SmsAlertChannel` supports only one phone number. Phone numbers need to be We only support phone numbers from certain [countries and regions](/integrations/alerts/sms#supported-countries-and-regions). +{/* typecheck-wrap: SmsAlertChannel */} ```ts highlight={3} new SmsAlertChannel('sms-channel-1', { name: 'Ops on-call', diff --git a/constructs/ssl-monitor.mdx b/constructs/ssl-monitor.mdx index 324aa296..22198294 100644 --- a/constructs/ssl-monitor.mdx +++ b/constructs/ssl-monitor.mdx @@ -112,6 +112,7 @@ SSL connection configuration that defines the target host and all TLS-specific o **Usage:** +{/* typecheck-wrap: SslMonitor */} ```ts new SslMonitor("my-ssl-monitor", { name: "Example SSL Monitor", @@ -141,6 +142,7 @@ TLS handshake time in milliseconds at or above which the monitor is marked as de **Usage:** +{/* typecheck-wrap: SslMonitor */} ```ts highlight={3} new SslMonitor("my-ssl", { name: "Example SSL", @@ -159,6 +161,7 @@ TLS handshake time in milliseconds at or above which the monitor is marked as fa **Usage:** +{/* typecheck-wrap: SslMonitor */} ```ts highlight={4} new SslMonitor("my-ssl", { name: "Example SSL", @@ -345,6 +348,7 @@ Learn more in our docs on [Assertions](/detect/assertions). Friendly name for your SSL Monitor, displayed in the Checkly dashboard and used in notifications. +{/* typecheck-wrap: SslMonitor */} ```ts highlight={2} new SslMonitor("my-ssl-monitor", { name: "Homepage Certificate", @@ -356,6 +360,7 @@ new SslMonitor("my-ssl-monitor", { How often the SSL Monitor should run. Use the `Frequency` enum to set the check interval. +{/* typecheck-wrap: SslMonitor */} ```ts highlight={3} new SslMonitor("my-ssl-monitor", { name: "Homepage Certificate", @@ -370,6 +375,7 @@ new SslMonitor("my-ssl-monitor", { Array of [public location codes](/concepts/locations/#public-locations) where the monitor should run from. Multiple locations provide geographic coverage. +{/* typecheck-wrap: SslMonitor */} ```ts highlight={3} new SslMonitor("global-ssl", { name: "Global Certificate Monitor", @@ -382,6 +388,7 @@ new SslMonitor("global-ssl", { Whether the SSL Monitor is enabled and will run according to its schedule. +{/* typecheck-wrap: SslMonitor */} ```ts highlight={3} new SslMonitor("my-ssl-monitor", { name: "Homepage Certificate", diff --git a/constructs/status-page-service.mdx b/constructs/status-page-service.mdx index cfc6aafd..467ac894 100644 --- a/constructs/status-page-service.mdx +++ b/constructs/status-page-service.mdx @@ -96,6 +96,7 @@ Display name for the service on the status page. This name appears in the status **Usage:** +{/* typecheck-wrap: StatusPageService */} ```ts highlight={2} new StatusPageService("api-service", { name: "API Service", @@ -226,6 +227,7 @@ new StatusPage("simple-status", { StatusPageService instances can be reused across multiple status pages: +{/* typecheck-wrap: StatusPageService */} ```ts // Define services once const apiService = new StatusPageService("api-service", { diff --git a/constructs/status-page-v3-automation-rule.mdx b/constructs/status-page-v3-automation-rule.mdx index d98f63a3..5e252d1c 100644 --- a/constructs/status-page-v3-automation-rule.mdx +++ b/constructs/status-page-v3-automation-rule.mdx @@ -52,6 +52,7 @@ A failing check matches this rule when it, or its group, carries any of these ta **Usage:** +{/* typecheck-wrap: StatusPageV3AutomationRule */} ```ts highlight={4} new StatusPageV3AutomationRule("api-outage-rule", { statusPage, @@ -87,6 +88,7 @@ The impact set on the component while the incident is open: `'UNDER_MAINTENANCE' **Usage:** +{/* typecheck-wrap: StatusPageV3AutomationRule */} ```ts highlight={5-8} new StatusPageV3AutomationRule("api-outage-rule", { statusPage, diff --git a/constructs/status-page-v3-component.mdx b/constructs/status-page-v3-component.mdx index 9ad1c75a..25fb787d 100644 --- a/constructs/status-page-v3-component.mdx +++ b/constructs/status-page-v3-component.mdx @@ -40,6 +40,7 @@ The page this component belongs to. A component belongs to exactly one page and **Usage:** +{/* typecheck-wrap: StatusPageV3Component */} ```ts highlight={2} new StatusPageV3Component("api-component", { statusPage, @@ -62,6 +63,7 @@ Position among its siblings; lower comes first. **Usage:** +{/* typecheck-wrap: StatusPageV3Component */} ```ts highlight={3} new StatusPageV3Component("backend-group", { statusPage, @@ -93,6 +95,7 @@ The `GROUP` component to nest this component under. Must be on the same status p **Usage:** +{/* typecheck-wrap: StatusPageV3Component */} ```ts highlight={4} new StatusPageV3Component("api-component", { statusPage, @@ -111,6 +114,7 @@ Unlike v2 services, a component belongs to one status page. It cannot be shared Use `StatusPageV3Component.fromId()` to point an [automation rule](/constructs/status-page-v3-automation-rule) or a `parent` at a component created in the UI: +{/* typecheck-wrap */} ```ts const cdn = StatusPageV3Component.fromId("790f145a-6ce9-4d94-b7b2-a92e0e2c6a1a") ``` diff --git a/constructs/status-page-v3.mdx b/constructs/status-page-v3.mdx index c5f185fa..1d1caaaf 100644 --- a/constructs/status-page-v3.mdx +++ b/constructs/status-page-v3.mdx @@ -100,6 +100,7 @@ Name of the status page, shown in the header and browser title. **Usage:** +{/* typecheck-wrap: StatusPageV3 */} ```ts highlight={2} new StatusPageV3("company-status", { name: "Company Status", @@ -126,6 +127,7 @@ Custom domain for your status page (e.g., `status.example.com`). Requires DNS co **Usage:** +{/* typecheck-wrap: StatusPageV3 */} ```ts highlight={4} new StatusPageV3("company-status", { name: "Company Status", @@ -194,6 +196,7 @@ Custom theme colors must be part of your plan. **Usage:** +{/* typecheck-wrap: StatusPageV3 */} ```ts themeColors: { light: { diff --git a/constructs/status-page.mdx b/constructs/status-page.mdx index 917decd1..f2716017 100644 --- a/constructs/status-page.mdx +++ b/constructs/status-page.mdx @@ -103,6 +103,7 @@ Name of the status page displayed in the header and browser title. **Usage:** +{/* typecheck-wrap: StatusPage */} ```ts highlight={2} new StatusPage("company-status", { name: "Company Status Page", @@ -119,6 +120,7 @@ Array of card objects that organize services into logical groups on the status p **Usage:** +{/* typecheck-wrap: StatusPage */} ```ts highlight={3-8} new StatusPage("company-status", { name: "Company Status", @@ -143,6 +145,7 @@ new StatusPage("company-status", { +{/* typecheck-wrap: StatusPageService */} ```ts Functional Organization const webAppService = new StatusPageService("web-app", { name: "Web Application" }) const mobileApiService = new StatusPageService("mobile-api", { name: "Mobile API" }) @@ -164,6 +167,7 @@ new StatusPage("functional-status", { }) ``` +{/* typecheck-wrap: StatusPageService */} ```ts Team Organization const frontendAppService = new StatusPageService("frontend", { name: "Frontend App" }) const backendApiService = new StatusPageService("backend", { name: "Backend API" }) @@ -189,6 +193,7 @@ new StatusPage("team-status", { }) ``` +{/* typecheck-wrap: StatusPageService */} ```ts Priority Organization const coreApiService = new StatusPageService("core-api", { name: "Core API" }) const authService = new StatusPageService("auth", { name: "Authentication" }) @@ -238,6 +243,7 @@ Custom domain for your status page (e.g., `status.example.com`). Requires DNS co **Usage:** +{/* typecheck-wrap: StatusPage */} ```ts highlight={4} new StatusPage("company-status", { name: "Company Status", @@ -256,6 +262,7 @@ URL to logo image displayed in the status page header. Must be publicly accessib **Usage:** +{/* typecheck-wrap: StatusPage */} ```ts highlight={3} new StatusPage("company-status", { name: "Company Status", @@ -272,6 +279,7 @@ URL to redirect users when they click the logo. Typically your main website or s **Usage:** +{/* typecheck-wrap: StatusPage */} ```ts highlight={4} new StatusPage("company-status", { name: "Company Status", @@ -290,6 +298,7 @@ URL to favicon image displayed in browser tabs. Must be publicly accessible. **Usage:** +{/* typecheck-wrap: StatusPage */} ```ts highlight={3} new StatusPage("company-status", { name: "Company Status", @@ -307,6 +316,7 @@ Default color theme for the status page. Options: 'LIGHT', 'DARK', or 'AUTO' (fo **Usage:** +{/* typecheck-wrap: StatusPage */} ```ts highlight={3} new StatusPage("company-status", { name: "Company Status", diff --git a/constructs/tcp-monitor.mdx b/constructs/tcp-monitor.mdx index e45f78ad..3e781af1 100644 --- a/constructs/tcp-monitor.mdx +++ b/constructs/tcp-monitor.mdx @@ -103,6 +103,7 @@ TCP connection configuration that defines the hostname, port, and optional data **Usage:** +{/* typecheck-wrap: TcpMonitor */} ```ts new TcpMonitor("tcp-monitor", { name: "Database TCP Check", @@ -129,6 +130,7 @@ new TcpMonitor("tcp-monitor", { +{/* typecheck-wrap: TcpMonitor */} ```ts new TcpMonitor("database-check", { name: "Database Connectivity", @@ -144,6 +146,7 @@ new TcpMonitor("database-check", { +{/* typecheck-wrap: TcpMonitor */} ```ts new TcpMonitor("redis-ping", { name: "Redis PING Test", @@ -162,6 +165,7 @@ new TcpMonitor("redis-ping", { +{/* typecheck-wrap: TcpMonitor */} ```ts new TcpMonitor("ipv6-service", { name: "IPv6 Service Check", @@ -184,6 +188,7 @@ new TcpMonitor("ipv6-service", { Response time threshold in milliseconds for marking the monitor as degraded (warning state). Usage: +{/* typecheck-wrap: TcpMonitor */} ```ts highlight={3} new TcpMonitor("tiered-monitoring", { name: "Tiered Monitoring", @@ -197,6 +202,7 @@ new TcpMonitor("tiered-monitoring", { ``` Examples: +{/* typecheck-wrap: TcpMonitor */} ```ts // Progressive performance alerts new TcpMonitor("mysql-performance", { @@ -218,6 +224,7 @@ new TcpMonitor("mysql-performance", { Maximum response time in milliseconds before the monitor is marked as failed. Usage: +{/* typecheck-wrap: TcpMonitor */} ```ts highlight={3} new TcpMonitor("fast-db", { name: "Fast DB Connection", @@ -230,6 +237,7 @@ new TcpMonitor("fast-db", { ``` Examples: +{/* typecheck-wrap: TcpMonitor */} ```ts // Low-latency database requirement new TcpMonitor("performance-db", { @@ -268,7 +276,7 @@ Here are some examples: - Assert the total response time of the TCP request ```ts -TcpAssertionBuilder.responseTime().lessThan(1000), +TcpAssertionBuilder.responseTime().lessThan(1000) // Equivalent to: { source: 'RESPONSE_TIME', comparison: 'LESS_THAN', target: '1000' } ``` @@ -289,6 +297,7 @@ Learn more in our docs on [Assertions](/detect/assertions). Friendly name for your TCP monitor that will be displayed in the Checkly dashboard and used in notifications. Usage: +{/* typecheck-wrap: TcpMonitor */} ```ts highlight={2} new TcpMonitor('my-tcp-monitor', { name: 'Database Connection Monitor' @@ -302,7 +311,7 @@ How often the TCP monitor should run. Use the `Frequency` enum to set the check Usage: ```ts highlight={4} -import { Frequency } from 'checkly/constructs' +import { Frequency, TcpMonitor } from 'checkly/constructs' new TcpMonitor("my-monitor", { frequency: Frequency.EVERY_2M, @@ -315,6 +324,7 @@ Examples: +{/* typecheck-wrap: TcpMonitor */} ```ts // Database connectivity (high frequency) new TcpMonitor("critical-db", { @@ -327,6 +337,7 @@ new TcpMonitor("critical-db", { +{/* typecheck-wrap: TcpMonitor */} ```ts // Application service (standard frequency) new TcpMonitor("app-service", { @@ -339,6 +350,7 @@ new TcpMonitor("app-service", { +{/* typecheck-wrap: TcpMonitor */} ```ts // Background service (low frequency) new TcpMonitor("background-service", { @@ -358,9 +370,11 @@ new TcpMonitor("background-service", { Array of public location codes where the TCP monitor should run from. Multiple locations provide geographic coverage. Usage: +{/* typecheck-wrap: TcpMonitor */} ```ts highlight={2} new TcpMonitor('global-monitor', { - locations: ['us-east-1', 'eu-west-1', 'ap-southeast-1'] + locations: ['us-east-1', 'eu-west-1', 'ap-southeast-1'], + /* More options... */ }) ``` @@ -369,6 +383,7 @@ Examples: +{/* typecheck-wrap: TcpMonitor */} ```ts // Database replication monitoring new TcpMonitor("global-db", { @@ -389,6 +404,7 @@ new TcpMonitor("global-db", { +{/* typecheck-wrap: TcpMonitor */} ```ts // Regional service monitoring new TcpMonitor("eu-service", { @@ -412,13 +428,16 @@ new TcpMonitor("eu-service", { Whether the TCP monitor is enabled and will run according to its schedule. Usage: +{/* typecheck-wrap: TcpMonitor */} ```ts highlight={2} new TcpMonitor('my-monitor', { - activated: false // Disabled monitor + activated: false, // Disabled monitor + /* More options... */ }) ``` Examples: +{/* typecheck-wrap: TcpMonitor */} ```ts // Temporarily disable a monitor new TcpMonitor("maintenance-db", { @@ -438,6 +457,7 @@ new TcpMonitor("maintenance-db", { + {/* typecheck-wrap: TcpMonitor */} ```ts new TcpMonitor("postgres-check", { name: "PostgreSQL Connection", @@ -455,6 +475,7 @@ new TcpMonitor("maintenance-db", { + {/* typecheck-wrap: TcpMonitor */} ```ts new TcpMonitor("redis-check", { name: "Redis Connectivity", @@ -476,6 +497,7 @@ new TcpMonitor("maintenance-db", { + {/* typecheck-wrap: TcpMonitor */} ```ts new TcpMonitor("smtp-check", { name: "SMTP Server Check", @@ -497,6 +519,7 @@ new TcpMonitor("maintenance-db", { + {/* typecheck-wrap: TcpMonitor */} ```ts new TcpMonitor("ssh-check", { name: "SSH Connectivity", @@ -516,6 +539,7 @@ new TcpMonitor("maintenance-db", { + {/* typecheck-wrap: TcpMonitor */} ```ts new TcpMonitor("app-port-check", { name: "Custom Application Port", diff --git a/constructs/telegram-alert-channel.mdx b/constructs/telegram-alert-channel.mdx index 39e17022..b4cb0190 100644 --- a/constructs/telegram-alert-channel.mdx +++ b/constructs/telegram-alert-channel.mdx @@ -77,6 +77,7 @@ The message sent to the chat when an alert is triggered. If this is not specifie We have [handlebar helpers and variables](/integrations/alerts/webhooks/#using-variables) available for building custom payloads. +{/* typecheck-wrap: TelegramAlertChannel */} ```ts highlight={5-16} new TelegramAlertChannel('my-telegramchannel-1', { name: 'My Telegram channel', diff --git a/constructs/traceroute-monitor.mdx b/constructs/traceroute-monitor.mdx index a9ea303b..3ef0c82a 100644 --- a/constructs/traceroute-monitor.mdx +++ b/constructs/traceroute-monitor.mdx @@ -98,6 +98,7 @@ Traceroute request configuration, including probe protocol, target host, and res **Usage:** +{/* typecheck-wrap: TracerouteMonitor */} ```ts new TracerouteMonitor('traceroute-monitor', { name: 'Network Path Monitor', @@ -133,6 +134,7 @@ Final-hop average RTT in milliseconds at which the monitor is marked as degraded **Usage:** +{/* typecheck-wrap: TracerouteMonitor */} ```ts highlight={3} new TracerouteMonitor("traceroute-latency-tiers", { name: "API Network Path", @@ -149,6 +151,7 @@ Final-hop average RTT in milliseconds at which the monitor is marked as failed. **Usage:** +{/* typecheck-wrap: TracerouteMonitor */} ```ts highlight={3} new TracerouteMonitor("traceroute-latency-tiers", { name: "API Network Path", @@ -211,6 +214,7 @@ Friendly name for your Traceroute Monitor that will be displayed in the Checkly **Usage:** +{/* typecheck-wrap: TracerouteMonitor */} ```ts highlight={2} new TracerouteMonitor("my-traceroute", { name: "API Gateway Network Path", @@ -224,6 +228,7 @@ How often the Traceroute Monitor should run. Use the `Frequency` enum to set the **Usage:** +{/* typecheck-wrap: TracerouteMonitor */} ```ts highlight={3} new TracerouteMonitor("my-traceroute", { name: "API Gateway Network Path", @@ -240,6 +245,7 @@ Array of [public location codes](/concepts/locations/#public-locations) where th **Usage:** +{/* typecheck-wrap: TracerouteMonitor */} ```ts highlight={3} new TracerouteMonitor("global-path-monitor", { name: "API Path from Multiple Regions", @@ -256,6 +262,7 @@ Whether the Traceroute Monitor is enabled and will run according to its schedule **Usage:** +{/* typecheck-wrap: TracerouteMonitor */} ```ts highlight={3} new TracerouteMonitor("my-traceroute", { name: "API Gateway Network Path", diff --git a/constructs/url-monitor.mdx b/constructs/url-monitor.mdx index 68b1c780..8a40c095 100644 --- a/constructs/url-monitor.mdx +++ b/constructs/url-monitor.mdx @@ -99,6 +99,7 @@ HTTP request configuration that defines the URL to monitor and how to handle the **Usage:** +{/* typecheck-wrap: UrlMonitor */} ```ts new UrlMonitor("url-monitor", { request: { @@ -107,7 +108,8 @@ new UrlMonitor("url-monitor", { assertions: [ UrlAssertionBuilder.statusCode().equals(200) ] - } + }, + /* More options... */ }) ``` @@ -126,6 +128,7 @@ new UrlMonitor("url-monitor", { +{/* typecheck-wrap: UrlMonitor */} ```ts new UrlMonitor('website-check', { name: 'Website Availability', @@ -142,6 +145,7 @@ new UrlMonitor('website-check', { +{/* typecheck-wrap: UrlMonitor */} ```ts new UrlMonitor("api-health", { name: "API Health Check", @@ -157,6 +161,7 @@ new UrlMonitor("api-health", { +{/* typecheck-wrap: UrlMonitor */} ```ts new UrlMonitor("dev-endpoint", { name: "Development Environment", @@ -180,6 +185,7 @@ Response time threshold in milliseconds for marking the monitor as degraded (war **Usage:** +{/* typecheck-wrap: UrlMonitor */} ```ts highlight={4} // Progressive performance monitoring new UrlMonitor("performance-tiers", { @@ -201,6 +207,7 @@ Maximum response time in milliseconds before the monitor is marked as failed. **Usage:** +{/* typecheck-wrap: UrlMonitor */} ```ts highlight={3} new UrlMonitor("fast-site", { name: "Fast site", @@ -213,6 +220,7 @@ new UrlMonitor("fast-site", { **Examples:** +{/* typecheck-wrap: UrlMonitor */} ```ts // Fast website requirement new UrlMonitor("performance-critical", { @@ -268,6 +276,7 @@ Friendly name for your URL monitor that will be displayed in the Checkly dashboa **Usage:** +{/* typecheck-wrap: UrlMonitor */} ```ts highlight={2} new UrlMonitor("my-monitor", { name: "Website Uptime Monitor", @@ -282,6 +291,7 @@ How often the URL monitor should run. Use the `Frequency` enum to set the check **Usage:** +{/* typecheck-wrap: UrlMonitor */} ```ts highlight={2} new UrlMonitor("my-monitor", { frequency: Frequency.EVERY_1M, @@ -294,36 +304,42 @@ new UrlMonitor("my-monitor", { +{/* typecheck-wrap: UrlMonitor */} ```ts // Critical service monitoring new UrlMonitor("critical-service", { name: "Critical Service Uptime", frequency: Frequency.EVERY_30S, // Every 30 seconds - maxResponseTime: 2000 + maxResponseTime: 2000, + /* More options... */ }) ``` +{/* typecheck-wrap: UrlMonitor */} ```ts // Regular website monitoring new UrlMonitor("website-monitor", { name: "Website Availability", frequency: Frequency.EVERY_5M, // Every 5 minutes - maxResponseTime: 5000 + maxResponseTime: 5000, + /* More options... */ }) ``` +{/* typecheck-wrap: UrlMonitor */} ```ts // Background service monitoring new UrlMonitor("background-service", { name: "Background Service Health", frequency: Frequency.EVERY_30M, // Every 30 minutes - maxResponseTime: 10000 + maxResponseTime: 10000, + /* More options... */ }) ``` @@ -338,9 +354,11 @@ Array of public location codes where the URL monitor should run from. Multiple l **Usage:** +{/* typecheck-wrap: UrlMonitor */} ```ts highlight={2} new UrlMonitor("global-monitor", { - locations: ["us-east-1", "eu-west-1", "ap-southeast-1"] + locations: ["us-east-1", "eu-west-1", "ap-southeast-1"], + /* More options... */ }) ``` @@ -349,6 +367,7 @@ new UrlMonitor("global-monitor", { +{/* typecheck-wrap: UrlMonitor */} ```ts // Worldwide monitoring new UrlMonitor("global-website", { @@ -361,19 +380,22 @@ new UrlMonitor("global-website", { "ap-southeast-1", // Singapore "ap-northeast-1" // Tokyo ], - maxResponseTime: 5000 + maxResponseTime: 5000, + /* More options... */ }) ``` +{/* typecheck-wrap: UrlMonitor */} ```ts // European users focus new UrlMonitor("eu-service", { name: "European Service Monitor", frequency: Frequency.EVERY_1M, - locations: ["eu-west-1", "eu-central-1"] + locations: ["eu-west-1", "eu-central-1"], + /* More options... */ }) ``` @@ -388,14 +410,17 @@ Whether the URL monitor is enabled and will run according to its schedule. **Usage:** +{/* typecheck-wrap: UrlMonitor */} ```ts highlight={2} new UrlMonitor("my-monitor", { - activated: false // Disabled monitor + activated: false, // Disabled monitor + /* More options... */ }) ``` **Examples:** +{/* typecheck-wrap: UrlMonitor */} ```ts // Temporarily disable a monitor new UrlMonitor("maintenance-site", { @@ -414,6 +439,7 @@ new UrlMonitor("maintenance-site", { + {/* typecheck-wrap: UrlMonitor */} ```ts new UrlMonitor("website-availability", { name: "Main Website Availability", @@ -433,6 +459,7 @@ new UrlMonitor("maintenance-site", { + {/* typecheck-wrap: UrlMonitor */} ```ts new UrlMonitor("api-health-check", { name: "API Health Endpoint", @@ -453,6 +480,7 @@ new UrlMonitor("maintenance-site", { + {/* typecheck-wrap: UrlMonitor */} ```ts new UrlMonitor("cdn-performance", { name: "CDN Asset Performance", @@ -471,6 +499,7 @@ new UrlMonitor("maintenance-site", { + {/* typecheck-wrap: UrlMonitor */} ```ts new UrlMonitor("redirect-chain", { name: "Redirect Chain Monitor", @@ -490,6 +519,7 @@ new UrlMonitor("maintenance-site", { + {/* typecheck-wrap: UrlMonitor */} ```ts new UrlMonitor("ssl-certificate-check", { name: "SSL Certificate Validity", @@ -508,6 +538,7 @@ new UrlMonitor("maintenance-site", { ``` + {/* typecheck-wrap: UrlMonitor */} ```ts new UrlMonitor("maintenance-page", { name: "Maintenance Page Check", diff --git a/constructs/webhook-alert-channel.mdx b/constructs/webhook-alert-channel.mdx index b125c920..57a73e46 100644 --- a/constructs/webhook-alert-channel.mdx +++ b/constructs/webhook-alert-channel.mdx @@ -71,6 +71,7 @@ const webhookChannel = new WebhookAlertChannel('webhook-channel-1', { Target URL for the webhook request. +{/* typecheck-wrap: WebhookAlertChannel */} ```ts highlight={4} new WebhookAlertChannel('webhook-channel-1', { name: 'Pushover webhook', @@ -91,6 +92,7 @@ Friendly name for the webhook channel. The request body template, usually JSON. You can use [Handlebars-style template variables](/integrations/alerts/webhooks#using-variables) to further customize the template. +{/* typecheck-wrap: WebhookAlertChannel */} ```ts highlight={5-14} new WebhookAlertChannel('webhook-channel-1', { name: 'Pushover webhook', @@ -113,6 +115,7 @@ new WebhookAlertChannel('webhook-channel-1', { An array of `{ key, value }` objects to define HTTP headers. +{/* typecheck-wrap: WebhookAlertChannel */} ```ts highlight={5} new WebhookAlertChannel('webhook-channel-1', { name: 'Pushover webhook', @@ -126,6 +129,7 @@ new WebhookAlertChannel('webhook-channel-1', { An array of `{ key, value }` objects to define query parameters. +{/* typecheck-wrap: WebhookAlertChannel */} ```ts highlight={5} new WebhookAlertChannel('webhook-channel-1', { name: 'Pushover webhook', diff --git a/detect/synthetic-monitoring/agentic-checks/configuration.mdx b/detect/synthetic-monitoring/agentic-checks/configuration.mdx index 83c6e298..0fdff69a 100644 --- a/detect/synthetic-monitoring/agentic-checks/configuration.mdx +++ b/detect/synthetic-monitoring/agentic-checks/configuration.mdx @@ -48,6 +48,7 @@ If an existing prompt covers unrelated paths, split them into separate replaceme Agentic Checks do **not** automatically expose all account variables or secrets to the agent. To expose one to an Agentic Check, reference it directly in the prompt with double curly brackets, such as `{{TEST_USER_EMAIL}}`. +{/* typecheck-skip */} ```typescript checkout.agentic.check.ts import { AgenticCheck, Frequency } from 'checkly/constructs' @@ -69,6 +70,7 @@ Some applications block automated monitoring unless requests include required he Agentic Checks include a default browser automation skill. You can add extra skills when the agent needs domain-specific capabilities. +{/* typecheck-skip */} ```typescript agentic-runtime.check.ts import { AgenticCheck } from 'checkly/constructs' @@ -104,6 +106,7 @@ The CLI construct supports these frequencies: Use `activated: false` to keep an existing Agentic Check deactivated while preserving its configuration and history: +{/* typecheck-skip */} ```typescript draft.agentic.check.ts import { AgenticCheck } from 'checkly/constructs' diff --git a/detect/synthetic-monitoring/playwright-checks/configuration.mdx b/detect/synthetic-monitoring/playwright-checks/configuration.mdx index 801ccca1..3a304a34 100644 --- a/detect/synthetic-monitoring/playwright-checks/configuration.mdx +++ b/detect/synthetic-monitoring/playwright-checks/configuration.mdx @@ -15,12 +15,13 @@ Use the `checkly.config.ts/js` file to define your Playwright Check Suite. Each To add Playwright Check Suites to your Checkly monitoring setup, specify the path to your `playwright.config.ts/js` and add a new `playwrightChecks` property to the existing `checks` configuration in your `checkly.config.ts/js`. -```typescript checkly.config.ts highlight={8-14} +```typescript checkly.config.ts highlight={9-15} import { defineConfig } from 'checkly' import { Frequency } from 'checkly/constructs' export default defineConfig({ - // ... + projectName: 'My Project', + logicalId: 'my-project', checks: { playwrightConfigPath: './playwright.config.ts', @@ -55,8 +56,11 @@ You can combine `pwTags` and `pwProjects` to generate your check suite, too. For example: -```typescript checkly.config.ts highlight={11, 20} +{/* typecheck-wrap */} +```typescript checkly.config.ts highlight={13, 22} export default defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', // ... checks: { playwrightConfigPath: './playwright.config.ts', @@ -195,6 +199,8 @@ import { Frequency } from 'checkly/constructs' import { productionGroup } from './production-group.check' export default defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', // Shared Checkly configuration (scheduling, locations, etc.) // ... checks: { @@ -287,10 +293,12 @@ Specify this option in your `playwright.config` or the `testCommand` in your `ch ``` - ```typescript checkly.config.ts highlight={11} + ```typescript checkly.config.ts highlight={13} import { defineConfig } from 'checkly' export default defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', checks: { playwrightConfigPath: './playwright.config.ts', playwrightChecks: [ @@ -324,10 +332,12 @@ Specify this option in your `playwright.config` or the `testCommand` in your `ch ``` - ```typescript checkly.config.ts highlight={11} + ```typescript checkly.config.ts highlight={13} import { defineConfig } from 'checkly' export default defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', checks: { playwrightConfigPath: './playwright.config.ts', playwrightChecks: [ diff --git a/detect/synthetic-monitoring/playwright-checks/dependencies.mdx b/detect/synthetic-monitoring/playwright-checks/dependencies.mdx index ba8c8df9..43c1788f 100644 --- a/detect/synthetic-monitoring/playwright-checks/dependencies.mdx +++ b/detect/synthetic-monitoring/playwright-checks/dependencies.mdx @@ -138,6 +138,8 @@ If you're confident your dependencies work without lifecycle scripts, you can us import { defineConfig } from 'checkly' export default defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', checks: { playwrightChecks: [ { @@ -156,6 +158,8 @@ If a dependency does require its install hooks to function correctly, use the [` import { defineConfig } from 'checkly' export default defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', checks: { include: ['scripts/**/*', 'config/**/*'], playwrightChecks: [ diff --git a/detect/synthetic-monitoring/playwright-checks/overview.mdx b/detect/synthetic-monitoring/playwright-checks/overview.mdx index a3221893..f24b5b30 100644 --- a/detect/synthetic-monitoring/playwright-checks/overview.mdx +++ b/detect/synthetic-monitoring/playwright-checks/overview.mdx @@ -69,8 +69,11 @@ Control which tests run as monitors using: Configure test selection in your `checkly.config.ts` file: +{/* typecheck-wrap */} ```typescript checkly.config.ts export default defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', checks: { playwrightChecks: [ { diff --git a/detect/synthetic-monitoring/playwright-checks/quickstart.mdx b/detect/synthetic-monitoring/playwright-checks/quickstart.mdx index 0ef7698f..89cc8074 100644 --- a/detect/synthetic-monitoring/playwright-checks/quickstart.mdx +++ b/detect/synthetic-monitoring/playwright-checks/quickstart.mdx @@ -96,8 +96,11 @@ Each entry in the `playwrightChecks` array becomes a separate monitor. Use `pwPr This example creates two check suites — one for critical flows running every 5 minutes, and one for secondary features at a lower frequency: +{/* typecheck-wrap */} ```typescript checkly.config.ts export default defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', // ... config from above checks: { diff --git a/detect/synthetic-monitoring/playwright-checks/test-organization.mdx b/detect/synthetic-monitoring/playwright-checks/test-organization.mdx index d307af97..67ef3b0e 100644 --- a/detect/synthetic-monitoring/playwright-checks/test-organization.mdx +++ b/detect/synthetic-monitoring/playwright-checks/test-organization.mdx @@ -46,8 +46,11 @@ Remember: 99.9% uptime means about 1 minute and 26 seconds of downtime each day. The quickest way to reuse your existing Playwright end-to-end tests as Playwright Check Suites is to specify your Playwright config path and a single Playwright Check Suite in your `checkly.config.ts`. -```typescript highlight={3-11} +{/* typecheck-wrap */} +```typescript highlight={5-13} export default defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', checks: { playwrightConfigPath: "./playwright.config.ts", playwrightChecks: [ @@ -85,8 +88,11 @@ Select existing Playwright tests and run them in a Playwright Check Suite by rel Use the `pwProjects` option to choose Playwright projects defined in the `playwright.config.ts` by name. -```typescript checkly.config.ts highlight={10} +{/* typecheck-wrap */} +```typescript checkly.config.ts highlight={12} export default defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', checks: { playwrightConfigPath: "./playwright.config.ts", playwrightChecks: [ @@ -138,8 +144,11 @@ Using `pwProjects` creates a custom `testCommand` that includes the exact same ` Select existing Playwright tests and run them in a Playwright Check Suite by relying on [Playwright test annotations and tags](https://playwright.dev/docs/test-annotations#tag-tests). -```typescript checkly.config.ts highlight={9} +{/* typecheck-wrap */} +```typescript checkly.config.ts highlight={11} export default defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', checks: { playwrightChecks: [ { @@ -230,8 +239,11 @@ The Playwright test runner can always be configured at a global, project, or tes And configure different monitoring configuration for each Playwright project in your Playwright Check Suite. -```typescript checkly.config.ts highlight={8-12, 17-21} +{/* typecheck-wrap */} +```typescript checkly.config.ts highlight={10-14, 19-23} export default defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', checks: { playwrightConfigPath: "./playwright.config.ts", playwrightChecks: [ @@ -287,8 +299,11 @@ export default defineConfig({ And configure different monitoring configuration for each Playwright project in your Playwright Check Suite. -```typescript checkly.config.ts highlight={8-12, 17-21} +{/* typecheck-wrap */} +```typescript checkly.config.ts highlight={10-14, 19-23} export default defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', checks: { playwrightConfigPath: "./playwright.config.ts", playwrightChecks: [ @@ -344,8 +359,11 @@ export default defineConfig({ And configure different monitoring configuration for each Playwright project in your Playwright Check Suite. -```typescript checkly.config.ts highlight={8-14, 19-25} +{/* typecheck-wrap */} +```typescript checkly.config.ts highlight={10-16, 21-27} export default defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', checks: { playwrightConfigPath: "./playwright.config.ts", playwrightChecks: [ @@ -432,8 +450,11 @@ This Playwright setup will always run the `login-setup` project before running ` Reuse the `logged-in-tests` project in your Checkly configuration. -```typescript checkly.config.ts highlight={9} +{/* typecheck-wrap */} +```typescript checkly.config.ts highlight={11} export default defineConfig({ + projectName: 'My Project', + logicalId: 'my-project', checks: { playwrightChecks: [ { diff --git a/guides/communicate-availability.mdx b/guides/communicate-availability.mdx index 571c628d..6c21ac86 100644 --- a/guides/communicate-availability.mdx +++ b/guides/communicate-availability.mdx @@ -197,6 +197,7 @@ An automation rule connects tags to components. When a check with one of the rul Add the rules to the same file: +{/* typecheck-wrap: StatusPageV3AutomationRule */} ```ts checks/status-page.check.ts // When a check tagged status-storefront fails, the storefront is down. new StatusPageV3AutomationRule('storefront-outage', { diff --git a/integrations/iac/pulumi/best-practices.mdx b/integrations/iac/pulumi/best-practices.mdx index 10d2bf4e..aba09112 100644 --- a/integrations/iac/pulumi/best-practices.mdx +++ b/integrations/iac/pulumi/best-practices.mdx @@ -466,6 +466,7 @@ Be mindful of Checkly's resource limits and pricing when creating large numbers ### Scalability +{/* typecheck-wrap */} ```javascript // Use loops for similar checks const endpoints = [ diff --git a/package-lock.json b/package-lock.json index 730002d0..7897e660 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "devDependencies": { "@mintlify/link-rot": "3.0.803", "@playwright/test": "^1.40.0", - "checkly": "8.2.0", + "checkly": "10.0.0", "mint": "4.2.1031", "tsx": "^4.23.15", "typescript": "^5.0.0" @@ -266,9 +266,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.10.tgz", + "integrity": "sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==", "dev": true, "license": "MIT", "engines": { @@ -6417,9 +6417,9 @@ } }, "node_modules/@oclif/core": { - "version": "4.11.4", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.11.4.tgz", - "integrity": "sha512-URwiQ5ALx/sJ2iH4vzXEd+H4K6NAI7LRs6Jag3hrgKEpGmaE6alfRC8qjO4GIgb6A3ACaJumqP9twi/M9ywdHQ==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-5.1.9.tgz", + "integrity": "sha512-jZfN6pxHkgDpHD0dk4nhtaUtYdK39oZoWJCfmkpp7CUE+6mUZSb3WDrdBHnxI5n6CJIiWBrLchM7rBvuV0lRSA==", "dev": true, "license": "MIT", "dependencies": { @@ -6428,22 +6428,22 @@ "clean-stack": "^3.0.1", "cli-spinners": "^2.9.2", "debug": "^4.4.3", - "ejs": "^3.1.10", + "ejs": "^6", "get-package-type": "^0.1.0", "indent-string": "^4.0.0", - "is-wsl": "^2.2.0", "lilconfig": "^3.1.3", "minimatch": "^10.2.5", "semver": "^7.8.1", "string-width": "^4.2.3", "supports-color": "^8", - "tinyglobby": "^0.2.16", + "tinyglobby": "^0.2.17", "widest-line": "^3.1.0", "wordwrap": "^1.0.0", - "wrap-ansi": "^7.0.0" + "wrap-ansi": "^7.0.0", + "wsl-utils": "^0.4.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@oclif/core/node_modules/indent-string": { @@ -6457,9 +6457,9 @@ } }, "node_modules/@oclif/core/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { @@ -6470,34 +6470,34 @@ } }, "node_modules/@oclif/plugin-help": { - "version": "6.2.49", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.49.tgz", - "integrity": "sha512-fEsO0YU7ThtzHE1RGuoHxFu/OGlqxm7PCfFp+U1PS8sde4E0cDqjVDuv78+VKrr45LpC5lWOApj7pm3FNfHrVA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-7.0.6.tgz", + "integrity": "sha512-0p9fM8OtQAZi68arvkfvUzbgiVpXGu6fIgkcvTc2wbuIHfDCs6benPU2uxXxfU2yJ0BWJw6cJbCZQN9cK4H6HA==", "dev": true, "license": "MIT", "dependencies": { - "@oclif/core": "^4" + "@oclif/core": "^5.1.9" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@oclif/plugin-warn-if-update-available": { - "version": "3.1.65", - "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-3.1.65.tgz", - "integrity": "sha512-HcSJc8SeCVUBHwc063xDL0LcpdjcamAISlisSX14VDDYQayMantvtVNOo9PmciwYpXRXfAykeH1z066YkA9JvQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-4.0.5.tgz", + "integrity": "sha512-zbfnLiYcIOuplVpASnYvMbU7zFbYNO86MDbLNjz2s18ofXcSFaV4U/jx3mBNj6rqW9DMP17UY8mseovdBfRFyA==", "dev": true, "license": "MIT", "dependencies": { - "@oclif/core": "^4", + "@oclif/core": "^5.1.8", "ansis": "^3.17.0", "debug": "^4.4.3", - "http-call": "^5.2.2", "lodash": "^4.18.1", - "registry-auth-token": "^5.1.1" + "registry-auth-token": "^5.1.1", + "undici": "^7.16.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@oclif/plugin-warn-if-update-available/node_modules/lodash": { @@ -6661,6 +6661,339 @@ "fast-deep-equal": "^3.1.3" } }, + "node_modules/@oxc-parser/binding-android-arm-eabi": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.155.0.tgz", + "integrity": "sha512-A6xv7hDtnTm+xlZ7utn6rRQpRMJHRhVr3gjRGqlx0RUX84mNk0pAsy6YN/wWhuOTkaZhRrrzaLxf0NfbH77j2w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-android-arm64": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.155.0.tgz", + "integrity": "sha512-T1wWwH9/JI5g7Z4kEQwDOwhToxdDhRyOTklH+uuNpJ16m3MZFmGl+l2rKc0NHQdbVRG2LTOBsNjpW3h1BWytPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.155.0.tgz", + "integrity": "sha512-ZoRB3qJxJ8DWA41jHja+YeB0lLfjBy4T+Kr15vnN1k65X3zbJt3rPZftEwN4Ju4tmA4K/T9dWWD7Z8ewQLnrVA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.155.0.tgz", + "integrity": "sha512-vxtL86BtM+IgrpejA86nbTk5j0HKTIMeuaJ1fQciw6p9RfavPtIPjI7gN34owap0yG9txXBaAWpGdxokNwdqIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.155.0.tgz", + "integrity": "sha512-tN6Ru5e0UVnWaIuiH8jEwnvxuxg7FvhWwSd3oe5oDhOD4ObsSr9/N6WfHLjilUWlPPj65ptwrSDH0Y7lzwTzmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.155.0.tgz", + "integrity": "sha512-h4ozA5n6L6lwolsz9iwunEhKWnIVbmFRots5QxEix0H6nJ5ICpuDa7PuShuhfpIDFe3+Qvyscioyiv+9g+4Syg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.155.0.tgz", + "integrity": "sha512-058/+LardpfuUlsKIvBGk/CYoakEVcMgqYx8GgyUZeOxFWTojYLlCc1Gb60/y21v3esDhHidgiY/Zbq9LpBhaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.155.0.tgz", + "integrity": "sha512-nrOt2Y3xIAzu+lSPzH0864ieO+iCCXgoo9qFlGANE8Xh0cQ+RP8Wstfp+/wXN2YCyb98cAGzX0VruKYw7it/jw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.155.0.tgz", + "integrity": "sha512-KYAayyN5hQbJPtGKtRxlyc8XYmyntOplyXSQzTDrmbz7l/GCrzQbSswvyJFBTH1LGtsZrbXOAfN52i/Kz6kLKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-ppc64-gnu": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.155.0.tgz", + "integrity": "sha512-CSuSY5hfjtsBnHXydOj8jiNfS1qHbdPZuPz1YL1cSgK7VmNYP+QlZIbG0BBYYBgX/vYEgZwbG9mBdW4YairZ5w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.155.0.tgz", + "integrity": "sha512-7KCfOQm+Nz2N8trAXbQkal4TQ5756WVEmhm35y816YHvyFnEfVsICsiV5k0pEszNf/fRm4cm2i6i18SJ6/iCWg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-musl": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.155.0.tgz", + "integrity": "sha512-JSlhgoK+/g1TGJI5NuADx2+6syhxnQNLCWLXyO5QLFyetomcr/vIxSdiNlmyAv963YXUzCuwAwRG6npZ5xyJ1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.155.0.tgz", + "integrity": "sha512-WFIX+dPokWp64mi434Md3U3lJaTwNxAphvGjpltoyQjGUsdXavOIRrnp9dOS34Hd75HOAwDxAI+YwWOwqmJbtg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.155.0.tgz", + "integrity": "sha512-g6xSDC/JpbnVOz5uafMGyK3txBVRFMQTx8opv/yHXGxqV3ZMVl3bf7W8XrSnF68dmy3gM4dgReNryuE53+WkeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.155.0.tgz", + "integrity": "sha512-6/4xlxKlZJWrQ0uwDFPc0H9+xLu7068CKhX3vIDW3SbvP/lVgnVuT5v6dyugeWskWpuxqF/WJ4WKwhxjU3pG2w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-openharmony-arm64": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.155.0.tgz", + "integrity": "sha512-tltklL0J0XjDxIRTBXWOBhvc2mitcmES45pIxhwDWfxRyqz7Vkeu0NekTZEIxGE4f/lXgq3vZcjjffteQOVorg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.155.0.tgz", + "integrity": "sha512-alAb9TzjatUEsOeoncAziUnfdTDxfyswhalFZ9sC6plUgATIUx2NIZ0+bMn6aJ28AduS1OpG/OAisr/YISn4Ig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-win32-ia32-msvc": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.155.0.tgz", + "integrity": "sha512-yc5cbSfcGmRv/KpxDFuyk8adEBaWd/9HilWvBbQ4bFbus1V2PUh2mGB2Cfq9rqZTqLeiMT8x0skV+LKp9hOMgQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.155.0.tgz", + "integrity": "sha512-8heq6jGq+rfpTDRDjoQiBHw0maQZf3IXkS99pdHQZPoTL5kyF5qyPS0RidUlSdnWDIqxXb5nux7GBD9cT+imUw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.155.0.tgz", + "integrity": "sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/oxc-project" + } + }, "node_modules/@playwright/test": { "version": "1.54.2", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.2.tgz", @@ -6708,9 +7041,9 @@ "license": "ISC" }, "node_modules/@pnpm/npm-conf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", - "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.3.tgz", + "integrity": "sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA==", "dev": true, "license": "MIT", "dependencies": { @@ -7993,9 +8326,9 @@ } }, "node_modules/@types/readable-stream": { - "version": "4.0.23", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.23.tgz", - "integrity": "sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==", + "version": "4.0.25", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.25.tgz", + "integrity": "sha512-7GsxL8Wd5X3jh73/qgW7WCnbBvGSdD8U3E4Jiuus3/8I+PN20DtlkJtwFhr/sImXfDDQ2Z03i/9wNiIF3TVSsw==", "dev": true, "license": "MIT", "dependencies": { @@ -8037,118 +8370,6 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.4.tgz", - "integrity": "sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.4", - "@typescript-eslint/types": "^8.59.4", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.4.tgz", - "integrity": "sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.4.tgz", - "integrity": "sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.4.tgz", - "integrity": "sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.59.4", - "@typescript-eslint/tsconfig-utils": "8.59.4", - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/visitor-keys": "8.59.4", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.4.tgz", - "integrity": "sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.4", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript/vfs": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.6.2.tgz", @@ -8197,9 +8418,9 @@ } }, "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.19.0.tgz", + "integrity": "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==", "dev": true, "license": "MIT", "bin": { @@ -8583,9 +8804,9 @@ } }, "node_modules/ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.3.tgz", + "integrity": "sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==", "dev": true, "license": "MIT", "dependencies": { @@ -9005,16 +9226,16 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/brace-expansion/node_modules/balanced-match": { @@ -9041,16 +9262,16 @@ } }, "node_modules/broker-factory": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.14.tgz", - "integrity": "sha512-L45k5HMbPIrMid0nTOZ/UPXG/c0aRuQKVrSDFIb1zOkvfiyHgYmIjc3cSiN1KwQIvRDOtKE0tfb3I9EZ3CmpQQ==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.15.tgz", + "integrity": "sha512-ko+aWvgNuP49meGrdjUu7rC+Y+Wai3cCPxP3xWwHsHfehFjOh5ZQM2yC4gEB2UddeZ/YXhm0K1eG/L6fxym2Og==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.29.2", + "@babel/runtime": "^7.29.7", "fast-unique-numbers": "^9.0.27", "tslib": "^2.8.1", - "worker-factory": "^7.0.49" + "worker-factory": "^7.0.50" } }, "node_modules/buffer": { @@ -9096,9 +9317,9 @@ "license": "MIT" }, "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.1.tgz", + "integrity": "sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==", "dev": true, "license": "MIT", "dependencies": { @@ -9319,95 +9540,220 @@ "license": "MIT" }, "node_modules/checkly": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/checkly/-/checkly-8.2.0.tgz", - "integrity": "sha512-ERQuK2cqvdPrplbTQ/0TcmI2PQDotp2bD7cvNJj6spXPi1NQYcpcDPQlssVKG3eDKLZ5ARxLlSQj28JuSlA0zA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/checkly/-/checkly-10.0.0.tgz", + "integrity": "sha512-fsMxrp+Zn3vgPXKZ+UFTrGu5Lyb6ksGpdKAJqM8BWP4jyojOUABQX3Ca22IEsteyJI7Aoav8v48Q4drmVM5O+w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@oclif/core": "^4.11.3", - "@oclif/plugin-help": "^6.2.49", - "@oclif/plugin-warn-if-update-available": "^3.1.65", - "@typescript-eslint/typescript-estree": "^8.59.4", - "acorn": "^8.16.0", + "@oclif/core": "^5.1.9", + "@oclif/plugin-help": "^7.0.5", + "@oclif/plugin-warn-if-update-available": "^4.0.4", + "acorn": "^8.19.0", "acorn-walk": "^8.3.5", "archiver": "^8.0.0", - "ast-types": "^0.16.1", - "axios": "^1.16.1", - "chalk": "^5.6.2", + "ast-types": "^0.16.3", + "axios": "^1.20.0", + "chalk": "^6.0.1", "ci-info": "^4.4.0", "conf": "^15.1.0", "debug": "^4.4.3", - "dotenv": "^17.4.2", - "execa": "^9.6.1", + "dotenv": "^18.0.8", + "execa": "^10.2.0", "git-repo-info": "^2.1.1", "glob": "^13.0.6", + "http-proxy-agent": "^9.1.0", + "https-proxy-agent": "^9.1.0", "indent-string": "^5.0.0", "jiti": "^2.7.0", - "json-stream-stringify": "^3.1.6", + "json-stream-stringify": "^3.1.7", "json5": "^2.2.3", "jwt-decode": "^4.0.0", "log-symbols": "^7.0.1", "luxon": "^3.7.2", - "minimatch": "^10.2.5", - "mqtt": "^5.15.1", - "open": "^11.0.0", - "p-queue": "^9.3.0", + "minimatch": "^10.2.6", + "mqtt": "^5.16.1", + "open": "^11.0.4", + "oxc-parser": "0.155.0", + "p-queue": "^10.0.0", "prompts": "^2.4.2", "proxy-from-env": "^2.1.0", - "recast": "^0.23.11", - "semver": "^7.8.1", - "string-width": "^8.2.1", - "tunnel": "^0.0.6", - "uuid": "^14.0.0" + "recast": "^0.24.0", + "semver": "^7.8.5", + "socks-proxy-agent": "^10.1.0", + "string-width": "^8.3.0", + "uuid": "^14.0.3", + "yaml": "^2.9.1" }, "bin": { - "checkly": "bin/run" + "checkly": "bin/run.cjs" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=22.13.0" + } + }, + "node_modules/checkly/node_modules/agent-base": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz", + "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" } }, "node_modules/checkly/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz", + "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/checkly/node_modules/axios": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.21.0.tgz", + "integrity": "sha512-YCzXMB53Q9PZBsh7yN7wtapit4WepwcHS2fP8QhGsBxSz5YtgYobV7GGlWlAJi+RxfU77GQTQi2DSLUma42EYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/checkly/node_modules/axios/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/checkly/node_modules/axios/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/checkly/node_modules/chalk": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-6.0.1.tgz", + "integrity": "sha512-/Ce6KNm3vIbWdMlNna6RVIZ/ICQxnJxCicet5LBKK9ZffBkqzDw0xh9EiKSljdRtiIQ1S1z4YgcscUUGzNCWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/checkly/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/checkly/node_modules/http-proxy-agent": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-9.1.0.tgz", + "integrity": "sha512-2NxoveTT58mjYT4n3RPTEfCZGLMbidoO8XEieXfpSYxu+PQJ1qpx4ypwH6N+uF9twBPIvRRgvkvW5HUTYWENig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "9.0.0", + "debug": "^4.3.4", + "proxy-agent-negotiate": "1.1.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/checkly/node_modules/https-proxy-agent": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-9.1.0.tgz", + "integrity": "sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "agent-base": "9.0.0", + "debug": "^4.3.4", + "proxy-agent-negotiate": "1.1.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">= 20" } }, - "node_modules/checkly/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "node_modules/checkly/node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "dev": true, "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/checkly/node_modules/open": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", - "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.4.tgz", + "integrity": "sha512-++Zlftm0kVLPmzC06t6epuWmcRMDbI4z5P3NNX979WA/k23+NtSOynEGzsVfZwguKw2mi5umVgnBlJQMwRz4Pg==", "dev": true, "license": "MIT", "dependencies": { - "default-browser": "^5.4.0", + "default-browser": "^5.5.1", "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", - "powershell-utils": "^0.1.0", - "wsl-utils": "^0.3.0" + "powershell-utils": "^0.2.1", + "wsl-utils": "^1.0.0" + }, + "engines": { + "node": ">=20" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/checkly/node_modules/powershell-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.1.tgz", + "integrity": "sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==", + "dev": true, + "license": "MIT", "engines": { "node": ">=20" }, @@ -9426,9 +9772,9 @@ } }, "node_modules/checkly/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { @@ -9438,10 +9784,25 @@ "node": ">=10" } }, + "node_modules/checkly/node_modules/socks-proxy-agent": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-10.1.0.tgz", + "integrity": "sha512-WlMj/67cEJ6MDI1OcsnjuYKDNDoyPCCYZ249kuuXPiMDw9F8PXkVaQ7YWu3siTydfQ/4BEZcvGzu+aYvz7dDCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "9.0.0", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 20" + } + }, "node_modules/checkly/node_modules/string-width": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", - "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz", + "integrity": "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9472,9 +9833,9 @@ } }, "node_modules/checkly/node_modules/uuid": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", - "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.3.tgz", + "integrity": "sha512-Sc5u1VVln93y1Xnz4R+CunOZc7R9LUcTmhj7Rc7Eg3HVcf7rVn2FOoa812fe0W8p3jD7xeoGSYbfqCGGH2B6xw==", "dev": true, "funding": [ "https://github.com/sponsors/broofa", @@ -9485,6 +9846,39 @@ "uuid": "dist-node/bin/uuid" } }, + "node_modules/checkly/node_modules/wsl-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-1.0.1.tgz", + "integrity": "sha512-c16PKLIRxBYpR3jSWsdS7SFp0COm5SOQdiFjY818dYFHJbMGuLBszpF07LBWmOS1uzrHa9VGdynsEgoeKy0oOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/checkly/node_modules/yaml": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -10417,9 +10811,9 @@ } }, "node_modules/default-browser": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", - "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz", + "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", "dev": true, "license": "MIT", "dependencies": { @@ -10708,11 +11102,14 @@ } }, "node_modules/dotenv": { - "version": "17.4.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", - "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "version": "18.0.9", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-18.0.9.tgz", + "integrity": "sha512-3fVOW4cB02R066PUSwn8O4TJyz9NckQl7F81blIbaq9jKBm2tSmOKky7ZHIXzGvkVPXCSn6jkpziBPZdGFs8Tw==", "dev": true, "license": "BSD-2-Clause", + "bin": { + "dotenv": "dist/index.cjs" + }, "engines": { "node": ">=12" }, @@ -10743,19 +11140,16 @@ "license": "MIT" }, "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-6.0.1.tgz", + "integrity": "sha512-UaaM14yby8U3k02ihS1Bmj5Kz2d7CCQM1scxpgs4Mhkq8F1wR2gl3+Ts4h5Ne4Mnt7M9m4Dw7jsuMr3+xO4vZA==", "dev": true, "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, "bin": { "ejs": "bin/cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.12.18" } }, "node_modules/emoji-regex": { @@ -11221,19 +11615,6 @@ "source-map": "~0.6.1" } }, - "node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -11396,13 +11777,6 @@ "node": ">=6" } }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "dev": true, - "license": "MIT" - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -11439,27 +11813,27 @@ } }, "node_modules/execa": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", - "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-10.2.1.tgz", + "integrity": "sha512-/Bofl3ZBh2Q4/PG0W63qFzP5vDAypi8Zc90UWTBzaDNIYiX7apPOd0N6L8hG8CojUdq4V51adu8BObP+iVsSTw==", "dev": true, "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.6", "figures": "^6.1.0", - "get-stream": "^9.0.0", + "get-stream": "^9.0.1", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", - "pretty-ms": "^9.2.0", + "pretty-ms": "^9.3.1", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.1.1" + "which-command": "^0.1.0", + "yoctocolors": "^2.2.0" }, "engines": { - "node": "^18.19.0 || >=20.5.0" + "node": ">=22" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" @@ -11800,39 +12174,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/filelist": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", - "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", - "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -11920,17 +12261,17 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -12505,9 +12846,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "license": "MIT", "dependencies": { @@ -12928,37 +13269,6 @@ "dev": true, "license": "BSD-2-Clause" }, - "node_modules/http-call": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/http-call/-/http-call-5.3.0.tgz", - "integrity": "sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==", - "dev": true, - "license": "ISC", - "dependencies": { - "content-type": "^1.0.4", - "debug": "^4.1.1", - "is-retry-allowed": "^1.1.0", - "is-stream": "^2.0.0", - "parse-json": "^4.0.0", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-call/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -13986,16 +14296,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", @@ -14175,24 +14475,6 @@ "dev": true, "license": "ISC" }, - "node_modules/jake": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.6", - "filelist": "^1.0.4", - "picocolors": "^1.1.1" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jiti": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", @@ -14213,17 +14495,6 @@ "url": "https://github.com/sponsors/panva" } }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -14275,13 +14546,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "license": "MIT" - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -14319,9 +14583,9 @@ "license": "BSD-2-Clause" }, "node_modules/json-stream-stringify": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz", - "integrity": "sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.7.tgz", + "integrity": "sha512-F4MWetLtY42YMaAKw5cV4e47zMD5aOT+tjjQWjX18ACtdkQ5Y/vrcfbcQ107Rh+MXjOCIx4KhW0wPmOvG8iQ5w==", "dev": true, "license": "MIT", "engines": { @@ -15955,13 +16219,13 @@ } }, "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" }, "engines": { "node": "18 || 20 || >=22" @@ -16062,9 +16326,9 @@ "optional": true }, "node_modules/mqtt": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.15.1.tgz", - "integrity": "sha512-V1WnkGuJh3ec9QXzy5Iylw8OOBK+Xu1WhxcQ9mMpLThG+/JZIMV1PgLNRgIiqXhZnvnVLsuyxHl5A/3bHHbcAA==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.16.1.tgz", + "integrity": "sha512-9aEaiR/mLblsMAiynD8quhcGTaINdta2bdyknAtfVzESfoe6Ncdh/uEs5p+3zqcTEtgYErwL4pNk0QkAynXxlg==", "dev": true, "license": "MIT", "dependencies": { @@ -16077,7 +16341,6 @@ "lru-cache": "^10.4.3", "minimist": "^1.2.8", "mqtt-packet": "^9.0.2", - "number-allocator": "^1.0.14", "readable-stream": "^4.7.0", "rfdc": "^1.4.1", "socks": "^2.8.6", @@ -16342,17 +16605,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/number-allocator": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz", - "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.1", - "js-sdsl": "4.3.0" - } - }, "node_modules/oauth4webapi": { "version": "3.8.8", "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.8.tgz", @@ -16559,6 +16811,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oxc-parser": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.155.0.tgz", + "integrity": "sha512-C/ReSf1JUFukK/zvk6jhcNibSssvas5+ktIzK7fbKVd3CedWe59C3QwHEOrEZj/4Rt9+xg0Jeis/Jv1F/KM1mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "^0.155.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/oxc-project" + }, + "optionalDependencies": { + "@oxc-parser/binding-android-arm-eabi": "0.155.0", + "@oxc-parser/binding-android-arm64": "0.155.0", + "@oxc-parser/binding-darwin-arm64": "0.155.0", + "@oxc-parser/binding-darwin-x64": "0.155.0", + "@oxc-parser/binding-freebsd-x64": "0.155.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.155.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.155.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.155.0", + "@oxc-parser/binding-linux-arm64-musl": "0.155.0", + "@oxc-parser/binding-linux-ppc64-gnu": "0.155.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.155.0", + "@oxc-parser/binding-linux-riscv64-musl": "0.155.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.155.0", + "@oxc-parser/binding-linux-x64-gnu": "0.155.0", + "@oxc-parser/binding-linux-x64-musl": "0.155.0", + "@oxc-parser/binding-openharmony-arm64": "0.155.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.155.0", + "@oxc-parser/binding-win32-ia32-msvc": "0.155.0", + "@oxc-parser/binding-win32-x64-msvc": "0.155.0" + } + }, "node_modules/p-any": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-any/-/p-any-4.0.0.tgz", @@ -16587,17 +16876,13 @@ } }, "node_modules/p-queue": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.0.tgz", - "integrity": "sha512-7NED7xhQ74Ngp4JP/2e0VZHp7vSWfJfqeiR92jPgxsz6m0Se4P03YoTKa9dDXyZ3r6P616gUXttrB6nnHYKang==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-10.0.0.tgz", + "integrity": "sha512-P2wrCri3bhGLPo3kX7qYVXbo/5GvaVATU0DpO24CbeT53Y4z35t8JUWku04ERpXHUYB5rPMi3TkWE3fmJgx5rA==", "dev": true, "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.4", - "p-timeout": "^7.0.0" - }, "engines": { - "node": ">=20" + "node": ">=22" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -16620,19 +16905,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-timeout": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", - "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pac-proxy-agent": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", @@ -16738,20 +17010,6 @@ "dev": true, "license": "MIT" }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/parse-latin": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", @@ -17285,9 +17543,9 @@ } }, "node_modules/pretty-ms": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", - "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.1.tgz", + "integrity": "sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA==", "dev": true, "license": "MIT", "dependencies": { @@ -17407,6 +17665,24 @@ "node": ">= 14" } }, + "node_modules/proxy-agent-negotiate": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-agent-negotiate/-/proxy-agent-negotiate-1.1.0.tgz", + "integrity": "sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "kerberos": "^2.0.0" + }, + "peerDependenciesMeta": { + "kerberos": { + "optional": true + } + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -17841,9 +18117,9 @@ } }, "node_modules/recast": { - "version": "0.23.11", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", - "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.24.0.tgz", + "integrity": "sha512-dN08tw9Kl2i8oDBy16NhxBh6qOqsEqmGYpX1xaxPmgz6/6ukopSuysLfvLbieuDMY57jEz6eTmNz6lqH54kuqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17854,7 +18130,7 @@ "tslib": "^2.0.1" }, "engines": { - "node": ">= 4" + "node": ">= 22" } }, "node_modules/recma-build-jsx": { @@ -19932,9 +20208,9 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { @@ -20057,19 +20333,6 @@ "license": "MIT", "optional": true }, - "node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -20118,22 +20381,13 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "license": "Apache-2.0", + "optional": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -20340,6 +20594,16 @@ "through": "^2.3.8" } }, + "node_modules/undici": { + "version": "7.30.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.30.1.tgz", + "integrity": "sha512-03KrMbjIFDWQR5RNPrSw3bd1r12JpyFQl9/yxjUbJtqkjmllqC5lFjZh6ujeuJCKr8EOQvRW872Oy/az+nLYxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/undici-types": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", @@ -20914,6 +21178,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-command": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/which-command/-/which-command-0.1.0.tgz", + "integrity": "sha512-XZyoF5/5hZtXitIwzrU4NKK+Wtbb9aB9CezUEw2Q0wlYK8NUYQxC1rRXgNueYLtBAJwXIb+/tFVk4dozciNJMA==", + "dev": true, + "license": "MIT", + "bin": { + "which-command": "cli.js" + }, + "engines": { + "node": ">=22" + }, + "funding": { + "url": "https://github.com/sindresorhus/which-command?sponsor=1" + } + }, "node_modules/which-typed-array": { "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", @@ -20957,54 +21237,54 @@ "license": "MIT" }, "node_modules/worker-factory": { - "version": "7.0.49", - "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.49.tgz", - "integrity": "sha512-lW7tpgy6aUv2dFsQhv1yv+XFzdkCf/leoKRTGMPVK5/die6RrUjqgJHJf556qO+ZfytNG6wPXc17E8zzsOLUDw==", + "version": "7.0.50", + "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.50.tgz", + "integrity": "sha512-hhwc0G+sFwM4qBuhJIUBn2p1Jf8v/FwmLUANBf/Q+Lt2uI8mfIZQhXaZQACodQD4R7Zp6cn/6702bIvNn2puJQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.29.2", + "@babel/runtime": "^7.29.7", "fast-unique-numbers": "^9.0.27", "tslib": "^2.8.1" } }, "node_modules/worker-timers": { - "version": "8.0.31", - "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.31.tgz", - "integrity": "sha512-ngkq5S6JuZyztom8tDgBzorLo9byhBMko/sXfgiUD945AuzKGg1GCgDMCC3NaYkicLpGKXutONM36wEX8UbBCA==", + "version": "8.0.34", + "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.34.tgz", + "integrity": "sha512-WXL+Dqsm0G6dnC66rQsvM3tPT2adhbqSirWUCZGglkALOr8ocS0KlpU0iuKbjflJOlu3ydZikMEVrYnHOM9suw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.29.2", + "@babel/runtime": "^7.29.7", "tslib": "^2.8.1", - "worker-timers-broker": "^8.0.16", - "worker-timers-worker": "^9.0.14" + "worker-timers-broker": "^8.0.18", + "worker-timers-worker": "^9.0.15" } }, "node_modules/worker-timers-broker": { - "version": "8.0.16", - "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-8.0.16.tgz", - "integrity": "sha512-JyP3AvUGyPGbBGW7XiUewm2+0pN/aYo1QpVf5kdXAfkDZcN3p7NbWrG6XnyDEpDIvfHk/+LCnOW/NsuiU9riYA==", + "version": "8.0.18", + "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-8.0.18.tgz", + "integrity": "sha512-FrjzDVX1wKfZN0gRbCFqv8VHuTncG4sbI/WGEg4tSSQeIsnwqg4YBYWMAHYLJtUDEYYmiK65UKFrVMVk2irDSg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.29.2", - "broker-factory": "^3.1.14", + "@babel/runtime": "^7.29.7", + "broker-factory": "^3.1.15", "fast-unique-numbers": "^9.0.27", "tslib": "^2.8.1", - "worker-timers-worker": "^9.0.14" + "worker-timers-worker": "^9.0.15" } }, "node_modules/worker-timers-worker": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-9.0.14.tgz", - "integrity": "sha512-/qF06C60sXmSLfUl7WglvrDIbspmPOM8UrG63Dnn4bi2x4/DfqHS/+dxF5B+MdHnYO5tVuZYLHdAodrKdabTIg==", + "version": "9.0.15", + "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-9.0.15.tgz", + "integrity": "sha512-KKUe7lZ/Aignr51H6hOUik8LwTnIgojH/1lwhli8A8qIEIyewogZTpNpMW5B6BF7nmwBOkUoTYgf1H3QShcjSA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.29.2", + "@babel/runtime": "^7.29.7", "tslib": "^2.8.1", - "worker-factory": "^7.0.49" + "worker-factory": "^7.0.50" } }, "node_modules/wrap-ansi": { @@ -21055,9 +21335,9 @@ } }, "node_modules/wsl-utils": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", - "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.4.0.tgz", + "integrity": "sha512-9YmF+2sFEd+T7TkwlmE337F0IVzfDvDknhtpBQxxXzEOfgPphGlFYpyx0cTuCIFj8/p+sqwBYAeGxOMNSzPPDA==", "dev": true, "license": "MIT", "dependencies": { @@ -21235,9 +21515,9 @@ } }, "node_modules/yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", + "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 38bce59d..35cb0926 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,8 @@ "dev": "mint dev", "test:api-docs": "node --test .github/scripts/api-navigation.test.mjs", "check:links": "node .github/scripts/check-broken-links.mjs", + "check:snippets": "cd .github/snippet-typecheck && npm update --no-audit --no-fund --silent && npm run check --silent", + "test:snippets": "cd .github/snippet-typecheck && npm update --no-audit --no-fund --silent && npm test --silent", "test:css-urls": "node --test .github/scripts/check-css-urls.test.mjs", "check:css-urls": "node .github/scripts/check-css-urls.mjs", "sync:api-group-tags": "node .github/scripts/sync-api-group-tags.mjs", @@ -21,7 +23,7 @@ "devDependencies": { "@mintlify/link-rot": "3.0.803", "@playwright/test": "^1.40.0", - "checkly": "8.2.0", + "checkly": "10.0.0", "mint": "4.2.1031", "tsx": "^4.23.15", "typescript": "^5.0.0" diff --git a/snippets/alert-channel-options-text.mdx b/snippets/alert-channel-options-text.mdx index 13edf097..21b4285f 100644 --- a/snippets/alert-channel-options-text.mdx +++ b/snippets/alert-channel-options-text.mdx @@ -15,6 +15,7 @@ Whether to send notifications when checks [become degraded](/communicate/alerts/ Whether to send notifications when a SSL/TLS certificate is about to expire. Default value is `false`. +{/* typecheck-wrap: EmailAlertChannel */} ```ts highlight={3} new EmailAlertChannel("email-channel-1", { address: "alerts@acme.com", @@ -29,6 +30,7 @@ new EmailAlertChannel("email-channel-1", { Number of days before the SSL/TLS certificate expiry date to send notifications. Only relevant when `sslExpiry` is enabled. Default value is `30`. +{/* typecheck-wrap: EmailAlertChannel */} ```ts highlight={4} new EmailAlertChannel("email-channel-1", { address: "alerts@acme.com",