@tightknitai/slack-block-kit-validator 0.1.12 → 0.1.14

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 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,
@@ -111,17 +112,20 @@ The schema uses `$defs` for every block, element, composition object, rich-text
111
112
 
112
113
  | Export | Signature | Description |
113
114
  |---|---|---|
114
- | `validateBlockKit` | `(input, opts?) => { valid, errors[] }` | Runs schema + all caveat helpers. Defaults to validating a bare blocks array. |
115
+ | `validateBlockKit` | `(input, opts?) => { valid, errors[] }` | Runs the schema, then the caveat helpers. Defaults to validating a bare blocks array. |
115
116
  | `ValidationResult` | `{ valid: boolean; errors: string[] }` | Return type. |
116
117
  | `ValidationTarget` | `'blocks' \| 'modal' \| 'home'` | What shape `input` should match. |
117
118
  | `ValidateBlockKitOptions` | `{ target?, surface? }` | Options bag. |
118
119
  | `Surface` | `'message' \| 'modal' \| 'home'` | Surface compatibility target. |
119
120
 
121
+ The two stages run in order: when the payload fails the JSON Schema, `validateBlockKit` returns those errors on their own and skips the helpers. The caveat rules compare fields against their siblings, which only means something once each field is known to be well-formed — and stopping there keeps a payload that ignores the schema's size caps from reaching the helpers' per-element loops. Fix the structural errors and re-run to see the cross-payload ones. The verdict doesn't depend on the order: schema errors alone already make `valid` false.
122
+
120
123
  ### Helpers
121
124
 
122
125
  | Helper | Signature | What it checks |
123
126
  |---|---|---|
124
127
  | `findDuplicateBlockIds` | `(blocks) => string[]` | Duplicate `block_id` values in a blocks array. |
128
+ | `findDuplicateActionIds` | `(blocks) => string[]` | Duplicate `action_id` values *within* a single block (legal across different blocks). |
125
129
  | `checkCumulativeMarkdownLength` | `(blocks) => string[]` | Sum of all `markdown` block text > 12,000 chars. |
126
130
  | `checkSingleTableBlock` | `(blocks) => string[]` | More than one `table` block per payload. |
127
131
  | `checkSinglePlanBlock` | `(blocks) => string[]` | More than one `plan` block per payload. |
@@ -148,7 +152,7 @@ Each returns an array of human-readable error strings — empty when valid.
148
152
  - **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
153
  - **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
154
  - **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.
155
+ - **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
156
 
153
157
  Every documented `maxLength`, regex (date / time / user ID / channel ID / team ID format), enum value, and array cardinality limit is enforced structurally.
154
158
 
