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.
Files changed (37) hide show
  1. package/bin/index.js +1 -1
  2. package/package.json +1 -1
  3. package/template/_gitignore +5 -0
  4. package/template/lib/db/client.ts +30 -0
  5. package/template/lib/db/db.ts +4 -0
  6. package/template/oxlint.config.ts +11 -0
  7. package/template/package.json +23 -3
  8. package/template/tsconfig.json +3 -2
  9. package/template/vendor/kysely-dsql/dsql/adapter.ts +15 -0
  10. package/template/vendor/kysely-dsql/dsql/alter-column-builder.ts +105 -0
  11. package/template/vendor/kysely-dsql/dsql/alter-table-builders.ts +195 -0
  12. package/template/vendor/kysely-dsql/dsql/compatibility-rules.ts +235 -0
  13. package/template/vendor/kysely-dsql/dsql/create-column-builder.ts +187 -0
  14. package/template/vendor/kysely-dsql/dsql/create-table-builder.ts +115 -0
  15. package/template/vendor/kysely-dsql/dsql/dialect.ts +41 -0
  16. package/template/vendor/kysely-dsql/dsql/dsql-kysely.ts +93 -0
  17. package/template/vendor/kysely-dsql/dsql/dsql-token.ts +29 -0
  18. package/template/vendor/kysely-dsql/dsql/index-view-builders.ts +206 -0
  19. package/template/vendor/kysely-dsql/dsql/pool.ts +40 -0
  20. package/template/vendor/kysely-dsql/dsql/query-compiler-error.ts +18 -0
  21. package/template/vendor/kysely-dsql/dsql/query-compiler.test.ts +765 -0
  22. package/template/vendor/kysely-dsql/dsql/query-compiler.ts +259 -0
  23. package/template/vendor/kysely-dsql/dsql/query-validation.test.ts +518 -0
  24. package/template/vendor/kysely-dsql/dsql/query-validation.ts +128 -0
  25. package/template/vendor/kysely-dsql/dsql/raw-statement.test.ts +167 -0
  26. package/template/vendor/kysely-dsql/dsql/raw-statement.ts +51 -0
  27. package/template/vendor/kysely-dsql/dsql/schema-module.ts +167 -0
  28. package/template/vendor/kysely-dsql/dsql/types.ts +4 -0
  29. package/template/vendor/kysely-dsql/generator/create-migration.ts +86 -0
  30. package/template/vendor/kysely-dsql/generator/generate-types-from-pglite.ts +40 -0
  31. package/template/vendor/kysely-dsql/generator/generated-types-writer.ts +73 -0
  32. package/template/vendor/kysely-dsql/generator/migration-file.ts +73 -0
  33. package/template/vendor/kysely-dsql/generator/type-generator.ts +330 -0
  34. package/template/vendor/kysely-dsql/plugins/auto-updated-at.plugin.ts +139 -0
  35. package/template/vendor/kysely-dsql/plugins/index.ts +10 -0
  36. package/template/vendor/kysely-dsql/plugins/soft-delete.plugin.ts +217 -0
  37. 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
+ }