@supersoniks/concorde 4.9.93 → 4.9.94

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 (89) hide show
  1. package/build-infos.json +1 -1
  2. package/concorde-core.bundle.js +299 -292
  3. package/concorde-core.es.js +10104 -6071
  4. package/dist/concorde-core.bundle.js +299 -292
  5. package/dist/concorde-core.es.js +10104 -6071
  6. package/dist/docs-mock-api-sw.js +110 -0
  7. package/dist/docs-mock-api-sw.js.map +3 -3
  8. package/dist/js/core/components/functional/functional.js +1 -0
  9. package/dist/js/core/components/functional/functional.js.map +1 -1
  10. package/dist/js/core/components/functional/jsonata/jsonata.js +119 -0
  11. package/dist/js/core/components/functional/jsonata/jsonata.js.map +1 -0
  12. package/dist/js/core/components/ui/button/button.js +1 -1
  13. package/dist/js/core/components/ui/button/button.js.map +1 -1
  14. package/dist/js/core/decorators/Subscriber.js +1 -0
  15. package/dist/js/core/decorators/Subscriber.js.map +1 -1
  16. package/dist/js/core/decorators/subscriber/derive.js +60 -0
  17. package/dist/js/core/decorators/subscriber/derive.js.map +1 -0
  18. package/dist/js/core/utils/derive.js +246 -0
  19. package/dist/js/core/utils/derive.js.map +1 -0
  20. package/dist/js/core/utils/jsonataHelpers.js +69 -0
  21. package/dist/js/core/utils/jsonataHelpers.js.map +1 -0
  22. package/dist/js/core/utils/jsonataRuntime.js +75 -0
  23. package/dist/js/core/utils/jsonataRuntime.js.map +1 -0
  24. package/dist/js/utils.js +2 -0
  25. package/dist/js/utils.js.map +1 -1
  26. package/dist/types/core/components/functional/functional.d.ts +1 -0
  27. package/dist/types/core/components/functional/functional.d.ts.map +1 -1
  28. package/dist/types/core/components/functional/jsonata/jsonata.d.ts +29 -0
  29. package/dist/types/core/components/functional/jsonata/jsonata.d.ts.map +1 -0
  30. package/dist/types/core/components/ui/button/button.d.ts +1 -1
  31. package/dist/types/core/components/ui/button/button.d.ts.map +1 -1
  32. package/dist/types/core/components/ui/form/checkbox/checkbox.d.ts +3 -3
  33. package/dist/types/core/components/ui/form/input/input.d.ts +3 -3
  34. package/dist/types/core/components/ui/form/input-autocomplete/input-autocomplete.d.ts +3 -3
  35. package/dist/types/core/components/ui/form/textarea/textarea.d.ts +3 -3
  36. package/dist/types/core/decorators/Subscriber.d.ts +2 -0
  37. package/dist/types/core/decorators/Subscriber.d.ts.map +1 -1
  38. package/dist/types/core/decorators/subscriber/derive.d.ts +30 -0
  39. package/dist/types/core/decorators/subscriber/derive.d.ts.map +1 -0
  40. package/dist/types/core/utils/derive.d.ts +40 -0
  41. package/dist/types/core/utils/derive.d.ts.map +1 -0
  42. package/dist/types/core/utils/jsonataHelpers.d.ts +15 -0
  43. package/dist/types/core/utils/jsonataHelpers.d.ts.map +1 -0
  44. package/dist/types/core/utils/jsonataRuntime.d.ts +13 -0
  45. package/dist/types/core/utils/jsonataRuntime.d.ts.map +1 -0
  46. package/dist/types/mixins.d.ts +3 -3
  47. package/dist/types/utils.d.ts +2 -0
  48. package/dist/types/utils.d.ts.map +1 -1
  49. package/docs/assets/{index-DURr6O71.js → index-DpIkksht.js} +652 -479
  50. package/docs/crawl/docs/_decorators/get.html +27 -6
  51. package/docs/crawl/docs/_decorators/patch.html +6 -0
  52. package/docs/crawl/docs/_decorators/post.html +8 -0
  53. package/docs/crawl/docs/_decorators/put.html +6 -0
  54. package/docs/crawl/hubs/decorators.html +36 -31
  55. package/docs/crawl/hubs/remote-data.html +36 -31
  56. package/docs/index.html +1 -1
  57. package/docs/llms-full.txt +47 -3
  58. package/docs/src/docs/_decorators/get.md +31 -0
  59. package/docs/src/docs/_decorators/patch.md +9 -0
  60. package/docs/src/docs/_decorators/post.md +11 -0
  61. package/docs/src/docs/_decorators/put.md +9 -0
  62. package/docs/src/docs/search/docs-search.json +120 -5
  63. package/docs/src/tsconfig.json +268 -268
  64. package/package.json +28 -3
  65. package/public/docs-mock-api-sw.js +110 -0
  66. package/public/docs-mock-api-sw.js.map +3 -3
  67. package/src/core/components/functional/functional.ts +1 -0
  68. package/src/core/components/functional/jsonata/jsonata.md +56 -0
  69. package/src/core/components/functional/jsonata/jsonata.spec.ts +202 -0
  70. package/src/core/components/functional/jsonata/jsonata.ts +116 -0
  71. package/src/core/components/ui/button/button.ts +2 -2
  72. package/src/core/decorators/Subscriber.ts +2 -0
  73. package/src/core/decorators/subscriber/derive.ts +95 -0
  74. package/src/core/utils/derive.spec.ts +190 -0
  75. package/src/core/utils/derive.ts +357 -0
  76. package/src/core/utils/jsonataHelpers.ts +100 -0
  77. package/src/core/utils/jsonataRuntime.ts +88 -0
  78. package/src/docs/_core-concept/dataFlow.md +9 -0
  79. package/src/docs/_misc/docs-mock-api.md +3 -0
  80. package/src/docs/components/docs-demo-sources.ts +26 -0
  81. package/src/docs/docs.ts +1 -0
  82. package/src/docs/example/docs-jsonata-demos.ts +128 -0
  83. package/src/docs/mock-api/fixtures-jsonata.ts +131 -0
  84. package/src/docs/mock-api/router.ts +26 -0
  85. package/src/docs/navigation/navigation.ts +4 -0
  86. package/src/docs/search/docs-search.json +180 -0
  87. package/src/tsconfig.json +18 -0
  88. package/src/tsconfig.tsbuildinfo +1 -1
  89. package/src/utils.ts +13 -0
