effect-qb 0.17.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/README.md +11 -1
  2. package/dist/index.js +9376 -0
  3. package/dist/mysql.js +4092 -2671
  4. package/dist/postgres/metadata.js +2589 -1402
  5. package/dist/postgres.js +3953 -3583
  6. package/dist/sqlite.js +5527 -4088
  7. package/dist/standard.js +9330 -0
  8. package/package.json +9 -4
  9. package/src/casing.ts +71 -0
  10. package/src/index.ts +2 -0
  11. package/src/internal/casing.ts +89 -0
  12. package/src/internal/coercion/rules.ts +13 -1
  13. package/src/internal/column-state.d.ts +3 -3
  14. package/src/internal/column-state.ts +24 -18
  15. package/src/internal/column.ts +52 -15
  16. package/src/internal/datatypes/define.ts +7 -1
  17. package/src/internal/datatypes/enrich.ts +23 -0
  18. package/src/internal/datatypes/lookup.ts +81 -25
  19. package/src/internal/datatypes/matrix.ts +903 -0
  20. package/src/internal/datatypes/shape.ts +2 -0
  21. package/src/internal/derived-table.ts +4 -36
  22. package/src/{mysql/internal/sql-expression-renderer.ts → internal/dialect-renderers/mysql.ts} +552 -361
  23. package/src/{postgres/internal/sql-expression-renderer.ts → internal/dialect-renderers/postgres.ts} +657 -400
  24. package/src/{sqlite/internal/sql-expression-renderer.ts → internal/dialect-renderers/sqlite.ts} +505 -347
  25. package/src/internal/dialect.ts +36 -1
  26. package/src/internal/dsl-mutation-runtime.ts +12 -162
  27. package/src/internal/dsl-plan-runtime.ts +10 -138
  28. package/src/internal/dsl-query-runtime.ts +5 -79
  29. package/src/internal/dsl-transaction-ddl-runtime.ts +41 -65
  30. package/src/internal/executor.ts +66 -49
  31. package/src/internal/grouping-key.ts +87 -20
  32. package/src/internal/implication-runtime.ts +1 -1
  33. package/src/internal/json/path-access.ts +351 -0
  34. package/src/internal/predicate/runtime.ts +3 -0
  35. package/src/internal/query.d.ts +39 -12
  36. package/src/internal/query.ts +65 -26
  37. package/src/internal/renderer.ts +26 -14
  38. package/src/internal/runtime/driver-value-mapping.ts +3 -3
  39. package/src/internal/runtime/normalize.ts +12 -5
  40. package/src/internal/runtime/schema.ts +28 -38
  41. package/src/internal/runtime/value.ts +20 -23
  42. package/src/internal/scalar.d.ts +1 -1
  43. package/src/internal/scalar.ts +8 -2
  44. package/src/internal/schema-derivation.d.ts +12 -61
  45. package/src/internal/schema-derivation.ts +95 -43
  46. package/src/internal/schema-expression.ts +2 -2
  47. package/src/internal/sql-expression-renderer.ts +19 -0
  48. package/src/internal/standard-dsl.ts +6978 -0
  49. package/src/internal/table-options.ts +126 -66
  50. package/src/internal/table.ts +819 -237
  51. package/src/mysql/column-extension.ts +3 -0
  52. package/src/mysql/column.ts +14 -15
  53. package/src/mysql/datatypes/index.ts +4 -2
  54. package/src/mysql/datatypes/spec.ts +6 -176
  55. package/src/mysql/errors/normalize.ts +0 -1
  56. package/src/mysql/executor.ts +11 -11
  57. package/src/mysql/function/temporal.ts +1 -1
  58. package/src/mysql/internal/dialect.ts +9 -4
  59. package/src/mysql/internal/dsl.ts +334 -170
  60. package/src/mysql/internal/renderer.ts +6 -2
  61. package/src/mysql/json.ts +7 -2
  62. package/src/mysql/query-extension.ts +16 -0
  63. package/src/mysql/renderer.ts +37 -3
  64. package/src/mysql/type.ts +60 -0
  65. package/src/mysql.ts +7 -13
  66. package/src/postgres/check.ts +1 -0
  67. package/src/postgres/column-extension.ts +28 -0
  68. package/src/postgres/column.ts +13 -19
  69. package/src/postgres/datatypes/index.d.ts +2 -1
  70. package/src/postgres/datatypes/index.ts +4 -2
  71. package/src/postgres/datatypes/spec.ts +6 -260
  72. package/src/postgres/errors/normalize.ts +0 -1
  73. package/src/postgres/executor.ts +11 -11
  74. package/src/postgres/foreign-key.ts +24 -0
  75. package/src/postgres/function/core.ts +1 -3
  76. package/src/postgres/function/index.ts +1 -17
  77. package/src/postgres/function/temporal.ts +1 -1
  78. package/src/postgres/index.ts +1 -0
  79. package/src/postgres/internal/dialect.ts +9 -4
  80. package/src/postgres/internal/dsl.ts +328 -179
  81. package/src/postgres/internal/renderer.ts +6 -2
  82. package/src/postgres/internal/schema-ddl.ts +22 -10
  83. package/src/postgres/internal/schema-model.ts +238 -7
  84. package/src/postgres/json-extension.ts +7 -0
  85. package/src/postgres/json.ts +762 -173
  86. package/src/postgres/jsonb.ts +37 -0
  87. package/src/postgres/primary-key.ts +24 -0
  88. package/src/postgres/query-extension.ts +2 -0
  89. package/src/postgres/renderer.ts +37 -3
  90. package/src/postgres/schema-management.ts +13 -13
  91. package/src/postgres/schema.ts +106 -15
  92. package/src/postgres/table.ts +205 -538
  93. package/src/postgres/type.ts +93 -10
  94. package/src/postgres/unique.ts +32 -0
  95. package/src/postgres.ts +20 -16
  96. package/src/sqlite/column-extension.ts +3 -0
  97. package/src/sqlite/column.ts +14 -15
  98. package/src/sqlite/datatypes/index.ts +4 -2
  99. package/src/sqlite/datatypes/spec.ts +6 -94
  100. package/src/sqlite/errors/normalize.ts +0 -1
  101. package/src/sqlite/executor.ts +11 -11
  102. package/src/sqlite/function/temporal.ts +1 -1
  103. package/src/sqlite/internal/dialect.ts +9 -4
  104. package/src/sqlite/internal/dsl.ts +307 -159
  105. package/src/sqlite/internal/renderer.ts +6 -2
  106. package/src/sqlite/json.ts +8 -2
  107. package/src/sqlite/query-extension.ts +2 -0
  108. package/src/sqlite/renderer.ts +37 -3
  109. package/src/sqlite/type.ts +40 -0
  110. package/src/sqlite.ts +7 -13
  111. package/src/standard/cast.ts +113 -0
  112. package/src/standard/check.ts +17 -0
  113. package/src/standard/column.ts +163 -0
  114. package/src/standard/datatypes/index.ts +83 -0
  115. package/src/standard/datatypes/spec.ts +12 -0
  116. package/src/standard/dialect.ts +40 -0
  117. package/src/standard/foreign-key.ts +37 -0
  118. package/src/standard/function/aggregate.ts +2 -0
  119. package/src/standard/function/core.ts +2 -0
  120. package/src/standard/function/index.ts +18 -0
  121. package/src/standard/function/string.ts +2 -0
  122. package/src/standard/function/temporal.ts +78 -0
  123. package/src/standard/function/window.ts +2 -0
  124. package/src/standard/index.ts +17 -0
  125. package/src/standard/internal/renderer.ts +45 -0
  126. package/src/standard/json.ts +883 -0
  127. package/src/standard/primary-key.ts +17 -0
  128. package/src/standard/query.ts +152 -0
  129. package/src/standard/renderer.ts +49 -0
  130. package/src/standard/table.ts +151 -0
  131. package/src/standard/unique.ts +17 -0
  132. package/src/standard.ts +32 -0
  133. package/src/internal/aggregation-validation.ts +0 -57
  134. package/src/internal/table.d.ts +0 -173
  135. package/src/mysql/table.ts +0 -183
  136. package/src/postgres/cast.ts +0 -45
  137. package/src/sqlite/table.ts +0 -183
