create-monolayer-app 0.1.2 → 0.2.1

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 (36) hide show
  1. package/package.json +1 -1
  2. package/template/_gitignore +5 -0
  3. package/template/lib/db/client.ts +30 -0
  4. package/template/lib/db/db.ts +4 -0
  5. package/template/oxlint.config.ts +11 -0
  6. package/template/package.json +23 -3
  7. package/template/tsconfig.json +3 -2
  8. package/template/vendor/kysely-dsql/dsql/adapter.ts +15 -0
  9. package/template/vendor/kysely-dsql/dsql/alter-column-builder.ts +105 -0
  10. package/template/vendor/kysely-dsql/dsql/alter-table-builders.ts +195 -0
  11. package/template/vendor/kysely-dsql/dsql/compatibility-rules.ts +235 -0
  12. package/template/vendor/kysely-dsql/dsql/create-column-builder.ts +187 -0
  13. package/template/vendor/kysely-dsql/dsql/create-table-builder.ts +115 -0
  14. package/template/vendor/kysely-dsql/dsql/dialect.ts +41 -0
  15. package/template/vendor/kysely-dsql/dsql/dsql-kysely.ts +93 -0
  16. package/template/vendor/kysely-dsql/dsql/dsql-token.ts +29 -0
  17. package/template/vendor/kysely-dsql/dsql/index-view-builders.ts +206 -0
  18. package/template/vendor/kysely-dsql/dsql/pool.ts +40 -0
  19. package/template/vendor/kysely-dsql/dsql/query-compiler-error.ts +18 -0
  20. package/template/vendor/kysely-dsql/dsql/query-compiler.test.ts +765 -0
  21. package/template/vendor/kysely-dsql/dsql/query-compiler.ts +259 -0
  22. package/template/vendor/kysely-dsql/dsql/query-validation.test.ts +518 -0
  23. package/template/vendor/kysely-dsql/dsql/query-validation.ts +128 -0
  24. package/template/vendor/kysely-dsql/dsql/raw-statement.test.ts +167 -0
  25. package/template/vendor/kysely-dsql/dsql/raw-statement.ts +51 -0
  26. package/template/vendor/kysely-dsql/dsql/schema-module.ts +167 -0
  27. package/template/vendor/kysely-dsql/dsql/types.ts +4 -0
  28. package/template/vendor/kysely-dsql/generator/create-migration.ts +86 -0
  29. package/template/vendor/kysely-dsql/generator/generate-types-from-pglite.ts +40 -0
  30. package/template/vendor/kysely-dsql/generator/generated-types-writer.ts +73 -0
  31. package/template/vendor/kysely-dsql/generator/migration-file.ts +73 -0
  32. package/template/vendor/kysely-dsql/generator/type-generator.ts +330 -0
  33. package/template/vendor/kysely-dsql/plugins/auto-updated-at.plugin.ts +139 -0
  34. package/template/vendor/kysely-dsql/plugins/index.ts +10 -0
  35. package/template/vendor/kysely-dsql/plugins/soft-delete.plugin.ts +217 -0
  36. package/template/vitest.config.ts +23 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-monolayer-app",
3
- "version": "0.1.2",
3
+ "version": "0.2.1",
4
4
  "description": "CLI to scaffold a new Monolayer application",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,7 +1,12 @@
1
1
  .DS_Store
2
+
2
3
  .env
3
4
  /node_modules/
4
5
 
5
6
  # React Router
7
+
6
8
  /.react-router/
7
9
  /build/
