@tightknitai/slack-block-kit-validator 0.1.11 → 0.1.13
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 +4 -2
- package/dist/helpers/find-duplicate-action-ids.d.ts +15 -0
- package/dist/helpers/find-duplicate-action-ids.d.ts.map +1 -0
- package/dist/helpers/find-duplicate-action-ids.js +81 -0
- package/dist/helpers/find-duplicate-action-ids.js.map +1 -0
- package/dist/helpers.d.ts +1 -0
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +1 -0
- package/dist/helpers.js.map +1 -1
- package/dist/validate-block-kit.d.ts +3 -2
- package/dist/validate-block-kit.d.ts.map +1 -1
- package/dist/validate-block-kit.js +5 -2
- package/dist/validate-block-kit.js.map +1 -1
- package/package.json +8 -1
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ JSON Schema (draft 2020-12) and validation helpers for Slack Block Kit JSON. Cat
|
|
|
15
15
|
|
|
16
16
|
Slack's API returns `200 OK` when you send malformed Block Kit JSON — the metadata is dropped and the message renders as plain text (or a modal opens blank). The only way to find out is to eyeball a real Slack channel. Slack hasn't open-sourced their validator.
|
|
17
17
|
|
|
18
|
-
This package compiles every rule in <https://docs.slack.dev/reference/block-kit> into a single JSON Schema, plus a handful of helpers for the cross-payload rules JSON Schema can't express (duplicate `block_id`, cumulative markdown length, one-table-per-message, `focus_on_load` uniqueness, surface compatibility).
|
|
18
|
+
This package compiles every rule in <https://docs.slack.dev/reference/block-kit> into a single JSON Schema, plus a handful of helpers for the cross-payload rules JSON Schema can't express (duplicate `block_id`, duplicate `action_id` within a block, cumulative markdown length, one-table-per-message, `focus_on_load` uniqueness, surface compatibility).
|
|
19
19
|
|
|
20
20
|
> Prefer an API call or an MCP server over an npm install? The repo also ships a Cloudflare Worker that exposes this package as a public, rate-limited HTTP endpoint plus a remote MCP server — see [`worker/`](./worker).
|
|
21
21
|
|
|
@@ -83,6 +83,7 @@ The helpers are pure (no deps, no Ajv) and can be stacked on top of any validato
|
|
|
83
83
|
```ts
|
|
84
84
|
import {
|
|
85
85
|
findDuplicateBlockIds,
|
|
86
|
+
findDuplicateActionIds,
|
|
86
87
|
checkCumulativeMarkdownLength,
|
|
87
88
|
checkSingleTableBlock,
|
|
88
89
|
checkSinglePlanBlock,
|
|
@@ -122,6 +123,7 @@ The schema uses `$defs` for every block, element, composition object, rich-text
|
|
|
122
123
|
| Helper | Signature | What it checks |
|
|
123
124
|
|---|---|---|
|
|
124
125
|
| `findDuplicateBlockIds` | `(blocks) => string[]` | Duplicate `block_id` values in a blocks array. |
|
|
126
|
+
| `findDuplicateActionIds` | `(blocks) => string[]` | Duplicate `action_id` values *within* a single block (legal across different blocks). |
|
|
125
127
|
| `checkCumulativeMarkdownLength` | `(blocks) => string[]` | Sum of all `markdown` block text > 12,000 chars. |
|
|
126
128
|
| `checkSingleTableBlock` | `(blocks) => string[]` | More than one `table` block per payload. |
|
|
127
129
|
| `checkSinglePlanBlock` | `(blocks) => string[]` | More than one `plan` block per payload. |
|
|
@@ -148,7 +150,7 @@ Each returns an array of human-readable error strings — empty when valid.
|
|
|
148
150
|
- **All 9 composition objects**: text (plain_text + mrkdwn), confirm, option (3 contextual variants), option_group, slack_file, dispatch_action_config, conversation_filter, trigger, workflow.
|
|
149
151
|
- **Rich text**: 4 container kinds (section, list, preformatted, quote) + 10 leaf kinds (text, link, user, usergroup, team, channel, emoji, broadcast, color, date) with style flags.
|
|
150
152
|
- **View envelopes**: `modal_view` + `home_view` under `$defs`.
|
|
151
|
-
- **Cross-payload rules** (via helpers): dup `block_id`, cumulative markdown, single-table, single-plan, two-data-visualization-per-message, chart series/category consistency, `focus_on_load` uniqueness, surface compatibility.
|
|
153
|
+
- **Cross-payload rules** (via helpers): dup `block_id`, dup `action_id` within a block, cumulative markdown, single-table, single-plan, two-data-visualization-per-message, chart series/category consistency, `focus_on_load` uniqueness, surface compatibility.
|
|
152
154
|
|
|
153
155
|
Every documented `maxLength`, regex (date / time / user ID / channel ID / team ID format), enum value, and array cardinality limit is enforced structurally.
|
|
154
156
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns error messages describing any duplicate `action_id` values within a
|
|
3
|
+
* single block. Slack rejects a payload where two interactive elements in the
|
|
4
|
+
* same block share an `action_id`. JSON Schema can't express per-property
|
|
5
|
+
* uniqueness across sibling items, so this check sits alongside structural
|
|
6
|
+
* validation like {@link findDuplicateBlockIds}.
|
|
7
|
+
*
|
|
8
|
+
* Uniqueness is required *within* a block, not across the payload: `state.values`
|
|
9
|
+
* is keyed `block_id` then `action_id`, so the same `action_id` in two different
|
|
10
|
+
* blocks is legal and is not flagged.
|
|
11
|
+
* @param blocks - array of Block Kit blocks (or anything with a nested shape)
|
|
12
|
+
* @returns array of human-readable error messages (empty when no duplicates)
|
|
13
|
+
*/
|
|
14
|
+
export declare function findDuplicateActionIds(blocks: readonly unknown[]): string[];
|
|
15
|
+
//# sourceMappingURL=find-duplicate-action-ids.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-duplicate-action-ids.d.ts","sourceRoot":"","sources":["../../src/helpers/find-duplicate-action-ids.ts"],"names":[],"mappings":"AA8BA;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,EAAE,CA8C3E"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Block properties that hold a block's interactive elements. Slack keys
|
|
3
|
+
* `state.values` by `block_id` then `action_id`, so everything reachable from
|
|
4
|
+
* one block shares a single `action_id` namespace. `element` / `accessory` are
|
|
5
|
+
* single elements — they can't collide with anything, but they're listed for
|
|
6
|
+
* consistency and cost nothing.
|
|
7
|
+
*/
|
|
8
|
+
const ELEMENT_KEYS = ["elements", "actions", "element", "accessory"];
|
|
9
|
+
/**
|
|
10
|
+
* Blocks whose children are themselves blocks, each opening its own
|
|
11
|
+
* `action_id` namespace rather than sharing the parent's — a `carousel`'s
|
|
12
|
+
* cards and a `container`'s child blocks each carry their own `block_id`.
|
|
13
|
+
*/
|
|
14
|
+
const CHILD_BLOCK_KEYS = new Map([
|
|
15
|
+
["carousel", "elements"],
|
|
16
|
+
["container", "child_blocks"],
|
|
17
|
+
]);
|
|
18
|
+
/**
|
|
19
|
+
* Cap for recursive traversal of block payloads. Well-formed payloads nest at
|
|
20
|
+
* most one level here (carousel → card, container → child block), so anything
|
|
21
|
+
* deeper is malformed or adversarial. Matches the cap used in the other
|
|
22
|
+
* walkers (`check-focus-on-load-uniqueness`, `check-number-input-bounds`).
|
|
23
|
+
*/
|
|
24
|
+
const MAX_WALK_DEPTH = 50;
|
|
25
|
+
const isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
26
|
+
/**
|
|
27
|
+
* Returns error messages describing any duplicate `action_id` values within a
|
|
28
|
+
* single block. Slack rejects a payload where two interactive elements in the
|
|
29
|
+
* same block share an `action_id`. JSON Schema can't express per-property
|
|
30
|
+
* uniqueness across sibling items, so this check sits alongside structural
|
|
31
|
+
* validation like {@link findDuplicateBlockIds}.
|
|
32
|
+
*
|
|
33
|
+
* Uniqueness is required *within* a block, not across the payload: `state.values`
|
|
34
|
+
* is keyed `block_id` then `action_id`, so the same `action_id` in two different
|
|
35
|
+
* blocks is legal and is not flagged.
|
|
36
|
+
* @param blocks - array of Block Kit blocks (or anything with a nested shape)
|
|
37
|
+
* @returns array of human-readable error messages (empty when no duplicates)
|
|
38
|
+
*/
|
|
39
|
+
export function findDuplicateActionIds(blocks) {
|
|
40
|
+
const errors = [];
|
|
41
|
+
const visit = (block, path, depth) => {
|
|
42
|
+
if (!isRecord(block) || depth > MAX_WALK_DEPTH) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const childKey = typeof block.type === "string" ? CHILD_BLOCK_KEYS.get(block.type) : undefined;
|
|
46
|
+
if (childKey !== undefined) {
|
|
47
|
+
const children = block[childKey];
|
|
48
|
+
if (Array.isArray(children)) {
|
|
49
|
+
children.forEach((child, i) => {
|
|
50
|
+
visit(child, `${path}.${childKey}[${i}]`, depth + 1);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const seen = new Map();
|
|
56
|
+
for (const key of ELEMENT_KEYS) {
|
|
57
|
+
const value = block[key];
|
|
58
|
+
const entries = Array.isArray(value)
|
|
59
|
+
? value.map((element, i) => [`${key}[${i}]`, element])
|
|
60
|
+
: [[key, value]];
|
|
61
|
+
for (const [rel, element] of entries) {
|
|
62
|
+
if (!isRecord(element) || typeof element.action_id !== "string") {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const id = element.action_id;
|
|
66
|
+
const prev = seen.get(id);
|
|
67
|
+
if (prev !== undefined) {
|
|
68
|
+
errors.push(`${path}.${rel}.action_id must be unique within the block — '${id}' appears at ${prev} and ${rel}`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
seen.set(id, rel);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
blocks.forEach((block, i) => {
|
|
77
|
+
visit(block, `blocks[${i}]`, 0);
|
|
78
|
+
});
|
|
79
|
+
return errors;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=find-duplicate-action-ids.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-duplicate-action-ids.js","sourceRoot":"","sources":["../../src/helpers/find-duplicate-action-ids.ts"],"names":[],"mappings":"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"}
|
package/dist/helpers.d.ts
CHANGED
|
@@ -8,5 +8,6 @@ export * from "./helpers/check-response-url-enabled-context.js";
|
|
|
8
8
|
export * from "./helpers/check-single-plan-block.js";
|
|
9
9
|
export * from "./helpers/check-single-table-block.js";
|
|
10
10
|
export * from "./helpers/check-surface-compatibility.js";
|
|
11
|
+
export * from "./helpers/find-duplicate-action-ids.js";
|
|
11
12
|
export * from "./helpers/find-duplicate-block-ids.js";
|
|
12
13
|
//# sourceMappingURL=helpers.d.ts.map
|
package/dist/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAIA,cAAc,qCAAqC,CAAC;AACpD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,mDAAmD,CAAC;AAClE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,wCAAwC,CAAC;AACvD,cAAc,iDAAiD,CAAC;AAChE,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,0CAA0C,CAAC;AACzD,cAAc,uCAAuC,CAAC"}
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAIA,cAAc,qCAAqC,CAAC;AACpD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,mDAAmD,CAAC;AAClE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,wCAAwC,CAAC;AACvD,cAAc,iDAAiD,CAAC;AAChE,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,0CAA0C,CAAC;AACzD,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC"}
|
package/dist/helpers.js
CHANGED
|
@@ -11,5 +11,6 @@ export * from "./helpers/check-response-url-enabled-context.js";
|
|
|
11
11
|
export * from "./helpers/check-single-plan-block.js";
|
|
12
12
|
export * from "./helpers/check-single-table-block.js";
|
|
13
13
|
export * from "./helpers/check-surface-compatibility.js";
|
|
14
|
+
export * from "./helpers/find-duplicate-action-ids.js";
|
|
14
15
|
export * from "./helpers/find-duplicate-block-ids.js";
|
|
15
16
|
//# sourceMappingURL=helpers.js.map
|
package/dist/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,8EAA8E;AAC9E,+DAA+D;AAE/D,cAAc,qCAAqC,CAAC;AACpD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,mDAAmD,CAAC;AAClE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,wCAAwC,CAAC;AACvD,cAAc,iDAAiD,CAAC;AAChE,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,0CAA0C,CAAC;AACzD,cAAc,uCAAuC,CAAC"}
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,8EAA8E;AAC9E,+DAA+D;AAE/D,cAAc,qCAAqC,CAAC;AACpD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,mDAAmD,CAAC;AAClE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,wCAAwC,CAAC;AACvD,cAAc,iDAAiD,CAAC;AAChE,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,0CAA0C,CAAC;AACzD,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC"}
|
|
@@ -23,8 +23,9 @@ export interface ValidateBlockKitOptions {
|
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
25
|
* Validates a Slack Block Kit payload against the JSON Schema and the set of
|
|
26
|
-
* caveat helpers (duplicate block_ids,
|
|
27
|
-
* single-plan, focus_on_load
|
|
26
|
+
* caveat helpers (duplicate block_ids, duplicate action_ids within a block,
|
|
27
|
+
* cumulative markdown length, single-table, single-plan, focus_on_load
|
|
28
|
+
* uniqueness, surface compatibility).
|
|
28
29
|
* @param input - the payload to validate
|
|
29
30
|
* @param options - target shape + optional surface
|
|
30
31
|
* @returns `{ valid, errors }` — `errors` is a flat array of human-readable messages
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-block-kit.d.ts","sourceRoot":"","sources":["../src/validate-block-kit.ts"],"names":[],"mappings":"AAYA,OAAO,EAA6B,KAAK,OAAO,EAAE,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"validate-block-kit.d.ts","sourceRoot":"","sources":["../src/validate-block-kit.ts"],"names":[],"mappings":"AAYA,OAAO,EAA6B,KAAK,OAAO,EAAE,MAAM,0CAA0C,CAAC;AAKnG;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3D,MAAM,WAAW,uBAAuB;IACtC,+DAA+D;IAC/D,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAoID;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,uBAA4B,GAAG,gBAAgB,CAoCxG"}
|
|
@@ -11,6 +11,7 @@ import { checkResponseUrlEnabledContext } from "./helpers/check-response-url-ena
|
|
|
11
11
|
import { checkSinglePlanBlock } from "./helpers/check-single-plan-block.js";
|
|
12
12
|
import { checkSingleTableBlock } from "./helpers/check-single-table-block.js";
|
|
13
13
|
import { checkSurfaceCompatibility } from "./helpers/check-surface-compatibility.js";
|
|
14
|
+
import { findDuplicateActionIds } from "./helpers/find-duplicate-action-ids.js";
|
|
14
15
|
import { findDuplicateBlockIds } from "./helpers/find-duplicate-block-ids.js";
|
|
15
16
|
import schema from "./slack-block-kit.schema.json" with { type: "json" };
|
|
16
17
|
const ajv = new Ajv2020({ allErrors: true, strict: false });
|
|
@@ -134,8 +135,9 @@ const stripUndefined = (input, depth = 0) => {
|
|
|
134
135
|
};
|
|
135
136
|
/**
|
|
136
137
|
* Validates a Slack Block Kit payload against the JSON Schema and the set of
|
|
137
|
-
* caveat helpers (duplicate block_ids,
|
|
138
|
-
* single-plan, focus_on_load
|
|
138
|
+
* caveat helpers (duplicate block_ids, duplicate action_ids within a block,
|
|
139
|
+
* cumulative markdown length, single-table, single-plan, focus_on_load
|
|
140
|
+
* uniqueness, surface compatibility).
|
|
139
141
|
* @param input - the payload to validate
|
|
140
142
|
* @param options - target shape + optional surface
|
|
141
143
|
* @returns `{ valid, errors }` — `errors` is a flat array of human-readable messages
|
|
@@ -151,6 +153,7 @@ export function validateBlockKit(input, options = {}) {
|
|
|
151
153
|
}
|
|
152
154
|
const blocks = extractBlocks(normalizedInput, target);
|
|
153
155
|
errors.push(...findDuplicateBlockIds(blocks));
|
|
156
|
+
errors.push(...findDuplicateActionIds(blocks));
|
|
154
157
|
errors.push(...checkCumulativeMarkdownLength(blocks));
|
|
155
158
|
errors.push(...checkSingleTableBlock(blocks));
|
|
156
159
|
errors.push(...checkSinglePlanBlock(blocks));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-block-kit.js","sourceRoot":"","sources":["../src/validate-block-kit.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"validate-block-kit.js","sourceRoot":"","sources":["../src/validate-block-kit.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tightknitai/slack-block-kit-validator",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.13",
|
|
4
4
|
"description": "JSON Schema (draft 2020-12) and validation helpers for Slack Block Kit payloads.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -67,6 +67,7 @@
|
|
|
67
67
|
"tinybench": "^6.0.2",
|
|
68
68
|
"tsx": "^4.22.0",
|
|
69
69
|
"typescript": "^6.0.3",
|
|
70
|
+
"vite": "~8.0.16",
|
|
70
71
|
"vitest": "^4.1.4"
|
|
71
72
|
},
|
|
72
73
|
"repository": {
|
|
@@ -103,8 +104,14 @@
|
|
|
103
104
|
],
|
|
104
105
|
"pnpm": {
|
|
105
106
|
"overrides": {
|
|
107
|
+
"@hono/node-server@<2.0.5": "^2.0.5",
|
|
108
|
+
"@modelcontextprotocol/sdk@<1.30.0": "^1.30.0",
|
|
106
109
|
"fast-json-patch@<3.1.1": ">=3.1.1",
|
|
107
110
|
"fast-uri@<3.1.4": "^3.1.4",
|
|
111
|
+
"hono@<4.12.27": "^4.12.27",
|
|
112
|
+
"js-yaml@<3.15.0": "^3.15.1",
|
|
113
|
+
"js-yaml@>=4.0.0 <4.2.0": "^4.2.0",
|
|
114
|
+
"undici@>=7.0.0 <7.28.0": "^7.28.0",
|
|
108
115
|
"ws@<8.20.1": "^8.20.1"
|
|
109
116
|
},
|
|
110
117
|
"onlyBuiltDependencies": [
|