@@ -1 +1 @@
1
- {"version":3,"file":"format-ajv-errors.js","sourceRoot":"","sources":["../src/format-ajv-errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format-ajv-errors.js","sourceRoot":"","sources":["../src/format-ajv-errors.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"check-data-visualization-consistency.d.ts","sourceRoot":"","sources":["../../src/helpers/check-data-visualization-consistency.ts"],"names":[],"mappings":"AAmBA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,SAAS;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,MAAM,EAAE,CAmEhG"}
1
+ {"version":3,"file":"check-data-visualization-consistency.d.ts","sourceRoot":"","sources":["../../src/helpers/check-data-visualization-consistency.ts"],"names":[],"mappings":"AA8BA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,SAAS;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,MAAM,EAAE,CAiGhG"}
@@ -1,3 +1,13 @@
1
+ /**
2
+ * Cap on the number of label/category mismatch errors reported for a single
3
+ * series. A schema-valid chart tops out at 20 categories and 20 data points
4
+ * per series, so a legitimate payload never reaches this — the cap only bites
5
+ * when unbounded input reaches the helper directly (it is exported on its own
6
+ * via `/helpers`, where no schema has run), and it stops a chart with tens of
7
+ * thousands of categories from materializing one error string per category
8
+ * per series.
9
+ */
10
+ const MAX_ERRORS_PER_SERIES = 100;
1
11
  /**
2
12
  * Enforces the two `data_visualization` rules Slack applies at runtime that
3
13
  * JSON Schema can't express, because each depends on the values of sibling
@@ -52,22 +62,48 @@ export function checkDataVisualizationConsistency(blocks) {
52
62
  return;
53
63
  }
54
64
  const labels = data.map((d) => d?.label).filter((l) => typeof l === "string");
65
+ // Tally the labels in one pass so the category sweep below can look each
66
+ // one up in O(1). Counting inside that loop instead (`labels.filter(...)`
67
+ // per category) rescans every label for every category — O(categories ×
68
+ // labels), which turns a chart with thousands of each into hundreds of
69
+ // milliseconds of CPU. This is O(categories + labels).
70
+ const labelCounts = new Map();
71
+ for (const label of labels) {
72
+ labelCounts.set(label, (labelCounts.get(label) ?? 0) + 1);
73
+ }
74
+ // Report at most MAX_ERRORS_PER_SERIES messages for this series, then
75
+ // count the rest and summarize — the first hundred already say what is
76
+ // wrong, and an unbounded input shouldn't turn into an unbounded array.
77
+ let reported = 0;
78
+ let suppressed = 0;
79
+ const report = (message) => {
80
+ if (reported < MAX_ERRORS_PER_SERIES) {
81
+ errors.push(message);
82
+ reported++;
83
+ }
84
+ else {
85
+ suppressed++;
86
+ }
87
+ };
55
88
  // Labels that aren't a declared category.
56
89
  for (const label of labels) {
57
90
  if (!categorySet.has(label)) {
58
- errors.push(`blocks[${i}].chart.series[${si}] has a data point labeled '${label}' that is not in axis_config.categories`);
91
+ report(`blocks[${i}].chart.series[${si}] has a data point labeled '${label}' that is not in axis_config.categories`);
59
92
  }
60
93
  }
61
94
  // Each category must be covered by exactly one data point.
62
95
  for (const category of categorySet) {
63
- const count = labels.filter((l) => l === category).length;
96
+ const count = labelCounts.get(category) ?? 0;
64
97
  if (count === 0) {
65
- errors.push(`blocks[${i}].chart.series[${si}] is missing a data point for category '${category}'`);
98
+ report(`blocks[${i}].chart.series[${si}] is missing a data point for category '${category}'`);
66
99
  }
67
100
  else if (count > 1) {
68
- errors.push(`blocks[${i}].chart.series[${si}] has ${count} data points for category '${category}' — expected exactly one`);
101
+ report(`blocks[${i}].chart.series[${si}] has ${count} data points for category '${category}' — expected exactly one`);
69
102
  }
70
103
  }
104
+ if (suppressed > 0) {
105
+ errors.push(`blocks[${i}].chart.series[${si}] has ${suppressed} further data point/category mismatches — only the first ${MAX_ERRORS_PER_SERIES} are listed`);
106
+ }
71
107
  });
72
108
  });
73
109
  return errors;
@@ -1 +1 @@
1
- {"version":3,"file":"check-data-visualization-consistency.js","sourceRoot":"","sources":["../../src/helpers/check-data-visualization-consistency.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check-data-visualization-consistency.js","sourceRoot":"","sources":["../../src/helpers/check-data-visualization-consistency.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -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
@@ -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"}
@@ -1290,13 +1290,14 @@
1290
1290
  },
1291
1291
 
1292
1292
  "data_visualization_axis_config": {
1293
- "description": "Axis configuration for cartesian (line/bar/area) charts. categories define the valid x-axis labels and their left-to-right display order.",
1293
+ "description": "Axis configuration for cartesian (line/bar/area) charts. categories define the valid x-axis labels and their left-to-right display order. At most 20 categories — each series must carry exactly one data point per category, and a series' data array is itself capped at 20 items.",
1294
1294
  "type": "object",
1295
1295
  "additionalProperties": false,
1296
1296
  "required": ["categories"],
1297
1297
  "properties": {
1298
1298
  "categories": {
1299
1299
  "type": "array",
1300
+ "maxItems": 20,
1300
1301
  "items": { "type": "string", "minLength": 1, "maxLength": 20 }
1301
1302
  },
1302
1303
  "x_label": { "type": "string", "maxLength": 50 },