checkly 8.2.0-prerelease-169e1f4 → 8.3.0-prerelease-d81dc3d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: checkly
3
- description: Set up, create, test and manage monitoring checks using the Checkly CLI. Use when working with Agentic Checks, API Checks, Browser Checks, URL Monitors, ICMP Monitors, Playwright Check Suites, Heartbeat Monitors, Alert Channels, Dashboards, or Status Pages. Access Checkly account plan, entitlements, feature limits, members, and pending invites.
3
+ description: Set up, create, test and manage monitoring checks using the Checkly CLI. Use when working with Agentic Checks, API Checks, Browser Checks, URL Monitors, ICMP Monitors, Playwright Check Suites, Heartbeat Monitors, Alert Channels, Dashboards, or Status Pages. Access Checkly account plan, entitlements, feature limits, members, and pending invites. Includes generic API pass-through (`checkly api`) for endpoints without dedicated commands.
4
4
  allowed-tools: Bash(npx:checkly:*) Bash(npm:install:*)
5
5
  metadata:
6
6
  author: checkly
@@ -36,6 +36,64 @@ Write commands (e.g. `incidents create`, `deploy`, `destroy`) return exit code 2
36
36
 
37
37
  Run `npx checkly skills communicate` for the full protocol details.
38
38
 
39
+ ## API Pass-Through (fallback for any endpoint)
40
+
41
+ When no dedicated CLI command exists for an endpoint, use `npx checkly api` to make authenticated requests directly. The CLI handles auth headers and base URL automatically.
42
+
43
+ ```bash
44
+ npx checkly api /v1/checks
45
+ npx checkly api /v1/dashboards -X GET --jq '.[].name'
46
+ npx checkly api /v1/checks -X POST -F name=MyCheck -F activated:=true
47
+ npx checkly api /v1/checks -X GET -F limit=5
48
+ ```
49
+
50
+ Key flags: `-X` (method), `-F` (field — `key=value` for strings, `key:=value` for JSON), `-H` (header), `--jq` (filter with jq), `--input` (body from file/stdin), `-i` / `--include` (response status + headers on stdout), `--verbose` (request/response headers on stderr).
51
+
52
+ ### Nested payloads
53
+
54
+ Use `:=` to send structured JSON in a single field:
55
+
56
+ ```bash
57
+ npx checkly api /v1/checks/<id> -X PATCH \
58
+ -F retryStrategy:='{"type":"LINEAR","maxRetries":2,"baseBackoffSeconds":10}'
59
+ ```
60
+
61
+ For large or deeply nested bodies, pipe a JSON file via `--input`:
62
+
63
+ ```bash
64
+ npx checkly api /v1/checks -X POST --input ./new-check.json
65
+ ```
66
+
67
+ ### Pagination
68
+
69
+ `checkly api` does not auto-walk pages. Drive pagination yourself, the same way every other `checkly` list command exposes it.
70
+
71
+ When using `-F` on a read endpoint, **always pass `-X GET` explicitly** — any `-F` flag implies POST unless the method is set, so omitting `-X GET` will try to create a resource with your pagination params as the body.
72
+
73
+ **Detecting which pagination style an endpoint uses.** Make a first request with `-i` (response headers on stdout) and inspect what came back:
74
+
75
+ - **Page-based** → response has a `content-range` header (e.g. `0-1/23` means items 0–1 of 23 total) and usually a `link` header with `rel="next"` / `rel="last"`. The body is a bare array. Walk by incrementing `-F page=N` until you've covered the total in `content-range`, or until the `rel="next"` link disappears.
76
+ - **Cursor-based** → response body is an envelope like `{ entries: [...], nextId: "...", length: N }`. Pass `-F nextId=<value>` (or `-F cursor=<value>`, depending on the endpoint) on the next call. When `nextId` is missing or null, you've reached the end.
77
+
78
+ ```bash
79
+ # Step 1: make the first call with -i and inspect the response shape
80
+ npx checkly api /v1/checks -X GET -F limit=100 -i
81
+
82
+ # If you saw a content-range header → page-based, walk with -F page=N
83
+ npx checkly api /v1/checks -X GET -F limit=100 -F page=2 -i
84
+
85
+ # If the body had a nextId field → cursor-based, walk with -F nextId=<value>
86
+ npx checkly api /v1/status-pages -X GET -F limit=50 -F nextId=<nextIdFromPrevResponse>
87
+ ```
88
+
89
+ ### Error responses
90
+
91
+ On non-2xx, the response body is still written to stdout (read it for the API's error message) and the CLI exits with code 1. A 401 prints an auth hint, a 403 prints a permission hint, and a 404 prints the docs URL — all on stderr.
92
+
93
+ ### Endpoint discovery
94
+
95
+ See the [Checkly API reference](https://www.checklyhq.com/docs/api) for the human-readable endpoint catalogue, or fetch the [OpenAPI spec](https://api.checklyhq.com/openapi.json) for a machine-readable definition you can grep for paths, parameters, and response shapes.
96
+
39
97
  ### `npx checkly skills initialize`
40
98
  Learn how to initialize and set up a new Checkly CLI project from scratch.
41
99
 
@@ -0,0 +1,23 @@
1
+ import { AuthCommand } from './authCommand.js';
2
+ export default class Api extends AuthCommand {
3
+ static hidden: boolean;
4
+ static readOnly: boolean;
5
+ static destructive: boolean;
6
+ static idempotent: boolean;
7
+ static description: string;
8
+ static examples: string[];
9
+ static args: {
10
+ endpoint: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
11
+ };
12
+ static flags: {
13
+ method: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ field: import("@oclif/core/interfaces").OptionFlag<string[], import("@oclif/core/interfaces").CustomOptions>;
15
+ header: import("@oclif/core/interfaces").OptionFlag<string[], import("@oclif/core/interfaces").CustomOptions>;
16
+ jq: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ input: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
+ include: import("@oclif/core/interfaces").BooleanFlag<boolean>;
19
+ verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
20
+ };
21
+ run(): Promise<void>;
22
+ private applyJq;
23
+ }
@@ -0,0 +1,205 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import { execFile } from 'node:child_process';
3
+ import { readFile } from 'node:fs/promises';
4
+ import { AuthCommand } from './authCommand.js';
5
+ import { api } from '../rest/api.js';
6
+ import { parseFields } from '../helpers/api-fields.js';
7
+ const WRITE_METHODS = new Set(['POST', 'PUT', 'PATCH']);
8
+ export default class Api extends AuthCommand {
9
+ static hidden = false;
10
+ static readOnly = false;
11
+ static destructive = true;
12
+ static idempotent = false;
13
+ static description = 'Make an authenticated HTTP request to the Checkly API.\n'
14
+ + 'Pass-through for any endpoint — handles auth automatically.\n'
15
+ + 'See https://www.checklyhq.com/docs/api for available endpoints.\n'
16
+ + 'OpenAPI spec: https://api.checklyhq.com/openapi.json';
17
+ static examples = [
18
+ 'checkly api /v1/checks',
19
+ 'checkly api /v1/checks -X GET --jq \'.[].name\'',
20
+ 'checkly api /v1/checks -X POST -F name=MyCheck -F activated:=true',
21
+ 'checkly api /v1/checks -X GET -F limit=5',
22
+ 'echo \'{"name":"New"}\' | checkly api /v1/checks -X POST --input -',
23
+ ];
24
+ static args = {
25
+ endpoint: Args.string({
26
+ description: 'API endpoint path (e.g. /v1/checks).',
27
+ required: true,
28
+ }),
29
+ };
30
+ /* eslint-disable @stylistic/quote-props */
31
+ static flags = {
32
+ 'method': Flags.string({
33
+ char: 'X',
34
+ description: 'HTTP method.',
35
+ options: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'],
36
+ }),
37
+ 'field': Flags.string({
38
+ char: 'F',
39
+ description: 'Add a field: key=value (string) or key:=value (parsed as JSON).',
40
+ multiple: true,
41
+ default: [],
42
+ }),
43
+ 'header': Flags.string({
44
+ char: 'H',
45
+ description: 'Custom HTTP header: "Key: Value".',
46
+ multiple: true,
47
+ default: [],
48
+ }),
49
+ 'jq': Flags.string({
50
+ description: 'Filter JSON output with a jq expression (requires jq installed).',
51
+ }),
52
+ 'input': Flags.string({
53
+ description: 'Request body from file path, or "-" for stdin.',
54
+ }),
55
+ 'include': Flags.boolean({
56
+ char: 'i',
57
+ description: 'Include HTTP status and response headers in the output.',
58
+ default: false,
59
+ }),
60
+ 'verbose': Flags.boolean({
61
+ description: 'Print request and response headers to stderr.',
62
+ default: false,
63
+ }),
64
+ };
65
+ async run() {
66
+ const { args, flags } = await this.parse(Api);
67
+ const hasFields = flags.field.length > 0;
68
+ const method = (flags.method ?? (hasFields || flags.input ? 'POST' : 'GET')).toUpperCase();
69
+ if (args.endpoint.startsWith('//') || /^[a-z][a-z\d+\-.]*:/i.test(args.endpoint)) {
70
+ this.error('Endpoint must be a relative path (e.g. /v1/checks), not a URL.');
71
+ }
72
+ const endpoint = args.endpoint.startsWith('/') ? args.endpoint : `/${args.endpoint}`;
73
+ const baseUrl = api.defaults.baseURL;
74
+ if (baseUrl) {
75
+ const resolved = new URL(endpoint, baseUrl);
76
+ if (resolved.origin !== new URL(baseUrl).origin) {
77
+ this.error('Endpoint must be a relative path (e.g. /v1/checks), not a URL.');
78
+ }
79
+ }
80
+ const fields = hasFields ? parseFields(flags.field) : undefined;
81
+ if (flags.input && hasFields) {
82
+ this.error('Cannot use --input together with -F/--field.');
83
+ }
84
+ let data;
85
+ if (flags.input) {
86
+ const raw = flags.input === '-' ? await readStdin() : await readFile(flags.input, 'utf-8');
87
+ try {
88
+ data = JSON.parse(raw);
89
+ }
90
+ catch {
91
+ data = raw;
92
+ }
93
+ }
94
+ else if (fields && WRITE_METHODS.has(method)) {
95
+ data = fields;
96
+ }
97
+ const params = fields && !WRITE_METHODS.has(method) ? fields : undefined;
98
+ const customHeaders = {};
99
+ for (const h of flags.header) {
100
+ const colonIndex = h.indexOf(':');
101
+ if (colonIndex === -1) {
102
+ this.error(`Invalid header format: "${h}". Expected "Key: Value".`);
103
+ }
104
+ customHeaders[h.slice(0, colonIndex).trim()] = h.slice(colonIndex + 1).trim();
105
+ }
106
+ const requestConfig = {
107
+ method,
108
+ url: endpoint,
109
+ params,
110
+ data,
111
+ headers: customHeaders,
112
+ validateStatus: () => true,
113
+ };
114
+ if (flags.verbose) {
115
+ this.logToStderr(`> ${method} ${endpoint}`);
116
+ for (const [k, v] of Object.entries(customHeaders)) {
117
+ this.logToStderr(`> ${k}: ${v}`);
118
+ }
119
+ this.logToStderr('');
120
+ }
121
+ const response = await api.request(requestConfig);
122
+ if (flags.verbose) {
123
+ this.logToStderr(`< ${response.status} ${response.statusText}`);
124
+ for (const [k, v] of Object.entries(response.headers)) {
125
+ if (v !== undefined) {
126
+ this.logToStderr(`< ${k}: ${v}`);
127
+ }
128
+ }
129
+ this.logToStderr('');
130
+ }
131
+ const responseData = response.data;
132
+ if (flags.include) {
133
+ this.log(`HTTP/1.1 ${response.status} ${response.statusText}`);
134
+ for (const [k, v] of Object.entries(response.headers)) {
135
+ if (v !== undefined) {
136
+ this.log(`${k}: ${v}`);
137
+ }
138
+ }
139
+ this.log();
140
+ }
141
+ if (responseData === undefined || responseData === null || responseData === '') {
142
+ if (response.status >= 400) {
143
+ this.exit(1);
144
+ }
145
+ return;
146
+ }
147
+ const json = typeof responseData === 'string' ? responseData : formatJson(responseData);
148
+ if (flags.jq) {
149
+ await this.applyJq(json, flags.jq);
150
+ }
151
+ else {
152
+ this.log(json);
153
+ }
154
+ if (response.status === 404) {
155
+ this.logToStderr('Endpoint not found. See available endpoints at https://www.checklyhq.com/docs/api');
156
+ }
157
+ else if (response.status === 401) {
158
+ this.logToStderr('Authentication failed — run "checkly login" or set CHECKLY_API_KEY.');
159
+ }
160
+ else if (response.status === 403) {
161
+ this.logToStderr('Permission denied — verify your account role and API key scope.');
162
+ }
163
+ if (response.status >= 400) {
164
+ this.exit(1);
165
+ }
166
+ }
167
+ applyJq(json, filter) {
168
+ return new Promise((resolve, reject) => {
169
+ const child = execFile('jq', [filter], { encoding: 'utf-8' }, (error, stdout, stderr) => {
170
+ if (error) {
171
+ if (error.code === 'ENOENT') {
172
+ reject(new Error('--jq requires jq to be installed.\n'
173
+ + 'Install it from https://jqlang.github.io/jq/'));
174
+ return;
175
+ }
176
+ reject(new Error(`jq failed: ${stderr || error.message}`));
177
+ return;
178
+ }
179
+ if (stderr) {
180
+ this.logToStderr(stderr);
181
+ }
182
+ if (stdout) {
183
+ this.log(stdout.trimEnd());
184
+ }
185
+ resolve();
186
+ });
187
+ child.stdin?.write(json);
188
+ child.stdin?.end();
189
+ });
190
+ }
191
+ }
192
+ function formatJson(data) {
193
+ if (process.stdout.isTTY) {
194
+ return JSON.stringify(data, null, 2);
195
+ }
196
+ return JSON.stringify(data);
197
+ }
198
+ async function readStdin() {
199
+ const chunks = [];
200
+ for await (const chunk of process.stdin) {
201
+ chunks.push(chunk);
202
+ }
203
+ return Buffer.concat(chunks).toString('utf-8');
204
+ }
205
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/commands/api.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,11 @@
1
1
  import { AlertChannel, AlertChannelProps } from './alert-channel.js';
2
2
  export interface SlackAppAlertChannelProps extends AlertChannelProps {
3
+ /**
4
+ * List of Slack #channels or @handles to notify.
5
+ * Private channels require the Checkly app to be invited first.
6
+ * @example
7
+ * ['#alerts', '#ops', '@alice']
8
+ */
3
9
  slackChannels: string[];
4
10
  }
5
11
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"slack-app-alert-channel.js","sourceRoot":"","sources":["../../src/constructs/slack-app-alert-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAA;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAMtC;;;;;;GAMG;AACH,MAAM,OAAO,oBAAqB,SAAQ,YAAY;IACpD,aAAa,CAAU;IACvB;;;;;;;OAOG;IACH,YAAa,SAAiB,EAAE,KAAgC;QAC9D,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QACvB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAA;QACxC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;IAED,QAAQ;QACN,OAAO,wBAAwB,IAAI,CAAC,SAAS,EAAE,CAAA;IACjD,CAAC;IAED,UAAU;QACR,OAAO;YACL,GAAG,KAAK,CAAC,UAAU,EAAE;YACrB,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE;gBACN,aAAa,EAAE,IAAI,CAAC,aAAa;aAClC;SACF,CAAA;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"slack-app-alert-channel.js","sourceRoot":"","sources":["../../src/constructs/slack-app-alert-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAA;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAYtC;;;;;;GAMG;AACH,MAAM,OAAO,oBAAqB,SAAQ,YAAY;IACpD,aAAa,CAAU;IACvB;;;;;;;OAOG;IACH,YAAa,SAAiB,EAAE,KAAgC;QAC9D,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QACvB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAA;QACxC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;IAED,QAAQ;QACN,OAAO,wBAAwB,IAAI,CAAC,SAAS,EAAE,CAAA;IACjD,CAAC;IAED,UAAU;QACR,OAAO;YACL,GAAG,KAAK,CAAC,UAAU,EAAE;YACrB,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE;gBACN,aAAa,EAAE,IAAI,CAAC,aAAa;aAClC;SACF,CAAA;IACH,CAAC;CACF"}
@@ -11,6 +11,10 @@ const examples = [
11
11
  description: 'Deploy your project to your Checkly account.',
12
12
  command: 'npx checkly deploy',
13
13
  },
14
+ {
15
+ description: 'Make an authenticated API request to any endpoint.',
16
+ command: 'npx checkly api /v1/checks',
17
+ },
14
18
  ];
15
19
  export default examples;
16
20
  //# sourceMappingURL=examples.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"examples.js","sourceRoot":"","sources":["../../src/help/examples.ts"],"names":[],"mappings":"AAKA,MAAM,QAAQ,GAAmB;IAC/B;QACE,WAAW,EAAE,+DAA+D;QAC5E,OAAO,EAAE,kBAAkB;KAC5B;IACD;QACE,WAAW,EAAE,4CAA4C;QACzD,OAAO,EAAE,wCAAwC;KAClD;IACD;QACE,WAAW,EAAE,8CAA8C;QAC3D,OAAO,EAAE,oBAAoB;KAC9B;CACF,CAAA;AACD,eAAe,QAAQ,CAAA"}
1
+ {"version":3,"file":"examples.js","sourceRoot":"","sources":["../../src/help/examples.ts"],"names":[],"mappings":"AAKA,MAAM,QAAQ,GAAmB;IAC/B;QACE,WAAW,EAAE,+DAA+D;QAC5E,OAAO,EAAE,kBAAkB;KAC5B;IACD;QACE,WAAW,EAAE,4CAA4C;QACzD,OAAO,EAAE,wCAAwC;KAClD;IACD;QACE,WAAW,EAAE,8CAA8C;QAC3D,OAAO,EAAE,oBAAoB;KAC9B;IACD;QACE,WAAW,EAAE,oDAAoD;QACjE,OAAO,EAAE,4BAA4B;KACtC;CACF,CAAA;AACD,eAAe,QAAQ,CAAA"}
@@ -0,0 +1,4 @@
1
+ export interface ParsedFields {
2
+ [key: string]: unknown;
3
+ }
4
+ export declare function parseFields(fields: string[]): ParsedFields;
@@ -0,0 +1,24 @@
1
+ export function parseFields(fields) {
2
+ const result = {};
3
+ for (const entry of fields) {
4
+ const jsonIndex = entry.indexOf(':=');
5
+ if (jsonIndex !== -1) {
6
+ const key = entry.slice(0, jsonIndex);
7
+ const raw = entry.slice(jsonIndex + 2);
8
+ try {
9
+ result[key] = JSON.parse(raw);
10
+ }
11
+ catch {
12
+ throw new Error(`Invalid JSON in field "${key}": ${raw}`);
13
+ }
14
+ continue;
15
+ }
16
+ const eqIndex = entry.indexOf('=');
17
+ if (eqIndex === -1) {
18
+ throw new Error(`Invalid field format: "${entry}". Expected key=value or key:=json.`);
19
+ }
20
+ result[entry.slice(0, eqIndex)] = entry.slice(eqIndex + 1);
21
+ }
22
+ return result;
23
+ }
24
+ //# sourceMappingURL=api-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-fields.js","sourceRoot":"","sources":["../../src/helpers/api-fields.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,WAAW,CAAE,MAAgB;IAC3C,MAAM,MAAM,GAAiB,EAAE,CAAA;IAE/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACrC,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;YACrC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;YACtC,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,MAAM,GAAG,EAAE,CAAC,CAAA;YAC3D,CAAC;YACD,SAAQ;QACV,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,qCAAqC,CAAC,CAAA;QACvF,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA;IAC5D,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function parseTotalFromContentRange(header: string | undefined): number | null;
@@ -0,0 +1,7 @@
1
+ export function parseTotalFromContentRange(header) {
2
+ if (!header)
3
+ return null;
4
+ const match = header.match(/\/(\d+)$/);
5
+ return match ? parseInt(match[1], 10) : null;
6
+ }
7
+ //# sourceMappingURL=content-range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-range.js","sourceRoot":"","sources":["../../src/helpers/content-range.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,0BAA0B,CAAE,MAA0B;IACpE,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACtC,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAC9C,CAAC"}
@@ -1,10 +1,4 @@
1
- function parseTotalFromContentRange(header) {
2
- if (!header)
3
- return null;
4
- // Content-Range format: "0-24/300" or "*/0"
5
- const match = header.match(/\/(\d+)$/);
6
- return match ? parseInt(match[1], 10) : null;
7
- }
1
+ import { parseTotalFromContentRange } from '../helpers/content-range.js';
8
2
  class Checks {
9
3
  api;
10
4
  constructor(api) {
@@ -1 +1 @@
1
- {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/rest/checks.ts"],"names":[],"mappings":"AAuCA,SAAS,0BAA0B,CAAE,MAA0B;IAC7D,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,4CAA4C;IAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACtC,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAC9C,CAAC;AAED,MAAM,MAAM;IACV,GAAG,CAAe;IAClB,YAAa,GAAkB;QAC7B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;IAED,MAAM,CAAE,SAA2B,EAAE;QACnC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAU,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IACxD,CAAC;IAED,KAAK,CAAC,eAAe,CAAE,SAA2B,EAAE;QAClD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAU,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QACtE,MAAM,KAAK,GAAG,0BAA0B,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAA;QACnG,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,IAAI;YACrB,KAAK;YACL,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC;YACtB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;SAC1B,CAAA;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAE,SAAmD,EAAE;QACnE,MAAM,QAAQ,GAAG,GAAG,CAAA;QACpB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QACjF,MAAM,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;QAEnC,IAAI,KAAK,CAAC,KAAK,IAAI,QAAQ;YAAE,OAAO,SAAS,CAAA;QAE7C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAA;QACpD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC9C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAU,YAAY,EAAE;YAClC,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;SACpD,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CACrB,CACF,CAAA;QACD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;QACzB,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,GAAG,CAAE,EAAU;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAQ,cAAc,EAAE,EAAE,CAAC,CAAA;IAChD,CAAC;CACF;AAED,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/rest/checks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAuCxE,MAAM,MAAM;IACV,GAAG,CAAe;IAClB,YAAa,GAAkB;QAC7B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;IAED,MAAM,CAAE,SAA2B,EAAE;QACnC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAU,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IACxD,CAAC;IAED,KAAK,CAAC,eAAe,CAAE,SAA2B,EAAE;QAClD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAU,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QACtE,MAAM,KAAK,GAAG,0BAA0B,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAA;QACnG,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,IAAI;YACrB,KAAK;YACL,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC;YACtB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;SAC1B,CAAA;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAE,SAAmD,EAAE;QACnE,MAAM,QAAQ,GAAG,GAAG,CAAA;QACpB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QACjF,MAAM,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;QAEnC,IAAI,KAAK,CAAC,KAAK,IAAI,QAAQ;YAAE,OAAO,SAAS,CAAA;QAE7C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAA;QACpD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC9C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAU,YAAY,EAAE;YAClC,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;SACpD,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CACrB,CACF,CAAA;QACD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;QACzB,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,GAAG,CAAE,EAAU;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAQ,cAAc,EAAE,EAAE,CAAC,CAAA;IAChD,CAAC;CACF;AAED,eAAe,MAAM,CAAA"}