@@ -0,0 +1,128 @@
1
+ import { html, LitElement } from "lit";
2
+ import { customElement } from "lit/decorators.js";
3
+ import { tailwind } from "../tailwind";
4
+ import { DOCS_MOCK_API_BASE } from "../mock-api/urls";
5
+ import { Endpoint } from "@supersoniks/concorde/core/utils/endpoint";
6
+ import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
7
+ import { set } from "@supersoniks/concorde/utils";
8
+
9
+ import "../../core/components/functional/fetch/fetch";
10
+ import "../../core/components/functional/jsonata/jsonata";
11
+ import "../../core/components/functional/list/list";
12
+ import "../../core/components/functional/value/value";
13
+ import "../../core/components/ui/form/input/input";
14
+
15
+ const missions = new Endpoint<unknown>("api/space-cats");
16
+ const topForm = new DataProviderKey<{ top: number | string }>(
17
+ "jsonataTopForm",
18
+ );
19
+
20
+ const order = new Endpoint<unknown>("api/market-order");
21
+ const taxForm = new DataProviderKey<{ taxPercent: number | string }>(
22
+ "jsonataTaxForm",
23
+ );
24
+
25
+ /** Cas 1 — groupby + top N (recalcul via form, sans refetch). */
26
+ @customElement("docs-jsonata-space-cats-demo")
27
+ export class DocsJsonataSpaceCatsDemo extends LitElement {
28
+ static styles = [tailwind];
29
+
30
+ connectedCallback(): void {
31
+ super.connectedCallback();
32
+ set(topForm, { top: 3 });
33
+ }
34
+
35
+ render() {
36
+ return html`
37
+ <div serviceURL=${DOCS_MOCK_API_BASE} class="flex flex-col gap-3">
38
+ <div formDataProvider=${topForm.path} class="max-w-xs">
39
+ <sonic-input name="top" type="number" label="Top N" value="3"></sonic-input>
40
+ </div>
41
+
42
+ <sonic-fetch
43
+ dataProvider=${missions.path}
44
+ endPoint=${missions.path}
45
+ key="data"
46
+ ></sonic-fetch>
47
+
48
+ <sonic-jsonata
49
+ inputProvider=${missions.path}
50
+ outputProvider="spaceCatLeaderboard"
51
+ formDataProvider=${topForm.path}
52
+ expression='$input{name: $sum(points)} ~> $each(function($v,$k){{"name":$k,"points":$v}}) ^(>points)[[0..$number($top)-1]]'
53
+ ></sonic-jsonata>
54
+
55
+ <sonic-list
56
+ dataProvider="spaceCatLeaderboard"
57
+ class="flex flex-col gap-1"
58
+ .items=${({ name, points }: { name: string; points: number }) =>
59
+ html`<div class="flex gap-3 text-sm">
60
+ <span class="font-medium">${name}</span>
61
+ <span class="ml-auto tabular-nums text-neutral-500">${points}</span>
62
+ </div>`}
63
+ ></sonic-list>
64
+ </div>
65
+ `;
66
+ }
67
+ }
68
+
69
+ /** Cas 2 — totaux d’un tableau (somme + taxe via form). */
70
+ @customElement("docs-jsonata-table-totals-demo")
71
+ export class DocsJsonataTableTotalsDemo extends LitElement {
72
+ static styles = [tailwind];
73
+
74
+ connectedCallback(): void {
75
+ super.connectedCallback();
76
+ set(taxForm, { taxPercent: 10 });
77
+ }
78
+
79
+ render() {
80
+ return html`
81
+ <div serviceURL=${DOCS_MOCK_API_BASE} class="flex flex-col gap-3">
82
+ <div formDataProvider=${taxForm.path} class="max-w-xs">
83
+ <sonic-input
84
+ name="taxPercent"
85
+ type="number"
86
+ label="Tax %"
87
+ value="10"
88
+ ></sonic-input>
89
+ </div>
90
+
91
+ <sonic-fetch
92
+ dataProvider=${order.path}
93
+ endPoint=${order.path}
94
+ key="data"
95
+ ></sonic-fetch>
96
+
97
+ <sonic-jsonata
98
+ inputProvider=${order.path}
99
+ outputProvider="marketOrderTotals"
100
+ formDataProvider=${taxForm.path}
101
+ expression='(
102
+ $sub := $sum($input.(qty * unitPrice));
103
+ {
104
+ "subtotal": $round($sub, 2),
105
+ "tax": $round($sub * $number($taxPercent) / 100, 2),
106
+ "grandTotal": $round($sub * (1 + $number($taxPercent) / 100), 2)
107
+ }
108
+ )'
109
+ ></sonic-jsonata>
110
+
111
+ <div dataProvider="marketOrderTotals" class="flex gap-6 text-sm">
112
+ <div>
113
+ <div class="text-neutral-400">Subtotal</div>
114
+ <sonic-value key="subtotal"></sonic-value>
115
+ </div>
116
+ <div>
117
+ <div class="text-neutral-400">Tax</div>
118
+ <sonic-value key="tax"></sonic-value>
119
+ </div>
120
+ <div>
121
+ <div class="text-neutral-400">Total</div>
122
+ <span class="font-semibold"><sonic-value key="grandTotal"></sonic-value></span>
123
+ </div>
124
+ </div>
125
+ </div>
126
+ `;
127
+ }
128
+ }
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Fixtures fun pour démos / tests sonic-jsonata (hors billetterie).
3
+ */
4
+
5
+ const avatar = (seed: string) =>
6
+ `https://i.pravatar.cc/150?u=${encodeURIComponent(seed)}`;
7
+
8
+ /** Missions de chats spatiaux — groupby name + top N points. */
9
+ export type SpaceCatMission = {
10
+ id: number;
11
+ name: string;
12
+ planet: string;
13
+ mission: string;
14
+ points: number;
15
+ avatar: string;
16
+ };
17
+
18
+ export const DOCS_SPACE_CAT_MISSIONS: SpaceCatMission[] = [
19
+ {
20
+ id: 1,
21
+ name: "Captain Whiskers",
22
+ planet: "Mars",
23
+ mission: "Laser hunt",
24
+ points: 40,
25
+ avatar: avatar("captain-whiskers"),
26
+ },
27
+ {
28
+ id: 2,
29
+ name: "Captain Whiskers",
30
+ planet: "Mars",
31
+ mission: "Dust nap",
32
+ points: 25,
33
+ avatar: avatar("captain-whiskers"),
34
+ },
35
+ {
36
+ id: 3,
37
+ name: "Nebula Paws",
38
+ planet: "Europa",
39
+ mission: "Ice fishing",
40
+ points: 55,
41
+ avatar: avatar("nebula-paws"),
42
+ },
43
+ {
44
+ id: 4,
45
+ name: "Astro Mittens",
46
+ planet: "Titan",
47
+ mission: "Methane surf",
48
+ points: 33,
49
+ avatar: avatar("astro-mittens"),
50
+ },
51
+ {
52
+ id: 5,
53
+ name: "Nebula Paws",
54
+ planet: "Europa",
55
+ mission: "Comet chase",
56
+ points: 20,
57
+ avatar: avatar("nebula-paws"),
58
+ },
59
+ {
60
+ id: 6,
61
+ name: "Professor Meowington",
62
+ planet: "Venus",
63
+ mission: "Cloud tasting",
64
+ points: 48,
65
+ avatar: avatar("prof-meowington"),
66
+ },
67
+ {
68
+ id: 7,
69
+ name: "Astro Mittens",
70
+ planet: "Titan",
71
+ mission: "Antenna polish",
72
+ points: 12,
73
+ avatar: avatar("astro-mittens"),
74
+ },
75
+ {
76
+ id: 8,
77
+ name: "Zero-G Socks",
78
+ planet: "Moon",
79
+ mission: "Flag knitting",
80
+ points: 61,
81
+ avatar: avatar("zero-g-socks"),
82
+ },
83
+ ];
84
+
85
+ /** Sacs de café — groupby origin + filtre roast. */
86
+ export type CoffeeBag = {
87
+ id: number;
88
+ origin: string;
89
+ roast: "light" | "medium" | "dark";
90
+ kg: number;
91
+ farm: string;
92
+ };
93
+
94
+ export const DOCS_COFFEE_BAGS: CoffeeBag[] = [
95
+ { id: 1, origin: "Ethiopia", roast: "light", kg: 12, farm: "Yirgacheffe Hills" },
96
+ { id: 2, origin: "Ethiopia", roast: "medium", kg: 8, farm: "Sidamo Ridge" },
97
+ { id: 3, origin: "Colombia", roast: "medium", kg: 15, farm: "Huila Valley" },
98
+ { id: 4, origin: "Colombia", roast: "dark", kg: 6, farm: "Cauca Peak" },
99
+ { id: 5, origin: "Brazil", roast: "dark", kg: 22, farm: "Minas Gerais" },
100
+ { id: 6, origin: "Brazil", roast: "medium", kg: 10, farm: "Cerrado" },
101
+ { id: 7, origin: "Guatemala", roast: "light", kg: 9, farm: "Antigua" },
102
+ { id: 8, origin: "Guatemala", roast: "dark", kg: 5, farm: "Huehuetenango" },
103
+ { id: 9, origin: "Ethiopia", roast: "light", kg: 4, farm: "Guji Forest" },
104
+ ];
105
+
106
+ export function filterCoffeeBags(
107
+ bags: CoffeeBag[],
108
+ roast: string | null | undefined,
109
+ ): CoffeeBag[] {
110
+ const r = roast?.trim().toLowerCase();
111
+ if (!r || r === "all") return bags;
112
+ return bags.filter((b) => b.roast === r);
113
+ }
114
+
115
+ /** Lignes de commande (table) — total / moyenne par ligne. */
116
+ export type MarketOrderLine = {
117
+ id: number;
118
+ name: string;
119
+ qty: number;
120
+ unitPrice: number;
121
+ category: string;
122
+ };
123
+
124
+ export const DOCS_MARKET_ORDER_LINES: MarketOrderLine[] = [
125
+ { id: 1, name: "Heirloom tomatoes", qty: 4, unitPrice: 3.5, category: "veg" },
126
+ { id: 2, name: "Sourdough loaf", qty: 2, unitPrice: 6.0, category: "bakery" },
127
+ { id: 3, name: "Goat cheese", qty: 1, unitPrice: 8.5, category: "dairy" },
128
+ { id: 4, name: "Honey jar", qty: 3, unitPrice: 5.2, category: "pantry" },
129
+ { id: 5, name: "Sunflowers", qty: 5, unitPrice: 2.0, category: "flowers" },
130
+ { id: 6, name: "Free-range eggs", qty: 2, unitPrice: 4.8, category: "dairy" },
131
+ ];
@@ -8,6 +8,12 @@ import {
8
8
  type ReqresUserResponse,
9
9
  type ReqresUsersListResponse,
10
10
  } from "./fixtures";
