create-monolayer-app 0.5.1 → 0.6.3
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 +91 -59
- package/package.json +19 -16
- package/template/.agents/skills/{monolayer-application-permissions → application-permissions}/SKILL.md +2 -2
- package/template/.agents/skills/application-permissions/agents/openai.yaml +4 -0
- package/template/.agents/skills/kysely/SKILL.md +48 -0
- package/template/.agents/skills/kysely/agents/openai.yaml +4 -0
- package/template/.agents/skills/kysely/references/execution-plugins-and-runtime.md +67 -0
- package/template/.agents/skills/kysely/references/expressions-and-helpers.md +102 -0
- package/template/.agents/skills/kysely/references/migrations.md +43 -0
- package/template/.agents/skills/kysely/references/official-docs-map.md +97 -0
- package/template/.agents/skills/kysely/references/query-building.md +119 -0
- package/template/.agents/skills/kysely/references/transactions.md +47 -0
- package/template/.agents/skills/kysely/references/troubleshooting-and-boundaries.md +67 -0
- package/template/.agents/skills/kysely/references/types.md +58 -0
- package/template/.agents/skills/persistent-app-data/SKILL.md +74 -0
- package/template/.agents/skills/persistent-app-data/agents/openai.yaml +4 -0
- package/template/.agents/skills/persistent-app-data/references/generated-types.md +23 -0
- package/template/.agents/skills/persistent-app-data/references/migrations.md +68 -0
- package/template/.agents/skills/vitest/GENERATION.md +25 -0
- package/template/.agents/skills/vitest/SKILL.md +59 -0
- package/template/.agents/skills/vitest/references/advanced-environments.md +26 -0
- package/template/.agents/skills/vitest/references/advanced-projects.md +31 -0
- package/template/.agents/skills/vitest/references/advanced-type-testing.md +30 -0
- package/template/.agents/skills/vitest/references/advanced-vi.md +23 -0
- package/template/.agents/skills/vitest/references/core-cli.md +23 -0
- package/template/.agents/skills/vitest/references/core-config.md +24 -0
- package/template/.agents/skills/vitest/references/core-describe.md +24 -0
- package/template/.agents/skills/vitest/references/core-expect.md +35 -0
- package/template/.agents/skills/vitest/references/core-hooks.md +26 -0
- package/template/.agents/skills/vitest/references/core-test-api.md +29 -0
- package/template/.agents/skills/vitest/references/features-benchmarking.md +25 -0
- package/template/.agents/skills/vitest/references/features-concurrency.md +20 -0
- package/template/.agents/skills/vitest/references/features-context.md +27 -0
- package/template/.agents/skills/vitest/references/features-coverage.md +17 -0
- package/template/.agents/skills/vitest/references/features-filtering.md +24 -0
- package/template/.agents/skills/vitest/references/features-mocking.md +32 -0
- package/template/.agents/skills/vitest/references/features-reporters.md +22 -0
- package/template/.agents/skills/vitest/references/features-snapshots.md +23 -0
- package/template/.agents/skills/vitest/references/features-test-tags.md +30 -0
- package/template/.agents/skills/vitest/references/version-compatibility.md +19 -0
- package/template/.claude/CLAUDE.md +2 -2
- package/template/.react-router/types/+routes.ts +41 -0
- package/template/.react-router/types/+server-build.d.ts +18 -0
- package/template/.react-router/types/app/+types/root.ts +68 -0
- package/template/.react-router/types/app/routes/+types/files.ts +71 -0
- package/template/.react-router/types/app/routes/+types/home.ts +71 -0
- package/template/AGENTS.md +6 -2
- package/template/README.md +10 -0
- package/template/app/routes/files.ts +3 -3
- package/template/build/client/assets/entry.client-Bc58m2-m.js +9 -0
- package/template/build/client/assets/errorBoundaries-CQxPIuVU.js +16 -0
- package/template/build/client/assets/files-BvRk9kiK.js +0 -0
- package/template/build/client/assets/home-CH2INc5e.js +1 -0
- package/template/build/client/assets/jsx-runtime-eLCqVKHJ.js +1 -0
- package/template/build/client/assets/logo-dark-pX2395Y0.svg +23 -0
- package/template/build/client/assets/logo-light-CVbx2LBR.svg +23 -0
- package/template/build/client/assets/manifest-2d65dd0f.js +1 -0
- package/template/build/client/assets/root-BeNS6njP.css +2 -0
- package/template/build/client/assets/root-C1tmjS9o.js +1 -0
- package/template/build/client/favicon.ico +0 -0
- package/template/build/server/index.js +1096 -0
- package/template/lib/db/client.ts +1 -27
- package/template/package-lock.json +8221 -0
- package/template/package.json +7 -3
- package/template/vendor/file-bucket/{client.ts → index.client.ts} +11 -9
- package/template/vendor/file-bucket/{server.ts → index.server.ts} +13 -8
- package/template/vendor/file-bucket/{index.ts → lib/file-bucket.ts} +2 -1
- package/template/vendor/file-bucket/{react-router.ts → react-router.server.ts} +15 -13
- package/template/vendor/kysely-dsql/dsql/dsql-kysely.ts +31 -3
- package/template/vendor/kysely-dsql/generator/migration-file.ts +3 -3
- package/template/vendor/kysely-dsql/plugins/index.ts +0 -2
- package/template/vendor/package-app/package-app.mjs +10 -3
- package/template/vendor/package-app/package-app.test.mjs +167 -0
- package/template/vite.config.ts +3 -1
- package/template/vitest.config.ts +7 -2
- package/template/.agents/skills/monolayer-application-permissions/agents/openai.yaml +0 -4
- package/template/vendor/kysely-dsql/plugins/soft-delete.plugin.ts +0 -217
- /package/template/.agents/skills/{monolayer-application-permissions → application-permissions}/references/development-and-verification.md +0 -0
- /package/template/.agents/skills/{monolayer-application-permissions → application-permissions}/references/interface-examples.md +0 -0
- /package/template/.agents/skills/{monolayer-application-permissions → application-permissions}/references/server-examples.md +0 -0
- /package/template/vendor/file-bucket/{errors.ts → lib/errors.server.ts} +0 -0
- /package/template/vendor/file-bucket/{multipart.ts → lib/multipart.ts} +0 -0
- /package/template/vendor/file-bucket/{protocol.ts → lib/protocol.ts} +0 -0
- /package/template/vendor/file-bucket/{transport.ts → lib/transport.client.ts} +0 -0
- /package/template/vendor/file-bucket/{types.ts → lib/types.ts} +0 -0
- /package/template/vendor/file-bucket/{transfers.ts → lib/upload-signed-url.ts} +0 -0
- /package/template/vendor/file-bucket/{xml.ts → lib/xml.ts} +0 -0
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
// oxlint-disable max-classes-per-file
|
|
2
|
-
// source: https://github.com/LouisJULIEN/kysely-plugins/blob/main/src/soft-delete/soft-delete.plugin.ts
|
|
3
|
-
import type {
|
|
4
|
-
KyselyPlugin,
|
|
5
|
-
OperationNode,
|
|
6
|
-
PluginTransformQueryArgs,
|
|
7
|
-
PluginTransformResultArgs,
|
|
8
|
-
QueryResult,
|
|
9
|
-
RootOperationNode,
|
|
10
|
-
SelectQueryNode,
|
|
11
|
-
UnknownRow,
|
|
12
|
-
UpdateQueryNode,
|
|
13
|
-
} from "kysely";
|
|
14
|
-
import {
|
|
15
|
-
AliasNode,
|
|
16
|
-
BinaryOperationNode,
|
|
17
|
-
ColumnNode,
|
|
18
|
-
IdentifierNode,
|
|
19
|
-
JoinNode,
|
|
20
|
-
OperationNodeTransformer,
|
|
21
|
-
OperatorNode,
|
|
22
|
-
RawNode,
|
|
23
|
-
ReferenceNode,
|
|
24
|
-
TableNode,
|
|
25
|
-
WhereNode,
|
|
26
|
-
} from "kysely";
|
|
27
|
-
|
|
28
|
-
// credits: https://github.com/kysely-org/kysely/issues/803
|
|
29
|
-
|
|
30
|
-
export class SoftDeleteError extends Error {
|
|
31
|
-
readonly node?: OperationNode | undefined;
|
|
32
|
-
|
|
33
|
-
constructor(
|
|
34
|
-
message: string,
|
|
35
|
-
node?: OperationNode | undefined
|
|
36
|
-
// oxlint-disable-next-line unicorn/custom-error-definition
|
|
37
|
-
) {
|
|
38
|
-
super(message);
|
|
39
|
-
this.node = node;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
class SoftDeleteQueryTransformer extends OperationNodeTransformer {
|
|
43
|
-
private deletedAtColumnName: string;
|
|
44
|
-
private ignoredTables: string[];
|
|
45
|
-
|
|
46
|
-
constructor({
|
|
47
|
-
deletedAtColumnName,
|
|
48
|
-
ignoredTables,
|
|
49
|
-
}: {
|
|
50
|
-
deletedAtColumnName?: string;
|
|
51
|
-
ignoredTables?: string[];
|
|
52
|
-
} = {}) {
|
|
53
|
-
super();
|
|
54
|
-
this.deletedAtColumnName = deletedAtColumnName || "deleted_at";
|
|
55
|
-
this.ignoredTables = ignoredTables || [];
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
protected override transformSelectQuery(
|
|
59
|
-
originalNode: SelectQueryNode
|
|
60
|
-
): SelectQueryNode {
|
|
61
|
-
const node = super.transformSelectQuery(originalNode);
|
|
62
|
-
return this.addDeletedAtCondition(node);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
protected override transformUpdateQuery(
|
|
66
|
-
originalNode: UpdateQueryNode
|
|
67
|
-
): UpdateQueryNode {
|
|
68
|
-
const node = super.transformUpdateQuery(originalNode);
|
|
69
|
-
return this.addDeletedAtCondition(node);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
private appendFromFilters(
|
|
73
|
-
where: WhereNode | undefined,
|
|
74
|
-
node: SelectQueryNode | UpdateQueryNode
|
|
75
|
-
): WhereNode | undefined {
|
|
76
|
-
let currentWhere = where;
|
|
77
|
-
if (node.from) {
|
|
78
|
-
for (const from of node.from.froms) {
|
|
79
|
-
const deletedAtReference = this.getDeletedAtReference(from);
|
|
80
|
-
if (deletedAtReference) {
|
|
81
|
-
currentWhere = this.addIsNotDeletedFilter(
|
|
82
|
-
currentWhere,
|
|
83
|
-
deletedAtReference
|
|
84
|
-
);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return currentWhere;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
private appendJoinFilters(
|
|
92
|
-
where: WhereNode | undefined,
|
|
93
|
-
node: SelectQueryNode | UpdateQueryNode
|
|
94
|
-
): WhereNode | undefined {
|
|
95
|
-
let currentWhere = where;
|
|
96
|
-
if (node.joins) {
|
|
97
|
-
for (const join of node.joins) {
|
|
98
|
-
const deletedAtReference = this.getDeletedAtReference(join);
|
|
99
|
-
if (deletedAtReference) {
|
|
100
|
-
currentWhere = this.addIsNotDeletedFilter(
|
|
101
|
-
currentWhere,
|
|
102
|
-
deletedAtReference
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return currentWhere;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
private addDeletedAtCondition<T extends SelectQueryNode | UpdateQueryNode>(
|
|
111
|
-
node: T
|
|
112
|
-
): T {
|
|
113
|
-
let where = this.appendFromFilters(node.where, node);
|
|
114
|
-
where = this.appendJoinFilters(where, node);
|
|
115
|
-
return {
|
|
116
|
-
...node,
|
|
117
|
-
where,
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
private getJoinReference(node: JoinNode): ReferenceNode | null {
|
|
122
|
-
if (node.table === null) {
|
|
123
|
-
throw new SoftDeleteError("Join without a table");
|
|
124
|
-
}
|
|
125
|
-
return this.getDeletedAtReference(node.table);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
private getAliasReference(
|
|
129
|
-
node: AliasNode,
|
|
130
|
-
deletedAtColumn: ColumnNode
|
|
131
|
-
): ReferenceNode | null {
|
|
132
|
-
if (!IdentifierNode.is(node.alias)) {
|
|
133
|
-
throw new SoftDeleteError("Alias without identifier", node.alias);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
const tableAlias = node.alias.name;
|
|
137
|
-
if (!this.tableShouldHaveDeletedAt(tableAlias)) {
|
|
138
|
-
return null;
|
|
139
|
-
}
|
|
140
|
-
return ReferenceNode.create(deletedAtColumn, TableNode.create(tableAlias));
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
private getTableReference(
|
|
144
|
-
node: TableNode,
|
|
145
|
-
deletedAtColumn: ColumnNode
|
|
146
|
-
): ReferenceNode | null {
|
|
147
|
-
const tableName = node.table.identifier.name;
|
|
148
|
-
if (!this.tableShouldHaveDeletedAt(tableName)) {
|
|
149
|
-
return null;
|
|
150
|
-
}
|
|
151
|
-
return ReferenceNode.create(deletedAtColumn, node);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
private getDeletedAtReference(node: OperationNode): ReferenceNode | null {
|
|
155
|
-
if (JoinNode.is(node)) {
|
|
156
|
-
return this.getJoinReference(node);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
const deletedAtColumn = ColumnNode.create(this.deletedAtColumnName);
|
|
160
|
-
if (TableNode.is(node)) {
|
|
161
|
-
return this.getTableReference(node, deletedAtColumn);
|
|
162
|
-
}
|
|
163
|
-
if (AliasNode.is(node)) {
|
|
164
|
-
return this.getAliasReference(node, deletedAtColumn);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
throw new SoftDeleteError(
|
|
168
|
-
`Getting a reference to ${this.deletedAtColumnName} column for ${node.kind} is not supported yet.`,
|
|
169
|
-
node
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// oxlint-disable-next-line class-methods-use-this
|
|
174
|
-
private addIsNotDeletedFilter(
|
|
175
|
-
node: WhereNode | undefined,
|
|
176
|
-
deletedAtReference: ReferenceNode
|
|
177
|
-
): WhereNode {
|
|
178
|
-
const filterOperation = BinaryOperationNode.create(
|
|
179
|
-
deletedAtReference,
|
|
180
|
-
OperatorNode.create("is"),
|
|
181
|
-
RawNode.createWithSql("null")
|
|
182
|
-
);
|
|
183
|
-
if (node === null || node === undefined) {
|
|
184
|
-
return WhereNode.create(filterOperation);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
return WhereNode.cloneWithOperation(node, "And", filterOperation);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
private tableShouldHaveDeletedAt(tableName: string): boolean {
|
|
191
|
-
return (
|
|
192
|
-
!tableName.startsWith("kysely_") &&
|
|
193
|
-
!this.ignoredTables.includes(tableName)
|
|
194
|
-
);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
export class SoftDelete implements KyselyPlugin {
|
|
199
|
-
private transformer: SoftDeleteQueryTransformer;
|
|
200
|
-
|
|
201
|
-
constructor(
|
|
202
|
-
...args: ConstructorParameters<typeof SoftDeleteQueryTransformer>
|
|
203
|
-
) {
|
|
204
|
-
this.transformer = new SoftDeleteQueryTransformer(...args);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
transformQuery({ node }: PluginTransformQueryArgs): RootOperationNode {
|
|
208
|
-
return this.transformer.transformNode(node);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// oxlint-disable-next-line class-methods-use-this
|
|
212
|
-
transformResult({
|
|
213
|
-
result,
|
|
214
|
-
}: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>> {
|
|
215
|
-
return Promise.resolve(result);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|