@refrakt-md/runes 0.32.0 → 0.34.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.
Files changed (303) hide show
  1. package/dist/aggregate-resolve.d.ts.map +1 -1
  2. package/dist/aggregate-resolve.js +18 -4
  3. package/dist/aggregate-resolve.js.map +1 -1
  4. package/dist/attributes.d.ts +15 -0
  5. package/dist/attributes.d.ts.map +1 -1
  6. package/dist/attributes.js +22 -7
  7. package/dist/attributes.js.map +1 -1
  8. package/dist/collection-helpers.d.ts.map +1 -1
  9. package/dist/collection-helpers.js +1 -1
  10. package/dist/collection-helpers.js.map +1 -1
  11. package/dist/collection-resolve.d.ts.map +1 -1
  12. package/dist/collection-resolve.js +31 -8
  13. package/dist/collection-resolve.js.map +1 -1
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +214 -77
  16. package/dist/config.js.map +1 -1
  17. package/dist/data-adapters.d.ts.map +1 -1
  18. package/dist/data-adapters.js +28 -11
  19. package/dist/data-adapters.js.map +1 -1
  20. package/dist/data-emit.d.ts +1 -0
  21. package/dist/data-emit.d.ts.map +1 -1
  22. package/dist/data-emit.js +40 -0
  23. package/dist/data-emit.js.map +1 -1
  24. package/dist/data-pipeline.d.ts +10 -4
  25. package/dist/data-pipeline.d.ts.map +1 -1
  26. package/dist/data-pipeline.js +331 -32
  27. package/dist/data-pipeline.js.map +1 -1
  28. package/dist/data-projection.d.ts +21 -0
  29. package/dist/data-projection.d.ts.map +1 -1
  30. package/dist/data-projection.js +41 -3
  31. package/dist/data-projection.js.map +1 -1
  32. package/dist/data-resolve.d.ts.map +1 -1
  33. package/dist/data-resolve.js +5 -2
  34. package/dist/data-resolve.js.map +1 -1
  35. package/dist/documents/page.d.ts.map +1 -1
  36. package/dist/documents/page.js.map +1 -1
  37. package/dist/drawer-pipeline.d.ts.map +1 -1
  38. package/dist/drawer-pipeline.js +3 -2
  39. package/dist/drawer-pipeline.js.map +1 -1
  40. package/dist/expand-pipeline.d.ts.map +1 -1
  41. package/dist/expand-pipeline.js +3 -3
  42. package/dist/expand-pipeline.js.map +1 -1
  43. package/dist/fence-escape.d.ts.map +1 -1
  44. package/dist/fence-escape.js +1 -3
  45. package/dist/fence-escape.js.map +1 -1
  46. package/dist/field-match.d.ts.map +1 -1
  47. package/dist/field-match.js.map +1 -1
  48. package/dist/file-ref-resolve.js +6 -4
  49. package/dist/file-ref-resolve.js.map +1 -1
  50. package/dist/fixtures.js +2 -2
  51. package/dist/fixtures.js.map +1 -1
  52. package/dist/functions.d.ts.map +1 -1
  53. package/dist/functions.js +16 -3
  54. package/dist/functions.js.map +1 -1
  55. package/dist/include-pipeline.d.ts +52 -0
  56. package/dist/include-pipeline.d.ts.map +1 -0
  57. package/dist/include-pipeline.js +206 -0
  58. package/dist/include-pipeline.js.map +1 -0
  59. package/dist/index.d.ts +94 -37
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +298 -59
  62. package/dist/index.js.map +1 -1
  63. package/dist/interfaces.d.ts.map +1 -1
  64. package/dist/interfaces.js.map +1 -1
  65. package/dist/layouts/grid.d.ts +1 -1
  66. package/dist/layouts/grid.d.ts.map +1 -1
  67. package/dist/layouts/grid.js +4 -6
  68. package/dist/layouts/grid.js.map +1 -1
  69. package/dist/lib/component.d.ts +20 -0
  70. package/dist/lib/component.d.ts.map +1 -1
  71. package/dist/lib/component.js +42 -7
  72. package/dist/lib/component.js.map +1 -1
  73. package/dist/lib/icon-resolve.d.ts.map +1 -1
  74. package/dist/lib/icon-resolve.js.map +1 -1
  75. package/dist/lib/image-schemes.js +2 -2
  76. package/dist/lib/image-schemes.js.map +1 -1
  77. package/dist/lib/index.d.ts +2 -2
  78. package/dist/lib/index.d.ts.map +1 -1
  79. package/dist/lib/index.js +252 -51
  80. package/dist/lib/index.js.map +1 -1
  81. package/dist/lib/node.d.ts.map +1 -1
  82. package/dist/lib/node.js +3 -2
  83. package/dist/lib/node.js.map +1 -1
  84. package/dist/lib/placeholder.d.ts.map +1 -1
  85. package/dist/lib/placeholder.js +6 -9
  86. package/dist/lib/placeholder.js.map +1 -1
  87. package/dist/lib/read-file.d.ts.map +1 -1
  88. package/dist/lib/read-file.js.map +1 -1
  89. package/dist/lib/renderable.d.ts.map +1 -1
  90. package/dist/lib/renderable.js +5 -5
  91. package/dist/lib/renderable.js.map +1 -1
  92. package/dist/lib/resolver.d.ts.map +1 -1
  93. package/dist/lib/resolver.js +26 -35
  94. package/dist/lib/resolver.js.map +1 -1
  95. package/dist/lib/svg.d.ts.map +1 -1
  96. package/dist/lib/svg.js.map +1 -1
  97. package/dist/nodes.d.ts.map +1 -1
  98. package/dist/nodes.js +24 -22
  99. package/dist/nodes.js.map +1 -1
  100. package/dist/outline-scope.js +1 -3
  101. package/dist/outline-scope.js.map +1 -1
  102. package/dist/plugins.d.ts.map +1 -1
  103. package/dist/plugins.js +13 -10
  104. package/dist/plugins.js.map +1 -1
  105. package/dist/reference.d.ts +27 -2
  106. package/dist/reference.d.ts.map +1 -1
  107. package/dist/reference.js +58 -25
  108. package/dist/reference.js.map +1 -1
  109. package/dist/relationships-resolve.d.ts.map +1 -1
  110. package/dist/relationships-resolve.js +31 -7
  111. package/dist/relationships-resolve.js.map +1 -1
  112. package/dist/rune.d.ts.map +1 -1
  113. package/dist/rune.js.map +1 -1
  114. package/dist/sandbox-sources.js +6 -6
  115. package/dist/sandbox-sources.js.map +1 -1
  116. package/dist/seo.d.ts.map +1 -1
  117. package/dist/seo.js +4 -4
  118. package/dist/seo.js.map +1 -1
  119. package/dist/snippet-pipeline.d.ts.map +1 -1
  120. package/dist/snippet-pipeline.js +1 -1
  121. package/dist/snippet-pipeline.js.map +1 -1
  122. package/dist/tags/accordion.d.ts.map +1 -1
  123. package/dist/tags/accordion.js +43 -11
  124. package/dist/tags/accordion.js.map +1 -1
  125. package/dist/tags/aggregate.d.ts.map +1 -1
  126. package/dist/tags/aggregate.js +65 -10
  127. package/dist/tags/aggregate.js.map +1 -1
  128. package/dist/tags/annotate.d.ts.map +1 -1
  129. package/dist/tags/annotate.js +12 -9
  130. package/dist/tags/annotate.js.map +1 -1
  131. package/dist/tags/badge.d.ts.map +1 -1
  132. package/dist/tags/badge.js.map +1 -1
  133. package/dist/tags/bar.d.ts.map +1 -1
  134. package/dist/tags/bar.js +3 -7
  135. package/dist/tags/bar.js.map +1 -1
  136. package/dist/tags/bg.d.ts.map +1 -1
  137. package/dist/tags/bg.js +60 -12
  138. package/dist/tags/bg.js.map +1 -1
  139. package/dist/tags/blog.d.ts.map +1 -1
  140. package/dist/tags/blog.js +35 -10
  141. package/dist/tags/blog.js.map +1 -1
  142. package/dist/tags/breadcrumb.d.ts.map +1 -1
  143. package/dist/tags/breadcrumb.js +33 -11
  144. package/dist/tags/breadcrumb.js.map +1 -1
  145. package/dist/tags/budget.d.ts.map +1 -1
  146. package/dist/tags/budget.js +54 -16
  147. package/dist/tags/budget.js.map +1 -1
  148. package/dist/tags/card.d.ts.map +1 -1
  149. package/dist/tags/card.js +24 -6
  150. package/dist/tags/card.js.map +1 -1
  151. package/dist/tags/chart.d.ts.map +1 -1
  152. package/dist/tags/chart.js +33 -11
  153. package/dist/tags/chart.js.map +1 -1
  154. package/dist/tags/code.d.ts +25 -0
  155. package/dist/tags/code.d.ts.map +1 -0
  156. package/dist/tags/code.js +36 -0
  157. package/dist/tags/code.js.map +1 -0
  158. package/dist/tags/codegroup.d.ts.map +1 -1
  159. package/dist/tags/codegroup.js +39 -21
  160. package/dist/tags/codegroup.js.map +1 -1
  161. package/dist/tags/collection.d.ts.map +1 -1
  162. package/dist/tags/collection.js +55 -9
  163. package/dist/tags/collection.js.map +1 -1
  164. package/dist/tags/common.d.ts.map +1 -1
  165. package/dist/tags/common.js +34 -9
  166. package/dist/tags/common.js.map +1 -1
  167. package/dist/tags/compare.d.ts.map +1 -1
  168. package/dist/tags/compare.js +26 -14
  169. package/dist/tags/compare.js.map +1 -1
  170. package/dist/tags/conversation.d.ts.map +1 -1
  171. package/dist/tags/conversation.js +19 -17
  172. package/dist/tags/conversation.js.map +1 -1
  173. package/dist/tags/data.d.ts.map +1 -1
  174. package/dist/tags/data.js +91 -15
  175. package/dist/tags/data.js.map +1 -1
  176. package/dist/tags/datatable.d.ts.map +1 -1
  177. package/dist/tags/datatable.js +22 -8
  178. package/dist/tags/datatable.js.map +1 -1
  179. package/dist/tags/deflist.d.ts.map +1 -1
  180. package/dist/tags/deflist.js +5 -11
  181. package/dist/tags/deflist.js.map +1 -1
  182. package/dist/tags/details.d.ts.map +1 -1
  183. package/dist/tags/details.js +8 -5
  184. package/dist/tags/details.js.map +1 -1
  185. package/dist/tags/diagram.d.ts.map +1 -1
  186. package/dist/tags/diagram.js +9 -5
  187. package/dist/tags/diagram.js.map +1 -1
  188. package/dist/tags/diff.d.ts.map +1 -1
  189. package/dist/tags/diff.js +43 -24
  190. package/dist/tags/diff.js.map +1 -1
  191. package/dist/tags/drawer.d.ts.map +1 -1
  192. package/dist/tags/drawer.js +4 -6
  193. package/dist/tags/drawer.js.map +1 -1
  194. package/dist/tags/embed.d.ts.map +1 -1
  195. package/dist/tags/embed.js +10 -5
  196. package/dist/tags/embed.js.map +1 -1
  197. package/dist/tags/expand.d.ts.map +1 -1
  198. package/dist/tags/expand.js.map +1 -1
  199. package/dist/tags/figure.d.ts.map +1 -1
  200. package/dist/tags/figure.js +29 -9
  201. package/dist/tags/figure.js.map +1 -1
  202. package/dist/tags/file-ref.d.ts.map +1 -1
  203. package/dist/tags/file-ref.js.map +1 -1
  204. package/dist/tags/form.d.ts.map +1 -1
  205. package/dist/tags/form.js +52 -25
  206. package/dist/tags/form.js.map +1 -1
  207. package/dist/tags/gallery.d.ts.map +1 -1
  208. package/dist/tags/gallery.js +26 -12
  209. package/dist/tags/gallery.js.map +1 -1
  210. package/dist/tags/grid.d.ts.map +1 -1
  211. package/dist/tags/grid.js +57 -14
  212. package/dist/tags/grid.js.map +1 -1
  213. package/dist/tags/hint.d.ts.map +1 -1
  214. package/dist/tags/hint.js +9 -5
  215. package/dist/tags/hint.js.map +1 -1
  216. package/dist/tags/icon.d.ts.map +1 -1
  217. package/dist/tags/icon.js +5 -1
  218. package/dist/tags/icon.js.map +1 -1
  219. package/dist/tags/include.d.ts +24 -0
  220. package/dist/tags/include.d.ts.map +1 -0
  221. package/dist/tags/include.js +46 -0
  222. package/dist/tags/include.js.map +1 -0
  223. package/dist/tags/juxtapose.d.ts.map +1 -1
  224. package/dist/tags/juxtapose.js +32 -14
  225. package/dist/tags/juxtapose.js.map +1 -1
  226. package/dist/tags/layout.d.ts.map +1 -1
  227. package/dist/tags/layout.js +7 -4
  228. package/dist/tags/layout.js.map +1 -1
  229. package/dist/tags/mediatext.d.ts.map +1 -1
  230. package/dist/tags/mediatext.js +19 -8
  231. package/dist/tags/mediatext.js.map +1 -1
  232. package/dist/tags/nav.d.ts.map +1 -1
  233. package/dist/tags/nav.js +43 -23
  234. package/dist/tags/nav.js.map +1 -1
  235. package/dist/tags/pagination.d.ts.map +1 -1
  236. package/dist/tags/pagination.js +27 -5
  237. package/dist/tags/pagination.js.map +1 -1
  238. package/dist/tags/progress.d.ts.map +1 -1
  239. package/dist/tags/progress.js +25 -5
  240. package/dist/tags/progress.js.map +1 -1
  241. package/dist/tags/pullquote.d.ts.map +1 -1
  242. package/dist/tags/pullquote.js +16 -9
  243. package/dist/tags/pullquote.js.map +1 -1
  244. package/dist/tags/region.d.ts.map +1 -1
  245. package/dist/tags/region.js +9 -4
  246. package/dist/tags/region.js.map +1 -1
  247. package/dist/tags/relationships.d.ts.map +1 -1
  248. package/dist/tags/relationships.js +55 -9
  249. package/dist/tags/relationships.js.map +1 -1
  250. package/dist/tags/reveal.d.ts.map +1 -1
  251. package/dist/tags/reveal.js +16 -7
  252. package/dist/tags/reveal.js.map +1 -1
  253. package/dist/tags/sandbox.d.ts.map +1 -1
  254. package/dist/tags/sandbox.js +104 -44
  255. package/dist/tags/sandbox.js.map +1 -1
  256. package/dist/tags/section.d.ts.map +1 -1
  257. package/dist/tags/section.js +13 -3
  258. package/dist/tags/section.js.map +1 -1
  259. package/dist/tags/showcase.d.ts.map +1 -1
  260. package/dist/tags/showcase.js +33 -11
  261. package/dist/tags/showcase.js.map +1 -1
  262. package/dist/tags/sidenote.d.ts.map +1 -1
  263. package/dist/tags/sidenote.js +9 -5
  264. package/dist/tags/sidenote.js.map +1 -1
  265. package/dist/tags/snippet.d.ts.map +1 -1
  266. package/dist/tags/snippet.js +14 -6
  267. package/dist/tags/snippet.js.map +1 -1
  268. package/dist/tags/tabs.d.ts.map +1 -1
  269. package/dist/tags/tabs.js +16 -9
  270. package/dist/tags/tabs.js.map +1 -1
  271. package/dist/tags/textblock.d.ts.map +1 -1
  272. package/dist/tags/textblock.js +9 -5
  273. package/dist/tags/textblock.js.map +1 -1
  274. package/dist/tags/tint.d.ts +1 -1
  275. package/dist/tags/tint.d.ts.map +1 -1
  276. package/dist/tags/tint.js +14 -2
  277. package/dist/tags/tint.js.map +1 -1
  278. package/dist/tags/toc.d.ts.map +1 -1
  279. package/dist/tags/toc.js +16 -7
  280. package/dist/tags/toc.js.map +1 -1
  281. package/dist/tags/xref.d.ts.map +1 -1
  282. package/dist/tags/xref.js.map +1 -1
  283. package/dist/universal-attributes.d.ts.map +1 -1
  284. package/dist/universal-attributes.js +28 -5
  285. package/dist/universal-attributes.js.map +1 -1
  286. package/dist/util.d.ts +41 -1
  287. package/dist/util.d.ts.map +1 -1
  288. package/dist/util.js +72 -14
  289. package/dist/util.js.map +1 -1
  290. package/dist/xref-patterns.js +1 -1
  291. package/dist/xref-patterns.js.map +1 -1
  292. package/dist/xref-preview-resolve.js +3 -4
  293. package/dist/xref-preview-resolve.js.map +1 -1
  294. package/dist/xref-resolve.d.ts.map +1 -1
  295. package/dist/xref-resolve.js +4 -4
  296. package/dist/xref-resolve.js.map +1 -1
  297. package/i18n/de.json +67 -67
  298. package/i18n/en.json +67 -67
  299. package/package.json +3 -3
  300. package/dist/tags/error.d.ts +0 -3
  301. package/dist/tags/error.d.ts.map +0 -1
  302. package/dist/tags/error.js +0 -34
  303. package/dist/tags/error.js.map +0 -1
