effect-qb 4.0.0-beta.66 → 4.0.0-beta.92
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 +5 -2
- package/dist/index.js +9373 -0
- package/dist/mysql.js +3917 -2572
- package/dist/postgres/metadata.js +2491 -1373
- package/dist/postgres.js +5450 -5155
- package/dist/sqlite.js +6891 -5528
- package/dist/standard.js +9327 -0
- package/package.json +9 -2
- 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.ts +21 -15
- package/src/internal/column.ts +44 -7
- 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 +35 -0
- 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 +14 -16
- 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 +38 -11
- package/src/internal/query.ts +64 -25
- package/src/internal/renderer.ts +26 -14
- package/src/internal/runtime/normalize.ts +12 -5
- package/src/internal/scalar.ts +7 -1
- package/src/internal/schema-derivation.d.ts +7 -7
- package/src/internal/schema-derivation.ts +9 -9
- package/src/internal/schema-expression.ts +2 -2
- package/src/internal/sql-expression-renderer.ts +19 -0
- package/src/internal/standard-dsl.ts +6975 -0
- package/src/internal/table-options.ts +126 -66
- package/src/internal/table.ts +652 -219
- package/src/mysql/column-extension.ts +3 -0
- package/src/mysql/column.ts +8 -9
- package/src/mysql/datatypes/index.ts +4 -2
- package/src/mysql/datatypes/spec.ts +6 -176
- package/src/mysql/executor.ts +7 -7
- package/src/mysql/internal/dialect.ts +9 -4
- package/src/mysql/internal/dsl.ts +309 -154
- 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 +2 -8
- 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/executor.ts +7 -7
- 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/index.ts +1 -0
- package/src/postgres/internal/dialect.ts +9 -4
- package/src/postgres/internal/dsl.ts +303 -163
- 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 +12 -11
- package/src/postgres/schema.ts +106 -15
- package/src/postgres/table.ts +205 -530
- 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 +8 -9
- package/src/sqlite/datatypes/index.ts +4 -2
- package/src/sqlite/datatypes/spec.ts +6 -94
- package/src/sqlite/executor.ts +7 -7
- package/src/sqlite/internal/dialect.ts +9 -4
- package/src/sqlite/internal/dsl.ts +298 -154
- 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 -180
- package/src/mysql/table.ts +0 -186
- package/src/postgres/cast.ts +0 -45
- package/src/sqlite/table.ts +0 -175
|
@@ -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) {
|
|
@@ -160,7 +161,7 @@ const EnumProto = {
|
|
|
160
161
|
}
|
|
161
162
|
|
|
162
163
|
const SequenceProto = {
|
|
163
|
-
pipe(this:
|
|
164
|
+
pipe(this: Pipeable) {
|
|
164
165
|
return pipeArguments(this, arguments)
|
|
165
166
|
},
|
|
166
167
|
qualifiedName(this: SequenceDefinition) {
|
|
@@ -211,7 +212,7 @@ export function enumType<
|
|
|
211
212
|
Name extends string,
|
|
212
213
|
const Values extends readonly [string, ...string[]]
|
|
213
214
|
>(
|
|
214
|
-
name: Name
|
|
215
|
+
name: NonEmptyStringInput<Name>,
|
|
215
216
|
values: Values
|
|
216
217
|
): EnumDefinition<Name, Values, undefined>
|
|
217
218
|
export function enumType<
|
|
@@ -219,9 +220,9 @@ export function enumType<
|
|
|
219
220
|
const Values extends readonly [string, ...string[]],
|
|
220
221
|
SchemaName extends string
|
|
221
222
|
>(
|
|
222
|
-
name: Name
|
|
223
|
+
name: NonEmptyStringInput<Name>,
|
|
223
224
|
values: Values,
|
|
224
|
-
schemaName: SchemaName
|
|
225
|
+
schemaName: NonEmptyStringInput<SchemaName>
|
|
225
226
|
): EnumDefinition<Name, Values, SchemaName>
|
|
226
227
|
export function enumType(
|
|
227
228
|
name: string,
|
|
@@ -242,11 +243,11 @@ export function enumType(
|
|
|
242
243
|
}
|
|
243
244
|
|
|
244
245
|
export function sequence<Name extends string>(
|
|
245
|
-
name: Name
|
|
246
|
+
name: NonEmptyStringInput<Name>
|
|
246
247
|
): SequenceDefinition<Name, undefined>
|
|
247
248
|
export function sequence<Name extends string, SchemaName extends string>(
|
|
248
|
-
name: Name
|
|
249
|
-
schemaName: SchemaName
|
|
249
|
+
name: NonEmptyStringInput<Name>,
|
|
250
|
+
schemaName: NonEmptyStringInput<SchemaName>
|
|
250
251
|
): SequenceDefinition<Name, SchemaName>
|
|
251
252
|
export function sequence(
|
|
252
253
|
name: string,
|
|
@@ -264,21 +265,21 @@ export function sequence(
|
|
|
264
265
|
}
|
|
265
266
|
|
|
266
267
|
export const schema = <SchemaName extends string>(
|
|
267
|
-
schemaName: SchemaName
|
|
268
|
+
schemaName: NonEmptyStringInput<SchemaName>
|
|
268
269
|
) => ({
|
|
269
270
|
schemaName,
|
|
270
271
|
enumType: <
|
|
271
272
|
Name extends string,
|
|
272
273
|
const Values extends readonly [string, ...string[]]
|
|
273
274
|
>(
|
|
274
|
-
name: Name
|
|
275
|
+
name: NonEmptyStringInput<Name>,
|
|
275
276
|
values: Values
|
|
276
277
|
): EnumDefinition<Name, Values, SchemaName> =>
|
|
277
278
|
enumType(name, values, schemaName) as EnumDefinition<Name, Values, SchemaName>,
|
|
278
279
|
sequence: <
|
|
279
280
|
Name extends string
|
|
280
281
|
>(
|
|
281
|
-
name: Name
|
|
282
|
+
name: NonEmptyStringInput<Name>
|
|
282
283
|
): SequenceDefinition<Name, SchemaName> =>
|
|
283
284
|
sequence(name, schemaName) as SequenceDefinition<Name, SchemaName>
|
|
284
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
|
+
}
|