@zio.dev/zio-blocks 0.0.32 → 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 (152) 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 +293 -51
  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} +3 -3
  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} +34 -192
  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 +5 -5
  99. package/reference/{schema-evolution → schema/schema-evolution}/index.md +2 -2
  100. package/reference/{schema-evolution → schema/schema-evolution}/into.md +3 -3
  101. package/reference/{schema-expr.md → schema/schema-expr.md} +110 -175
  102. package/reference/{schema.md → schema/schema.md} +13 -1
  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 +2922 -583
  138. package/sidebars.js +238 -43
  139. package/superpowers/plans/2026-03-19-docs-critique-subagent.md +407 -0
  140. package/superpowers/specs/2026-03-19-docs-critique-subagent-design.md +222 -0
  141. package/reference/formats.md +0 -694
  142. package/reference/http-model.md +0 -1716
  143. package/reference/streams.md +0 -989
  144. package/ringbuffer.md +0 -249
  145. /package/reference/{json-differ.md → schema/built-in-codecs/json/json-differ.md} +0 -0
  146. /package/reference/{dynamic-value.md → schema/dynamic-value.md} +0 -0
  147. /package/reference/{lazy.md → schema/lazy.md} +0 -0
  148. /package/reference/{reflect.md → schema/reflect.md} +0 -0
  149. /package/reference/{registers.md → schema/registers.md} +0 -0
  150. /package/reference/{schema-error.md → schema/schema-error.md} +0 -0
  151. /package/reference/{syntax.md → schema/syntax.md} +0 -0
  152. /package/reference/{validation.md → schema/validation.md} +0 -0
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  id: xml
3
- title: "XML"
3
+ title: "XML Codec Module"
4
4
  ---
5
5
 
6
6
  `Xml` is a **sealed trait representing XML nodes**. It provides a type-safe, immutable representation of all valid XML document structures including elements, text nodes, CDATA sections, comments, and processing instructions.
@@ -303,7 +303,7 @@ Use `WriterConfig` to control XML output formatting:
303
303
  import zio.blocks.schema.xml.WriterConfig
304
304
 
305
305
  // Compact output (default)
306
- val compact = WriterConfig.default
306
+ val compact = WriterConfig
307
307
  // <Person><name>Alice</name></Person>
308
308
 
309
309
  // Pretty-printed with 2-space indentation