@@ -0,0 +1,37 @@
1
+ import { jsonb } from "./json.js"
2
+
3
+ /** Postgres jsonb-only helpers for containment, mutation, wildcard paths, and SQL/JSON path predicates. */
4
+ export { jsonb }
5
+ export const key = jsonb.key
6
+ export const index = jsonb.index
7
+ export const wildcard = jsonb.wildcard
8
+ export const slice = jsonb.slice
9
+ export const descend = jsonb.descend
10
+ export const get = jsonb.get
11
+ export const access = jsonb.access
12
+ export const traverse = jsonb.traverse
13
+ export const text = jsonb.text
14
+ export const accessText = jsonb.accessText
15
+ export const traverseText = jsonb.traverseText
16
+ export const contains = jsonb.contains
17
+ export const containedBy = jsonb.containedBy
18
+ export const hasKey = jsonb.hasKey
19
+ export const keyExists = jsonb.keyExists
20
+ export const hasAnyKeys = jsonb.hasAnyKeys
21
+ export const hasAllKeys = jsonb.hasAllKeys
22
+ export const delete_ = jsonb.delete
23
+ export { delete_ as delete }
24
+ export const remove = jsonb.remove
25
+ export const set = jsonb.set
26
+ export const insert = jsonb.insert
27
+ export const concat = jsonb.concat
28
+ export const merge = jsonb.merge
29
+ export const buildObject = jsonb.buildObject
30
+ export const buildArray = jsonb.buildArray
31
+ export const toJsonb = jsonb.toJsonb
32
+ export const typeOf = jsonb.typeOf
33
+ export const length = jsonb.length
34
+ export const keys = jsonb.keys
35
+ export const stripNulls = jsonb.stripNulls
36
+ export const pathExists = jsonb.pathExists
37
+ export const pathMatch = jsonb.pathMatch
@@ -0,0 +1,24 @@
1
+ import * as BaseTable from "../internal/table.js"
2
+ import type { TableOptionSpec } from "../internal/table-options.js"
3
+
4
+ type PrimaryKeySpec = Extract<TableOptionSpec, { readonly kind: "primaryKey" }>
5
+
6
+ export const deferrable = <Spec extends PrimaryKeySpec, TableContext extends BaseTable.TableDefinition<any, any, any, "schema", any>>(
7
+ option: BaseTable.TableOption<Spec, TableContext>
8
+ ): BaseTable.TableOption<Spec & { readonly deferrable: true }, TableContext> =>
9
+ BaseTable.mapOption(option, (spec) => ({
10
+ ...spec,
11
+ deferrable: true
12
+ } as Spec & { readonly deferrable: true }))
13
+
14
+ export const initiallyDeferred = <Spec extends PrimaryKeySpec, TableContext extends BaseTable.TableDefinition<any, any, any, "schema", any>>(
15
+ option: BaseTable.TableOption<Spec, TableContext>
16
+ ): BaseTable.TableOption<Spec & {
17
+ readonly deferrable: true
18
+ readonly initiallyDeferred: true
19
+ }, TableContext> =>
20
+ BaseTable.mapOption(option, (spec) => ({
21
+ ...spec,
22
+ deferrable: true,
23
+ initiallyDeferred: true
24
+ } as Spec & { readonly deferrable: true; readonly initiallyDeferred: true }))
@@ -0,0 +1,2 @@
1
+ /** Postgres-only query helpers. Portable query builders are exported from the root package. */
2
+ export { distinctOn, generateSeries, onConflict } from "./query.js"
@@ -1,5 +1,9 @@
1
+ import { pipeArguments, type Pipeable } from "effect/Pipeable"
2
+
1
3
  import * as CoreRenderer from "../internal/renderer.js"
