@openstatus/health-clerk 0.1.4-dev.0

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.
package/README.md ADDED
@@ -0,0 +1,77 @@
1
+ # @openstatus/health-clerk
2
+
3
+ [Clerk](https://clerk.com/) probe for
4
+ [`@openstatus/health`](https://jsr.io/@openstatus/health). Sends
5
+ `GET {baseUrl}/v1/users?limit=1` to the Clerk Backend API with your secret key
6
+ as a bearer header, so it proves both that Clerk answers and that the key is
7
+ valid — with `fetch` alone, on every runtime.
8
+
9
+ ```sh
10
+ deno add jsr:@openstatus/health jsr:@openstatus/health-clerk
11
+ npm install @openstatus/health @openstatus/health-clerk
12
+ ```
13
+
14
+ ```ts
15
+ import { createHealthHandler, readEnv } from "@openstatus/health";
16
+ import { clerkProbe } from "@openstatus/health-clerk";
17
+
18
+ const secretKey = readEnv("CLERK_SECRET_KEY");
19
+
20
+ Deno.serve(
21
+ createHealthHandler({
22
+ probes: [
23
+ // the factory validates `secretKey` at construction, so pass a
24
+ // placeholder and let `skip` keep the unconfigured check from running.
25
+ clerkProbe({
26
+ secretKey: secretKey || "unconfigured",
27
+ skip: () => !secretKey,
28
+ }),
29
+ ],
30
+ }),
31
+ );
32
+ ```
33
+
34
+ `secretKey` is the `CLERK_SECRET_KEY` of the instance (`sk_live_…` or
35
+ `sk_test_…`). Listing one user is the cheapest authenticated read on the
36
+ Backend API and has no side effects, so the probe can run on every health
37
+ request. `baseUrl` defaults to `https://api.clerk.com`. Like every probe here,
38
+ this one never reads the environment itself — pass the values in, and use
39
+ `skip` for environments where Clerk is not configured.
40
+
41
+ This checks the Backend API your server calls to verify sessions and read
42
+ users; the Frontend API your browser code talks to is a separate host with its
43
+ own status.
44
+
45
+ ```ts
46
+ clerkProbe({
47
+ secretKey,
48
+ // optional overrides from the Probe contract
49
+ name: "auth",
50
+ critical: true,
51
+ timeoutMs: 2000,
52
+ skip: () => !secretKey,
53
+ });
54
+ ```
55
+
56
+ Non-critical by default, since Clerk's session tokens are verified locally
57
+ with the instance's JWKS and most requests never call the Backend API. Set
58
+ `critical: true` when requests cannot be served without it — sign-up, user
59
+ management or organization lookups on every request.
60
+
61
+ ## About openstatus
62
+
63
+ [openstatus](https://www.openstatus.dev/) is the open-source uptime monitoring
64
+ and status page platform. This package is part of
65
+ [`@openstatus/health`](https://github.com/openstatusHQ/health), the `/health`
66
+ endpoints behind openstatus's own services, extracted so any JavaScript server
67
+ can expose one. Point an
68
+ [openstatus monitor](https://www.openstatus.dev/docs/reference/http-monitor)
69
+ at the endpoint and assert on `status` in the body to be alerted on
70
+ `degraded` before it becomes `unhealthy`.
71
+
72
+ Source: [github.com/openstatusHQ/health](https://github.com/openstatusHQ/health).
73
+ Issues and PRs welcome.
74
+
75
+ ## License
76
+
77
+ [MIT](https://github.com/openstatusHQ/health/blob/main/LICENSE)
@@ -0,0 +1,30 @@
1
+ //#region rolldown:runtime
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
+ key = keys[i];
11
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: ((k) => from[k]).bind(null, key),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
19
+ value: mod,
20
+ enumerable: true
21
+ }) : target, mod));
22
+
23
+ //#endregion
24
+
25
+ Object.defineProperty(exports, '__toESM', {
26
+ enumerable: true,
27
+ get: function () {
28
+ return __toESM;
29
+ }
30
+ });
package/dist/mod.cjs ADDED
@@ -0,0 +1,36 @@
1
+ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
+ const __openstatus_health = require_rolldown_runtime.__toESM(require("@openstatus/health"));
3
+
4
+ //#region src/mod.ts
5
+ /** API base URL when `baseUrl` is unset. */
6
+ const clerkDefaultBaseUrl = "https://api.clerk.com";
7
+ /** Probe name when `name` is unset. */
8
+ const clerkDefaultName = "clerk";
9
+ /** A probe that expects 2xx from `GET {baseUrl}/v1/users?limit=1` with `secretKey` as a bearer token; non-critical by default. Throws `ProbeConfigError` for an empty `secretKey` or an invalid `baseUrl`. */
10
+ function clerkProbe(options) {
11
+ const doFetch = options.fetch ?? globalThis.fetch;
12
+ const url = (0, __openstatus_health.probeUrl)({
13
+ probe: "clerkProbe",
14
+ field: "baseUrl",
15
+ value: options.baseUrl ?? clerkDefaultBaseUrl,
16
+ path: "/v1/users?limit=1"
17
+ });
18
+ if (typeof options.secretKey !== "string" || options.secretKey.length === 0) throw new __openstatus_health.ProbeConfigError("clerkProbe", "secretKey", typeof options.secretKey !== "string" ? `must be a string, got ${String(options.secretKey)}` : "must not be empty");
19
+ const headers = { authorization: `Bearer ${options.secretKey}` };
20
+ return {
21
+ name: options.name ?? clerkDefaultName,
22
+ critical: options.critical ?? false,
23
+ timeoutMs: options.timeoutMs,
24
+ skip: options.skip,
25
+ run: (signal) => (0, __openstatus_health.expectOk)(doFetch(url, {
26
+ method: "GET",
27
+ headers,
28
+ signal
29
+ }))
30
+ };
31
+ }
32
+
33
+ //#endregion
34
+ exports.clerkDefaultBaseUrl = clerkDefaultBaseUrl;
35
+ exports.clerkDefaultName = clerkDefaultName;
36
+ exports.clerkProbe = clerkProbe;
package/dist/mod.d.cts ADDED
@@ -0,0 +1,23 @@
1
+ import { Probe, ProbeOverrides } from "@openstatus/health";
2
+
3
+ //#region src/mod.d.ts
4
+
5
+ /** API base URL when `baseUrl` is unset. */
6
+ declare const clerkDefaultBaseUrl = "https://api.clerk.com";
7
+ /** Probe name when `name` is unset. */
8
+ declare const clerkDefaultName = "clerk";
9
+ /** Options for `clerkProbe()`. */
10
+ interface ClerkProbeOptions extends ProbeOverrides {
11
+ /** The `CLERK_SECRET_KEY` of the instance (`sk_live_…` / `sk_test_…`). */
12
+ readonly secretKey: string;
13
+ /** API host. Default `clerkDefaultBaseUrl`. */
14
+ readonly baseUrl?: string | URL;
15
+ /** Replacement `fetch`, for tests. */
16
+ readonly fetch?: typeof fetch;
17
+ }
18
+ /** A probe that expects 2xx from `GET {baseUrl}/v1/users?limit=1` with `secretKey` as a bearer token; non-critical by default. Throws `ProbeConfigError` for an empty `secretKey` or an invalid `baseUrl`. */
19
+ declare function clerkProbe(options: ClerkProbeOptions): Probe;
20
+ //# sourceMappingURL=mod.d.ts.map
21
+ //#endregion
22
+ export { ClerkProbeOptions, clerkDefaultBaseUrl, clerkDefaultName, clerkProbe };
23
+ //# sourceMappingURL=mod.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.cts","names":[],"sources":["../src/mod.ts"],"sourcesContent":[],"mappings":";;;;;AAoCoC,cAfvB,mBAAA,GAeuB,uBAAA;;AAAyB,cAbhD,gBAAA,GAagD,OAAA;;UAV5C,iBAAA,SAA0B;;;;8BAIb;;0BAEJ;;;iBAIV,UAAA,UAAoB,oBAAoB"}
package/dist/mod.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import { Probe, ProbeOverrides } from "@openstatus/health";
2
+
3
+ //#region src/mod.d.ts
4
+
5
+ /** API base URL when `baseUrl` is unset. */
6
+ declare const clerkDefaultBaseUrl = "https://api.clerk.com";
7
+ /** Probe name when `name` is unset. */
8
+ declare const clerkDefaultName = "clerk";
9
+ /** Options for `clerkProbe()`. */
10
+ interface ClerkProbeOptions extends ProbeOverrides {
11
+ /** The `CLERK_SECRET_KEY` of the instance (`sk_live_…` / `sk_test_…`). */
12
+ readonly secretKey: string;
13
+ /** API host. Default `clerkDefaultBaseUrl`. */
14
+ readonly baseUrl?: string | URL;
15
+ /** Replacement `fetch`, for tests. */
16
+ readonly fetch?: typeof fetch;
17
+ }
18
+ /** A probe that expects 2xx from `GET {baseUrl}/v1/users?limit=1` with `secretKey` as a bearer token; non-critical by default. Throws `ProbeConfigError` for an empty `secretKey` or an invalid `baseUrl`. */
19
+ declare function clerkProbe(options: ClerkProbeOptions): Probe;
20
+ //# sourceMappingURL=mod.d.ts.map
21
+ //#endregion
22
+ export { ClerkProbeOptions, clerkDefaultBaseUrl, clerkDefaultName, clerkProbe };
23
+ //# sourceMappingURL=mod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.ts","names":[],"sources":["../src/mod.ts"],"sourcesContent":[],"mappings":";;;;;AAoCoC,cAfvB,mBAAA,GAeuB,uBAAA;;AAAyB,cAbhD,gBAAA,GAagD,OAAA;;UAV5C,iBAAA,SAA0B;;;;8BAIb;;0BAEJ;;;iBAIV,UAAA,UAAoB,oBAAoB"}
package/dist/mod.js ADDED
@@ -0,0 +1,34 @@
1
+ import { ProbeConfigError, expectOk, probeUrl } from "@openstatus/health";
2
+
3
+ //#region src/mod.ts
4
+ /** API base URL when `baseUrl` is unset. */
5
+ const clerkDefaultBaseUrl = "https://api.clerk.com";
6
+ /** Probe name when `name` is unset. */
7
+ const clerkDefaultName = "clerk";
8
+ /** A probe that expects 2xx from `GET {baseUrl}/v1/users?limit=1` with `secretKey` as a bearer token; non-critical by default. Throws `ProbeConfigError` for an empty `secretKey` or an invalid `baseUrl`. */
9
+ function clerkProbe(options) {
10
+ const doFetch = options.fetch ?? globalThis.fetch;
11
+ const url = probeUrl({
12
+ probe: "clerkProbe",
13
+ field: "baseUrl",
14
+ value: options.baseUrl ?? clerkDefaultBaseUrl,
15
+ path: "/v1/users?limit=1"
16
+ });
17
+ if (typeof options.secretKey !== "string" || options.secretKey.length === 0) throw new ProbeConfigError("clerkProbe", "secretKey", typeof options.secretKey !== "string" ? `must be a string, got ${String(options.secretKey)}` : "must not be empty");
18
+ const headers = { authorization: `Bearer ${options.secretKey}` };
19
+ return {
20
+ name: options.name ?? clerkDefaultName,
21
+ critical: options.critical ?? false,
22
+ timeoutMs: options.timeoutMs,
23
+ skip: options.skip,
24
+ run: (signal) => expectOk(doFetch(url, {
25
+ method: "GET",
26
+ headers,
27
+ signal
28
+ }))
29
+ };
30
+ }
31
+
32
+ //#endregion
33
+ export { clerkDefaultBaseUrl, clerkDefaultName, clerkProbe };
34
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","names":["options: ClerkProbeOptions"],"sources":["../src/mod.ts"],"sourcesContent":["/**\n * Clerk reachability probe for `@openstatus/health`, against `/v1/users?limit=1`.\n *\n * ```ts\n * import { clerkProbe } from \"@openstatus/health-clerk\";\n *\n * const probe = clerkProbe({ secretKey: env.CLERK_SECRET_KEY });\n * ```\n *\n * @module\n */\n\nimport {\n expectOk,\n type Probe,\n ProbeConfigError,\n type ProbeOverrides,\n probeUrl,\n} from \"@openstatus/health\";\n\n/** API base URL when `baseUrl` is unset. */\nexport const clerkDefaultBaseUrl = \"https://api.clerk.com\";\n/** Probe name when `name` is unset. */\nexport const clerkDefaultName = \"clerk\";\n\n/** Options for `clerkProbe()`. */\nexport interface ClerkProbeOptions extends ProbeOverrides {\n /** The `CLERK_SECRET_KEY` of the instance (`sk_live_…` / `sk_test_…`). */\n readonly secretKey: string;\n /** API host. Default `clerkDefaultBaseUrl`. */\n readonly baseUrl?: string | URL;\n /** Replacement `fetch`, for tests. */\n readonly fetch?: typeof fetch;\n}\n\n/** A probe that expects 2xx from `GET {baseUrl}/v1/users?limit=1` with `secretKey` as a bearer token; non-critical by default. Throws `ProbeConfigError` for an empty `secretKey` or an invalid `baseUrl`. */\nexport function clerkProbe(options: ClerkProbeOptions): Probe {\n const doFetch = options.fetch ?? globalThis.fetch;\n const url = probeUrl({\n probe: \"clerkProbe\",\n field: \"baseUrl\",\n value: options.baseUrl ?? clerkDefaultBaseUrl,\n path: \"/v1/users?limit=1\",\n });\n if (typeof options.secretKey !== \"string\" || options.secretKey.length === 0) {\n throw new ProbeConfigError(\n \"clerkProbe\",\n \"secretKey\",\n typeof options.secretKey !== \"string\"\n ? `must be a string, got ${String(options.secretKey)}`\n : \"must not be empty\",\n );\n }\n const headers = { authorization: `Bearer ${options.secretKey}` };\n return {\n name: options.name ?? clerkDefaultName,\n critical: options.critical ?? false,\n timeoutMs: options.timeoutMs,\n skip: options.skip,\n run: (signal) => expectOk(doFetch(url, { method: \"GET\", headers, signal })),\n };\n}\n"],"mappings":";;;;AAqBA,MAAa,sBAAsB;;AAEnC,MAAa,mBAAmB;;AAahC,SAAgB,WAAWA,SAAmC;CAC5D,MAAM,UAAU,QAAQ,SAAS,WAAW;CAC5C,MAAM,MAAM,SAAS;EACnB,OAAO;EACP,OAAO;EACP,OAAO,QAAQ,WAAW;EAC1B,MAAM;CACP,EAAC;AACF,YAAW,QAAQ,cAAc,YAAY,QAAQ,UAAU,WAAW,EACxE,OAAM,IAAI,iBACR,cACA,oBACO,QAAQ,cAAc,YACxB,wBAAwB,OAAO,QAAQ,UAAU,CAAC,IACnD;CAGR,MAAM,UAAU,EAAE,gBAAgB,SAAS,QAAQ,UAAU,EAAG;AAChE,QAAO;EACL,MAAM,QAAQ,QAAQ;EACtB,UAAU,QAAQ,YAAY;EAC9B,WAAW,QAAQ;EACnB,MAAM,QAAQ;EACd,KAAK,CAAC,WAAW,SAAS,QAAQ,KAAK;GAAE,QAAQ;GAAO;GAAS;EAAQ,EAAC,CAAC;CAC5E;AACF"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@openstatus/health-clerk",
3
+ "version": "0.1.4-dev.0",
4
+ "description": "Clerk Backend API probe for @openstatus/health",
5
+ "keywords": [
6
+ "openstatus",
7
+ "health",
8
+ "healthcheck",
9
+ "clerk",
10
+ "auth",
11
+ "authentication"
12
+ ],
13
+ "license": "MIT",
14
+ "author": {
15
+ "name": "openstatus",
16
+ "url": "https://www.openstatus.dev/"
17
+ },
18
+ "homepage": "https://github.com/openstatusHQ/health",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/openstatusHQ/health.git",
22
+ "directory": "packages/clerk/"
23
+ },
24
+ "bugs": {
25
+ "url": "https://github.com/openstatusHQ/health/issues"
26
+ },
27
+ "type": "module",
28
+ "module": "./dist/mod.js",
29
+ "main": "./dist/mod.cjs",
30
+ "types": "./dist/mod.d.ts",
31
+ "exports": {
32
+ ".": {
33
+ "types": {
34
+ "import": "./dist/mod.d.ts",
35
+ "require": "./dist/mod.d.cts"
36
+ },
37
+ "import": "./dist/mod.js",
38
+ "require": "./dist/mod.cjs"
39
+ },
40
+ "./package.json": "./package.json"
41
+ },
42
+ "sideEffects": false,
43
+ "files": [
44
+ "dist/"
45
+ ],
46
+ "engines": {
47
+ "node": ">=22"
48
+ },
49
+ "peerDependencies": {
50
+ "@openstatus/health": "^0.1.4-dev.0"
51
+ },
52
+ "devDependencies": {
53
+ "tsdown": "^0.12.7",
54
+ "typescript": "^5.8.3"
55
+ },
56
+ "scripts": {
57
+ "build": "tsdown",
58
+ "prepack": "tsdown",
59
+ "test": "node --experimental-transform-types --test"
60
+ }
61
+ }