@@ -466,7 +466,7 @@ val xml = XmlReader.read("""
466
466
  </book>
467
467
  </books>
468
468
  </library>
469
- """).toOption.get
469
+ """)
470
470
 
471
471
  // Navigate to child elements
472
472
  val books = xml.select.get("library").get("books")
@@ -478,9 +478,16 @@ val firstBook = books.get("book")(0)
478
478
  Extract text content from the first book:
479
479
 
480
480
  ```scala
481
- val title: Either[XmlError, String] = firstBook.get("title").text
482
- // title: Either[XmlError, String] = Left(
483
- // zio.blocks.schema.xml.XmlError: Expected single value but got 0
481
+ val title: Either[SchemaError, String] = firstBook.get("title").text
482
+ // title: Either[SchemaError, String] = Left(
483
+ // SchemaError(
484
+ // List(
485
+ // Message(
486
+ // source = DynamicOptic(IndexedSeq()),
487
+ // details = "Expected single value but got 0"
488
+ // )
489
+ // )
490
+ // )
484
491
  // )
485
492
  ```
486
493
 
@@ -513,7 +520,8 @@ Filter selections by node type or custom predicates:
513
520
  ```scala
514
521
  import zio.blocks.schema.xml._
515
522
 
516
- val selection: XmlSelection = ???
523
+ val xml = XmlReader.read("<root><item>text1</item><comment>note</comment></root>")
524
+ val selection = xml.select.descendant("item")
517
525
 
518
526
  // Filter by type
519
527
  val elements = selection.elements
@@ -531,22 +539,23 @@ Execute a selection to extract values or convert to other formats:
531
539
  ```scala
532
540
  import zio.blocks.schema.xml._
533
541
 
534
- val selection: XmlSelection = ???
542
+ val xml = XmlReader.read("<root><item>A</item><item>B</item></root>")
543
+ val selection = xml.select.get("item")
535
544
 
536
545
  // Get single value (fails if not exactly one)
537
- val one: Either[XmlError, Xml] = selection.one
546
+ val one: Either[SchemaError, Xml] = selection.one
538
547
 
539
548
  // Get any value (first of many)
540
- val any: Either[XmlError, Xml] = selection.any
549
+ val any: Either[SchemaError, Xml] = selection.any
541
550
 
542
551
  // Get all values as a single XML element
543
- val all: Either[XmlError, Xml] = selection.all
552
+ val all: Either[SchemaError, Xml] = selection.all
544
553
 
545
554
  // Convert to chunk
546
555
  val chunk = selection.toChunk
547
556
 
548
557
  // Extract text content
549
- val text: Either[XmlError, String] = selection.text
558
+ val text: Either[SchemaError, String] = selection.text
550
559
  val allText: String = selection.textContent
551
560
  ```
552
561
 
@@ -557,8 +566,10 @@ Combine and transform selections using monadic operations:
557
566
  ```scala
558
567
  import zio.blocks.schema.xml._
559
568
 
560
- val selection1: XmlSelection = ???
561
- val selection2: XmlSelection = ???
569
+ val xml1 = XmlReader.read("<root><item>X</item></root>")
570
+ val xml2 = XmlReader.read("<root><item>Y</item></root>")
571
+ val selection1 = xml1.select.get("item")
572
+ val selection2 = xml2.select.get("item")
562
573
 
563
574
  // Map over selections
564
575
  val mapped = selection1.map(xml => xml)
@@ -631,11 +642,11 @@ Apply a patch to an XML document to produce a modified result:
631
642
  import zio.blocks.schema._
632
643
  import zio.blocks.schema.xml._
633
644
 
634
- val xml: Xml = ???
645
+ val xml = XmlReader.read("<person><name>Alice</name></person>")
635
646
  val patch = XmlPatch.setAttribute(p".person", "active", "true")
636
647
 
637
648
  // Apply the patch
638
- val result: Either[XmlError, Xml] = patch(xml)
649
+ val result: Either[SchemaError, Xml] = patch(xml)
639
650
  ```
640
651
 
641
652
  ### Composing Patches
@@ -657,175 +668,6 @@ val patch2 = XmlPatch.add(
657
668
  val combined = patch1 ++ patch2
658
669
  ```
659
670
 
660
- ## XmlEncoder and XmlDecoder
661
-
662
- For more fine-grained control over XML serialization, use the separate `XmlEncoder` and `XmlDecoder` traits:
663
-
664
- ### XmlEncoder
665
-
666
- `XmlEncoder[A]` provides type-safe XML encoding:
667
-
668
- ```scala
669
- import zio.blocks.schema._
670
- import zio.blocks.schema.xml._
671
-
672
- // Automatic derivation from Schema
673
- case class Person(name: String, age: Int)
674
- object Person {
675
- implicit val schema: Schema[Person] = Schema.derived
676
- implicit val encoder: XmlEncoder[Person] = XmlEncoder.fromSchema
677
- }
678
-
679
- val person = Person("Alice", 30)
680
- val xml: Xml = XmlEncoder[Person].encode(person)
681
- ```
682
-
683
- #### Creating custom encoders
684
-
685
- Create custom encoders from functions or using contravariance:
686
-
687
- ```scala
688
- import zio.blocks.schema.xml._
689
-
690
- // Create from a function
691
- val customEncoder: XmlEncoder[Int] = XmlEncoder.instance(n =>
692
- Xml.Element("number", Xml.Text(n.toString))
693
- )
694
-
695
- // Map with contravariance - encode a wrapper type
696
- case class UserId(value: Int)
697
-
698
- val userIdEncoder: XmlEncoder[UserId] =
699
- customEncoder.contramap[UserId](_.value)
700
- ```
701
-
702
- #### Using implicit resolution
703
-
704
- Leverage implicit resolution for automatic encoder derivation:
705
-
706
- ```scala
707
- import zio.blocks.schema._
708
- import zio.blocks.schema.xml._
709
-
710
- case class Product(id: String, price: Double)
711
- object Product {
712
- implicit val schema: Schema[Product] = Schema.derived
713
- }
714
-
715
- // No explicit encoder needed - derives automatically
716
- def encodeProduct[A](value: A)(implicit encoder: XmlEncoder[A]): Xml =
717
- encoder.encode(value)
718
-
719
- val result = encodeProduct(Product("item-1", 99.99))
720
- ```
721
-
722
- ### XmlDecoder
723
-
724
- `XmlDecoder[A]` provides type-safe XML decoding with error handling:
725
-
726
- ```scala
727
- import zio.blocks.schema._
728
- import zio.blocks.schema.xml._
729
-
730
- // Automatic derivation from Schema
731
- case class Person(name: String, age: Int)
732
- object Person {
733
- implicit val schema: Schema[Person] = Schema.derived
734
- implicit val decoder: XmlDecoder[Person] = XmlDecoder.fromSchema
735
- }
736
-
737
- val xml = Xml.Element("Person",
738
- Xml.Element("name", Xml.Text("Alice")),
739
- Xml.Element("age", Xml.Text("30"))
740
- )
741
- ```
742
-
743
- Decode the XML:
744
-
745
- ```scala
746
- val result: Either[XmlError, Person] = XmlDecoder[Person].decode(xml)
747
- // result: Either[XmlError, Person] = Right(Person(name = "Alice", age = 30))
748
- ```
749
-
750
- #### Creating custom decoders
751
-
752
- Create custom decoders from functions or using covariance:
753
-
754
- ```scala
755
- import zio.blocks.schema.xml._
756
- import zio.blocks.chunk.Chunk
757
-
758
- // Create from a function
759
- val numberDecoder: XmlDecoder[Int] = XmlDecoder.instance { xml =>
760
- xml match {
761
- case Xml.Element(_, _, Chunk(Xml.Text(text), _*)) =>
762
- text.toIntOption.toRight(XmlError("Invalid number"))
763
- case _ => Left(XmlError("Expected number element"))
764
- }
765
- }
766
-
767
- // Map for covariance - decode to a wrapper type
768
- case class UserId(value: Int)
769
-
770
- val userIdDecoder: XmlDecoder[UserId] =
771
- numberDecoder.map(UserId(_))
772
- ```
773
-
774
- #### Error handling with decoders
775
-
776
- Handle decoding errors gracefully with fallback strategies:
777
-
778
- ```scala
779
- import zio.blocks.schema._
780
- import zio.blocks.schema.xml._
781
-
782
- case class Person(name: String, age: Int)
783
- object Person {
784
- implicit val schema: Schema[Person] = Schema.derived
785
- }
786
-
787
- def decodeWithFallback[A](
788
- xml: Xml,
789
- fallback: A
790
- )(implicit decoder: XmlDecoder[A]): A = {
791
- decoder.decode(xml).getOrElse(fallback)
792
- }
793
-
794
- val invalidXml = Xml.Element("Empty")
795
- val defaultPerson = Person("Unknown", 0)
796
- val result = decodeWithFallback(invalidXml, defaultPerson)
797
- // Person("Unknown", 0)
798
- ```
799
-
800
- #### Combining encoders and decoders
801
-
802
- Round-trip values by encoding and decoding:
803
-
804
- ```scala
805
- import zio.blocks.schema._
806
- import zio.blocks.schema.xml._
807
- import zio.blocks.schema.xml.syntax._
808
-
809
- case class Message(id: String, text: String)
810
- object Message {
811
- implicit val schema: Schema[Message] = Schema.derived
812
- }
813
-
814
- // Round-trip: encode then decode
815
- val message = Message("msg-1", "Hello")
816
- val encoded: Xml = message.toXml
817
- ```
818
-
819
- Decode the encoded value:
820
-
821
- ```scala
822
- val result: Either[XmlError, Message] =
823
- implicitly[XmlDecoder[Message]].decode(encoded)
824
- // result: Either[XmlError, Message] = Right(
825
- // Message(id = "msg-1", text = "Hello")
826
- // )
827
- ```
828
-
829
671
  ## Extension Syntax
830
672
 
831
673
  When a `Schema` is in scope, use convenient extension methods:
@@ -955,15 +797,15 @@ object Person {
955
797
  implicit val schema: Schema[Person] = Schema.derived
956
798
  }
957
799
 
958
- // Get the underlying binary codec
959
- val codec: XmlCodec[Person] = Schema[Person].derive(XmlCodecDeriver)
800
+ // Get the underlying XML codec
801
+ val codec: XmlCodec[Person] = Schema[Person].derive(XmlFormat)
960
802
 
961
803
  // Encode to Xml directly
962
804
  val person = Person("Alice", 30)
963
805
  val xml: Xml = codec.encodeValue(person)
964
806
 
965
807
  // Decode from Xml directly
966
- val decoded: Either[XmlError, Person] = codec.decodeValue(xml)
808
+ val decoded: Person = codec.decodeValue(xml)
967
809
  ```
968
810
 
969
811
  **XmlCodec supports all Schema types:**
@@ -977,7 +819,7 @@ val decoded: Either[XmlError, Person] = codec.decodeValue(xml)
977
819
 
978
820
  ## Error Handling
979
821
 
980
- All decoding operations return `Either[SchemaError, A]` or `Either[XmlError, A]`. The `XmlError` type provides detailed error information:
822
+ All decoding operations return `Either[SchemaError, A]` or `Either[SchemaError, A]`. The `SchemaError` type provides detailed error information:
981
823
 
982
824
  ```scala
983
825
  import zio.blocks.schema._
@@ -1002,12 +844,12 @@ result match {
1002
844
  }
1003
845
  ```
1004
846
 
1005
- `XmlError` provides detailed error information for debugging:
847
+ `SchemaError` provides detailed error information for debugging:
1006
848
 
1007
849
  ```scala
1008
850
  import zio.blocks.schema.xml._
1009
851
 
1010
- val error = XmlError("Parse failed")
852
+ val error = SchemaError("Parse failed")
1011
853
 
1012
854
  // Error message
1013
855
  val message: String = error.getMessage
@@ -1133,7 +975,7 @@ val xmlString = """
1133
975
  </library>
1134
976
  """
1135
977
 
1136
- val xml = XmlReader.read(xmlString).toOption.get
978
+ val xml = XmlReader.read(xmlString)
1137
979
 
1138
980
  // Find all books
1139
981
  val books = xml.select.get("library").get("books").get("book")