create-monolayer-app 0.1.1 → 0.2.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/bin/index.js +1 -1
- package/package.json +1 -1
- package/template/_gitignore +5 -0
- package/template/lib/db/client.ts +30 -0
- package/template/lib/db/db.ts +4 -0
- package/template/oxlint.config.ts +11 -0
- package/template/package.json +23 -3
- package/template/tsconfig.json +3 -2
- package/template/vendor/kysely-dsql/dsql/adapter.ts +15 -0
- package/template/vendor/kysely-dsql/dsql/alter-column-builder.ts +105 -0
- package/template/vendor/kysely-dsql/dsql/alter-table-builders.ts +195 -0
- package/template/vendor/kysely-dsql/dsql/compatibility-rules.ts +235 -0
- package/template/vendor/kysely-dsql/dsql/create-column-builder.ts +187 -0
- package/template/vendor/kysely-dsql/dsql/create-table-builder.ts +115 -0
- package/template/vendor/kysely-dsql/dsql/dialect.ts +41 -0
- package/template/vendor/kysely-dsql/dsql/dsql-kysely.ts +93 -0
- package/template/vendor/kysely-dsql/dsql/dsql-token.ts +29 -0
- package/template/vendor/kysely-dsql/dsql/index-view-builders.ts +206 -0
- package/template/vendor/kysely-dsql/dsql/pool.ts +40 -0
- package/template/vendor/kysely-dsql/dsql/query-compiler-error.ts +18 -0
- package/template/vendor/kysely-dsql/dsql/query-compiler.test.ts +765 -0
- package/template/vendor/kysely-dsql/dsql/query-compiler.ts +259 -0
- package/template/vendor/kysely-dsql/dsql/query-validation.test.ts +518 -0
- package/template/vendor/kysely-dsql/dsql/query-validation.ts +128 -0
- package/template/vendor/kysely-dsql/dsql/raw-statement.test.ts +167 -0
- package/template/vendor/kysely-dsql/dsql/raw-statement.ts +51 -0
- package/template/vendor/kysely-dsql/dsql/schema-module.ts +167 -0
- package/template/vendor/kysely-dsql/dsql/types.ts +4 -0
- package/template/vendor/kysely-dsql/generator/create-migration.ts +86 -0
- package/template/vendor/kysely-dsql/generator/generate-types-from-pglite.ts +40 -0
- package/template/vendor/kysely-dsql/generator/generated-types-writer.ts +73 -0
- package/template/vendor/kysely-dsql/generator/migration-file.ts +73 -0
- package/template/vendor/kysely-dsql/generator/type-generator.ts +330 -0
- package/template/vendor/kysely-dsql/plugins/auto-updated-at.plugin.ts +139 -0
- package/template/vendor/kysely-dsql/plugins/index.ts +10 -0
- package/template/vendor/kysely-dsql/plugins/soft-delete.plugin.ts +217 -0
- package/template/vitest.config.ts +23 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { PostgresQueryCompiler } from "kysely";
|
|
2
|
+
import type {
|
|
3
|
+
AddColumnNode,
|
|
4
|
+
AddConstraintNode,
|
|
5
|
+
AlterColumnNode,
|
|
6
|
+
AlterTypeNode,
|
|
7
|
+
ColumnDefinitionNode,
|
|
8
|
+
CompiledQuery,
|
|
9
|
+
CreateIndexNode,
|
|
10
|
+
CreateTableNode,
|
|
11
|
+
CreateTypeNode,
|
|
12
|
+
CreateViewNode,
|
|
13
|
+
DropTypeNode,
|
|
14
|
+
DropViewNode,
|
|
15
|
+
ForeignKeyConstraintNode,
|
|
16
|
+
ModifyColumnNode,
|
|
17
|
+
OperationNode,
|
|
18
|
+
QueryId,
|
|
19
|
+
ReferencesNode,
|
|
20
|
+
RefreshMaterializedViewNode,
|
|
21
|
+
RootOperationNode,
|
|
22
|
+
} from "kysely";
|
|
23
|
+
|
|
24
|
+
import { DSQLQueryCompilerError } from "./query-compiler-error.js";
|
|
25
|
+
import {
|
|
26
|
+
getCompatibilityIssue,
|
|
27
|
+
validateDSQLStatement,
|
|
28
|
+
} from "./query-validation.js";
|
|
29
|
+
import type { DSQLValidationCode } from "./query-validation.js";
|
|
30
|
+
|
|
31
|
+
const throwCompilerIssue = (code: DSQLValidationCode): never => {
|
|
32
|
+
throw new DSQLQueryCompilerError([getCompatibilityIssue(code)]);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const guardTemporaryTable = (node: CreateTableNode): void => {
|
|
36
|
+
if (node.temporary || node.onCommit) {
|
|
37
|
+
throwCompilerIssue("temporary_object");
|
|
38
|
+
}
|
|
39
|
+
if (node.selectQuery) {
|
|
40
|
+
throwCompilerIssue("create_table_as");
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const guardTableConstraints = (node: CreateTableNode): void => {
|
|
45
|
+
if (node.indexes && node.indexes.length > 0) {
|
|
46
|
+
throwCompilerIssue("synchronous_index");
|
|
47
|
+
}
|
|
48
|
+
if (node.constraints?.some((c) => c.kind === "ForeignKeyConstraintNode")) {
|
|
49
|
+
throwCompilerIssue("foreign_key");
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const guardColumnDefinition = (node: ColumnDefinitionNode): void => {
|
|
54
|
+
if (node.references) {
|
|
55
|
+
throwCompilerIssue("foreign_key");
|
|
56
|
+
}
|
|
57
|
+
if (node.autoIncrement || node.identity) {
|
|
58
|
+
throwCompilerIssue("postgres_type");
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const guardCreateView = (node: CreateViewNode): void => {
|
|
63
|
+
if (node.temporary) {
|
|
64
|
+
throwCompilerIssue("temporary_object");
|
|
65
|
+
}
|
|
66
|
+
if (node.materialized) {
|
|
67
|
+
throwCompilerIssue("materialized_view");
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const guardDropView = (node: DropViewNode): void => {
|
|
72
|
+
if (node.materialized) {
|
|
73
|
+
throwCompilerIssue("materialized_view");
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const guardAlterColumn = (node: AlterColumnNode): void => {
|
|
78
|
+
if (node.dataType || node.dataTypeExpression) {
|
|
79
|
+
throwCompilerIssue("alter_column_type");
|
|
80
|
+
}
|
|
81
|
+
if (node.setNotNull) {
|
|
82
|
+
throwCompilerIssue("alter_column_set_not_null");
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const hasColumnConstraints = (col: ColumnDefinitionNode): boolean =>
|
|
87
|
+
Boolean(col.defaultTo || col.notNull || col.primaryKey || col.unique);
|
|
88
|
+
|
|
89
|
+
const hasColumnConstraintModifiers = (col: ColumnDefinitionNode): boolean =>
|
|
90
|
+
Boolean(col.references || col.check || col.generated);
|
|
91
|
+
|
|
92
|
+
const hasColumnIdentityModifiers = (col: ColumnDefinitionNode): boolean =>
|
|
93
|
+
Boolean(col.autoIncrement || col.identity || col.unsigned);
|
|
94
|
+
|
|
95
|
+
const hasColumnModifiers = (col: ColumnDefinitionNode): boolean =>
|
|
96
|
+
hasColumnConstraintModifiers(col) || hasColumnIdentityModifiers(col);
|
|
97
|
+
|
|
98
|
+
const guardAddColumn = (node: AddColumnNode): void => {
|
|
99
|
+
if (hasColumnConstraints(node.column) || hasColumnModifiers(node.column)) {
|
|
100
|
+
throwCompilerIssue("alter_add_column_constraint");
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const guardAddConstraint = (node: AddConstraintNode): void => {
|
|
105
|
+
if (node.constraint.kind === "ForeignKeyConstraintNode") {
|
|
106
|
+
throwCompilerIssue("foreign_key");
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const hasInvalidIndexColumn = (columns?: readonly OperationNode[]): boolean => {
|
|
111
|
+
if (!columns || columns.length === 0) {
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
return columns.some(
|
|
115
|
+
(col) => col.kind === "OrderByItemNode" || col.kind === "RawNode"
|
|
116
|
+
);
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const guardCreateIndex = (node: CreateIndexNode): void => {
|
|
120
|
+
if (
|
|
121
|
+
!node.table ||
|
|
122
|
+
node.using ||
|
|
123
|
+
node.where ||
|
|
124
|
+
hasInvalidIndexColumn(node.columns)
|
|
125
|
+
) {
|
|
126
|
+
throwCompilerIssue("unsupported_index_clause");
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Aurora DSQL query compiler.
|
|
132
|
+
*
|
|
133
|
+
* Enforces Aurora DSQL compatibility rules on structured operation nodes
|
|
134
|
+
* and validates final compiled SQL statements before driver execution.
|
|
135
|
+
*/
|
|
136
|
+
export class DSQLQueryCompiler extends PostgresQueryCompiler {
|
|
137
|
+
override compileQuery(
|
|
138
|
+
node: RootOperationNode,
|
|
139
|
+
queryId: QueryId
|
|
140
|
+
): CompiledQuery {
|
|
141
|
+
const compiled = super.compileQuery(node, queryId);
|
|
142
|
+
const validation = validateDSQLStatement(compiled.sql);
|
|
143
|
+
if (!validation.supported) {
|
|
144
|
+
throw new DSQLQueryCompilerError(validation.issues);
|
|
145
|
+
}
|
|
146
|
+
return compiled;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
protected override visitCreateTable(node: CreateTableNode): void {
|
|
150
|
+
guardTemporaryTable(node);
|
|
151
|
+
guardTableConstraints(node);
|
|
152
|
+
super.visitCreateTable(node);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
protected override visitColumnDefinition(node: ColumnDefinitionNode): void {
|
|
156
|
+
guardColumnDefinition(node);
|
|
157
|
+
super.visitColumnDefinition(node);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
protected override visitCreateView(node: CreateViewNode): void {
|
|
161
|
+
guardCreateView(node);
|
|
162
|
+
super.visitCreateView(node);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
protected override visitDropView(node: DropViewNode): void {
|
|
166
|
+
guardDropView(node);
|
|
167
|
+
super.visitDropView(node);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// oxlint-disable-next-line class-methods-use-this
|
|
171
|
+
protected override visitRefreshMaterializedView(
|
|
172
|
+
_node: RefreshMaterializedViewNode
|
|
173
|
+
): void {
|
|
174
|
+
throwCompilerIssue("materialized_view");
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// oxlint-disable-next-line class-methods-use-this
|
|
178
|
+
protected override visitCreateType(_node: CreateTypeNode): void {
|
|
179
|
+
throwCompilerIssue("postgres_type");
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// oxlint-disable-next-line class-methods-use-this
|
|
183
|
+
protected override visitDropType(_node: DropTypeNode): void {
|
|
184
|
+
throwCompilerIssue("postgres_type");
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// oxlint-disable-next-line class-methods-use-this
|
|
188
|
+
protected override visitAlterType(_node: AlterTypeNode): void {
|
|
189
|
+
throwCompilerIssue("postgres_type");
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// oxlint-disable-next-line class-methods-use-this
|
|
193
|
+
protected override visitForeignKeyConstraint(
|
|
194
|
+
_node: ForeignKeyConstraintNode
|
|
195
|
+
): void {
|
|
196
|
+
throwCompilerIssue("foreign_key");
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// oxlint-disable-next-line class-methods-use-this
|
|
200
|
+
protected override visitReferences(_node: ReferencesNode): void {
|
|
201
|
+
throwCompilerIssue("foreign_key");
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// oxlint-disable-next-line class-methods-use-this
|
|
205
|
+
protected override visitModifyColumn(_node: ModifyColumnNode): void {
|
|
206
|
+
throwCompilerIssue("alter_column_type");
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
protected override visitAlterColumn(node: AlterColumnNode): void {
|
|
210
|
+
guardAlterColumn(node);
|
|
211
|
+
super.visitAlterColumn(node);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
protected override visitAddColumn(node: AddColumnNode): void {
|
|
215
|
+
guardAddColumn(node);
|
|
216
|
+
super.visitAddColumn(node);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
protected override visitAddConstraint(node: AddConstraintNode): void {
|
|
220
|
+
guardAddConstraint(node);
|
|
221
|
+
super.visitAddConstraint(node);
|
|
222
|
+
if (node.constraint.kind === "CheckConstraintNode") {
|
|
223
|
+
this.append(" not valid");
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
private appendIndexPrefix(node: CreateIndexNode): void {
|
|
228
|
+
this.append("create ");
|
|
229
|
+
if (node.unique) {
|
|
230
|
+
this.append("unique ");
|
|
231
|
+
}
|
|
232
|
+
this.append("index async ");
|
|
233
|
+
if (node.ifNotExists) {
|
|
234
|
+
this.append("if not exists ");
|
|
235
|
+
}
|
|
236
|
+
this.visitNode(node.name);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
private appendIndexTableAndColumns(node: CreateIndexNode): void {
|
|
240
|
+
if (node.table) {
|
|
241
|
+
this.append(" on ");
|
|
242
|
+
this.visitNode(node.table);
|
|
243
|
+
}
|
|
244
|
+
if (node.columns) {
|
|
245
|
+
this.append(" (");
|
|
246
|
+
this.compileList(node.columns);
|
|
247
|
+
this.append(")");
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
protected override visitCreateIndex(node: CreateIndexNode): void {
|
|
252
|
+
guardCreateIndex(node);
|
|
253
|
+
this.appendIndexPrefix(node);
|
|
254
|
+
this.appendIndexTableAndColumns(node);
|
|
255
|
+
if (node.nullsNotDistinct) {
|
|
256
|
+
this.append(" nulls not distinct");
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|