10
+
11
+ .pglite_development/
12
+ .pglite_test/
@@ -0,0 +1,30 @@
1
+ import assert from "node:assert";
2
+
3
+ import { PGlite } from "@electric-sql/pglite";
4
+ import { PGliteDialect } from "kysely";
5
+
6
+ import { DSQLDialect } from "../../vendor/kysely-dsql/dsql/dialect";
7
+ import { DSQLKysely } from "../../vendor/kysely-dsql/dsql/dsql-kysely";
8
+ import { createDSQLPool } from "../../vendor/kysely-dsql/dsql/pool";
9
+ import plugins from "../../vendor/kysely-dsql/plugins";
10
+ import type { Database } from "./db.js";
11
+
12
+ function dialect() {
13
+ if (process.env.NODE_ENV === "production") {
14
+ const endpoint = process.env.CLUSTER_ENDPOINT;
15
+ assert.ok(endpoint);
16
+ return new DSQLDialect({
17
+ pool: createDSQLPool(endpoint),
18
+ });
19
+ }
20
+ return new PGliteDialect({
21
+ pglite: new PGlite(
22
+ `./.pglite_${process.env.NODE_ENV === "test" ? "test" : "development"}`
23
+ ),
24
+ });
25
+ }
26
+
27
+ export const db: DSQLKysely<Database> = new DSQLKysely<Database>({
28
+ dialect: dialect(),
29
+ plugins,
30
+ });
@@ -0,0 +1,4 @@
1
+ // This file is generated by @mnlyr-apps/db. Do not edit this file.
2
+
3
+ // oxlint-disable-next-line typescript/no-empty-interface typescript/no-empty-object-type
4
+ export interface Database {}
@@ -29,6 +29,17 @@ export default defineConfig({
29
29
  "no-use-before-define": "off",
30
30
  "no-empty-pattern": "off",
31
31
  "react-doctor/rendering-svg-precision": "off",
32
+ "arrow-body-style": "off",
32
33
  },
34
+ overrides: [
35
+ {
36
+ files: ["lib/db/migrations/*.ts"],
37
+ rules: {
38
+ "typescript/no-explicit-any": "off",
39
+ "no-unused-vars": "off",
40
+ "unicorn/filename-case": "off",
41
+ },
42
+ },
43
+ ],
33
44
  settings: jsPluginSettings,
34
45
  });
@@ -7,28 +7,48 @@
7
7
  "dev": "react-router dev",
8
8
  "start": "react-router-serve ./build/server/index.js",
9
9
  "check": "react-router typegen && tsc && ultracite check",
10
- "fix": "ultracite fix"
10
+ "fix": "ultracite fix",
11
+ "migrate:latest": "kysely migrate:latest",
12
+ "postmigrate:latest": "npm run db:create-types",
13
+ "migrate:up": "kysely migrate:up",
14
+ "postmigrate:up": "npm run db:create-types",
15
+ "migrate:down": "kysely migrate:down",
16
+ "postmigrate:down": "npm run db:create-types",
17
+ "migrate:list": "kysely migrate:list",
18
+ "migrate:make": "tsx vendor/kysely-dsql/generator/create-migration.ts",
19
+ "db:create-types": "tsx vendor/kysely-dsql/generator/generate-types-from-pglite.ts"
11
20
  },
12
21
  "dependencies": {
22
+ "@aws-sdk/dsql-signer": "^3.1126.0",
23
+ "@aws/aurora-dsql-node-postgres-connector": "^0.1.9",
24
+ "@kysera/infra": "^0.10.0",
13
25
  "@react-router/node": "^8",
14
26
  "@react-router/serve": "^8",
27
+ "@types/pg": "^8.23.1",
15
28
  "isbot": "^5.1.36",
29
+ "kysely": "^0.29.5",
30
+ "pg": "^8.23.0",
16
31
  "react": "^19.2.7",
17
32
  "react-dom": "^19.2.7",
18
33
  "react-router": "^8"
19
34
  },
20
35
  "devDependencies": {
36
+ "@electric-sql/pglite": "^0.5.8",
37
+ "@electric-sql/pglite-socket": "^0.2.11",
21
38
  "@react-router/dev": "^8",
22
39
  "@tailwindcss/vite": "^4.2.2",
23
- "@types/node": "^22",
40
+ "@types/node": "^24",
24
41
  "@types/react": "^19.2.14",
25
42
  "@types/react-dom": "^19.2.3",
43
+ "kysely-ctl": "^0.21.0",
26
44
  "oxfmt": "^0.65.0",
27
45
  "oxlint": "^1.80.0",
28
46
  "oxlint-plugin-react-doctor": "^0.9.12",
29
47
  "tailwindcss": "^4.2.2",
48
+ "tsx": "^4.23.13",
30
49
  "typescript": "^7.0.2",
31
50
  "ultracite": "^7.10.7",
32
- "vite": "^8.0.3"
51
+ "vite": "^8.0.3",
52
+ "vitest": "^5.0.0"
33
53
  }
34
54
  }
@@ -3,11 +3,12 @@
3
3
  "**/*",
4
4
  "**/.server/**/*",
5
5
  "**/.client/**/*",
6
- ".react-router/types/**/*"
6
+ ".react-router/types/**/*",
7
+ ".config/*"
7
8
  ],