4
+ import * as Casing from "../internal/casing.js"
2
5
  import type * as Expression from "../internal/scalar.js"
6
+ import type { PostgresDatatypeFamily, PostgresDatatypeKind } from "./datatypes/spec.js"
3
7
  import { renderPostgresPlan } from "./internal/renderer.js"
4
8
 
5
9
  /** Postgres-specialized rendered query shape. */
@@ -7,18 +11,48 @@ export type RenderedQuery<Row> = CoreRenderer.RenderedQuery<Row, "postgres">
7
11
  /** Extracts the row type carried by a Postgres rendered query. */
8
12
  export type RowOf<Value extends RenderedQuery<any>> = CoreRenderer.RowOf<Value>
9
13
  /** Postgres-specialized renderer contract. */
10
- export type Renderer = CoreRenderer.Renderer<"postgres">
14
+ export type Renderer = CoreRenderer.Renderer<"postgres"> & Pipeable & {
15
+ readonly [Casing.TypeId]: Casing.State
16
+ readonly withCasing: (options: Casing.Options) => Renderer
17
+ }
18
+
19
+ export type ValueMappings = Expression.DriverValueMappingsFor<PostgresDatatypeKind, PostgresDatatypeFamily>
11
20
 
12
21
  export interface MakeOptions {
13
- readonly valueMappings?: Expression.DriverValueMappings
22
+ readonly valueMappings?: ValueMappings
23
+ }
24
+
25
+ interface RendererState extends MakeOptions {
26
+ readonly casing?: Casing.Options
14
27
  }
