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.
- package/README.md +11 -1
- package/dist/index.js +9376 -0
- package/dist/mysql.js +4092 -2671
- package/dist/postgres/metadata.js +2589 -1402
- package/dist/postgres.js +3953 -3583
- package/dist/sqlite.js +5527 -4088
- package/dist/standard.js +9330 -0
- package/package.json +9 -4
- package/src/casing.ts +71 -0
- package/src/index.ts +2 -0
- package/src/internal/casing.ts +89 -0
- package/src/internal/coercion/rules.ts +13 -1
- package/src/internal/column-state.d.ts +3 -3
- package/src/internal/column-state.ts +24 -18
- package/src/internal/column.ts +52 -15
- package/src/internal/datatypes/define.ts +7 -1
- package/src/internal/datatypes/enrich.ts +23 -0
- package/src/internal/datatypes/lookup.ts +81 -25
- package/src/internal/datatypes/matrix.ts +903 -0
- package/src/internal/datatypes/shape.ts +2 -0
- package/src/internal/derived-table.ts +4 -36
- package/src/{mysql/internal/sql-expression-renderer.ts → internal/dialect-renderers/mysql.ts} +552 -361
- package/src/{postgres/internal/sql-expression-renderer.ts → internal/dialect-renderers/postgres.ts} +657 -400
- package/src/{sqlite/internal/sql-expression-renderer.ts → internal/dialect-renderers/sqlite.ts} +505 -347
- package/src/internal/dialect.ts +36 -1
- package/src/internal/dsl-mutation-runtime.ts +12 -162
- package/src/internal/dsl-plan-runtime.ts +10 -138
- package/src/internal/dsl-query-runtime.ts +5 -79
- package/src/internal/dsl-transaction-ddl-runtime.ts +41 -65
- package/src/internal/executor.ts +66 -49
- package/src/internal/grouping-key.ts +87 -20
- package/src/internal/implication-runtime.ts +1 -1
- package/src/internal/json/path-access.ts +351 -0
- package/src/internal/predicate/runtime.ts +3 -0
- package/src/internal/query.d.ts +39 -12
- package/src/internal/query.ts +65 -26
- package/src/internal/renderer.ts +26 -14
- package/src/internal/runtime/driver-value-mapping.ts +3 -3
- package/src/internal/runtime/normalize.ts +12 -5
- package/src/internal/runtime/schema.ts +28 -38
- package/src/internal/runtime/value.ts +20 -23
- package/src/internal/scalar.d.ts +1 -1
- package/src/internal/scalar.ts +8 -2
- package/src/internal/schema-derivation.d.ts +12 -61
- package/src/internal/schema-derivation.ts +95 -43
- package/src/internal/schema-expression.ts +2 -2
- package/src/internal/sql-expression-renderer.ts +19 -0
- package/src/internal/standard-dsl.ts +6978 -0
- package/src/internal/table-options.ts +126 -66
- package/src/internal/table.ts +819 -237
- package/src/mysql/column-extension.ts +3 -0
- package/src/mysql/column.ts +14 -15
- package/src/mysql/datatypes/index.ts +4 -2
- package/src/mysql/datatypes/spec.ts +6 -176
- package/src/mysql/errors/normalize.ts +0 -1
- package/src/mysql/executor.ts +11 -11
- package/src/mysql/function/temporal.ts +1 -1
- package/src/mysql/internal/dialect.ts +9 -4
- package/src/mysql/internal/dsl.ts +334 -170
- package/src/mysql/internal/renderer.ts +6 -2
- package/src/mysql/json.ts +7 -2
- package/src/mysql/query-extension.ts +16 -0
- package/src/mysql/renderer.ts +37 -3
- package/src/mysql/type.ts +60 -0
- package/src/mysql.ts +7 -13
- package/src/postgres/check.ts +1 -0
- package/src/postgres/column-extension.ts +28 -0
- package/src/postgres/column.ts +13 -19
- package/src/postgres/datatypes/index.d.ts +2 -1
- package/src/postgres/datatypes/index.ts +4 -2
- package/src/postgres/datatypes/spec.ts +6 -260
- package/src/postgres/errors/normalize.ts +0 -1
- package/src/postgres/executor.ts +11 -11
- package/src/postgres/foreign-key.ts +24 -0
- package/src/postgres/function/core.ts +1 -3
- package/src/postgres/function/index.ts +1 -17
- package/src/postgres/function/temporal.ts +1 -1
- package/src/postgres/index.ts +1 -0
- package/src/postgres/internal/dialect.ts +9 -4
- package/src/postgres/internal/dsl.ts +328 -179
- package/src/postgres/internal/renderer.ts +6 -2
- package/src/postgres/internal/schema-ddl.ts +22 -10
- package/src/postgres/internal/schema-model.ts +238 -7
- package/src/postgres/json-extension.ts +7 -0
- package/src/postgres/json.ts +762 -173
- package/src/postgres/jsonb.ts +37 -0
- package/src/postgres/primary-key.ts +24 -0
- package/src/postgres/query-extension.ts +2 -0
- package/src/postgres/renderer.ts +37 -3
- package/src/postgres/schema-management.ts +13 -13
- package/src/postgres/schema.ts +106 -15
- package/src/postgres/table.ts +205 -538
- package/src/postgres/type.ts +93 -10
- package/src/postgres/unique.ts +32 -0
- package/src/postgres.ts +20 -16
- package/src/sqlite/column-extension.ts +3 -0
- package/src/sqlite/column.ts +14 -15
- package/src/sqlite/datatypes/index.ts +4 -2
- package/src/sqlite/datatypes/spec.ts +6 -94
- package/src/sqlite/errors/normalize.ts +0 -1
- package/src/sqlite/executor.ts +11 -11
- package/src/sqlite/function/temporal.ts +1 -1
- package/src/sqlite/internal/dialect.ts +9 -4
- package/src/sqlite/internal/dsl.ts +307 -159
- package/src/sqlite/internal/renderer.ts +6 -2
- package/src/sqlite/json.ts +8 -2
- package/src/sqlite/query-extension.ts +2 -0
- package/src/sqlite/renderer.ts +37 -3
- package/src/sqlite/type.ts +40 -0
- package/src/sqlite.ts +7 -13
- package/src/standard/cast.ts +113 -0
- package/src/standard/check.ts +17 -0
- package/src/standard/column.ts +163 -0
- package/src/standard/datatypes/index.ts +83 -0
- package/src/standard/datatypes/spec.ts +12 -0
- package/src/standard/dialect.ts +40 -0
- package/src/standard/foreign-key.ts +37 -0
- package/src/standard/function/aggregate.ts +2 -0
- package/src/standard/function/core.ts +2 -0
- package/src/standard/function/index.ts +18 -0
- package/src/standard/function/string.ts +2 -0
- package/src/standard/function/temporal.ts +78 -0
- package/src/standard/function/window.ts +2 -0
- package/src/standard/index.ts +17 -0
- package/src/standard/internal/renderer.ts +45 -0
- package/src/standard/json.ts +883 -0
- package/src/standard/primary-key.ts +17 -0
- package/src/standard/query.ts +152 -0
- package/src/standard/renderer.ts +49 -0
- package/src/standard/table.ts +151 -0
- package/src/standard/unique.ts +17 -0
- package/src/standard.ts +32 -0
- package/src/internal/aggregation-validation.ts +0 -57
- package/src/internal/table.d.ts +0 -173
- package/src/mysql/table.ts +0 -183
- package/src/postgres/cast.ts +0 -45
- 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 }))
|
package/src/postgres/renderer.ts
CHANGED
|
@@ -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?:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
})
|
package/src/postgres/schema.ts
CHANGED
|
@@ -1,35 +1,126 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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,
|
|
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,
|
|
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
|
+
}
|