@zio.dev/zio-blocks 0.0.33 → 0.0.51

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 (150) hide show
  1. package/guides/compile-time-resource-safety-with-scope.md +16 -17
  2. package/guides/getting-started-with-mux.md +1507 -0
  3. package/guides/query-dsl-extending.md +161 -102
  4. package/guides/query-dsl-fluent-builder.md +217 -157
  5. package/guides/query-dsl-reified-optics.md +12 -10
  6. package/guides/query-dsl-sql.md +246 -165
  7. package/guides/telemetry-guide.md +1069 -0
  8. package/guides/zio-schema-migration.md +29 -22
  9. package/index.md +292 -50
  10. package/package.json +1 -1
  11. package/plans/config-follow-up-prs.md +188 -0
  12. package/plans/config-pr-assessment-roadmap.md +310 -0
  13. package/reference/MuxDataFlow.jsx +250 -0
  14. package/reference/async.md +651 -0
  15. package/reference/chunk.md +3533 -308
  16. package/reference/codegen/case-class.md +436 -0
  17. package/reference/codegen/emitter-config.md +383 -0
  18. package/reference/codegen/examples.md +664 -0
  19. package/reference/codegen/field.md +316 -0
  20. package/reference/codegen/index.md +317 -0
  21. package/reference/codegen/scala-emitter.md +392 -0
  22. package/reference/codegen/scala-file.md +276 -0
  23. package/reference/codegen/sealed-trait.md +408 -0
  24. package/reference/codegen/type-definition.md +340 -0
  25. package/reference/codegen/type-ref.md +201 -0
  26. package/reference/combinators.md +347 -117
  27. package/reference/config.md +158 -0
  28. package/reference/context.md +4 -4
  29. package/reference/datastar.md +346 -0
  30. package/reference/docs.md +1461 -345
  31. package/reference/endpoint/auth-type.md +146 -0
  32. package/reference/endpoint/endpoint.md +297 -0
  33. package/reference/endpoint/http-codec.md +249 -0
  34. package/reference/endpoint/index.md +825 -0
  35. package/reference/endpoint/path-codec.md +237 -0
  36. package/reference/endpoint/route-pattern.md +196 -0
  37. package/reference/endpoint/route-tree.md +111 -0
  38. package/reference/endpoint/segment-codec.md +212 -0
  39. package/reference/html.md +1120 -0
  40. package/reference/htmx/attribute-values.md +359 -0
  41. package/reference/htmx/hx-encoding.md +111 -0
  42. package/reference/htmx/hx-params.md +204 -0
  43. package/reference/htmx/hx-swap.md +276 -0
  44. package/reference/htmx/hx-sync.md +251 -0
  45. package/reference/htmx/hx-target.md +314 -0
  46. package/reference/htmx/hx-trigger.md +457 -0
  47. package/reference/htmx/hx-url-update.md +239 -0
  48. package/reference/htmx/index.md +855 -0
  49. package/reference/http-model/index.md +47 -0
  50. package/reference/http-model/model.md +1481 -0
  51. package/reference/http-model/schema.md +747 -0
  52. package/reference/maybe.md +826 -0
  53. package/reference/media-type.md +2 -2
  54. package/reference/mux.mdx +823 -0
  55. package/reference/openapi.md +1351 -0
  56. package/reference/resource-management/defer-handle.md +1 -1
  57. package/reference/resource-management/resource.md +31 -2
  58. package/reference/resource-management/scope.md +28 -12
  59. package/reference/resource-management/wire.md +3 -7
  60. package/reference/ringbuffer/MpmcDiagram.jsx +717 -0
  61. package/reference/ringbuffer/MpscDiagram.jsx +618 -0
  62. package/reference/ringbuffer/SpmcDiagram.jsx +680 -0
  63. package/reference/ringbuffer/SpscDiagram.jsx +677 -0
  64. package/reference/ringbuffer/advanced.mdx +109 -0
  65. package/reference/ringbuffer/index.mdx +145 -0
  66. package/reference/ringbuffer/mpmc.mdx +151 -0
  67. package/reference/ringbuffer/mpsc.mdx +132 -0
  68. package/reference/ringbuffer/spmc.mdx +108 -0
  69. package/reference/ringbuffer/spsc.mdx +344 -0
  70. package/reference/{allows.md → schema/allows.md} +4 -4
  71. package/reference/{binding-resolver.md → schema/binding-resolver.md} +1 -1
  72. package/reference/{binding.md → schema/binding.md} +2 -3
  73. package/reference/schema/built-in-codecs/avro.md +451 -0
  74. package/reference/schema/built-in-codecs/bson.md +480 -0
  75. package/reference/schema/built-in-codecs/csv.md +564 -0
  76. package/reference/schema/built-in-codecs/index.md +77 -0
  77. package/reference/schema/built-in-codecs/json/index.md +295 -0
  78. package/reference/schema/built-in-codecs/json/json-config.md +217 -0
  79. package/reference/{json-patch.md → schema/built-in-codecs/json/json-patch.md} +5 -5
  80. package/reference/{json-schema.md → schema/built-in-codecs/json/json-schema.md} +14 -47
  81. package/reference/schema/built-in-codecs/json/json-selection.md +322 -0
  82. package/reference/{json.md → schema/built-in-codecs/json/json.md} +32 -64
  83. package/reference/schema/built-in-codecs/messagepack.md +508 -0
  84. package/reference/schema/built-in-codecs/thrift.md +433 -0
  85. package/reference/schema/built-in-codecs/toon.md +1078 -0
  86. package/reference/{xml.md → schema/built-in-codecs/xml.md} +13 -9
  87. package/reference/schema/built-in-codecs/yaml.md +552 -0
  88. package/reference/{codec.md → schema/codec.md} +10 -10
  89. package/reference/{dynamic-optic.md → schema/dynamic-optic.md} +151 -5
  90. package/reference/{dynamic-schema.md → schema/dynamic-schema.md} +8 -8
  91. package/reference/schema/format.md +92 -0
  92. package/reference/schema/index.md +50 -0
  93. package/reference/schema/migration.md +297 -0
  94. package/reference/{modifier.md → schema/modifier.md} +58 -7
  95. package/reference/{optics.md → schema/optics.md} +2 -2
  96. package/reference/{patch.md → schema/patch.md} +1 -1
  97. package/{path-interpolator.md → reference/schema/path-interpolator.md} +165 -72
  98. package/reference/{schema-evolution → schema/schema-evolution}/as.md +8 -8
  99. package/reference/{schema-evolution → schema/schema-evolution}/index.md +2 -2
  100. package/reference/{schema-evolution → schema/schema-evolution}/into.md +8 -8
  101. package/reference/{schema-expr.md → schema/schema-expr.md} +110 -175
  102. package/reference/{schema.md → schema/schema.md} +12 -0
  103. package/reference/{structural-types.md → schema/structural-types.md} +1 -1
  104. package/reference/{type-class-derivation.md → schema/type-class-derivation.md} +63 -1
  105. package/reference/smithy.md +533 -0
  106. package/reference/sql/db-codec-deriver.md +71 -0
  107. package/reference/sql/db-codec.md +687 -0
  108. package/reference/sql/db-con.md +271 -0
  109. package/reference/sql/db-connection.md +153 -0
  110. package/reference/sql/db-param-writer.md +77 -0
  111. package/reference/sql/db-param.md +66 -0
  112. package/reference/sql/db-result-reader.md +146 -0
  113. package/reference/sql/db-tx.md +82 -0
  114. package/reference/sql/db-value.md +41 -0
  115. package/reference/sql/ddl.md +85 -0
  116. package/reference/sql/frag.md +254 -0
  117. package/reference/sql/index.md +341 -0
  118. package/reference/sql/repo.md +600 -0
  119. package/reference/sql/sql-dialect.md +73 -0
  120. package/reference/sql/sql-logger.md +62 -0
  121. package/reference/sql/sql-name-mapper.md +70 -0
  122. package/reference/sql/table-metadata.md +134 -0
  123. package/reference/sql/table.md +448 -0
  124. package/reference/sql/transactor-zio.md +399 -0
  125. package/reference/sql/transactor.md +353 -0
  126. package/reference/sql-zio.md +112 -0
  127. package/reference/streams/concurrent-operators.md +106 -0
  128. package/reference/streams/index.md +653 -0
  129. package/reference/streams/pipeline.md +718 -0
  130. package/reference/streams/reader.md +1284 -0
  131. package/reference/streams/scala-2-compatibility.md +55 -0
  132. package/reference/streams/sink.md +1426 -0
  133. package/reference/streams/stream.md +2526 -0
  134. package/reference/streams/writer.md +1045 -0
  135. package/reference/streams/zero-boxing.md +275 -0
  136. package/reference/telemetry.md +693 -0
  137. package/reference/typeid.md +5 -19
  138. package/sidebars.js +238 -43
  139. package/reference/formats.md +0 -694
  140. package/reference/http-model.md +0 -1716
  141. package/reference/streams.md +0 -989
  142. package/ringbuffer.md +0 -249
  143. /package/reference/{json-differ.md → schema/built-in-codecs/json/json-differ.md} +0 -0
  144. /package/reference/{dynamic-value.md → schema/dynamic-value.md} +0 -0
  145. /package/reference/{lazy.md → schema/lazy.md} +0 -0
  146. /package/reference/{reflect.md → schema/reflect.md} +0 -0
  147. /package/reference/{registers.md → schema/registers.md} +0 -0
  148. /package/reference/{schema-error.md → schema/schema-error.md} +0 -0
  149. /package/reference/{syntax.md → schema/syntax.md} +0 -0
  150. /package/reference/{validation.md → schema/validation.md} +0 -0
