effect-qb 0.13.0 → 0.15.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 +6 -1431
- package/dist/mysql.js +61945 -3611
- package/dist/postgres/metadata.js +2818 -0
- package/dist/postgres.js +9942 -5591
- package/package.json +21 -10
- package/src/internal/aggregation-validation.ts +3 -3
- package/src/internal/case-analysis.d.ts +18 -0
- package/src/internal/case-analysis.ts +4 -4
- package/src/internal/coercion/analysis.d.ts +7 -0
- package/src/internal/{coercion-analysis.ts → coercion/analysis.ts} +3 -3
- package/src/internal/coercion/errors.d.ts +17 -0
- package/src/internal/{coercion-errors.ts → coercion/errors.ts} +1 -1
- package/src/internal/coercion/kind.d.ts +4 -0
- package/src/internal/{coercion-kind.ts → coercion/kind.ts} +2 -2
- package/src/internal/{coercion-normalize.ts → coercion/normalize.ts} +1 -1
- package/src/internal/coercion/rules.d.ts +6 -0
- package/src/internal/{coercion-rules.ts → coercion/rules.ts} +2 -2
- package/src/internal/column-state.d.ts +190 -0
- package/src/internal/column-state.ts +119 -56
- package/src/internal/column.ts +387 -149
- package/src/internal/datatypes/define.d.ts +17 -0
- package/src/internal/datatypes/define.ts +18 -34
- package/src/internal/datatypes/lookup.d.ts +44 -0
- package/src/internal/datatypes/lookup.ts +61 -152
- package/src/internal/datatypes/shape.d.ts +16 -0
- package/src/internal/datatypes/shape.ts +1 -1
- package/src/internal/derived-table.d.ts +4 -0
- package/src/internal/derived-table.ts +21 -16
- package/src/internal/dsl-mutation-runtime.ts +378 -0
- package/src/internal/dsl-plan-runtime.ts +387 -0
- package/src/internal/dsl-query-runtime.ts +160 -0
- package/src/internal/dsl-transaction-ddl-runtime.ts +263 -0
- package/src/internal/executor.ts +173 -38
- package/src/internal/expression-ast.ts +19 -5
- package/src/internal/grouping-key.d.ts +3 -0
- package/src/internal/grouping-key.ts +1 -1
- package/src/internal/implication-runtime.d.ts +15 -0
- package/src/internal/implication-runtime.ts +171 -0
- package/src/internal/json/ast.d.ts +30 -0
- package/src/internal/json/ast.ts +1 -1
- package/src/internal/json/errors.d.ts +8 -0
- package/src/internal/json/path.d.ts +75 -0
- package/src/internal/json/path.ts +1 -1
- package/src/internal/json/types.d.ts +62 -0
- package/src/internal/predicate/analysis.d.ts +20 -0
- package/src/internal/{predicate-analysis.ts → predicate/analysis.ts} +13 -3
- package/src/internal/predicate/atom.d.ts +28 -0
- package/src/internal/{predicate-branches.ts → predicate/branches.ts} +2 -2
- package/src/internal/predicate/context.d.ts +67 -0
- package/src/internal/{predicate-context.ts → predicate/context.ts} +111 -32
- package/src/internal/predicate/formula.d.ts +35 -0
- package/src/internal/{predicate-formula.ts → predicate/formula.ts} +32 -20
- package/src/internal/predicate/key.d.ts +11 -0
- package/src/internal/{predicate-key.ts → predicate/key.ts} +2 -2
- package/src/internal/{predicate-nnf.ts → predicate/nnf.ts} +2 -2
- package/src/internal/predicate/normalize.d.ts +53 -0
- package/src/internal/predicate/normalize.ts +273 -0
- package/src/internal/predicate/runtime.d.ts +31 -0
- package/src/internal/predicate/runtime.ts +679 -0
- package/src/internal/projection-alias.d.ts +13 -0
- package/src/internal/projections.d.ts +31 -0
- package/src/internal/projections.ts +1 -1
- package/src/internal/query-ast.d.ts +217 -0
- package/src/internal/query-ast.ts +1 -1
- package/src/internal/query-requirements.d.ts +20 -0
- package/src/internal/query.d.ts +775 -0
- package/src/internal/query.ts +767 -275
- package/src/internal/renderer.ts +7 -21
- package/src/internal/row-set.d.ts +53 -0
- package/src/internal/{plan.ts → row-set.ts} +23 -11
- package/src/internal/{runtime-normalize.ts → runtime/normalize.ts} +9 -31
- package/src/internal/{runtime-schema.ts → runtime/schema.ts} +84 -55
- package/src/internal/runtime/value.d.ts +22 -0
- package/src/internal/{runtime-value.ts → runtime/value.ts} +2 -2
- package/src/internal/scalar.d.ts +107 -0
- package/src/internal/scalar.ts +191 -0
- package/src/internal/schema-derivation.d.ts +105 -0
- package/src/internal/schema-derivation.ts +93 -21
- package/src/internal/schema-expression.d.ts +18 -0
- package/src/internal/schema-expression.ts +75 -0
- package/src/internal/table-options.d.ts +94 -0
- package/src/internal/table-options.ts +94 -8
- package/src/internal/table.d.ts +173 -0
- package/src/internal/table.ts +135 -54
- package/src/mysql/column.ts +95 -18
- package/src/mysql/datatypes/index.ts +58 -3
- package/src/mysql/errors/generated.ts +57336 -0
- package/src/mysql/errors/index.ts +1 -0
- package/src/mysql/errors/normalize.ts +55 -53
- package/src/mysql/errors/types.ts +74 -0
- package/src/mysql/executor.ts +69 -7
- package/src/mysql/function/aggregate.ts +1 -5
- package/src/mysql/function/core.ts +1 -3
- package/src/mysql/function/index.ts +1 -1
- package/src/mysql/function/string.ts +1 -5
- package/src/mysql/function/temporal.ts +12 -15
- package/src/mysql/function/window.ts +1 -6
- package/src/{internal/mysql-dialect.ts → mysql/internal/dialect.ts} +1 -1
- package/src/mysql/internal/dsl.ts +6115 -0
- package/src/{internal/mysql-renderer.ts → mysql/internal/renderer.ts} +6 -6
- package/src/mysql/internal/sql-expression-renderer.ts +1455 -0
- package/src/mysql/json.ts +2 -0
- package/src/mysql/query.ts +111 -86
- package/src/mysql/renderer.ts +1 -1
- package/src/mysql/table.ts +1 -1
- package/src/mysql.ts +6 -4
- package/src/postgres/cast.ts +30 -0
- package/src/postgres/column.ts +178 -20
- package/src/postgres/datatypes/index.d.ts +515 -0
- package/src/postgres/datatypes/index.ts +49 -5
- package/src/postgres/datatypes/spec.d.ts +412 -0
- package/src/postgres/errors/generated.ts +2636 -0
- package/src/postgres/errors/index.ts +1 -0
- package/src/postgres/errors/normalize.ts +47 -62
- package/src/postgres/errors/types.ts +92 -34
- package/src/postgres/executor.ts +37 -5
- package/src/postgres/function/aggregate.ts +1 -5
- package/src/postgres/function/core.ts +20 -2
- package/src/postgres/function/index.ts +1 -1
- package/src/postgres/function/string.ts +1 -5
- package/src/postgres/function/temporal.ts +12 -15
- package/src/postgres/function/window.ts +1 -6
- package/src/{internal/postgres-dialect.ts → postgres/internal/dialect.ts} +1 -1
- package/src/{internal/query-factory.ts → postgres/internal/dsl.ts} +1568 -2120
- package/src/{internal/postgres-renderer.ts → postgres/internal/renderer.ts} +6 -6
- package/src/postgres/internal/schema-ddl.ts +108 -0
- package/src/postgres/internal/schema-model.ts +150 -0
- package/src/{internal → postgres/internal}/sql-expression-renderer.ts +112 -46
- package/src/postgres/json.ts +493 -0
- package/src/postgres/metadata.ts +31 -0
- package/src/postgres/query.ts +113 -86
- package/src/postgres/renderer.ts +3 -13
- package/src/postgres/schema-expression.ts +17 -0
- package/src/postgres/schema-management.ts +204 -0
- package/src/postgres/schema.ts +35 -0
- package/src/postgres/table.ts +316 -42
- package/src/postgres/type.ts +31 -0
- package/src/postgres.ts +20 -4
- package/CHANGELOG.md +0 -134
- package/src/internal/expression.ts +0 -327
- package/src/internal/predicate-normalize.ts +0 -202
- package/src/mysql/function/json.ts +0 -4
- package/src/mysql/private/query.ts +0 -13
- package/src/postgres/function/json.ts +0 -4
- package/src/postgres/private/query.ts +0 -13
- /package/src/internal/{predicate-atom.ts → predicate/atom.ts} +0 -0
package/src/postgres/query.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { postgresQuery } from "./private/query.js"
|
|
2
1
|
import {
|
|
2
|
+
type AnyTableFunctionSource,
|
|
3
|
+
type AnyUnnestSource,
|
|
4
|
+
type AnyValuesSource,
|
|
3
5
|
type CapabilitiesOfPlan,
|
|
4
6
|
type CompletePlan,
|
|
5
7
|
type DialectCompatiblePlan,
|
|
@@ -36,92 +38,117 @@ import {
|
|
|
36
38
|
type StatementOfPlan,
|
|
37
39
|
type StringExpressionInput
|
|
38
40
|
} from "../internal/query.js"
|
|
41
|
+
import {
|
|
42
|
+
type PublicNonStructuredFromApi,
|
|
43
|
+
type PublicGenerateSeriesApi,
|
|
44
|
+
type PublicStructuredFromConstraint,
|
|
45
|
+
type PublicStructuredFromResult,
|
|
46
|
+
type as postgresType,
|
|
47
|
+
values,
|
|
48
|
+
unnest,
|
|
49
|
+
select,
|
|
50
|
+
insert,
|
|
51
|
+
generateSeries as dslGenerateSeries,
|
|
52
|
+
from as dslFrom
|
|
53
|
+
} from "./internal/dsl.js"
|
|
54
|
+
|
|
55
|
+
export {
|
|
56
|
+
literal,
|
|
57
|
+
column,
|
|
58
|
+
eq,
|
|
59
|
+
neq,
|
|
60
|
+
lt,
|
|
61
|
+
lte,
|
|
62
|
+
gt,
|
|
63
|
+
gte,
|
|
64
|
+
isNull,
|
|
65
|
+
isNotNull,
|
|
66
|
+
like,
|
|
67
|
+
ilike,
|
|
68
|
+
collate,
|
|
69
|
+
regexMatch,
|
|
70
|
+
regexIMatch,
|
|
71
|
+
regexNotMatch,
|
|
72
|
+
regexNotIMatch,
|
|
73
|
+
and,
|
|
74
|
+
or,
|
|
75
|
+
not,
|
|
76
|
+
all,
|
|
77
|
+
any,
|
|
78
|
+
case_ as case,
|
|
79
|
+
match,
|
|
80
|
+
in_ as in,
|
|
81
|
+
notIn,
|
|
82
|
+
between,
|
|
83
|
+
contains,
|
|
84
|
+
containedBy,
|
|
85
|
+
overlaps,
|
|
86
|
+
exists,
|
|
87
|
+
isDistinctFrom,
|
|
88
|
+
isNotDistinctFrom,
|
|
89
|
+
excluded,
|
|
90
|
+
as,
|
|
91
|
+
with_ as with,
|
|
92
|
+
withRecursive,
|
|
93
|
+
lateral,
|
|
94
|
+
scalar,
|
|
95
|
+
inSubquery,
|
|
96
|
+
compareAny,
|
|
97
|
+
compareAll,
|
|
98
|
+
values,
|
|
99
|
+
unnest,
|
|
100
|
+
select,
|
|
101
|
+
returning,
|
|
102
|
+
onConflict,
|
|
103
|
+
insert,
|
|
104
|
+
update,
|
|
105
|
+
upsert,
|
|
106
|
+
delete_ as delete,
|
|
107
|
+
truncate,
|
|
108
|
+
merge,
|
|
109
|
+
transaction,
|
|
110
|
+
commit,
|
|
111
|
+
rollback,
|
|
112
|
+
savepoint,
|
|
113
|
+
rollbackTo,
|
|
114
|
+
releaseSavepoint,
|
|
115
|
+
createTable,
|
|
116
|
+
dropTable,
|
|
117
|
+
createIndex,
|
|
118
|
+
dropIndex,
|
|
119
|
+
union,
|
|
120
|
+
unionAll,
|
|
121
|
+
intersect,
|
|
122
|
+
intersectAll,
|
|
123
|
+
except,
|
|
124
|
+
exceptAll,
|
|
125
|
+
where,
|
|
126
|
+
having,
|
|
127
|
+
innerJoin,
|
|
128
|
+
leftJoin,
|
|
129
|
+
rightJoin,
|
|
130
|
+
fullJoin,
|
|
131
|
+
crossJoin,
|
|
132
|
+
distinct,
|
|
133
|
+
distinctOn,
|
|
134
|
+
limit,
|
|
135
|
+
offset,
|
|
136
|
+
lock,
|
|
137
|
+
orderBy,
|
|
138
|
+
groupBy
|
|
139
|
+
} from "./internal/dsl.js"
|
|
140
|
+
export { postgresType as type }
|
|
141
|
+
export const generateSeries: PublicGenerateSeriesApi = dslGenerateSeries as PublicGenerateSeriesApi
|
|
142
|
+
|
|
143
|
+
type StructuredSource = AnyValuesSource | AnyUnnestSource | AnyTableFunctionSource
|
|
144
|
+
|
|
145
|
+
type StructuredFromApi = <CurrentSource extends StructuredSource>(
|
|
146
|
+
source: CurrentSource
|
|
147
|
+
) => <PlanValue extends QueryPlan<any, any, any, any, any, any, any, any, any, any>>(
|
|
148
|
+
plan: PlanValue & PublicStructuredFromConstraint<PlanValue, CurrentSource, "postgres">
|
|
149
|
+
) => PublicStructuredFromResult<PlanValue, CurrentSource, "postgres">
|
|
39
150
|
|
|
40
|
-
export const
|
|
41
|
-
export const cast = postgresQuery.cast
|
|
42
|
-
export const type = postgresQuery.type
|
|
43
|
-
export const eq = postgresQuery.eq
|
|
44
|
-
export const neq = postgresQuery.neq
|
|
45
|
-
export const lt = postgresQuery.lt
|
|
46
|
-
export const lte = postgresQuery.lte
|
|
47
|
-
export const gt = postgresQuery.gt
|
|
48
|
-
export const gte = postgresQuery.gte
|
|
49
|
-
export const isNull = postgresQuery.isNull
|
|
50
|
-
export const isNotNull = postgresQuery.isNotNull
|
|
51
|
-
export const like = postgresQuery.like
|
|
52
|
-
export const ilike = postgresQuery.ilike
|
|
53
|
-
export const and = postgresQuery.and
|
|
54
|
-
export const or = postgresQuery.or
|
|
55
|
-
export const not = postgresQuery.not
|
|
56
|
-
export const all = postgresQuery.all
|
|
57
|
-
export const any = postgresQuery.any
|
|
58
|
-
const case_ = postgresQuery.case
|
|
59
|
-
export const match = postgresQuery.match
|
|
60
|
-
export const in_ = postgresQuery.in
|
|
61
|
-
export const notIn = postgresQuery.notIn
|
|
62
|
-
export const between = postgresQuery.between
|
|
63
|
-
export const contains = postgresQuery.contains
|
|
64
|
-
export const containedBy = postgresQuery.containedBy
|
|
65
|
-
export const overlaps = postgresQuery.overlaps
|
|
66
|
-
export const exists = postgresQuery.exists
|
|
67
|
-
export const isDistinctFrom = postgresQuery.isDistinctFrom
|
|
68
|
-
export const isNotDistinctFrom = postgresQuery.isNotDistinctFrom
|
|
69
|
-
export const excluded = postgresQuery.excluded
|
|
70
|
-
export const as = postgresQuery.as
|
|
71
|
-
export const with_ = postgresQuery.with
|
|
72
|
-
export const withRecursive = postgresQuery.withRecursive
|
|
73
|
-
export const lateral = postgresQuery.lateral
|
|
74
|
-
export const scalar = postgresQuery.scalar
|
|
75
|
-
export const inSubquery = postgresQuery.inSubquery
|
|
76
|
-
export const compareAny = postgresQuery.compareAny
|
|
77
|
-
export const compareAll = postgresQuery.compareAll
|
|
78
|
-
export const values = postgresQuery.values
|
|
79
|
-
export const unnest = postgresQuery.unnest
|
|
80
|
-
export const generateSeries = postgresQuery.generateSeries
|
|
81
|
-
export const returning = postgresQuery.returning
|
|
82
|
-
export const onConflict = postgresQuery.onConflict
|
|
83
|
-
export const insert = postgresQuery.insert
|
|
84
|
-
export const update = postgresQuery.update
|
|
85
|
-
export const upsert = postgresQuery.upsert
|
|
86
|
-
export const delete_ = postgresQuery.delete
|
|
87
|
-
export const truncate = postgresQuery.truncate
|
|
88
|
-
export const merge = postgresQuery.merge
|
|
89
|
-
export const transaction = postgresQuery.transaction
|
|
90
|
-
export const commit = postgresQuery.commit
|
|
91
|
-
export const rollback = postgresQuery.rollback
|
|
92
|
-
export const savepoint = postgresQuery.savepoint
|
|
93
|
-
export const rollbackTo = postgresQuery.rollbackTo
|
|
94
|
-
export const releaseSavepoint = postgresQuery.releaseSavepoint
|
|
95
|
-
export const createTable = postgresQuery.createTable
|
|
96
|
-
export const dropTable = postgresQuery.dropTable
|
|
97
|
-
export const createIndex = postgresQuery.createIndex
|
|
98
|
-
export const dropIndex = postgresQuery.dropIndex
|
|
99
|
-
export const union = postgresQuery.union
|
|
100
|
-
export const unionAll = postgresQuery.unionAll
|
|
101
|
-
export const intersect = postgresQuery.intersect
|
|
102
|
-
export const intersectAll = postgresQuery.intersectAll
|
|
103
|
-
export const except = postgresQuery.except
|
|
104
|
-
export const exceptAll = postgresQuery.exceptAll
|
|
105
|
-
export const select = postgresQuery.select
|
|
106
|
-
export const where = postgresQuery.where
|
|
107
|
-
export const having = postgresQuery.having
|
|
108
|
-
export const from = postgresQuery.from
|
|
109
|
-
export const innerJoin = postgresQuery.innerJoin
|
|
110
|
-
export const leftJoin = postgresQuery.leftJoin
|
|
111
|
-
export const rightJoin = postgresQuery.rightJoin
|
|
112
|
-
export const fullJoin = postgresQuery.fullJoin
|
|
113
|
-
export const crossJoin = postgresQuery.crossJoin
|
|
114
|
-
export const distinct = postgresQuery.distinct
|
|
115
|
-
export const distinctOn = postgresQuery.distinctOn
|
|
116
|
-
export const limit = postgresQuery.limit
|
|
117
|
-
export const offset = postgresQuery.offset
|
|
118
|
-
export const lock = postgresQuery.lock
|
|
119
|
-
export const orderBy = postgresQuery.orderBy
|
|
120
|
-
export const groupBy = postgresQuery.groupBy
|
|
121
|
-
export { case_ as case }
|
|
122
|
-
export { in_ as in }
|
|
123
|
-
export { with_ as with }
|
|
124
|
-
export { delete_ as delete }
|
|
151
|
+
export const from: StructuredFromApi & PublicNonStructuredFromApi = dslFrom as StructuredFromApi & PublicNonStructuredFromApi
|
|
125
152
|
|
|
126
153
|
export type {
|
|
127
154
|
CapabilitiesOfPlan,
|
package/src/postgres/renderer.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as CoreRenderer from "../internal/renderer.js"
|
|
2
|
+
import { renderPostgresPlan } from "./internal/renderer.js"
|
|
2
3
|
|
|
3
4
|
/** Postgres-specialized rendered query shape. */
|
|
4
5
|
export type RenderedQuery<Row> = CoreRenderer.RenderedQuery<Row, "postgres">
|
|
@@ -11,19 +12,8 @@ export { TypeId } from "../internal/renderer.js"
|
|
|
11
12
|
export type { Projection } from "../internal/renderer.js"
|
|
12
13
|
|
|
13
14
|
/** Creates the built-in Postgres renderer. */
|
|
14
|
-
export
|
|
15
|
-
|
|
16
|
-
export function make(
|
|
17
|
-
dialect: "postgres",
|
|
18
|
-
render: Parameters<typeof CoreRenderer.make>[1]
|
|
19
|
-
): Renderer
|
|
20
|
-
export function make(
|
|
21
|
-
dialectOrRender?: "postgres" | Parameters<typeof CoreRenderer.make>[1],
|
|
22
|
-
render?: Parameters<typeof CoreRenderer.make>[1]
|
|
23
|
-
): Renderer {
|
|
24
|
-
const customRender = typeof dialectOrRender === "function" ? dialectOrRender : render
|
|
25
|
-
return customRender ? CoreRenderer.make("postgres", customRender as any) : CoreRenderer.make("postgres")
|
|
26
|
-
}
|
|
15
|
+
export const make = (): Renderer =>
|
|
16
|
+
CoreRenderer.make("postgres", renderPostgresPlan)
|
|
27
17
|
|
|
28
18
|
/** Shared built-in Postgres renderer instance. */
|
|
29
19
|
export const postgres = make()
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export {
|
|
2
|
+
TypeId,
|
|
3
|
+
fromAst,
|
|
4
|
+
fromSql,
|
|
5
|
+
isSchemaExpression,
|
|
6
|
+
normalize,
|
|
7
|
+
parseExpression,
|
|
8
|
+
render,
|
|
9
|
+
toAst,
|
|
10
|
+
type Any,
|
|
11
|
+
type SchemaExpression
|
|
12
|
+
} from "../internal/schema-expression.js"
|
|
13
|
+
|
|
14
|
+
export {
|
|
15
|
+
normalizeDdlExpressionSql,
|
|
16
|
+
renderDdlExpressionSql
|
|
17
|
+
} from "./internal/schema-ddl.js"
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import * as Schema from "effect/Schema"
|
|
2
|
+
import { pipeArguments, type Pipeable } from "effect/Pipeable"
|
|
3
|
+
|
|
4
|
+
import type * as Expression from "../internal/scalar.js"
|
|
5
|
+
import { makeColumnDefinition, type ColumnDefinition } from "../internal/column-state.js"
|
|
6
|
+
|
|
7
|
+
export const EnumTypeId: unique symbol = Symbol.for("effect-qb/SchemaManagement/Enum")
|
|
8
|
+
export const SequenceTypeId: unique symbol = Symbol.for("effect-qb/SchemaManagement/Sequence")
|
|
9
|
+
|
|
10
|
+
type QualifiedName<
|
|
11
|
+
Name extends string,
|
|
12
|
+
SchemaName extends string | undefined
|
|
13
|
+
> = SchemaName extends string
|
|
14
|
+
? SchemaName extends "public"
|
|
15
|
+
? Name
|
|
16
|
+
: `${SchemaName}.${Name}`
|
|
17
|
+
: Name
|
|
18
|
+
|
|
19
|
+
type EnumColumn<
|
|
20
|
+
Name extends string,
|
|
21
|
+
Values extends readonly [string, ...string[]],
|
|
22
|
+
SchemaName extends string | undefined
|
|
23
|
+
> = ColumnDefinition<
|
|
24
|
+
Values[number],
|
|
25
|
+
Values[number],
|
|
26
|
+
Values[number],
|
|
27
|
+
Expression.DbType.Enum<"postgres", QualifiedName<Name, SchemaName>>,
|
|
28
|
+
false,
|
|
29
|
+
false,
|
|
30
|
+
false,
|
|
31
|
+
false,
|
|
32
|
+
false,
|
|
33
|
+
undefined
|
|
34
|
+
>
|
|
35
|
+
|
|
36
|
+
const EnumProto = {
|
|
37
|
+
pipe(this: unknown) {
|
|
38
|
+
return pipeArguments(this, arguments)
|
|
39
|
+
},
|
|
40
|
+
qualifiedName(this: EnumDefinition) {
|
|
41
|
+
return this.schemaName === undefined || this.schemaName === "public"
|
|
42
|
+
? this.name
|
|
43
|
+
: `${this.schemaName}.${this.name}`
|
|
44
|
+
},
|
|
45
|
+
type(this: EnumDefinition) {
|
|
46
|
+
return {
|
|
47
|
+
dialect: "postgres",
|
|
48
|
+
kind: this.qualifiedName(),
|
|
49
|
+
variant: "enum"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
column(this: EnumDefinition) {
|
|
53
|
+
const values = this.values.map((value) => Schema.Literal(value)) as unknown as readonly [Schema.Schema.Any, ...Schema.Schema.Any[]]
|
|
54
|
+
return makeColumnDefinition(
|
|
55
|
+
values.length === 1 ? values[0]! : Schema.Union(...values),
|
|
56
|
+
{
|
|
57
|
+
dbType: this.type(),
|
|
58
|
+
nullable: false,
|
|
59
|
+
hasDefault: false,
|
|
60
|
+
generated: false,
|
|
61
|
+
primaryKey: false,
|
|
62
|
+
unique: false,
|
|
63
|
+
references: undefined,
|
|
64
|
+
ddlType: this.qualifiedName(),
|
|
65
|
+
identity: undefined,
|
|
66
|
+
enum: {
|
|
67
|
+
name: this.name,
|
|
68
|
+
schemaName: this.schemaName,
|
|
69
|
+
values: this.values
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const SequenceProto = {
|
|
77
|
+
pipe(this: unknown) {
|
|
78
|
+
return pipeArguments(this, arguments)
|
|
79
|
+
},
|
|
80
|
+
qualifiedName(this: SequenceDefinition) {
|
|
81
|
+
return this.schemaName === undefined || this.schemaName === "public"
|
|
82
|
+
? this.name
|
|
83
|
+
: `${this.schemaName}.${this.name}`
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface EnumDefinition<
|
|
88
|
+
Name extends string = string,
|
|
89
|
+
Values extends readonly [string, ...string[]] = readonly [string, ...string[]],
|
|
90
|
+
SchemaName extends string | undefined = undefined
|
|
91
|
+
> extends Pipeable {
|
|
92
|
+
readonly name: Name
|
|
93
|
+
readonly values: Values
|
|
94
|
+
readonly schemaName: SchemaName
|
|
95
|
+
readonly [EnumTypeId]: {
|
|
96
|
+
readonly kind: "enum"
|
|
97
|
+
readonly name: Name
|
|
98
|
+
readonly values: Values
|
|
99
|
+
readonly schemaName: SchemaName
|
|
100
|
+
}
|
|
101
|
+
readonly qualifiedName: () => QualifiedName<Name, SchemaName>
|
|
102
|
+
readonly type: () => Expression.DbType.Enum<"postgres", QualifiedName<Name, SchemaName>>
|
|
103
|
+
readonly column: () => EnumColumn<Name, Values, SchemaName>
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface SequenceDefinition<
|
|
107
|
+
Name extends string = string,
|
|
108
|
+
SchemaName extends string | undefined = undefined
|
|
109
|
+
> extends Pipeable {
|
|
110
|
+
readonly name: Name
|
|
111
|
+
readonly schemaName: SchemaName
|
|
112
|
+
readonly [SequenceTypeId]: {
|
|
113
|
+
readonly kind: "sequence"
|
|
114
|
+
readonly name: Name
|
|
115
|
+
readonly schemaName: SchemaName
|
|
116
|
+
}
|
|
117
|
+
readonly qualifiedName: () => QualifiedName<Name, SchemaName>
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export type AnyEnumDefinition = EnumDefinition<string, readonly [string, ...string[]], string | undefined>
|
|
121
|
+
export type AnySequenceDefinition = SequenceDefinition<string, string | undefined>
|
|
122
|
+
export type AnyDefinition = AnyEnumDefinition | AnySequenceDefinition
|
|
123
|
+
|
|
124
|
+
export function enumType<
|
|
125
|
+
Name extends string,
|
|
126
|
+
const Values extends readonly [string, ...string[]]
|
|
127
|
+
>(
|
|
128
|
+
name: Name,
|
|
129
|
+
values: Values
|
|
130
|
+
): EnumDefinition<Name, Values, undefined>
|
|
131
|
+
export function enumType<
|
|
132
|
+
Name extends string,
|
|
133
|
+
const Values extends readonly [string, ...string[]],
|
|
134
|
+
SchemaName extends string
|
|
135
|
+
>(
|
|
136
|
+
name: Name,
|
|
137
|
+
values: Values,
|
|
138
|
+
schemaName: SchemaName
|
|
139
|
+
): EnumDefinition<Name, Values, SchemaName>
|
|
140
|
+
export function enumType(
|
|
141
|
+
name: string,
|
|
142
|
+
values: readonly [string, ...string[]],
|
|
143
|
+
schemaName?: string
|
|
144
|
+
): EnumDefinition<string, readonly [string, ...string[]], string | undefined> {
|
|
145
|
+
const definition = Object.create(EnumProto)
|
|
146
|
+
definition.name = name
|
|
147
|
+
definition.values = values
|
|
148
|
+
definition.schemaName = schemaName
|
|
149
|
+
definition[EnumTypeId] = {
|
|
150
|
+
kind: "enum",
|
|
151
|
+
name,
|
|
152
|
+
values,
|
|
153
|
+
schemaName
|
|
154
|
+
}
|
|
155
|
+
return definition
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export function sequence<Name extends string>(
|
|
159
|
+
name: Name
|
|
160
|
+
): SequenceDefinition<Name, undefined>
|
|
161
|
+
export function sequence<Name extends string, SchemaName extends string>(
|
|
162
|
+
name: Name,
|
|
163
|
+
schemaName: SchemaName
|
|
164
|
+
): SequenceDefinition<Name, SchemaName>
|
|
165
|
+
export function sequence(
|
|
166
|
+
name: string,
|
|
167
|
+
schemaName?: string
|
|
168
|
+
): SequenceDefinition<string, string | undefined> {
|
|
169
|
+
const definition = Object.create(SequenceProto)
|
|
170
|
+
definition.name = name
|
|
171
|
+
definition.schemaName = schemaName
|
|
172
|
+
definition[SequenceTypeId] = {
|
|
173
|
+
kind: "sequence",
|
|
174
|
+
name,
|
|
175
|
+
schemaName
|
|
176
|
+
}
|
|
177
|
+
return definition
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export const schema = <SchemaName extends string>(
|
|
181
|
+
schemaName: SchemaName
|
|
182
|
+
) => ({
|
|
183
|
+
schemaName,
|
|
184
|
+
enumType: <
|
|
185
|
+
Name extends string,
|
|
186
|
+
const Values extends readonly [string, ...string[]]
|
|
187
|
+
>(
|
|
188
|
+
name: Name,
|
|
189
|
+
values: Values
|
|
190
|
+
): EnumDefinition<Name, Values, SchemaName> =>
|
|
191
|
+
enumType(name, values, schemaName) as EnumDefinition<Name, Values, SchemaName>,
|
|
192
|
+
sequence: <
|
|
193
|
+
Name extends string
|
|
194
|
+
>(
|
|
195
|
+
name: Name
|
|
196
|
+
): SequenceDefinition<Name, SchemaName> =>
|
|
197
|
+
sequence(name, schemaName) as SequenceDefinition<Name, SchemaName>
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
export const isEnumDefinition = (value: unknown): value is AnyEnumDefinition =>
|
|
201
|
+
typeof value === "object" && value !== null && EnumTypeId in value
|
|
202
|
+
|
|
203
|
+
export const isSequenceDefinition = (value: unknown): value is AnySequenceDefinition =>
|
|
204
|
+
typeof value === "object" && value !== null && SequenceTypeId in value
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { schema as makeTableSchemaNamespace, type TableSchemaNamespace } from "../internal/table.js"
|
|
2
|
+
import { enumType, sequence, type EnumDefinition, type SequenceDefinition } from "./schema-management.js"
|
|
3
|
+
|
|
4
|
+
export type SchemaNamespace<SchemaName extends string> = TableSchemaNamespace<SchemaName> & {
|
|
5
|
+
readonly enum: <
|
|
6
|
+
Name extends string,
|
|
7
|
+
const Values extends readonly [string, ...string[]]
|
|
8
|
+
>(
|
|
9
|
+
name: Name,
|
|
10
|
+
values: Values
|
|
11
|
+
) => EnumDefinition<Name, Values, SchemaName>
|
|
12
|
+
readonly sequence: <
|
|
13
|
+
Name extends string
|
|
14
|
+
>(
|
|
15
|
+
name: Name
|
|
16
|
+
) => SequenceDefinition<Name, SchemaName>
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const schema = <SchemaName extends string>(
|
|
20
|
+
schemaName: SchemaName
|
|
21
|
+
): SchemaNamespace<SchemaName> => ({
|
|
22
|
+
...makeTableSchemaNamespace(schemaName),
|
|
23
|
+
enum: <
|
|
24
|
+
Name extends string,
|
|
25
|
+
const Values extends readonly [string, ...string[]]
|
|
26
|
+
>(
|
|
27
|
+
name: Name,
|
|
28
|
+
values: Values
|
|
29
|
+
) => enumType(name, values, schemaName) as EnumDefinition<Name, Values, SchemaName>,
|
|
30
|
+
sequence: <
|
|
31
|
+
Name extends string
|
|
32
|
+
>(
|
|
33
|
+
name: Name
|
|
34
|
+
) => sequence(name, schemaName) as SequenceDefinition<Name, SchemaName>
|
|
35
|
+
})
|