8
9
  "compilerOptions": {
9
10
  "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
10
- "lib": ["DOM", "DOM.Iterable", "ES2022"],
11
+ "lib": ["DOM", "DOM.Iterable", "ES2022", "ES2023"],
11
12
  "types": ["node", "vite/client"],
12
13
  "target": "ES2022",
13
14
  "module": "ES2022",
@@ -0,0 +1,15 @@
1
+ // oxlint-disable typescript/no-explicit-any class-methods-use-this require-await
2
+ import { PostgresAdapter } from "kysely";
3
+ import type { MigrationLockOptions } from "kysely";
4
+
5
+ import type { AnyKysely } from "./types";
6
+
7
+ export class DQSLAdapter extends PostgresAdapter {
8
+ async acquireMigrationLock(_db: AnyKysely, _opt: MigrationLockOptions) {
9
+ console.log("ACQUIRE");
10
+ }
11
+ // oxlint-disable-next-line require-await class-methods-use-this
12
+ async releaseMigrationLock(_db: AnyKysely, _opt: MigrationLockOptions) {
13
+ console.log("RELEASE");
14
+ }
15
+ }
@@ -0,0 +1,105 @@
1
+ // oxlint-disable max-classes-per-file
2
+ import { AlterColumnBuilder, ColumnDefinitionBuilder } from "kysely";
3
+ import type { AlteredColumnBuilder } from "kysely";
4
+
5
+ /**
6
+ * Restricts column definition options when adding columns during table alteration.
7
+ *
8
+ * Aurora DSQL only allows the IF NOT EXISTS modifier when adding columns.
9
+ */
10
+ // eslint-disable-next-line max-classes-per-file
11
+ export class DSQLAlterAddColumnDefinitionBuilder extends ColumnDefinitionBuilder {
12
+ /**
13
+ * Adds the IF NOT EXISTS clause when adding a column.
14
+ *
15
+ * @returns The restricted column definition builder.
16
+ */
17
+ declare ifNotExists: () => DSQLAlterAddColumnDefinitionBuilder;
18
+
19
+ /**
20
+ * Calls a custom transformation function.
21
+ *
22
+ * @param func - The transformation callback.
23
+ * @returns The callback result.
24
+ */
25
+ declare $call: <T>(func: (qb: this) => T) => T;
26
+
27
+ declare primaryKey: (this: never, ...args: never[]) => never;
28
+ declare unique: (this: never, ...args: never[]) => never;
29
+ declare nullsNotDistinct: (this: never, ...args: never[]) => never;
30
+ declare notNull: (this: never, ...args: never[]) => never;
31
+ declare defaultTo: (this: never, ...args: never[]) => never;
32
+ declare check: (this: never, ...args: never[]) => never;
33
+ declare references: (this: never, ...args: never[]) => never;
34
+ declare onDelete: (this: never, ...args: never[]) => never;
35
+ declare onUpdate: (this: never, ...args: never[]) => never;
36
+ declare autoIncrement: (this: never, ...args: never[]) => never;
37
+ declare identity: (this: never, ...args: never[]) => never;
38
+ declare unsigned: (this: never, ...args: never[]) => never;
39
+ declare generatedAlwaysAs: (this: never, ...args: never[]) => never;
40
+ declare generatedAlwaysAsIdentity: (this: never, ...args: never[]) => never;
41
+ declare generatedByDefaultAsIdentity: (
42
+ this: never,
43
+ ...args: never[]
44
+ ) => never;
45
+ declare stored: (this: never, ...args: never[]) => never;
46
+ declare modifyFront: (this: never, ...args: never[]) => never;
47
+ declare modifyEnd: (this: never, ...args: never[]) => never;
48
+ }
49
+
50
+ /**
51
+ * Callback function to configure a column definition when adding a column to an existing table.
52
+ */
53
+ export type DSQLAlterAddColumnDefinitionBuilderCallback = (
54
+ builder: DSQLAlterAddColumnDefinitionBuilder
55
+ ) => DSQLAlterAddColumnDefinitionBuilder;
56
+
57
+ /**
58
+ * Restricts column alteration options in Aurora DSQL.
59
+ *
60
+ * Aurora DSQL supports setting/dropping defaults and dropping NOT NULL constraints.
61
+ */
62
+ // eslint-disable-next-line max-classes-per-file
63
+ export class DSQLAlterColumnBuilder extends AlterColumnBuilder {
64
+ /**
65
+ * Sets a default value for the column.
66
+ *
67
+ * @param args - The default value arguments.
68
+ * @returns The altered column builder.
69
+ */
70
+ declare setDefault: (
71
+ ...args: Parameters<AlterColumnBuilder["setDefault"]>
72
+ ) => AlteredColumnBuilder;
73
+
74
+ /**
75
+ * Drops the default value from the column.
76
+ *
77
+ * @returns The altered column builder.
78
+ */
79
+ declare dropDefault: () => AlteredColumnBuilder;
80
+
81
+ /**
82
+ * Drops the NOT NULL constraint from the column.
83
+ *
84
+ * @returns The altered column builder.
85
+ */
86
+ declare dropNotNull: () => AlteredColumnBuilder;
87
+
88
+ /**
89
+ * Calls a custom transformation function.
90
+ *
91
+ * @param func - The transformation callback.
92
+ * @returns The callback result.
93
+ */
94
+ declare $call: <T>(func: (qb: this) => T) => T;
95
+
96
+ declare setNotNull: (this: never, ...args: never[]) => never;
97
+ declare setDataType: (this: never, ...args: never[]) => never;
98
+ }
99
+
100
+ /**
101
+ * Callback function to alter an existing column definition.
102
+ */
103
+ export type DSQLAlterColumnBuilderCallback = (
104
+ builder: DSQLAlterColumnBuilder
105
+ ) => AlteredColumnBuilder;
@@ -0,0 +1,195 @@
1
+ // oxlint-disable-next-line max-classes-per-file
2
+ import { AlterTableBuilder, AlterTableColumnAlteringBuilder } from "kysely";
3
+ import type { DropColumnBuilderCallback } from "kysely";
4
+
5
+ import type {
6
+ DSQLAlterAddColumnDefinitionBuilderCallback,
7
+ DSQLAlterColumnBuilderCallback,
8
+ } from "./alter-column-builder.js";
9
+ import type { DSQLColumnDataType } from "./create-column-builder.js";
10
+
11
+ /**
12
+ * Restricts new column types after an Aurora DSQL table alteration starts.
13
+ *
14
+ * This class adds type declarations only. Kysely supplies all runtime behavior.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * db.schema.alterTable("person").dropColumn("name").addColumn("name", "text");
19
+ * ```
20
+ */
21
+ // eslint-disable-next-line max-classes-per-file
22
+ export class DSQLAlterTableColumnAlteringBuilder extends AlterTableColumnAlteringBuilder {
23
+ /**
24
+ * Adds a column with an Aurora DSQL data type.
25
+ *
26
+ * @param columnName - The column name.
27
+ * @param dataType - The Aurora DSQL data type.
28
+ * @param build - The optional column builder callback.
29
+ * @returns The restricted table alteration builder.
30
+ * @example
31
+ * ```ts
32
+ * builder.addColumn("name", "text");
33
+ * ```
34
+ */
35
+ declare addColumn: (
36
+ columnName: string,
37
+ dataType: DSQLColumnDataType,
38
+ build?: DSQLAlterAddColumnDefinitionBuilderCallback
39
+ ) => DSQLAlterTableColumnAlteringBuilder;
40
+
41
+ /**
42
+ * Alters a column and keeps the restricted builder.
43
+ *
44
+ * @param column - The column name.
45
+ * @param alteration - The column alteration callback.
46
+ * @returns The restricted table alteration builder.
47
+ * @example
48
+ * ```ts
49
+ * builder.alterColumn("name", (column) => column.dropNotNull());
50
+ * ```
51
+ */
52
+ declare alterColumn: (
53
+ column: string,
54
+ alteration: DSQLAlterColumnBuilderCallback
55
+ ) => DSQLAlterTableColumnAlteringBuilder;
56
+
57
+ /**
58
+ * Drops a column and keeps the restricted builder.
59
+ *
60
+ * @param column - The column name.
61
+ * @param build - Optional drop column callback.
62
+ * @returns The restricted table alteration builder.
63
+ * @example
64
+ * ```ts
65
+ * builder.dropColumn("legacy_name");
66
+ * ```
67
+ */
68
+ declare dropColumn: (
69
+ column: string,
70
+ build?: DropColumnBuilderCallback
71
+ ) => DSQLAlterTableColumnAlteringBuilder;
72
+
73
+ /**
74
+ * Renames a column and keeps the restricted builder.
75
+ *
76
+ * @param column - The current column name.
77
+ * @param newColumn - The new column name.
78
+ * @returns The restricted table alteration builder.
79
+ * @example
80
+ * ```ts
81
+ * builder.renameColumn("old_name", "new_name");
82
+ * ```
83
+ */
84
+ declare renameColumn: (
85
+ column: string,
86
+ newColumn: string
87
+ ) => DSQLAlterTableColumnAlteringBuilder;
88
+
89
+ /**
90
+ * Calls a custom transformation function.
91
+ *
92
+ * @param func - The transformation callback.
93
+ * @returns The callback result.
94
+ */
95
+ declare $call: <T>(func: (qb: this) => T) => T;
96
+
97
+ declare modifyColumn: (this: never, ...args: never[]) => never;
98
+ declare addForeignKeyConstraint: (this: never, ...args: never[]) => never;
99
+ declare addPrimaryKeyConstraint: (this: never, ...args: never[]) => never;
100
+ declare addUniqueConstraint: (this: never, ...args: never[]) => never;
101
+ declare addIndex: (this: never, ...args: never[]) => never;
102
+ }
103
+
104
+ /**
105
+ * Restricts new column types for an Aurora DSQL table alteration.
106
+ *
107
+ * This class adds type declarations only. Kysely supplies all runtime behavior.
108
+ *
109
+ * @example
110
+ * ```ts
111
+ * db.schema.alterTable("person").addColumn("name", "text");
112
+ * ```
113
+ */
114
+ // eslint-disable-next-line max-classes-per-file
115
+ export class DSQLAlterTableBuilder extends AlterTableBuilder {
116
+ /**
117
+ * Adds a column with an Aurora DSQL data type.
118
+ *
119
+ * @param columnName - The column name.
120
+ * @param dataType - The Aurora DSQL data type.
121
+ * @param build - The optional column builder callback.
122
+ * @returns The restricted column alteration builder.
123
+ * @example
124
+ * ```ts
125
+ * builder.addColumn("name", "text");
126
+ * ```
127
+ */
128
+ declare addColumn: (
129
+ columnName: string,
130
+ dataType: DSQLColumnDataType,
131
+ build?: DSQLAlterAddColumnDefinitionBuilderCallback
132
+ ) => DSQLAlterTableColumnAlteringBuilder;
133
+
134
+ /**
135
+ * Alters a column and returns the restricted builder.
136
+ *
137
+ * @param column - The column name.
138
+ * @param alteration - The column alteration callback.
139
+ * @returns The restricted column alteration builder.
140
+ * @example
141
+ * ```ts
142
+ * builder.alterColumn("name", (column) => column.dropNotNull());
143
+ * ```
144
+ */
145
+ declare alterColumn: (
146
+ column: string,
147
+ alteration: DSQLAlterColumnBuilderCallback
148
+ ) => DSQLAlterTableColumnAlteringBuilder;
149
+
150
+ /**
151
+ * Drops a column and returns the restricted builder.
152
+ *
153
+ * @param column - The column name.
154
+ * @param build - Optional drop column callback.
155
+ * @returns The restricted column alteration builder.
156
+ * @example
157
+ * ```ts
158
+ * builder.dropColumn("legacy_name");
159
+ * ```
160
+ */
161
+ declare dropColumn: (
162
+ column: string,
163
+ build?: DropColumnBuilderCallback
164
+ ) => DSQLAlterTableColumnAlteringBuilder;
165
+
166
+ /**
167
+ * Renames a column and returns the restricted builder.
168
+ *
169
+ * @param column - The current column name.
170
+ * @param newColumn - The new column name.
171
+ * @returns The restricted column alteration builder.
172
+ * @example
173
+ * ```ts
174
+ * builder.renameColumn("old_name", "new_name");
175
+ * ```
176
+ */
177
+ declare renameColumn: (
178
+ column: string,
179
+ newColumn: string
180
+ ) => DSQLAlterTableColumnAlteringBuilder;
181
+
182
+ /**
183
+ * Calls a custom transformation function.
184
+ *
185
+ * @param func - The transformation callback.
186
+ * @returns The callback result.
187
+ */
188
+ declare $call: <T>(func: (qb: this) => T) => T;
189
+
190
+ declare modifyColumn: (this: never, ...args: never[]) => never;
191
+ declare addForeignKeyConstraint: (this: never, ...args: never[]) => never;
192
+ declare addPrimaryKeyConstraint: (this: never, ...args: never[]) => never;
193
+ declare addUniqueConstraint: (this: never, ...args: never[]) => never;
194
+ declare addIndex: (this: never, ...args: never[]) => never;
195
+ }