@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,62 @@
1
+ ---
2
+ id: sql-logger
3
+ title: "SqlLogger"
4
+ description: "Reference for SqlLogger, the callback interface for observing SQL execution."
5
+ keywords:
6
+ - "SqlLogger observability"
7
+ - "SQL execution logging"
8
+ - "SuccessEvent ErrorEvent"
9
+ ---
10
+
11
+ `SqlLogger` is a callback interface that reports SQL execution events. Every statement calls either `onSuccess` or `onError` with details about the execution: rendered SQL, bound parameters, duration, and row count.
12
+
13
+ Key points:
14
+
15
+ - **Synchronous** — Callbacks run on the JDBC thread immediately after statement completion. Keep implementations fast; use a background thread for heavy I/O.
16
+ - **SqlLogger.noop** — Pre-built no-op instance that discards all events. Default when no custom logger is configured.
17
+
18
+ ## Core API
19
+
20
+ ```scala
21
+ trait SqlLogger {
22
+ def onSuccess(event: SqlLogger.SuccessEvent): Unit
23
+ def onError(event: SqlLogger.ErrorEvent): Unit
24
+ }
25
+ ```
26
+
27
+ ## Usage
28
+
29
+ Implement the trait to observe SQL execution:
30
+
31
+ ```scala
32
+ import zio.blocks.sql.SqlLogger
33
+
34
+ val myLogger: SqlLogger = new SqlLogger {
35
+ def onSuccess(event: SqlLogger.SuccessEvent): Unit =
36
+ println(s"OK (${event.duration.toMillis}ms, ${event.rowCount} rows): ${event.sql}")
37
+
38
+ def onError(event: SqlLogger.ErrorEvent): Unit =
39
+ println(s"FAIL: ${event.error.getMessage}")
40
+ }
41
+ // myLogger: SqlLogger = repl.MdocSession$MdocApp0$$anon$1@1b9203b8
42
+ ```
43
+
44
+ Pass the logger when creating a `JdbcTransactor`:
45
+
46
+ ```scala
47
+ import zio.blocks.sql._
48
+
49
+ val dataSource: javax.sql.DataSource = ???
50
+ val myLogger: SqlLogger = SqlLogger.noop
51
+
52
+ val tx = new JdbcTransactor(() => dataSource.getConnection(), SqlDialect.PostgreSQL, myLogger)
53
+ ```
54
+
55
+ Use the predefined no-op logger when you don't need logging:
56
+
57
+ ```scala
58
+ import zio.blocks.sql._
59
+
60
+ val dataSource: javax.sql.DataSource = ???
61
+ val tx: JdbcTransactor = JdbcTransactor.fromDataSource(dataSource, SqlDialect.PostgreSQL)
62
+ ```
@@ -0,0 +1,70 @@
1
+ ---
2
+ id: sql-name-mapper
3
+ title: "SqlNameMapper"
4
+ description: "Reference for SqlNameMapper, the interface for mapping Scala field names to SQL column names."
5
+ keywords:
6
+ - "SqlNameMapper Column Naming"
7
+ - "SnakeCase Conversion"
8
+ - "Identity Passthrough"
9
+ - "Custom Column Naming"
10
+ ---
11
+
12
+ `SqlNameMapper` converts Scala field names to SQL column names. Three implementations are built in: `SnakeCase` (default, converts `firstName` to `first_name`), `Identity` (no change), and `Custom` (arbitrary function).
13
+
14
+ ## Core API
15
+
16
+ The simplified structural shape of `SqlNameMapper` is:
17
+
18
+ ```scala
19
+ sealed trait SqlNameMapper extends (String => String)
20
+
21
+ object SqlNameMapper {
22
+ case object SnakeCase extends SqlNameMapper
23
+ case object Identity extends SqlNameMapper
24
+ final case class Custom(f: String => String) extends SqlNameMapper
25
+ }
26
+ ```
27
+
28
+ ## Usage
29
+
30
+ Call a mapper like a function:
31
+
32
+ ```scala
33
+ import zio.blocks.sql.SqlNameMapper
34
+
35
+ SqlNameMapper.SnakeCase("firstName")
36
+ // res1: String = "first_name"
37
+ SqlNameMapper.SnakeCase("userID")
38
+ // res2: String = "user_id"
39
+ SqlNameMapper.Identity("firstName")
40
+ // res3: String = "firstName"
41
+
42
+ val upper = SqlNameMapper.Custom(_.toUpperCase)
43
+ // upper: Custom = Custom(
44
+ // repl.MdocSession$MdocApp0$$Lambda$20339/0x00007f2996f5b000@1850c853
45
+ // )
46
+ upper("firstName")
47
+ // res4: String = "FIRSTNAME"
48
+ ```
49
+
50
+ Use a custom mapper when deriving codecs:
51
+
52
+ ```scala
53
+ import zio.blocks.sql.{DbCodec, DbCodecDeriver, SqlNameMapper}
54
+ import zio.blocks.schema.Schema
55
+
56
+ case class Order(orderId: Int, totalAmount: BigDecimal)
57
+ object Order { given schema: Schema[Order] = Schema.derived }
58
+
59
+ // Use UPPERCASE column names instead of snake_case
60
+ val upperDeriver = DbCodecDeriver.withColumnNameMapper(SqlNameMapper.Custom(_.toUpperCase))
61
+ // upperDeriver: DbCodecDeriver = zio.blocks.sql.DbCodecDeriver@646cca72
62
+ val codec: DbCodec[Order] = Order.schema.deriving(upperDeriver).derive
63
+ // codec: DbCodec[Order] = zio.blocks.sql.DbCodecDeriver$$anon$20@596dacd
64
+ codec.columns
65
+ // res6: IndexedSeq[String] = Vector("ORDERID", "TOTALAMOUNT")
66
+ ```
67
+
68
+ ## Key Points
69
+
70
+ For full control over individual field names, use `@Modifier.rename("column_name")` on specific fields without changing the global mapper. It takes precedence over any `SqlNameMapper` in use.
@@ -0,0 +1,134 @@
1
+ ---
2
+ id: table-metadata
3
+ title: "TableMetadata"
4
+ description: "Reference for TableMetadata, the utility for deriving column metadata from a Schema."
5
+ keywords:
6
+ - "Table Metadata"
7
+ - "Column Metadata"
8
+ - "Table Naming Policy"
9
+ - "Schema DDL Column Derivation"
10
+ ---
11
+
12
+ `TableMetadata` derives column metadata from a `Schema`. It returns a list of `ColumnMeta` instances, each describing a column's name, type, and nullability. `TableNamingPolicy` controls how Scala type names become table names.
13
+
14
+ ## Core API
15
+
16
+ ```scala
17
+ object TableMetadata {
18
+ def columnsFor[A](
19
+ schema: Schema[A],
20
+ columnNameMapper: SqlNameMapper = SqlNameMapper.SnakeCase
21
+ ): IndexedSeq[ColumnMeta]
22
+ }
23
+
24
+ final case class ColumnMeta(name: String, dbValue: DbValue, nullable: Boolean)
25
+
26
+ sealed trait TableNamingPolicy {
27
+ def defaultName(typeName: String): String
28
+ }
29
+
30
+ object TableNamingPolicy {
31
+ case object Singular extends TableNamingPolicy
32
+ case object Plural extends TableNamingPolicy
33
+ final case class Custom(f: String => String) extends TableNamingPolicy
34
+ }
35
+ ```
36
+
37
+ ## Usage
38
+
39
+ Derive column metadata from a schema:
40
+
41
+ ```scala
42
+ import zio.blocks.sql.{TableMetadata, SqlDialect}
43
+ import zio.blocks.schema.Schema
44
+
45
+ case class Product(id: Int, name: String, price: Option[BigDecimal])
46
+ object Product { given schema: Schema[Product] = Schema.derived }
47
+
48
+ val cols = TableMetadata.columnsFor(Product.schema)
49
+ // cols: IndexedSeq[ColumnMeta] = Vector(
50
+ // ColumnMeta(name = "id", dbValue = DbInt(0), nullable = false),
51
+ // ColumnMeta(name = "name", dbValue = DbString(""), nullable = false),
52
+ // ColumnMeta(name = "price", dbValue = DbBigDecimal(0), nullable = true)
53
+ // )
54
+ cols
55
+ // res1: IndexedSeq[ColumnMeta] = Vector(
56
+ // ColumnMeta(name = "id", dbValue = DbInt(0), nullable = false),
57
+ // ColumnMeta(name = "name", dbValue = DbString(""), nullable = false),
58
+ // ColumnMeta(name = "price", dbValue = DbBigDecimal(0), nullable = true)
59
+ // )
60
+
61
+ cols.map(_.name)
62
+ // res2: IndexedSeq[String] = Vector("id", "name", "price")
63
+ cols.map(_.nullable)
64
+ // res3: IndexedSeq[Boolean] = Vector(false, false, true)
65
+ ```
66
+
67
+ Use the column metadata to get DDL types:
68
+
69
+ ```scala
70
+ cols.map(col => SqlDialect.PostgreSQL.typeName(col.dbValue))
71
+ // res4: IndexedSeq[String] = Vector("INTEGER", "TEXT", "NUMERIC")
72
+ ```
73
+
74
+ Control table naming when deriving a Table:
75
+
76
+ ```scala
77
+ import zio.blocks.sql.{Table, TableNamingPolicy}
78
+
79
+ // Singular table name (default)
80
+ val table1 = Table.derived[Product]
81
+ // table1: Table[Product] = Table(
82
+ // name = "product",
83
+ // codec = zio.blocks.sql.DbCodecDeriver$$anon$20@40f5588b,
84
+ // columnsMeta = Vector(
85
+ // ColumnMeta(name = "id", dbValue = DbInt(0), nullable = false),
86
+ // ColumnMeta(name = "name", dbValue = DbString(""), nullable = false),
87
+ // ColumnMeta(name = "price", dbValue = DbBigDecimal(0), nullable = true)
88
+ // )
89
+ // )
90
+ table1.name
91
+ // res5: String = "product"
92
+
93
+ // Plural table name
94
+ val table2 = Table.derived[Product](TableNamingPolicy.Plural)
95
+ // table2: Table[Product] = Table(
96
+ // name = "products",
97
+ // codec = zio.blocks.sql.DbCodecDeriver$$anon$20@13590a4,
98
+ // columnsMeta = Vector(
99
+ // ColumnMeta(name = "id", dbValue = DbInt(0), nullable = false),
100
+ // ColumnMeta(name = "name", dbValue = DbString(""), nullable = false),
101
+ // ColumnMeta(name = "price", dbValue = DbBigDecimal(0), nullable = true)
102
+ // )
103
+ // )
104
+ table2.name
105
+ // res6: String = "products"
106
+
107
+ // Custom naming
108
+ val table3 = Table.derived[Product](TableNamingPolicy.Custom("t_" + _))
109
+ // table3: Table[Product] = Table(
110
+ // name = "t_Product",
111
+ // codec = zio.blocks.sql.DbCodecDeriver$$anon$20@2fa45824,
112
+ // columnsMeta = Vector(
113
+ // ColumnMeta(name = "id", dbValue = DbInt(0), nullable = false),
114
+ // ColumnMeta(name = "name", dbValue = DbString(""), nullable = false),
115
+ // ColumnMeta(name = "price", dbValue = DbBigDecimal(0), nullable = true)
116
+ // )
117
+ // )
118
+ table3.name
119
+ // res7: String = "t_Product"
120
+ ```
121
+
122
+ ## Key Points
123
+
124
+ **`columnsFor`** — Walks a schema's structure and returns metadata for each column, respecting `@Modifier.transient` (skip field), `@Modifier.rename` (override name), and `Option[A]` / `Maybe[A]` (mark nullable).
125
+
126
+ **ColumnMeta** — Holds the column name, a representative `DbValue` for type inference, and a nullable flag. The actual value in `dbValue` doesn't matter—only its variant is used by `SqlDialect#typeName`.
127
+
128
+ **TableNamingPolicy** — Controls default table naming: `Singular` converts `"UserAccount"` to `"user_account"`, `Plural` to `"user_accounts"`, `Custom(f)` applies function `f` directly.
129
+
130
+ ## How It Works
131
+
132
+ `Table.derived` calls `columnsFor` to extract column metadata from the schema. For each `ColumnMeta`, the dialect's `typeName` method is called to get the SQL type string. The metadata tracks which columns are nullable based on `Option[A]` or `Maybe[A]` types. Fields annotated with `@Modifier.rename` use their explicit name instead of the mapper.
133
+
134
+ For how Table uses this metadata, see [Table](./table.md). For DDL generation, see [Ddl](./ddl.md).