@@ -0,0 +1,250 @@
1
+ import React, { useState, useRef, useEffect } from "react";
2
+
3
+ const MAX_VISIBLE = 8;
4
+ const QUEUE_CAP = 256;
5
+ const STREAM_COUNT = 3;
6
+
7
+ const stateMap = {
8
+ open: { label: "open", bg: "#e8f5e0", color: "#3B6D11", dot: "#639922" },
9
+ hcl: { label: "half-closed local", bg: "#fef3cd", color: "#854F0B", dot: "#BA7517" },
10
+ hcr: { label: "half-closed remote", bg: "#fef3cd", color: "#854F0B", dot: "#BA7517" },
11
+ closed: { label: "closed", bg: "#fce8e8", color: "#A32D2D", dot: "#E24B4A" },
12
+ };
13
+
14
+ const initStreams = () =>
15
+ Array.from({ length: STREAM_COUNT }, (_, i) => ({
16
+ id: i + 1, state: "open", outQ: [], inQ: [], logs: [],
17
+ }));
18
+
19
+ const Badge = ({ state }) => (
20
+ <span style={{
21
+ display: "inline-block", fontSize: 11, fontWeight: 500,
22
+ padding: "2px 8px", borderRadius: 6,
23
+ background: stateMap[state].bg, color: stateMap[state].color,
24
+ }}>
25
+ {stateMap[state].label}
26
+ </span>
27
+ );
28
+
29
+ const Pill = ({ label, dir }) => (
30
+ <span style={{
31
+ padding: "2px 8px", borderRadius: 4, fontSize: 11, whiteSpace: "nowrap",
32
+ fontFamily: "monospace",
33
+ background: dir === "out" ? "rgba(126,119,221,0.15)" : "rgba(29,158,117,0.15)",
34
+ color: dir === "out" ? "#534AB7" : "#0F6E56",
35
+ }}>
36
+ {label}
37
+ </span>
38
+ );
39
+
40
+ const Btn = ({ children, variant, disabled, onClick }) => {
41
+ const palette = {
42
+ app: { border: "rgba(126,119,221,0.4)", color: "#534AB7", hover: "rgba(126,119,221,0.1)" },
43
+ proto: { border: "rgba(29,158,117,0.4)", color: "#0F6E56", hover: "rgba(29,158,117,0.1)" },
44
+ lc: { border: "rgba(186,117,23,0.4)", color: "#854F0B", hover: "rgba(186,117,23,0.1)" },
45
+ }[variant];
46
+ return (
47
+ <button
48
+ type="button"
49
+ disabled={disabled}
50
+ onClick={onClick}
51
+ style={{
52
+ fontSize: 12, padding: "4px 10px", borderRadius: 6, cursor: disabled ? "not-allowed" : "pointer",
53
+ border: `1px solid ${palette.border}`, color: palette.color, background: "transparent",
54
+ opacity: disabled ? 0.35 : 1, transition: "background 0.15s",
55
+ }}
56
+ onMouseEnter={e => { if (!disabled) e.currentTarget.style.background = palette.hover; }}
57
+ onMouseLeave={e => { e.currentTarget.style.background = "transparent"; }}
58
+ >
59
+ {children}
60
+ </button>
61
+ );
62
+ };
63
+
64
+ const Zone = ({ children, label, tint }) => (
65
+ <div style={{
66
+ padding: "12px 16px", borderRadius: 12, marginBottom: 6,
67
+ background: tint.bg, border: `1px solid ${tint.border}`,
68
+ }}>
69
+ <div style={{ fontSize: 11, fontWeight: 600, textTransform: "uppercase", letterSpacing: 0.5, marginBottom: 8, color: tint.label }}>
70
+ {label}
71
+ </div>
72
+ {children}
73
+ </div>
74
+ );
75
+
76
+ const QueueRow = ({ label, items, dir, count }) => (
77
+ <div style={{ display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }}>
78
+ <span style={{ fontSize: 12, color: "#888", minWidth: 80, textAlign: "right" }}>{label}</span>
79
+ <div style={{
80
+ flex: 1, display: "flex", gap: 3, alignItems: "center", minHeight: 28,
81
+ padding: "3px 6px", borderRadius: 6, border: "1px dashed #ddd", overflow: "hidden",
82
+ }}>
83
+ {items.slice(0, MAX_VISIBLE).map((m, i) => <Pill key={`${m}-${i}`} label={m} dir={dir} />)}
84
+ {items.length > MAX_VISIBLE && <span style={{ fontSize: 10, color: "#aaa" }}>+{items.length - MAX_VISIBLE}</span>}
85
+ </div>
86
+ <span style={{ fontSize: 10, color: "#aaa", minWidth: 40, textAlign: "center" }}>{count}/{QUEUE_CAP}</span>
87
+ </div>
88
+ );
89
+
90
+ const MuxDataFlow = () => {
91
+ const [streams, setStreams] = useState(initStreams);
92
+ const [activeIdx, setActiveIdx] = useState(0);
93
+ const msgRef = useRef(0);
94
+ const logRef = useRef(null);
95
+
96
+ const current = streams[activeIdx];
97
+
98
+ useEffect(() => {
99
+ if (logRef.current) logRef.current.scrollTop = logRef.current.scrollHeight;
100
+ });
101
+
102
+ const update = (fn) => {
103
+ setStreams(prev => {
104
+ const next = prev.map(s => ({ ...s, outQ: [...s.outQ], inQ: [...s.inQ], logs: [...s.logs] }));
105
+ fn(next[activeIdx]);
106
+ return next;
107
+ });
108
+ };
109
+
110
+ const addLog = (st, msg, ok) => {
111
+ st.logs.push({ msg, ok });
112
+ if (st.logs.length > 40) st.logs.splice(0, st.logs.length - 40);
113
+ };
114
+
115
+ const nextTag = (p) => { msgRef.current += 1; return p + msgRef.current; };
116
+
117
+ const appSend = () => update(st => {
118
+ if (st.state === "closed" || st.state === "hcl") return addLog(st, "send() → StreamClosed", false);
119
+ if (st.outQ.length >= QUEUE_CAP) return addLog(st, `send() → QueueFull(${QUEUE_CAP})`, false);
120
+ const t = nextTag("M"); st.outQ.push(t); addLog(st, `send("${t}") → ok`, true);
121
+ });
122
+
123
+ const appReceive = () => update(st => {
124
+ if (st.inQ.length > 0) { const m = st.inQ.shift(); addLog(st, `receive() → Some("${m}")`, true); }
125
+ else if (st.state === "closed") addLog(st, "receive() → StreamClosed", false);
126
+ else addLog(st, "receive() → None", null);
127
+ });
128
+
129
+ const protoTake = () => update(st => {
130
+ if (st.outQ.length > 0) { const m = st.outQ.shift(); addLog(st, `takeOutbound() → Some("${m}")`, true); }
131
+ else if (st.state === "closed") addLog(st, "takeOutbound() → StreamClosed", false);
132
+ else addLog(st, "takeOutbound() → None", null);
133
+ });
134
+
135
+ const protoOffer = () => update(st => {
136
+ if (st.state === "closed" || st.state === "hcr") return addLog(st, "offerInbound() → StreamClosed", false);
137
+ if (st.inQ.length >= QUEUE_CAP) return addLog(st, `offerInbound() → QueueFull(${QUEUE_CAP})`, false);
138
+ const t = nextTag("R"); st.inQ.push(t); addLog(st, `offerInbound("${t}") → ok`, true);
139
+ });
140
+
141
+ const doHalfClose = () => update(st => {
142
+ if (st.state === "open") { st.state = "hcl"; addLog(st, "halfClose() → HALF_CLOSED_LOCAL", true); }
143
+ else if (st.state === "hcr") { st.state = "closed"; addLog(st, "halfClose() → CLOSED (both sides done)", true); }
144
+ else addLog(st, `halfClose() → no-op (${stateMap[st.state].label})`, null);
145
+ });
146
+
147
+ const doSignalRemote = () => update(st => {
148
+ if (st.state === "open") { st.state = "hcr"; addLog(st, "signalRemoteClose() → HALF_CLOSED_REMOTE", true); }
149
+ else if (st.state === "hcl") { st.state = "closed"; addLog(st, "signalRemoteClose() → CLOSED (both sides done)", true); }
150
+ else addLog(st, `signalRemoteClose() → no-op (${stateMap[st.state].label})`, null);
151
+ });
152
+
153
+ const doClose = () => update(st => { st.state = "closed"; addLog(st, "close() → CLOSED (immediate)", true); });
154
+
155
+ const doReset = () => update(st => {
156
+ st.state = "open"; st.outQ = []; st.inQ = []; st.logs = [];
157
+ addLog(st, `Stream ${st.id} reset to OPEN`, true);
158
+ });
159
+
160
+ const isClosed = current.state === "closed";
161
+ const isHCL = current.state === "hcl";
162
+ const isHCR = current.state === "hcr";
163
+ const activeCount = streams.filter(s => s.state !== "closed").length;
164
+ const recentLogs = current.logs.slice(-14);
165
+
166
+ const flowArrow = { textAlign: "center", fontSize: 11, color: "#aaa", padding: "2px 0" };
167
+
168
+ return (
169
+ <div style={{ maxWidth: 640, margin: "0 auto", fontFamily: "system-ui, sans-serif", fontSize: 14 }}>
170
+
171
+ {/* Stream tabs */}
172
+ <div style={{ display: "flex", gap: 6, marginBottom: 8 }}>
173
+ {streams.map((ss, i) => (
174
+ <button type="button" key={ss.id} onClick={() => setActiveIdx(i)} style={{
175
+ padding: "4px 14px", borderRadius: 8, fontSize: 13, cursor: "pointer",
176
+ border: i === activeIdx ? "none" : "1px solid #ddd",
177
+ background: i === activeIdx ? "#333" : "#fff",
178
+ color: i === activeIdx ? "#fff" : "#888",
179
+ }}>
180
+ Stream {ss.id}
181
+ <span style={{ display: "inline-block", width: 7, height: 7, borderRadius: "50%", marginLeft: 6, verticalAlign: "middle", background: stateMap[ss.state].dot }} />
182
+ </button>
183
+ ))}
184
+ </div>
185
+
186
+ {/* Stats */}
187
+ <div style={{ fontSize: 12, color: "#888", marginBottom: 10 }}>
188
+ Active streams: <strong>{activeCount}/{STREAM_COUNT}</strong>
189
+ <span style={{ marginLeft: 16 }}>Mux capacity: <strong>{STREAM_COUNT}</strong></span>
190
+ </div>
191
+
192
+ {/* Application zone */}
193
+ <Zone label="Application code" tint={{ bg: "rgba(126,119,221,0.06)", border: "rgba(126,119,221,0.2)", label: "#534AB7" }}>
194
+ <div style={{ display: "flex", gap: 6, flexWrap: "wrap" }}>
195
+ <Btn variant="app" disabled={isClosed || isHCL} onClick={appSend}>↑ send()</Btn>
196
+ <Btn variant="app" disabled={false} onClick={appReceive}>↓ receive()</Btn>
197
+ </div>
198
+ </Zone>
199
+
200
+ <div style={flowArrow}>↓ send() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; receive() ↑</div>
201
+
202
+ {/* Mux zone */}
203
+ <Zone label="" tint={{ bg: "#f9f9f7", border: "#e5e5e0", label: "#888" }}>
204
+ <div style={{ display: "flex", alignItems: "center", gap: 8, marginBottom: 8 }}>
205
+ <span style={{ fontSize: 11, fontWeight: 600, textTransform: "uppercase", letterSpacing: 0.5, color: "#888" }}>MuxStream</span>
206
+ <Badge state={current.state} />
207
+ </div>
208
+ <QueueRow label="Outbound" items={current.outQ} dir="out" count={current.outQ.length} />
209
+ <QueueRow label="Inbound" items={current.inQ} dir="in" count={current.inQ.length} />
210
+ </Zone>
211
+
212
+ <div style={flowArrow}>↓ takeOutbound() &nbsp;&nbsp;&nbsp; offerInbound() ↑</div>
213
+
214
+ {/* Protocol zone */}
215
+ <Zone label="Protocol layer" tint={{ bg: "rgba(29,158,117,0.06)", border: "rgba(29,158,117,0.2)", label: "#0F6E56" }}>
216
+ <div style={{ display: "flex", gap: 6, flexWrap: "wrap" }}>
217
+ <Btn variant="proto" disabled={false} onClick={protoTake}>↑ takeOutbound()</Btn>
218
+ <Btn variant="proto" disabled={isClosed || isHCR} onClick={protoOffer}>↓ offerInbound()</Btn>
219
+ </div>
220
+ </Zone>
221
+
222
+ {/* Lifecycle controls */}
223
+ <div style={{ display: "flex", alignItems: "center", gap: 6, flexWrap: "wrap", marginTop: 8, marginBottom: 4 }}>
224
+ <span style={{ fontSize: 11, color: "#aaa", marginRight: 2 }}>Lifecycle:</span>
225
+ <Btn variant="lc" disabled={isClosed} onClick={doHalfClose}>halfClose()</Btn>
226
+ <Btn variant="lc" disabled={isClosed} onClick={doSignalRemote}>signalRemoteClose()</Btn>
227
+ <Btn variant="lc" disabled={isClosed} onClick={doClose}>close()</Btn>
228
+ <Btn variant="lc" disabled={false} onClick={doReset}>↻ reset</Btn>
229
+ </div>
230
+
231
+ {/* Event log */}
232
+ <div ref={logRef} style={{
233
+ marginTop: 8, maxHeight: 100, overflowY: "auto", borderRadius: 8,
234
+ background: "#f7f7f5", border: "1px solid #e5e5e0", padding: "8px 12px",
235
+ fontFamily: "monospace", fontSize: 11, lineHeight: 1.7, color: "#888",
236
+ }}>
237
+ {recentLogs.map((entry, i) => (
238
+ <div key={i} style={{ color: entry.ok === true ? "#3B6D11" : entry.ok === false ? "#c03030" : undefined }}>
239
+ {entry.msg}
240
+ </div>
241
+ ))}
242
+ {recentLogs.length === 0 && (
243
+ <div style={{ color: "#bbb", fontStyle: "italic" }}>Click an action to begin</div>
244
+ )}
245
+ </div>
246
+ </div>
247
+ );
248
+ };
249
+
250
+ export default MuxDataFlow;