15
28
 
16
29
  export { TypeId } from "../internal/renderer.js"
17
30
  export type { Projection } from "../internal/renderer.js"
18
31
 
32
+ const RendererProto = {
33
+ pipe(this: Pipeable) {
34
+ return pipeArguments(this, arguments)
35
+ }
36
+ }
37
+
38
+ /** Creates the built-in Postgres renderer. */
39
+ const makeWithState = (state: RendererState = {}): Renderer => {
40
+ const renderer = CoreRenderer.makeTrusted("postgres", (plan) => renderPostgresPlan(plan, state))
41
+ return Object.assign(Object.create(RendererProto), renderer, {
42
+ [Casing.TypeId]: {
43
+ casing: state.casing
44
+ },
45
+ withCasing: (override: Casing.Options) =>
46
+ makeWithState({
47
+ ...state,
48
+ casing: Casing.merge(state.casing, override)
49
+ })
50
+ }) as Renderer
51
+ }
52
+
19
53
  /** Creates the built-in Postgres renderer. */
20
54
  export const make = (options: MakeOptions = {}): Renderer =>
21
- CoreRenderer.make("postgres", (plan) => renderPostgresPlan(plan, options))
55
+ makeWithState({ valueMappings: options.valueMappings })
22
56
 
23
57
  /** Shared built-in Postgres renderer instance. */
24
58
  export const postgres = make()
@@ -3,6 +3,7 @@ import { pipeArguments, type Pipeable } from "effect/Pipeable"
3
3
 
4
4
  import type * as Expression from "../internal/scalar.js"
5
5
  import { makeColumnDefinition, type ColumnDefinition } from "../internal/column-state.js"
6
+ import type { NonEmptyStringInput } from "../internal/table-options.js"
6
7
 
7
8
  export const EnumTypeId: unique symbol = Symbol.for("effect-qb/SchemaManagement/Enum")
8
9
  export const SequenceTypeId: unique symbol = Symbol.for("effect-qb/SchemaManagement/Sequence")