@@ -8,10 +8,16 @@
8
8
  * emitted table is consumed by `chart`/`datatable` with no structural edits and
9
9
  * is the honest no-JS fallback on a bare page.
10
10
  *
11
- * On any failure (sandbox escape / missing file / parse error / empty result)
12
- * the tag is replaced with a visible error callout and a build warning is
13
- * emitted — the build continues and the `data` tag never reaches its throwing
14
- * transform.
11
+ * On a failure (sandbox escape / missing file / parse error / a source that
12
+ * yielded no rows) the tag is replaced with a visible error callout and a build
13
+ * error is recorded — the build continues and the `data` tag never reaches its
14
+ * throwing transform.
15
+ *
16
+ * A *projection* that ends with no rows is not a failure (BUG-011). Asking real
17
+ * data a question with no answer today is normal, so the tag is spliced away and
18
+ * nothing renders. What used to justify erroring there — catching a misspelt
19
+ * column — is now `unknownFieldWarnings`, which detects the typo directly
20
+ * instead of inferring it from an empty result.
15
21
  */
16
22
  import type { Node } from '@markdoc/markdoc';
17
23
  import type { PreprocessContext, PreprocessPage } from '@refrakt-md/types';
@@ -1 +1 @@
1
- {"version":3,"file":"data-pipeline.d.ts","sourceRoot":"","sources":["../src/data-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAgB,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA4CzF;;;;GAIG;AACH,wBAAgB,cAAc,CAC7B,GAAG,EAAE,IAAI,EACT,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE,iBAAiB,GACpB,IAAI,GAAG,IAAI,CAKb"}
1
+ {"version":3,"file":"data-pipeline.d.ts","sourceRoot":"","sources":["../src/data-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,EAAgB,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAgHzF;;;;GAIG;AACH,wBAAgB,cAAc,CAC7B,GAAG,EAAE,IAAI,EACT,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE,iBAAiB,GACpB,IAAI,GAAG,IAAI,CAOb"}
@@ -8,40 +8,93 @@
8
8
  * emitted table is consumed by `chart`/`datatable` with no structural edits and
9
9
  * is the honest no-JS fallback on a bare page.
10
10
  *
11
- * On any failure (sandbox escape / missing file / parse error / empty result)
12
- * the tag is replaced with a visible error callout and a build warning is
13
- * emitted — the build continues and the `data` tag never reaches its throwing
14
- * transform.
11
+ * On a failure (sandbox escape / missing file / parse error / a source that
12
+ * yielded no rows) the tag is replaced with a visible error callout and a build
13
+ * error is recorded — the build continues and the `data` tag never reaches its
14
+ * throwing transform.
15
+ *
16
+ * A *projection* that ends with no rows is not a failure (BUG-011). Asking real
17
+ * data a question with no answer today is normal, so the tag is spliced away and
18
+ * nothing renders. What used to justify erroring there — catching a misspelt
19
+ * column — is now `unknownFieldWarnings`, which detects the typo directly
20
+ * instead of inferring it from an empty result.
15
21
  */
22
+ import Markdoc from '@markdoc/markdoc';
23
+ const { Ast } = Markdoc;
16
24
  import { delimitedAdapter, jsonAdapter, ndjsonAdapter, inferFormat, DataSourceError, } from './data-adapters.js';
17
- import { applyWhere, applySort, applyColumns, applyLimitOffset, applyTyping, } from './data-projection.js';
18
- import { emitTableNode, emitErrorNode } from './data-emit.js';
19
- /** Resolve a Markdoc attribute value to a string — literal strings and
20
- * `Variable` AST nodes (e.g. `src=$file.dir`). Mirrors snippet's resolver. */
21
- function resolveString(value, variables) {
25
+ import { applyWhere, applySort, applyColumns, applyLimitOffset, applyTyping, unknownFieldWarnings, } from './data-projection.js';
26
+ import { emitTableNode, emitBodyTableNode, emitErrorNode } from './data-emit.js';
27
+ function resolveAttr(value, variables) {
22
28
  if (value === undefined || value === null)
23
- return '';
24
- if (typeof value === 'string')
25
- return value;
29
+ return { ok: false, why: 'is empty' };
30
+ if (typeof value === 'string') {
31
+ return value === '' ? { ok: false, why: 'is empty' } : { ok: true, value };
32
+ }
26
33
  if (typeof value === 'number' || typeof value === 'boolean')
27
- return String(value);
34
+ return { ok: true, value: String(value) };
28
35
  if (typeof value === 'object' && '$$mdtype' in value) {
29
36
  const node = value;
30
37
  if (node.$$mdtype === 'Variable' && Array.isArray(node.path)) {
38
+ const path = node.path.join('.');
31
39
  let current = variables;
32
40
  for (const segment of node.path) {
33
- if (current === null || current === undefined)
34
- return '';
41
+ if (current === null || current === undefined) {
42
+ current = undefined;
43
+ break;
44
+ }
35
45
  current = current[segment];
36
46
  }
37
- return current === null || current === undefined ? '' : String(current);
47
+ return current === null || current === undefined
48
+ ? { ok: false, why: `references \`$${path}\`, which is not defined here` }
49
+ : { ok: true, value: String(current) };
50
+ }
51
+ if (node.$$mdtype === 'Function') {
52
+ // `data` resolves its attributes during preprocess, and Markdoc
53
+ // evaluates functions during the transform — so the call has not
54
+ // happened yet and there is nothing to read.
55
+ return {
56
+ ok: false,
57
+ why: `is a call to \`${node.name ?? 'a function'}()\`, and \`data\` reads its attributes ` +
58
+ 'during preprocess — before functions are evaluated',
59
+ };
38
60
  }
39
61
  }
40
- return '';
62
+ return { ok: false, why: 'could not be read' };
41
63
  }
64
+ /** Resolve to a string, treating anything unreadable as absent. For attributes
65
+ * whose failure the caller reports separately via {@link resolveAttr}. */
66
+ function resolveString(value, variables) {
67
+ const r = resolveAttr(value, variables);
68
+ return r.ok ? r.value : '';
69
+ }
70
+ /**
71
+ * Every attribute `data` resolves as a string (BUG-010).
72
+ *
73
+ * `limit` and `offset` are absent on purpose — they go through `numberAttr`,
74
+ * which has its own coercion, and `header` is a Boolean. Everything here
75
+ * reaches `resolveAttr`, so a present-but-unreadable one is reported rather
76
+ * than quietly becoming `''`.
77
+ */
78
+ const STRING_ATTRIBUTES = [
79
+ 'src',
80
+ 'format',
81
+ 'delimiter',
82
+ 'root',
83
+ 'orient',
84
+ 'key-column',
85
+ 'columns',
86
+ 'where',
87
+ 'sort',
88
+ 'numeric',
89
+ 'text',
90
+ 'headers',
91
+ ];
42
92
  /** Parse a comma-separated column list into trimmed, non-empty names. */
43
93
  function splitList(raw) {
44
- return raw.split(',').map((s) => s.trim()).filter((s) => s.length > 0);
94
+ return raw
95
+ .split(',')
96
+ .map((s) => s.trim())
97
+ .filter((s) => s.length > 0);
45
98
  }
46
99
  /**
47
100
  * Preprocess: replace every `{% data %}` tag with a resolved `table` node (or an
@@ -52,29 +105,227 @@ export function preprocessData(ast, page, ctx) {
52
105
  if (!ctx.sandbox)
53
106
  return;
54
107
  let mutated = false;
55
- walkAndReplaceData(ast, page, ctx, ctx.sandbox, () => { mutated = true; });
108
+ walkAndReplaceData(ast, page, ctx, ctx.sandbox, () => {
109
+ mutated = true;
110
+ });
56
111
  return mutated ? ast : undefined;
57
112
  }
58
- function walkAndReplaceData(node, page, ctx, files, onReplaced) {
113
+ /** Runes that consume a `<table>` child directly, so a per-row body inside them
114
+ * would render as a silently empty chart rather than an error (SPEC-127). */
115
+ const TABLE_CONSUMERS = new Set(['chart', 'datatable']);
116
+ function walkAndReplaceData(node, page, ctx, files, onReplaced, enclosing) {
59
117
  if (!node.children)
60
118
  return;
61
119
  for (let i = 0; i < node.children.length; i++) {
62
120
  const child = node.children[i];
63
121
  if (child.type === 'tag' && child.tag === 'data') {
64
- node.children[i] = resolveDataToNode(child, page, ctx, files);
122
+ // **Splice, never wrap.** One `data` tag may now produce N nodes, and
123
+ // they have to land as direct siblings: a container node to keep the
124
+ // replacement 1:1 breaks composition invisibly, and how badly depends
125
+ // on the parent. Measured against `accordion`, a `{% div %}` wrapper is
126
+ // harmless while `{% section %}` and `{% grid %}` consume their
127
+ // children — the `accordion-item` tags and their body text vanish with
128
+ // no error or warning (SPEC-127).
129
+ let replacement = resolveData(child, page, ctx, files, enclosing);
130
+ // Resolve any `data` the replacement carries — a subquery, one copy
131
+ // per outer row, each with its `where` already bound (WORK-553).
132
+ //
133
+ // Walked through a throwaway container because a subquery can be a
134
+ // *direct* child of the body, in which case it is the replacement
135
+ // node itself: `walkAndReplaceData` only ever replaces children, so
136
+ // handing it the node would walk past the very tag that needs
137
+ // resolving.
138
+ //
139
+ // This terminates without a depth limit: the tags come from the
140
+ // authored body and each pass consumes one level of it. A row value
141
+ // cannot synthesise a new `data` tag — rows are text, and `bindRow`
142
+ // only substitutes into slots that already exist.
143
+ if (replacement.length > 0) {
144
+ const container = new Ast.Node('document', {}, replacement);
145
+ walkAndReplaceData(container, page, ctx, files, onReplaced, enclosing);
146
+ replacement = container.children;
147
+ }
148
+ node.children.splice(i, 1, ...replacement);
149
+ i += replacement.length - 1;
65
150
  onReplaced();
66
151
  continue;
67
152
  }
68
- walkAndReplaceData(child, page, ctx, files, onReplaced);
153
+ walkAndReplaceData(child, page, ctx, files, onReplaced, child.tag ?? enclosing);
154
+ }
155
+ }
156
+ /**
157
+ * Bind one row into a copy of the template body.
158
+ *
159
+ * `$row.x` reaches the AST as a `Variable` in a node's *attributes* — on a tag
160
+ * (`href=$row.url`) and equally on a `text` node, where `{% $row.title %}`
161
+ * becomes `content: Variable(['row','title'])`. So one rule covers both.
162
+ *
163
+ * Substitution happens here, at preprocess, rather than being left to the
164
+ * transform's `config.variables`: the binding differs per row, and a single
165
+ * shared config cannot express that.
166
+ */
167
+ function bindRow(node, row) {
168
+ const attributes = {};
169
+ for (const [key, value] of Object.entries(node.attributes ?? {})) {
170
+ attributes[key] = resolveRowVariable(value, row);
171
+ }
172
+ // **A nested `data` owns its own `$row`** (WORK-553). Its *attributes* bind
173
+ // from this row — that is how a subquery is parameterised, `where=$row.axis`
174
+ // — but its body belongs to the subquery's rows, so it is copied verbatim.
175
+ //
176
+ // Without the stop, the outer bind resolves the inner body's `$row.name`
177
+ // against the outer row, which has no such column, and blanks it to `''`
178
+ // before the subquery ever runs. Measured, not theorised.
179
+ const children = node.tag === 'data'
180
+ ? (node.children ?? []).map(cloneNode)
181
+ : (node.children ?? []).map((child) => bindRow(child, row));
182
+ const copy = new Ast.Node(node.type, attributes, children, node.tag);
183
+ // `inline` and a few other node types carry meaning in fields the
184
+ // constructor does not take; copy what Markdoc sets.
185
+ if (node.lines)
186
+ copy.lines = node.lines;
187
+ if (node.location)
188
+ copy.location = node.location;
189
+ // `inline` was named in the comment above and then not copied, so every
190
+ // node a row template bound came out block-level. Harmless while nothing
191
+ // validated — and then 6,609 `tag-placement-invalid` findings the moment
192
+ // SPEC-132 pointed Markdoc's validator at the content, because `{% code %}`
193
+ // declares `inline: true` and the rune-attribute tables bind it per row.
194
+ // `cloneWithBindings` in include-pipeline.ts had it right all along.
195
+ copy.inline = node.inline;
196
+ if (node.annotations?.length)
197
+ copy.annotations = node.annotations;
198
+ return copy;
199
+ }
200
+ /**
201
+ * Split a body into `---`-delimited cells (WORK-550).
202
+ *
203
+ * `---` is already refrakt's delimiter for this shape — `card` splits its body
204
+ * into media / body / footer on it, `grid` splits columns on it — and Markdoc
205
+ * parses it to an `hr` node whether or not blank lines surround it, so a cell
206
+ * can be written tightly without turning the line above into a setext heading.
207
+ *
208
+ * A cell may hold any number of block nodes, including none: `a --- --- b` is
209
+ * three cells, the middle one empty. That matters for a column an author wants
210
+ * blank on some rows.
211
+ */
212
+ function splitCells(body) {
213
+ const cells = [[]];
214
+ for (const node of body) {
215
+ if (node.type === 'hr')
216
+ cells.push([]);
217
+ else
218
+ cells[cells.length - 1].push(node);
69
219
  }
220
+ return cells;
70
221
  }
71
- function resolveDataToNode(tag, page, ctx, files) {
222
+ /** Deep-copy a node without touching variables — the subquery body's copy. */
223
+ function cloneNode(node) {
224
+ const copy = new Ast.Node(node.type, { ...(node.attributes ?? {}) }, (node.children ?? []).map(cloneNode), node.tag);
225
+ if (node.lines)
226
+ copy.lines = node.lines;
227
+ if (node.location)
228
+ copy.location = node.location;
229
+ // Same omission as `bindRow` had — a nested `data`'s verbatim body copy must
230
+ // keep `inline` too, or the subquery's `{% code %}` cells come out block.
231
+ copy.inline = node.inline;
232
+ if (node.annotations?.length)
233
+ copy.annotations = node.annotations;
234
+ return copy;
235
+ }
236
+ function resolveRowVariable(value, row) {
237
+ if (value && typeof value === 'object') {
238
+ const node = value;
239
+ if (node.$$mdtype === 'Variable' && Array.isArray(node.path) && node.path[0] === 'row') {
240
+ let current = row;
241
+ for (const segment of node.path.slice(1)) {
242
+ if (current === null || current === undefined)
243
+ return '';
244
+ current = current[segment];
245
+ }
246
+ return current === null || current === undefined ? '' : current;
247
+ }
248
+ }
249
+ return value;
250
+ }
251
+ /**
252
+ * Project a typed table into plain row objects keyed by column header.
253
+ *
254
+ * A numeric column exposes its normalized number so a template can do
255
+ * arithmetic or formatting with it; everything else exposes the cell's text,
256
+ * which is what a template renders.
257
+ *
258
+ * Booleans are the one extra coercion. The table intermediate is text, so a
259
+ * JSON `false` arrives as the *string* `"false"` — which is truthy, making
260
+ * `{% if $row.flag %}` render for every row. Sources with boolean fields are
261
+ * exactly what a per-row template wants to branch on, so `"true"` / `"false"`
262
+ * bind as booleans. The match is on the whole cell, so a column of prose
263
+ * mentioning "false" is unaffected.
264
+ */
265
+ function rowObjects(table) {
266
+ return table.rows.map((cells) => {
267
+ const row = {};
268
+ cells.forEach((cell, c) => {
269
+ if (table.columnTypes[c] === 'numeric' && cell.value !== null) {
270
+ row[table.headers[c]] = cell.value;
271
+ }
272
+ else if (cell.text === 'true' || cell.text === 'false') {
273
+ row[table.headers[c]] = cell.text === 'true';
274
+ }
275
+ else {
276
+ row[table.headers[c]] = cell.text;
277
+ }
278
+ });
279
+ return row;
280
+ });
281
+ }
282
+ function resolveData(tag, page, ctx, files, enclosing) {
283
+ const body = (tag.children ?? []).filter((child) => child.type !== 'text' || String(child.attributes?.content ?? '').trim() !== '');
284
+ if (body.length > 0 && enclosing && TABLE_CONSUMERS.has(enclosing)) {
285
+ const msg = `a per-row body cannot be used inside {% ${enclosing} %}, which consumes the table this rune would otherwise emit — remove the body, or move the {% data %} outside`;
286
+ ctx.error(`data: ${msg}`, page.url);
287
+ return [emitErrorNode(`data error: ${msg}`)];
288
+ }
289
+ return resolveDataToNodes(tag, page, ctx, files, body);
290
+ }
291
+ function resolveDataToNodes(tag, page, ctx, files, body) {
72
292
  const a = tag.attributes;
293
+ // BUG-010 — an attribute the author *wrote* but the rune cannot read is an
294
+ // error, and the reason is named. Absent stays absent: only keys actually
295
+ // present in the tag are checked, so omitting `where` is still fine.
296
+ //
297
+ // Checked up front and reported together, because one unreadable attribute
298
+ // usually means the call site is wrong in a way that affects several.
299
+ const unreadable = [];
300
+ for (const name of STRING_ATTRIBUTES) {
301
+ if (!(name in a))
302
+ continue;
303
+ const r = resolveAttr(a[name], ctx.variables);
304
+ if (!r.ok)
305
+ unreadable.push(`\`${name}\` ${r.why}`);
306
+ }
307
+ if (unreadable.length > 0) {
308
+ const msg = unreadable.length === 1
309
+ ? unreadable[0]
310
+ : `${unreadable.length} attributes could not be read — ${unreadable.join('; ')}`;
311
+ ctx.error(`data: ${msg}`, page.url);
312
+ return [emitErrorNode(`data error: ${msg}`)];
313
+ }
73
314
  const src = resolveString(a.src, ctx.variables);
315
+ const headers = splitList(resolveString(a.headers, ctx.variables));
316
+ // `headers` describes the *body's* cells, so without a body there is nothing
317
+ // for it to describe. Ignoring it silently would read as a rename of
318
+ // `columns`, which selects and renames source columns instead.
319
+ if (headers.length > 0 && body.length === 0) {
320
+ const msg = '`headers` names the columns of a `---`-delimited body and needs one. ' +
321
+ 'For a bodyless table, select and rename source columns with `columns`.';
322
+ ctx.error(`data "${src || '(unresolved)'}": ${msg}`, page.url);
323
+ return [emitErrorNode(`data error: ${msg}`)];
324
+ }
74
325
  if (!src) {
75
326
  const msg = 'data `src` attribute is required (and an unresolvable variable reference resolves to empty)';
76
327
  ctx.error(msg, page.url);
77
- return emitErrorNode(`data error: ${msg}`);
328
+ return [emitErrorNode(`data error: ${msg}`)];
78
329
  }
79
330
  try {
80
331
  const raw = files.read(src);
@@ -83,29 +334,77 @@ function resolveDataToNode(tag, page, ctx, files) {
83
334
  }
84
335
  const format = resolveFormat(src, resolveString(a.format, ctx.variables));
85
336
  const table = runAdapter(raw, format, a, ctx);
337
+ // A source that parsed to nothing is an error: the author pointed at the
338
+ // wrong file, or a `root` / JSON pointer into nothing. Checked *before*
339
+ // projection, so it stays distinct from "my filter excluded everything"
340
+ // — collapsing the two is what BUG-011 was.
341
+ if (table.rows.length === 0) {
342
+ throw new DataSourceError('source yielded no rows — check the file has data, and that `root` / `orient` point at the right place');
343
+ }
344
+ const whereSpec = resolveString(a.where, ctx.variables) || undefined;
345
+ const sortSpec = resolveString(a.sort, ctx.variables) || undefined;
346
+ const columnsSpec = resolveString(a.columns, ctx.variables) || undefined;
347
+ // The typo detector (BUG-011). Fires on a misspelt column whether or not
348
+ // the result ends up empty — a clause that names nothing is a mistake even
349
+ // when some other clause still matches rows.
350
+ for (const w of unknownFieldWarnings(table, {
351
+ where: whereSpec,
352
+ sort: sortSpec,
353
+ columns: columnsSpec,
354
+ })) {
355
+ ctx.warn(`data "${src}": ${w}`, page.url);
356
+ }
86
357
  // Shared projection: where → sort → columns → limit/offset.
87
- const { table: filtered, warnings } = applyWhere(table, resolveString(a.where, ctx.variables) || undefined);
358
+ const { table: filtered, warnings } = applyWhere(table, whereSpec);
88
359
  for (const w of warnings)
89
360
  ctx.warn(`data "${src}": ${w}`, page.url);
90
- const sorted = applySort(filtered, resolveString(a.sort, ctx.variables) || undefined);
91
- const { table: selected, sources } = applyColumns(sorted, resolveString(a.columns, ctx.variables) || undefined);
361
+ const sorted = applySort(filtered, sortSpec);
362
+ const { table: selected, sources } = applyColumns(sorted, columnsSpec);
92
363
  const projected = applyLimitOffset(selected, numberAttr(a.limit), numberAttr(a.offset));
93
- if (projected.rows.length === 0) {
94
- throw new DataSourceError('result is empty after projection (no rows to render)');
95
- }
364
+ // A filter that legitimately matched nothing renders nothing, silently.
365
+ // Asking real data a question with no answer today is normal — a page
366
+ // listing open bugs when there are none is working, not broken — and the
367
+ // mistake this used to catch now has its own warning above.
368
+ if (projected.rows.length === 0)
369
+ return [];
96
370
  // Shared typing → data-value channel (`numeric`/`text` may name the
97
371
  // source or the renamed column).
98
372
  const numericCols = splitList(resolveString(a.numeric, ctx.variables));
99
373
  const textCols = splitList(resolveString(a.text, ctx.variables));
100
374
  const typed = applyTyping(projected, { numeric: numericCols, text: textCols, sources });
101
- return emitTableNode(typed);
375
+ if (body.length === 0)
376
+ return [emitTableNode(typed)];
377
+ // WORK-550 — `headers` switches what the body *means*: a `---`-delimited
378
+ // sequence of cells rather than a run of blocks. The cells stay authored
379
+ // Markdoc, so a generated table can carry the emphasis, links, runes and
380
+ // `{% if %}` the bodyless form's literal-text cells cannot.
381
+ if (headers.length > 0) {
382
+ const cells = splitCells(body);
383
+ if (cells.length !== headers.length) {
384
+ throw new DataSourceError(`\`headers\` names ${headers.length} column${headers.length === 1 ? '' : 's'} but the body has ` +
385
+ `${cells.length} \`---\`-delimited cell${cells.length === 1 ? '' : 's'}. ` +
386
+ 'Separate each cell with a `---` line; the counts must match.');
387
+ }
388
+ const rows = rowObjects(typed).map((row) => cells.map((cell) => cell.map((child) => bindRow(child, row))));
389
+ return [emitBodyTableNode(headers, rows)];
390
+ }
391
+ // `numeric` / `text` exist to drive the `data-value` channel that charts
392
+ // and sortable tables read off `<td>`s. With a body there are no cells to
393
+ // carry it, so say so rather than accepting an attribute that does
394
+ // nothing — the same posture WORK-536 took for silently dropped axes.
395
+ if (numericCols.length > 0 || textCols.length > 0) {
396
+ ctx.warn(`data "${src}": \`numeric\` / \`text\` set alongside a per-row body — they type the ` +
397
+ '`data-value` attribute on table cells, and a body emits no cells. Numeric columns are ' +
398
+ 'still bound to `$row` as numbers.', page.url);
399
+ }
400
+ return rowObjects(typed).flatMap((row) => body.map((child) => bindRow(child, row)));
102
401
  }
103
402
  catch (err) {
104
403
  const msg = err instanceof DataSourceError
105
404
  ? err.message
106
405
  : `unexpected failure — ${err instanceof Error ? err.message : String(err)}`;
107
406
  ctx.error(`data "${src}": ${msg}`, page.url);
108
- return emitErrorNode(`data error: ${msg}`);
407
+ return [emitErrorNode(`data error: ${msg}`)];
109
408
  }
110
409
  }
111
410
  /** Resolve the effective format: explicit override, else extension-inferred. */
@@ -1 +1 @@
1
- {"version":3,"file":"data-pipeline.js","sourceRoot":"","sources":["../src/data-pipeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-pipeline.js","sourceRoot":"","sources":["../src/data-pipeline.ts"],"names":[],"mappings":"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"}
@@ -62,6 +62,27 @@ export declare function applyColumns(table: DataTable, spec: string | undefined)
62
62
  * when every non-empty cell in the column parses as a number, else by natural
63
63
  * string collation. A no-op when `spec` is empty or names an unknown column. */
64
64
  export declare function applySort(table: DataTable, spec: string | undefined): DataTable;
65
+ /**
66
+ * Warn about a `where` / `sort` / `columns` clause naming a column the source
67
+ * does not have (BUG-011).
68
+ *
69
+ * This is the typo detector. Before it, nothing reported a misspelt field: a
70
+ * clause naming a column that does not exist matched no rows, and the only
71
+ * thing that noticed was `data`'s blanket "result is empty after projection"
72
+ * error — which fired just as loudly on a *correct* filter that legitimately
73
+ * matched nothing. One signal was standing in for two conditions, so it was
74
+ * wrong about one of them. Detecting the typo directly is what lets the empty
75
+ * case stop being a failure.
76
+ *
77
+ * All three specs are checked against the adapter's headers, which is right for
78
+ * each of them: `where` and `sort` run before `columns`, and `columns` names
79
+ * *source* headers even when it renames them.
80
+ */
81
+ export declare function unknownFieldWarnings(table: DataTable, specs: {
82
+ where?: string;
83
+ sort?: string;
84
+ columns?: string;
85
+ }): string[];
65
86
  /** Apply `limit`/`offset` — a row slice (the `data` analogue of snippet `lines=`). */
66
87
  export declare function applyLimitOffset(table: DataTable, limit?: number, offset?: number): DataTable;
67
88
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"data-projection.d.ts","sourceRoot":"","sources":["../src/data-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAQ,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG1D,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AAE5C;;oFAEoF;AACpF,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,+EAA+E;AAC/E,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU3D;AAOD,qEAAqE;AACrE,UAAU,eAAe;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;CACZ;AAED;;uCAEuC;AACvC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAchE;AA4BD;;;;;;GAMG;AACH,wBAAgB,UAAU,CACzB,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,GAAG,SAAS,GACtB;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAa1C;AAED;;;;;qCAKqC;AACrC,wBAAgB,YAAY,CAC3B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,GAAG,SAAS,GACtB;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAYzC;AAED;;iFAEiF;AACjF,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CA8B/E;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAK7F;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAC1B,KAAK,EAAE,SAAS,EAChB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GACpE,UAAU,CAsBZ"}
1
+ {"version":3,"file":"data-projection.d.ts","sourceRoot":"","sources":["../src/data-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAQ,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG1D,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AAE5C;;oFAEoF;AACpF,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,+EAA+E;AAC/E,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU3D;AAOD,qEAAqE;AACrE,UAAU,eAAe;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;CACZ;AAED;;uCAEuC;AACvC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAchE;AAsCD;;;;;;GAMG;AACH,wBAAgB,UAAU,CACzB,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,GAAG,SAAS,GACtB;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAa1C;AAED;;;;;qCAKqC;AACrC,wBAAgB,YAAY,CAC3B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,GAAG,SAAS,GACtB;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAYzC;AAED;;iFAEiF;AACjF,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CA+B/E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACxD,MAAM,EAAE,CAuBV;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAK7F;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAC1B,KAAK,EAAE,SAAS,EAChB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GACpE,UAAU,CAwBZ"}
@@ -78,7 +78,8 @@ function splitTopLevel(input, sep) {
78
78
  return out;
79
79
  }
80
80
  function stripQuotes(s) {
81
- if (s.length >= 2 && ((s[0] === '"' && s[s.length - 1] === '"') || (s[0] === "'" && s[s.length - 1] === "'"))) {
81
+ if (s.length >= 2 &&
82
+ ((s[0] === '"' && s[s.length - 1] === '"') || (s[0] === "'" && s[s.length - 1] === "'"))) {
82
83
  return s.slice(1, -1);
83
84
  }
84
85
  return s;
@@ -135,8 +136,8 @@ export function applySort(table, spec) {
135
136
  if (idx === -1)
136
137
  return table;
137
138
  const cells = table.rows.map((r) => r[idx] ?? '');
138
- const allNumeric = cells.every((c) => c.trim() === '' || normalizeNumber(c) !== null)
139
- && cells.some((c) => normalizeNumber(c) !== null);
139
+ const allNumeric = cells.every((c) => c.trim() === '' || normalizeNumber(c) !== null) &&
140
+ cells.some((c) => normalizeNumber(c) !== null);
140
141
  const sorted = [...table.rows].sort((a, b) => {
141
142
  const ca = a[idx] ?? '';
142
143
  const cb = b[idx] ?? '';
@@ -161,6 +162,43 @@ export function applySort(table, spec) {
161
162
  });
162
163
  return { headers: table.headers, rows: sorted };
163
164
  }
165
+ /**
166
+ * Warn about a `where` / `sort` / `columns` clause naming a column the source
167
+ * does not have (BUG-011).
168
+ *
169
+ * This is the typo detector. Before it, nothing reported a misspelt field: a
170
+ * clause naming a column that does not exist matched no rows, and the only
171
+ * thing that noticed was `data`'s blanket "result is empty after projection"
172
+ * error — which fired just as loudly on a *correct* filter that legitimately
173
+ * matched nothing. One signal was standing in for two conditions, so it was
174
+ * wrong about one of them. Detecting the typo directly is what lets the empty
175
+ * case stop being a failure.
176
+ *
177
+ * All three specs are checked against the adapter's headers, which is right for
178
+ * each of them: `where` and `sort` run before `columns`, and `columns` names
179
+ * *source* headers even when it renames them.
180
+ */
181
+ export function unknownFieldWarnings(table, specs) {
182
+ const known = new Set(table.headers);
183
+ const available = table.headers.join(', ');
184
+ const warnings = [];
185
+ const check = (attr, field) => {
186
+ if (field === '' || known.has(field))
187
+ return;
188
+ warnings.push(`\`${attr}\` names a column the source does not have: "${field}". Available: ${available}.`);
189
+ };
190
+ for (const clause of parseFieldMatch(specs.where).clauses)
191
+ check('where', clause.field);
192
+ if (specs.sort && specs.sort.trim() !== '') {
193
+ const trimmed = specs.sort.trim();
194
+ check('sort', (trimmed.startsWith('-') ? trimmed.slice(1) : trimmed).trim());
195
+ }
196
+ if (specs.columns && specs.columns.trim() !== '') {
197
+ for (const sel of parseColumnsSpec(specs.columns))
198
+ check('columns', sel.source);
199
+ }
200
+ return warnings;
201
+ }
164
202
  /** Apply `limit`/`offset` — a row slice (the `data` analogue of snippet `lines=`). */
165
203
  export function applyLimitOffset(table, limit, offset) {
166
204
  const start = offset && offset > 0 ? offset : 0;