11
+ import {
12
+ DOCS_COFFEE_BAGS,
13
+ DOCS_MARKET_ORDER_LINES,
14
+ DOCS_SPACE_CAT_MISSIONS,
15
+ filterCoffeeBags,
16
+ } from "./fixtures-jsonata";
11
17
 
12
18
  export const DOCS_MOCK_API_PREFIX = "/docs-mock-api";
13
19
 
@@ -241,6 +247,26 @@ export async function handleDocsMockApiRequest(
241
247
  return json(paginateUsers(url));
242
248
  }
243
249
 
250
+ if (subPath === "/api/space-cats") {
251
+ return json({
252
+ data: DOCS_SPACE_CAT_MISSIONS,
253
+ total: DOCS_SPACE_CAT_MISSIONS.length,
254
+ });
255
+ }
256
+
257
+ if (subPath === "/api/coffee-bags") {
258
+ const roast = url.searchParams.get("roast");
259
+ const data = filterCoffeeBags(DOCS_COFFEE_BAGS, roast);
260
+ return json({ data, total: data.length });
261
+ }
262
+
263
+ if (subPath === "/api/market-order") {
264
+ return json({
265
+ data: DOCS_MARKET_ORDER_LINES,
266
+ total: DOCS_MARKET_ORDER_LINES.length,
267
+ });
268
+ }
269
+
244
270
  if (subPath === "/geo/communes" || subPath.startsWith("/geo/communes")) {
245
271
  return json(geoCommunes(url), {
246
272
  headers: { "X-Fetched-At": new Date().toISOString() },
@@ -40,6 +40,10 @@ export class DocsNavigation extends LitElement {
40
40
  { label: "If", href: "#core/components/functional/if/if.md/if" },
41
41
  { label: "List", href: "#core/components/functional/list/list.md/list" },
42
42
  { label: "Mix", href: "#core/components/functional/mix/mix.md/mix" },
43
+ {
44
+ label: "Jsonata",
45
+ href: "#core/components/functional/jsonata/jsonata.md/jsonata",
46
+ },
43
47
  {
44
48
  label: "Queue",
45
49
  href: "#core/components/functional/queue/queue.md/queue",
@@ -549,6 +549,171 @@
549
549
  }
550
550
  }
551
551
  },
552
+ {
553
+ "search": "Jsonata",
554
+ "files": {
555
+ "core/components/functional/jsonata/jsonata.md": {
556
+ "title": "Jsonata",
557
+ "hashes": {
558
+ "jsonata": {
559
+ "count": 1,
560
+ "title": "",
561
+ "type": "page"
562
+ }
563
+ }
564
+ }
565
+ }
566
+ },
567
+ {
568
+ "search": "sonic-jsonata adapts the derive primitive: it watches input DataProviders (and optional form variables), evaluates a JSONata expression, and publishes a read-only output DataProvider.\n",
569
+ "files": {
570
+ "core/components/functional/jsonata/jsonata.md": {
571
+ "title": "Jsonata",
572
+ "hashes": {
573
+ "jsonata": {
574
+ "count": 1,
575
+ "title": "",
576
+ "type": "paragraph"
577
+ }
578
+ }
579
+ }
580
+ }
581
+ },
582
+ {
583
+ "search": "Unlike sonic-mix (bidirectional composition, no compute), sonic-jsonata is unidirectional (fetch → compute → display).\n",
584
+ "files": {
585
+ "core/components/functional/jsonata/jsonata.md": {
586
+ "title": "Jsonata",
587
+ "hashes": {
588
+ "jsonata": {
589
+ "count": 1,
590
+ "title": "",
591
+ "type": "paragraph"
592
+ }
593
+ }
594
+ }
595
+ }
596
+ },
597
+ {
598
+ "search": "Seed sessions via mock API or imperative set, then:\n",
599
+ "files": {
600
+ "core/components/functional/jsonata/jsonata.md": {
601
+ "title": "Jsonata",
602
+ "hashes": {
603
+ "sdui-example-palmarès": {
604
+ "count": 1,
605
+ "title": "SDUI example (palmarès)",
606
+ "type": "paragraph"
607
+ }
608
+ }
609
+ }
610
+ }
611
+ },
612
+ {
613
+ "search": "No DOM, no network, no eval.\n",
614
+ "files": {
615
+ "core/components/functional/jsonata/jsonata.md": {
616
+ "title": "Jsonata",
617
+ "hashes": {
618
+ "helpers-whitelist": {
619
+ "count": 1,
620
+ "title": "Helpers (whitelist)",
621
+ "type": "paragraph"
622
+ }
623
+ }
624
+ }
625
+ }
626
+ },
627
+ {
628
+ "search": "type Session = { edito: { title: string }; stock: { internal: { revenue: number } } };\ntype Row = { titre: string; ca: number };\n",
629
+ "files": {
630
+ "core/components/functional/jsonata/jsonata.md": {
631
+ "title": "Jsonata",
632
+ "hashes": {
633
+ "typescript--derive--dataproviderkey": {
634
+ "count": 1,
635
+ "title": "TypeScript — `derive` + `DataProviderKey`",
636
+ "type": "paragraph"
637
+ }
638
+ }
639
+ }
640
+ }
641
+ },
642
+ {
643
+ "search": "const sessions = new DataProviderKey&lt;Session[]&gt;(&quot;sessions&quot;);\nconst form = new DataProviderKey&lt;{ top: number }&gt;(&quot;lbForm&quot;);\nconst palmares = new DataProviderKey&lt;Row[]&gt;(&quot;palmares&quot;);\n",
644
+ "files": {
645
+ "core/components/functional/jsonata/jsonata.md": {
646
+ "title": "Jsonata",
647
+ "hashes": {
648
+ "typescript--derive--dataproviderkey": {
649
+ "count": 1,
650
+ "title": "TypeScript — `derive` + `DataProviderKey`",
651
+ "type": "paragraph"
652
+ }
653
+ }
654
+ }
655
+ }
656
+ },
657
+ {
658
+ "search": "const handle = derive({\n inputs: { s: sessions },\n variables: form,\n output: palmares,\n compute: async (i, v) =&gt; {\n const expr = compileJsonata(\n &#39;$s{edito.title: $sum(stock.internal.revenue)} ~&gt; $each(function($v,$k){{&quot;titre&quot;:$k,&quot;ca&quot;:$v}}) ^(&gt;ca)[[0..$number($top)-1]]&#39;,\n );\n return expr.evaluate({}, { ...i, ...v }) as Row[];\n },\n});\n// handle.stop() on disconnect\n \n\n",
659
+ "files": {
660
+ "core/components/functional/jsonata/jsonata.md": {
661
+ "title": "Jsonata",
662
+ "hashes": {
663
+ "typescript--derive--dataproviderkey": {
664
+ "count": 1,
665
+ "title": "TypeScript — `derive` + `DataProviderKey`",
666
+ "type": "paragraph"
667
+ }
668
+ }
669
+ }
670
+ }
671
+ },
672
+ {
673
+ "search": "Compile-safe: pass DataProviderKey&amp;lt;T&amp;gt; — not bare untyped strings — for TS callers.\n",
674
+ "files": {
675
+ "core/components/functional/jsonata/jsonata.md": {
676
+ "title": "Jsonata",
677
+ "hashes": {
678
+ "typescript--derive--dataproviderkey": {
679
+ "count": 1,
680
+ "title": "TypeScript — `derive` + `DataProviderKey`",
681
+ "type": "paragraph"
682
+ }
683
+ }
684
+ }
685
+ }
686
+ },
687
+ {
688
+ "search": "Status is published on {outputRoot}/_state_ as { status, error? } with status ∈ loading | ready | error | empty. Wire sonic-states with dataProvider=&quot;palmares/_state_&quot; and data-path=&quot;status&quot;.\n",
689
+ "files": {
690
+ "core/components/functional/jsonata/jsonata.md": {
691
+ "title": "Jsonata",
692
+ "hashes": {
693
+ "states": {
694
+ "count": 1,
695
+ "title": "States",
696
+ "type": "paragraph"
697
+ }
698
+ }
699
+ }
700
+ }
701
+ },
702
+ {
703
+ "search": "See the live demo embedded below (fixtures demo14).\n",
704
+ "files": {
705
+ "core/components/functional/jsonata/jsonata.md": {
706
+ "title": "Jsonata",
707
+ "hashes": {
708
+ "demo-widget": {
709
+ "count": 1,
710
+ "title": "Demo widget",
711
+ "type": "paragraph"
712
+ }
713
+ }
714
+ }
715
+ }
716
+ },
552
717
  {
553
718
  "search": "List",
554
719
  "files": {
@@ -3304,6 +3469,21 @@
3304
3469
  }
3305
3470
  }
3306
3471
  },
3472
+ {
3473
+ "search": "Use when you need client-side aggregations (groupby, top N, chart shapes) from existing DataProviders — without inline app JS in SDUI.\n",
3474
+ "files": {
3475
+ "docs/_core-concept/dataFlow.md": {
3476
+ "title": "Data flow",
3477
+ "hashes": {
3478
+ "derived-data-derive--sonic-jsonata": {
3479
+ "count": 1,
3480
+ "title": "Derived data (`derive` / `sonic-jsonata`)",
3481
+ "type": "paragraph"
3482
+ }
3483
+ }
3484
+ }
3485
+ }
3486
+ },
3307
3487
  {
3308
3488
  "search": "lit + tailwind + vite",
3309
3489
  "files": {
package/src/tsconfig.json CHANGED
@@ -54,6 +54,12 @@
54
54
  "./functional/if": [
55
55
  "/sites/concorde/src/core/components/functional/if/if.ts"
56
56
  ],
57
+ "./jsonata": [
58
+ "/sites/concorde/src/core/components/functional/jsonata/jsonata.ts"
59
+ ],
60
+ "./functional/jsonata": [
61
+ "/sites/concorde/src/core/components/functional/jsonata/jsonata.ts"
62
+ ],
57
63
  "./list": [
58
64
  "/sites/concorde/src/core/components/functional/list/list.ts"
59
65
  ],
@@ -714,6 +720,9 @@
714
720
  "./decorators/subscriber/common": [
715
721
  "/sites/concorde/src/core/decorators/subscriber/common.ts"
716
722
  ],
723
+ "./decorators/subscriber/derive": [
724
+ "/sites/concorde/src/core/decorators/subscriber/derive.ts"
725
+ ],
717
726
  "./decorators/subscriber/dynamicPath": [
718
727
  "/sites/concorde/src/core/decorators/subscriber/dynamicPath.ts"
719
728
  ],
@@ -804,9 +813,18 @@
804
813
  "./utils/dataProviderKey": [
805
814
  "/sites/concorde/src/core/utils/dataProviderKey.ts"
806
815
  ],
816
+ "./utils/derive": [
817
+ "/sites/concorde/src/core/utils/derive.ts"
818
+ ],
807
819
  "./utils/endpoint": [
808
820
  "/sites/concorde/src/core/utils/endpoint.ts"
809
821
  ],
822
+ "./utils/jsonataHelpers": [
823
+ "/sites/concorde/src/core/utils/jsonataHelpers.ts"
824
+ ],
825
+ "./utils/jsonataRuntime": [
826
+ "/sites/concorde/src/core/utils/jsonataRuntime.ts"
827
+ ],
810
828
  "./utils/route": [
811
829
  "/sites/concorde/src/core/utils/route.ts"
812
830
  ],
@@ -1 +1 @@
1
- {"root":["./components.ts","./concorde-loaded.ts","./css.d.ts","./dataprovider.ts","./decorators.ts","./directives.ts","./index.ts","./mixins.ts","./utils.ts","./core/core.ts","./core/_types/endpoint.ts","./core/_types/key.ts","./core/_types/types.ts","./core/components/functional/functional.ts","./core/components/functional/date/date.ts","./core/components/functional/example/example.ts","./core/components/functional/fetch/fetch.ts","./core/components/functional/if/if.test.ts","./core/components/functional/if/if.ts","./core/components/functional/list/list.demo.ts","./core/components/functional/list/list.spec.ts","./core/components/functional/list/list.ts","./core/components/functional/mix/mix.ts","./core/components/functional/queue/queue.demo.ts","./core/components/functional/queue/queue.ts","./core/components/functional/router/redirect.ts","./core/components/functional/router/router.demo.ts","./core/components/functional/router/router.spec.ts","./core/components/functional/router/router.ts","./core/components/functional/sdui/SDUIDescriptorTransformer.ts","./core/components/functional/sdui/sdui-utils.ts","./core/components/functional/sdui/sdui.ts","./core/components/functional/sdui/types.ts","./core/components/functional/sonic-scope/sonic-scope.ts","./core/components/functional/states/states.demo.ts","./core/components/functional/states/states.spec.ts","./core/components/functional/states/states.ts","./core/components/functional/submit/submit.ts","./core/components/functional/subscriber/subscriber.ts","./core/components/functional/translation/translation.ts","./core/components/functional/value/value.ts","./core/components/ui/ui.ts","./core/components/ui/_css/scroll.ts","./core/components/ui/_css/shadow.ts","./core/components/ui/_css/size.ts","./core/components/ui/_css/type.ts","./core/components/ui/alert/alert.ts","./core/components/ui/alert-messages/alert-messages.ts","./core/components/ui/badge/badge.ts","./core/components/ui/button/button.ts","./core/components/ui/captcha/altchaStyles.ts","./core/components/ui/captcha/captcha.ts","./core/components/ui/card/card-footer.ts","./core/components/ui/card/card-header-descripton.ts","./core/components/ui/card/card-header.ts","./core/components/ui/card/card-main.ts","./core/components/ui/card/card.ts","./core/components/ui/divider/divider.ts","./core/components/ui/form/checkbox/checkbox.ts","./core/components/ui/form/css/form-control.ts","./core/components/ui/form/fieldset/fieldset.ts","./core/components/ui/form/fieldset/legend-description.ts","./core/components/ui/form/fieldset/legend.ts","./core/components/ui/form/form-actions/form-actions.ts","./core/components/ui/form/form-layout/form-layout.ts","./core/components/ui/form/input/input.ts","./core/components/ui/form/input/password-helper.ts","./core/components/ui/form/input/same-value-helper.ts","./core/components/ui/form/input-autocomplete/input-autocomplete.ts","./core/components/ui/form/radio/radio.ts","./core/components/ui/form/select/select.ts","./core/components/ui/form/switch/switch.ts","./core/components/ui/form/textarea/textarea.ts","./core/components/ui/group/group.ts","./core/components/ui/icon/icon.stories.ts","./core/components/ui/icon/icon.ts","./core/components/ui/icon/icons.ts","./core/components/ui/image/image.ts","./core/components/ui/link/link.ts","./core/components/ui/loader/loader.stories.ts","./core/components/ui/loader/loader.ts","./core/components/ui/loader/styles/fixed.ts","./core/components/ui/loader/styles/inline.ts","./core/components/ui/menu/menu-item.ts","./core/components/ui/menu/menu.ts","./core/components/ui/modal/modal-actions.ts","./core/components/ui/modal/modal-close.ts","./core/components/ui/modal/modal-content.ts","./core/components/ui/modal/modal-subtitle.ts","./core/components/ui/modal/modal-title.ts","./core/components/ui/modal/modal-utils.ts","./core/components/ui/modal/modal.ts","./core/components/ui/pop/pop.ts","./core/components/ui/progress/progress.ts","./core/components/ui/table/table-caption.ts","./core/components/ui/table/table-tbody.ts","./core/components/ui/table/table-td.ts","./core/components/ui/table/table-tfoot.ts","./core/components/ui/table/table-th.ts","./core/components/ui/table/table-thead.ts","./core/components/ui/table/table-tr.ts","./core/components/ui/table/table.ts","./core/components/ui/theme/theme.ts","./core/components/ui/theme/theme-collection/core-variables.ts","./core/components/ui/theme/theme-collection/dark.ts","./core/components/ui/theme/theme-collection/light.ts","./core/components/ui/toast/message-subscriber.ts","./core/components/ui/toast/toast-item.ts","./core/components/ui/toast/toast.ts","./core/components/ui/toast/types.ts","./core/components/ui/tooltip/tooltip.ts","./core/decorators/Subscriber.ts","./core/decorators/api.post.spec.ts","./core/decorators/api.spec.ts","./core/decorators/api.ts","./core/decorators/lifecycle.ts","./core/decorators/subscriber/ancestorAttribute.spec.ts","./core/decorators/subscriber/ancestorAttribute.ts","./core/decorators/subscriber/autoFill.ts","./core/decorators/subscriber/autoSubscribe.ts","./core/decorators/subscriber/bind.ts","./core/decorators/subscriber/common.ts","./core/decorators/subscriber/dynamicPath.spec.ts","./core/decorators/subscriber/dynamicPath.ts","./core/decorators/subscriber/dynamicPropertyWatch.spec.ts","./core/decorators/subscriber/dynamicPropertyWatch.ts","./core/decorators/subscriber/handle.disambig.spec.ts","./core/decorators/subscriber/handle.skip.spec.ts","./core/decorators/subscriber/handle.ts","./core/decorators/subscriber/onAssign.ts","./core/decorators/subscriber/publish.spec.ts","./core/decorators/subscriber/publish.ts","./core/decorators/subscriber/publisherPath.ts","./core/decorators/subscriber/subscribe.spec.ts","./core/decorators/subscriber/subscribe.ts","./core/directives/DataProvider.sub.spec.ts","./core/directives/DataProvider.ts","./core/directives/Wording.ts","./core/mixins/Fetcher.ts","./core/mixins/FormCheckable.ts","./core/mixins/FormElement.ts","./core/mixins/FormInput.ts","./core/mixins/Subscriber.ts","./core/mixins/TemplatesContainer.ts","./core/mixins/mixins.ts","./core/utils/AncestorAttributeObserver.ts","./core/utils/Arrays.ts","./core/utils/DataBindObserver.ts","./core/utils/Electron.ts","./core/utils/Format.ts","./core/utils/HTML.ts","./core/utils/LocationHandler.ts","./core/utils/Objects.ts","./core/utils/PublisherProxy.ts","./core/utils/SafariScrollGuard.ts","./core/utils/Utils.ts","./core/utils/aesCrypto.ts","./core/utils/api.spec.ts","./core/utils/api.ts","./core/utils/dataProviderKey.spec.ts","./core/utils/dataProviderKey.ts","./core/utils/dpOptions.spec.ts","./core/utils/endpoint.spec.ts","./core/utils/endpoint.ts","./core/utils/publisherPathKey.spec.ts","./core/utils/route.spec.ts","./core/utils/route.ts","./core/utils/url-pattern.ts","./test-utils/TestUtils.ts"],"version":"5.9.2"}
1
+ {"root":["./components.ts","./concorde-loaded.ts","./css.d.ts","./dataprovider.ts","./decorators.ts","./directives.ts","./index.ts","./mixins.ts","./utils.ts","./core/core.ts","./core/_types/endpoint.ts","./core/_types/key.ts","./core/_types/types.ts","./core/components/functional/functional.ts","./core/components/functional/date/date.ts","./core/components/functional/example/example.ts","./core/components/functional/fetch/fetch.ts","./core/components/functional/if/if.test.ts","./core/components/functional/if/if.ts","./core/components/functional/jsonata/jsonata.spec.ts","./core/components/functional/jsonata/jsonata.ts","./core/components/functional/list/list.demo.ts","./core/components/functional/list/list.spec.ts","./core/components/functional/list/list.ts","./core/components/functional/mix/mix.ts","./core/components/functional/queue/queue.demo.ts","./core/components/functional/queue/queue.ts","./core/components/functional/router/redirect.ts","./core/components/functional/router/router.demo.ts","./core/components/functional/router/router.spec.ts","./core/components/functional/router/router.ts","./core/components/functional/sdui/SDUIDescriptorTransformer.ts","./core/components/functional/sdui/sdui-utils.ts","./core/components/functional/sdui/sdui.ts","./core/components/functional/sdui/types.ts","./core/components/functional/sonic-scope/sonic-scope.ts","./core/components/functional/states/states.demo.ts","./core/components/functional/states/states.spec.ts","./core/components/functional/states/states.ts","./core/components/functional/submit/submit.ts","./core/components/functional/subscriber/subscriber.ts","./core/components/functional/translation/translation.ts","./core/components/functional/value/value.ts","./core/components/ui/ui.ts","./core/components/ui/_css/scroll.ts","./core/components/ui/_css/shadow.ts","./core/components/ui/_css/size.ts","./core/components/ui/_css/type.ts","./core/components/ui/alert/alert.ts","./core/components/ui/alert-messages/alert-messages.ts","./core/components/ui/badge/badge.ts","./core/components/ui/button/button.ts","./core/components/ui/captcha/altchaStyles.ts","./core/components/ui/captcha/captcha.ts","./core/components/ui/card/card-footer.ts","./core/components/ui/card/card-header-descripton.ts","./core/components/ui/card/card-header.ts","./core/components/ui/card/card-main.ts","./core/components/ui/card/card.ts","./core/components/ui/divider/divider.ts","./core/components/ui/form/checkbox/checkbox.ts","./core/components/ui/form/css/form-control.ts","./core/components/ui/form/fieldset/fieldset.ts","./core/components/ui/form/fieldset/legend-description.ts","./core/components/ui/form/fieldset/legend.ts","./core/components/ui/form/form-actions/form-actions.ts","./core/components/ui/form/form-layout/form-layout.ts","./core/components/ui/form/input/input.ts","./core/components/ui/form/input/password-helper.ts","./core/components/ui/form/input/same-value-helper.ts","./core/components/ui/form/input-autocomplete/input-autocomplete.ts","./core/components/ui/form/radio/radio.ts","./core/components/ui/form/select/select.ts","./core/components/ui/form/switch/switch.ts","./core/components/ui/form/textarea/textarea.ts","./core/components/ui/group/group.ts","./core/components/ui/icon/icon.stories.ts","./core/components/ui/icon/icon.ts","./core/components/ui/icon/icons.ts","./core/components/ui/image/image.ts","./core/components/ui/link/link.ts","./core/components/ui/loader/loader.stories.ts","./core/components/ui/loader/loader.ts","./core/components/ui/loader/styles/fixed.ts","./core/components/ui/loader/styles/inline.ts","./core/components/ui/menu/menu-item.ts","./core/components/ui/menu/menu.ts","./core/components/ui/modal/modal-actions.ts","./core/components/ui/modal/modal-close.ts","./core/components/ui/modal/modal-content.ts","./core/components/ui/modal/modal-subtitle.ts","./core/components/ui/modal/modal-title.ts","./core/components/ui/modal/modal-utils.ts","./core/components/ui/modal/modal.ts","./core/components/ui/pop/pop.ts","./core/components/ui/progress/progress.ts","./core/components/ui/table/table-caption.ts","./core/components/ui/table/table-tbody.ts","./core/components/ui/table/table-td.ts","./core/components/ui/table/table-tfoot.ts","./core/components/ui/table/table-th.ts","./core/components/ui/table/table-thead.ts","./core/components/ui/table/table-tr.ts","./core/components/ui/table/table.ts","./core/components/ui/theme/theme.ts","./core/components/ui/theme/theme-collection/core-variables.ts","./core/components/ui/theme/theme-collection/dark.ts","./core/components/ui/theme/theme-collection/light.ts","./core/components/ui/toast/message-subscriber.ts","./core/components/ui/toast/toast-item.ts","./core/components/ui/toast/toast.ts","./core/components/ui/toast/types.ts","./core/components/ui/tooltip/tooltip.ts","./core/decorators/Subscriber.ts","./core/decorators/api.post.spec.ts","./core/decorators/api.spec.ts","./core/decorators/api.ts","./core/decorators/lifecycle.ts","./core/decorators/subscriber/ancestorAttribute.spec.ts","./core/decorators/subscriber/ancestorAttribute.ts","./core/decorators/subscriber/autoFill.ts","./core/decorators/subscriber/autoSubscribe.ts","./core/decorators/subscriber/bind.ts","./core/decorators/subscriber/common.ts","./core/decorators/subscriber/derive.ts","./core/decorators/subscriber/dynamicPath.spec.ts","./core/decorators/subscriber/dynamicPath.ts","./core/decorators/subscriber/dynamicPropertyWatch.spec.ts","./core/decorators/subscriber/dynamicPropertyWatch.ts","./core/decorators/subscriber/handle.disambig.spec.ts","./core/decorators/subscriber/handle.skip.spec.ts","./core/decorators/subscriber/handle.ts","./core/decorators/subscriber/onAssign.ts","./core/decorators/subscriber/publish.spec.ts","./core/decorators/subscriber/publish.ts","./core/decorators/subscriber/publisherPath.ts","./core/decorators/subscriber/subscribe.spec.ts","./core/decorators/subscriber/subscribe.ts","./core/directives/DataProvider.sub.spec.ts","./core/directives/DataProvider.ts","./core/directives/Wording.ts","./core/mixins/Fetcher.ts","./core/mixins/FormCheckable.ts","./core/mixins/FormElement.ts","./core/mixins/FormInput.ts","./core/mixins/Subscriber.ts","./core/mixins/TemplatesContainer.ts","./core/mixins/mixins.ts","./core/utils/AncestorAttributeObserver.ts","./core/utils/Arrays.ts","./core/utils/DataBindObserver.ts","./core/utils/Electron.ts","./core/utils/Format.ts","./core/utils/HTML.ts","./core/utils/LocationHandler.ts","./core/utils/Objects.ts","./core/utils/PublisherProxy.ts","./core/utils/SafariScrollGuard.ts","./core/utils/Utils.ts","./core/utils/aesCrypto.ts","./core/utils/api.spec.ts","./core/utils/api.ts","./core/utils/dataProviderKey.spec.ts","./core/utils/dataProviderKey.ts","./core/utils/derive.spec.ts","./core/utils/derive.ts","./core/utils/dpOptions.spec.ts","./core/utils/endpoint.spec.ts","./core/utils/endpoint.ts","./core/utils/jsonataHelpers.ts","./core/utils/jsonataRuntime.ts","./core/utils/publisherPathKey.spec.ts","./core/utils/route.spec.ts","./core/utils/route.ts","./core/utils/url-pattern.ts","./test-utils/TestUtils.ts"],"version":"5.9.2"}
package/src/utils.ts CHANGED
@@ -24,6 +24,19 @@ export const URLPattern = myURLPattern.default;
24
24
  import { Endpoint } from "./core/utils/endpoint";
25
25
  import { DataProviderKey } from "./core/utils/dataProviderKey";
26
26
  export { Endpoint, DataProviderKey };
27
+ export {
28
+ derive,
29
+ deriveStateKey,
30
+ type DeriveOptions,
31
+ type DeriveHandle,
32
+ type DeriveState,
33
+ type DeriveStatus,
34
+ } from "./core/utils/derive";
35
+ export {
36
+ compileJsonata,
37
+ validateOutputSchema,
38
+ } from "./core/utils/jsonataRuntime";
39
+
27
40
  export {
28
41
  installSafariScrollGuard,
29
42
  watchScrollRoot,