@@ -121,7 +122,7 @@ const renderQualifiedTypeName = (
121
122
  : `${renderIdentifier(schemaName)}.${renderIdentifier(name)}`
122
123
 
123
124
  const EnumProto = {
124
- pipe(this: unknown) {
125
+ pipe(this: Pipeable) {
125
126
  return pipeArguments(this, arguments)
126
127
  },
127
128
  qualifiedName(this: EnumDefinition) {
@@ -137,9 +138,8 @@ const EnumProto = {
137
138
  }
138
139
  },
139
140
  column(this: EnumDefinition) {
140
- const values = this.values.map((value) => Schema.Literal(value)) as unknown as readonly [Schema.Schema.Any, ...Schema.Schema.Any[]]
141
141
  return makeColumnDefinition(
142
- values.length === 1 ? values[0]! : Schema.Union(...values),
142
+ Schema.Literals(this.values),
143
143
  {
144
144
  dbType: this.type(),
145
145
  nullable: false,
@@ -161,7 +161,7 @@ const EnumProto = {
161
161
  }
162
162
 
163
163
  const SequenceProto = {
164
- pipe(this: unknown) {
164
+ pipe(this: Pipeable) {
165
165
  return pipeArguments(this, arguments)
166
166
  },
167
167
  qualifiedName(this: SequenceDefinition) {
@@ -212,7 +212,7 @@ export function enumType<
212
212
  Name extends string,
213
213
  const Values extends readonly [string, ...string[]]
214
214
  >(
215
- name: Name,
215
+ name: NonEmptyStringInput<Name>,
216
216
  values: Values
217
217
  ): EnumDefinition<Name, Values, undefined>
218
218
  export function enumType<
@@ -220,9 +220,9 @@ export function enumType<
220
220
  const Values extends readonly [string, ...string[]],
221
221
  SchemaName extends string
222
222
  >(
223
- name: Name,
223
+ name: NonEmptyStringInput<Name>,
224
224
  values: Values,
225
- schemaName: SchemaName
225
+ schemaName: NonEmptyStringInput<SchemaName>
226
226
  ): EnumDefinition<Name, Values, SchemaName>
227
227
  export function enumType(
228
228
  name: string,
@@ -243,11 +243,11 @@ export function enumType(
243
243
  }
244
244
 
245
245
  export function sequence<Name extends string>(
246
- name: Name
246
+ name: NonEmptyStringInput<Name>
247
247
  ): SequenceDefinition<Name, undefined>
248
248
  export function sequence<Name extends string, SchemaName extends string>(
249
- name: Name,
250
- schemaName: SchemaName
249
+ name: NonEmptyStringInput<Name>,
250
+ schemaName: NonEmptyStringInput<SchemaName>
251
251
  ): SequenceDefinition<Name, SchemaName>
252
252
  export function sequence(
253
253
  name: string,
@@ -265,21 +265,21 @@ export function sequence(
265
265
  }
266
266
 
267
267
  export const schema = <SchemaName extends string>(
268
- schemaName: SchemaName
268
+ schemaName: NonEmptyStringInput<SchemaName>
269
269
  ) => ({
270
270
  schemaName,
271
271
  enumType: <
272
272
  Name extends string,
273
273
  const Values extends readonly [string, ...string[]]
274
274
  >(
275
- name: Name,
275
+ name: NonEmptyStringInput<Name>,
276
276
  values: Values
277
277
  ): EnumDefinition<Name, Values, SchemaName> =>
278
278
  enumType(name, values, schemaName) as EnumDefinition<Name, Values, SchemaName>,
279
279
  sequence: <
280
280
  Name extends string
281
281
  >(
282
- name: Name
282
+ name: NonEmptyStringInput<Name>
283
283
  ): SequenceDefinition<Name, SchemaName> =>
284
284
  sequence(name, schemaName) as SequenceDefinition<Name, SchemaName>
285
285
  })
@@ -1,35 +1,126 @@
1
- import { schema as makeTableSchemaNamespace, type TableSchemaNamespace } from "./table.js"
1
+ import { pipeArguments, type Pipeable } from "effect/Pipeable"
2
+
3
+ import { ColumnTypeId } from "../internal/column-state.js"
4
+ import type { AnyColumnDefinition } from "../internal/column-state.js"
5
+ import * as Casing from "../internal/casing.js"
6
+ import * as BaseTable from "../internal/table.js"
7
+ import type { TableFieldMap } from "../internal/schema-derivation.js"
8
+ import { make as makeTable } from "../standard/table.js"
2
9
  import { enumType, sequence, type EnumDefinition, type SequenceDefinition } from "./schema-management.js"
3
10
 
4
- export type SchemaNamespace<SchemaName extends string> = TableSchemaNamespace<SchemaName> & {
11
+ type InlinePrimaryKeyKeys<Fields extends TableFieldMap> = Extract<{
12
+ [K in keyof Fields]: Fields[K]["metadata"]["primaryKey"] extends true ? K : never
13
+ }[keyof Fields], string>
14
+
15
+ type FieldDialect<Column extends AnyColumnDefinition> = Column[typeof ColumnTypeId]["dbType"]["dialect"]
16
+
17
+ type ValidatePostgresSchemaFields<Fields extends TableFieldMap> = {
18
+ [K in keyof Fields]: Exclude<FieldDialect<Fields[K]>, "standard" | "postgres"> extends never ? Fields[K] : never
19
+ }
20
+
21
+ type ApplySchemaTableOptions<
22
+ Name extends string,
23
+ Fields extends TableFieldMap,
24
+ PrimaryKeyColumns extends keyof Fields & string,
25
+ SchemaName extends string,
26
+ Options extends BaseTable.DeclaredTableOptions
27
+ > = BaseTable.ApplyDeclaredOptions<
28
+ BaseTable.TableDefinition<Name, Fields, PrimaryKeyColumns, "schema", SchemaName>,
29
+ Options
30
+ > extends BaseTable.TableDefinition<
31
+ any,
32
+ any,
33
+ infer AppliedPrimaryKeyColumns extends keyof Fields & string,
34
+ "schema",
35
+ any,
36
+ infer AppliedConflictArbiters extends BaseTable.ConflictArbiter
37
+ >
38
+ ? BaseTable.TableDefinition<Name, Fields, AppliedPrimaryKeyColumns, "schema", SchemaName, AppliedConflictArbiters>
39
+ : BaseTable.TableDefinition<Name, Fields, PrimaryKeyColumns, "schema", SchemaName>
40
+
41
+ type ValidatePostgresSchemaTable<
42
+ Table extends BaseTable.TableDefinition<any, any, any, any, any, any>
43
+ > = Table extends BaseTable.TableDefinition<any, infer Fields extends TableFieldMap, any, any, any, any>
44
+ ? BaseTable.TableDefinition<any, Fields & ValidatePostgresSchemaFields<Fields>, any, any, any, any>
45
+ : never
46
+
47
+ export type SchemaNamespace<SchemaName extends string> = Pipeable & {
48
+ readonly schemaName: SchemaName
49
+ readonly table: <
50
+ Name extends string,
51
+ Fields extends TableFieldMap,
52
+ const Options extends BaseTable.DeclaredTableOptions,
53
+ PrimaryKeyColumns extends keyof Fields & string = InlinePrimaryKeyKeys<Fields>
54
+ >(
55
+ name: BaseTable.NonEmptyStringInput<Name>,
56
+ fields: Fields & BaseTable.NonEmptyFieldMap<Fields> & ValidatePostgresSchemaFields<Fields>,
57
+ ...options: Options & BaseTable.ValidateDeclaredOptions<BaseTable.TableDefinition<Name, Fields, PrimaryKeyColumns, "schema", SchemaName>, Options>
58
+ ) => ApplySchemaTableOptions<Name, Fields, PrimaryKeyColumns, SchemaName, Options>
5
59
  readonly enum: <
6
60
  Name extends string,
7
61
  const Values extends readonly [string, ...string[]]
8
62
  >(
9
- name: Name,
63
+ name: BaseTable.NonEmptyStringInput<Name>,
10
64
  values: Values
11
65
  ) => EnumDefinition<Name, Values, SchemaName>
12
66
  readonly sequence: <
13
67
  Name extends string
14
68
  >(
15
- name: Name
69
+ name: BaseTable.NonEmptyStringInput<Name>
16
70
  ) => SequenceDefinition<Name, SchemaName>
71
+ readonly withSchema: <
72
+ Table extends BaseTable.TableDefinition<any, any, any, any, any, any>
73
+ >(table: Table & ValidatePostgresSchemaTable<Table>) => BaseTable.TableDefinition<
74
+ Table[typeof BaseTable.TypeId]["name"],
75
+ Table[typeof BaseTable.TypeId]["fields"],
76
+ Table[typeof BaseTable.TypeId]["primaryKey"][number],
77
+ Table[typeof BaseTable.TypeId]["kind"],
78
+ SchemaName,
79
+ Table[typeof BaseTable.TypeId]["conflictArbiters"][number]
80
+ >
81
+ readonly [Casing.TypeId]: Casing.State
82
+ readonly withCasing: (options: Casing.Options) => SchemaNamespace<SchemaName>
17
83
  }
18
84
 
19
- export const schema = <SchemaName extends string>(
20
- schemaName: SchemaName
21
- ): SchemaNamespace<SchemaName> => ({
22
- ...makeTableSchemaNamespace(schemaName),
23
- enum: <
85
+ const SchemaProto = {
86
+ pipe(this: Pipeable) {
87
+ return pipeArguments(this, arguments)
88
+ }
89
+ }
90
+
91
+ export const make = <SchemaName extends string>(
92
+ schemaName: BaseTable.NonEmptyStringInput<SchemaName>,
93
+ options: { readonly casing?: Casing.Options } = {}
94
+ ): SchemaNamespace<SchemaName> => {
95
+ const physicalSchemaName = Casing.applyCategory(options.casing, "schemas", schemaName)
96
+ const namespace = Object.create(SchemaProto)
97
+ namespace.schemaName = schemaName
98
+ namespace.table = ((name: string, fields: any, ...declaredOptions: any[]) => {
99
+ let table = makeTable(name, fields, schemaName)
100
+ for (const option of declaredOptions) {
101
+ table = option(table)
102
+ }
103
+ return options.casing === undefined ? table : BaseTable.withCasing(table as any, options.casing)
104
+ }) as SchemaNamespace<SchemaName>["table"]
105
+ namespace.enum = <
24
106
  Name extends string,
25
107
  const Values extends readonly [string, ...string[]]
26
108
  >(
27
- name: Name,
109
+ name: BaseTable.NonEmptyStringInput<Name>,
28
110
  values: Values
29
- ) => enumType(name, values, schemaName) as EnumDefinition<Name, Values, SchemaName>,
30
- sequence: <
111
+ ) => enumType(Casing.applyCategory(options.casing, "types", name), values, physicalSchemaName) as EnumDefinition<Name, Values, SchemaName>
112
+ namespace.sequence = <
31
113
  Name extends string
32
114
  >(
33
- name: Name
34
- ) => sequence(name, schemaName) as SequenceDefinition<Name, SchemaName>
35
- })
115
+ name: BaseTable.NonEmptyStringInput<Name>
116
+ ) => sequence(Casing.applyCategory(options.casing, "sequences", name), physicalSchemaName) as SequenceDefinition<Name, SchemaName>
117
+ namespace.withSchema = <
118
+ Table extends BaseTable.TableDefinition<any, any, any, any, any, any>
119
+ >(table: Table & ValidatePostgresSchemaTable<Table>) => BaseTable.withSchema(table, schemaName, options.casing)
120
+ namespace[Casing.TypeId] = {
121
+ casing: options.casing
122
+ }
123
+ namespace.withCasing = (override: Casing.Options) =>
124
+ make(schemaName, { casing: Casing.merge(options.casing, override) })
125
+ return namespace as SchemaNamespace<SchemaName>
126
+ }