@casekit/orm2 0.0.0-20250322230249
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/build/builders/buildCount.d.ts +23 -0
- package/build/builders/buildCount.js +63 -0
- package/build/builders/buildCount.test.d.ts +1 -0
- package/build/builders/buildCount.test.js +144 -0
- package/build/builders/buildCreate.d.ts +5 -0
- package/build/builders/buildCreate.js +28 -0
- package/build/builders/buildCreate.test.d.ts +1 -0
- package/build/builders/buildCreate.test.js +47 -0
- package/build/builders/buildDelete.d.ts +5 -0
- package/build/builders/buildDelete.js +28 -0
- package/build/builders/buildDelete.test.d.ts +1 -0
- package/build/builders/buildDelete.test.js +108 -0
- package/build/builders/buildFind.d.ts +8 -0
- package/build/builders/buildFind.js +185 -0
- package/build/builders/buildFind.test.d.ts +1 -0
- package/build/builders/buildFind.test.js +263 -0
- package/build/builders/buildUpdate.d.ts +5 -0
- package/build/builders/buildUpdate.js +34 -0
- package/build/builders/buildUpdate.test.d.ts +1 -0
- package/build/builders/buildUpdate.test.js +130 -0
- package/build/builders/buildWhere.d.ts +6 -0
- package/build/builders/buildWhere.js +63 -0
- package/build/builders/buildWhere.test.d.ts +1 -0
- package/build/builders/buildWhere.test.js +154 -0
- package/build/builders/types.d.ts +87 -0
- package/build/builders/types.js +1 -0
- package/build/connection.d.ts +31 -0
- package/build/connection.js +206 -0
- package/build/index.d.ts +10 -0
- package/build/index.js +5 -0
- package/build/operators.d.ts +59 -0
- package/build/operators.js +44 -0
- package/build/orm.count.d.ts +14 -0
- package/build/orm.count.js +22 -0
- package/build/orm.createMany.d.ts +5 -0
- package/build/orm.createMany.js +26 -0
- package/build/orm.createOne.d.ts +5 -0
- package/build/orm.createOne.js +34 -0
- package/build/orm.d.ts +81 -0
- package/build/orm.deleteMany.d.ts +5 -0
- package/build/orm.deleteMany.js +26 -0
- package/build/orm.deleteOne.d.ts +5 -0
- package/build/orm.deleteOne.js +32 -0
- package/build/orm.findMany.d.ts +8 -0
- package/build/orm.findMany.js +64 -0
- package/build/orm.findOne.d.ts +5 -0
- package/build/orm.findOne.js +20 -0
- package/build/orm.js +243 -0
- package/build/orm.restrict.d.ts +6 -0
- package/build/orm.restrict.js +52 -0
- package/build/orm.updateMany.d.ts +5 -0
- package/build/orm.updateMany.js +29 -0
- package/build/orm.updateOne.d.ts +5 -0
- package/build/orm.updateOne.js +35 -0
- package/build/sql/countToSql.d.ts +3 -0
- package/build/sql/countToSql.js +11 -0
- package/build/sql/countToSql.test.d.ts +1 -0
- package/build/sql/countToSql.test.js +218 -0
- package/build/sql/createToSql.d.ts +3 -0
- package/build/sql/createToSql.js +27 -0
- package/build/sql/createToSql.test.d.ts +1 -0
- package/build/sql/createToSql.test.js +186 -0
- package/build/sql/deleteToSql.d.ts +3 -0
- package/build/sql/deleteToSql.js +15 -0
- package/build/sql/deleteToSql.test.d.ts +1 -0
- package/build/sql/deleteToSql.test.js +93 -0
- package/build/sql/findToSql.d.ts +3 -0
- package/build/sql/findToSql.js +33 -0
- package/build/sql/findToSql.test.d.ts +1 -0
- package/build/sql/findToSql.test.js +409 -0
- package/build/sql/updateToSql.d.ts +3 -0
- package/build/sql/updateToSql.js +16 -0
- package/build/sql/updateToSql.test.d.ts +1 -0
- package/build/sql/updateToSql.test.js +165 -0
- package/build/sql/util.d.ts +11 -0
- package/build/sql/util.js +36 -0
- package/build/sql/util.test.d.ts +1 -0
- package/build/sql/util.test.js +163 -0
- package/build/tests/connection.test.d.ts +1 -0
- package/build/tests/connection.test.js +304 -0
- package/build/tests/datatypes.test.d.ts +1 -0
- package/build/tests/datatypes.test.js +239 -0
- package/build/tests/operators.test.d.ts +1 -0
- package/build/tests/operators.test.js +125 -0
- package/build/tests/orm.count.middleware.test.d.ts +1 -0
- package/build/tests/orm.count.middleware.test.js +132 -0
- package/build/tests/orm.count.test-d.d.ts +1 -0
- package/build/tests/orm.count.test-d.js +60 -0
- package/build/tests/orm.count.test.d.ts +1 -0
- package/build/tests/orm.count.test.js +151 -0
- package/build/tests/orm.createMany.middleware.test.d.ts +1 -0
- package/build/tests/orm.createMany.middleware.test.js +63 -0
- package/build/tests/orm.createMany.test-d.d.ts +1 -0
- package/build/tests/orm.createMany.test-d.js +131 -0
- package/build/tests/orm.createMany.test.d.ts +1 -0
- package/build/tests/orm.createMany.test.js +392 -0
- package/build/tests/orm.createOne.middleware.test.d.ts +1 -0
- package/build/tests/orm.createOne.middleware.test.js +54 -0
- package/build/tests/orm.createOne.test-d.d.ts +1 -0
- package/build/tests/orm.createOne.test-d.js +113 -0
- package/build/tests/orm.createOne.test.d.ts +1 -0
- package/build/tests/orm.createOne.test.js +268 -0
- package/build/tests/orm.deleteMany.middleware.test.d.ts +1 -0
- package/build/tests/orm.deleteMany.middleware.test.js +77 -0
- package/build/tests/orm.deleteMany.test-d.d.ts +1 -0
- package/build/tests/orm.deleteMany.test-d.js +179 -0
- package/build/tests/orm.deleteMany.test.d.ts +1 -0
- package/build/tests/orm.deleteMany.test.js +394 -0
- package/build/tests/orm.deleteOne.middleware.test.d.ts +1 -0
- package/build/tests/orm.deleteOne.middleware.test.js +61 -0
- package/build/tests/orm.deleteOne.test-d.d.ts +1 -0
- package/build/tests/orm.deleteOne.test-d.js +179 -0
- package/build/tests/orm.deleteOne.test.d.ts +1 -0
- package/build/tests/orm.deleteOne.test.js +360 -0
- package/build/tests/orm.findMany.includeManyToMany.test.d.ts +1 -0
- package/build/tests/orm.findMany.includeManyToMany.test.js +335 -0
- package/build/tests/orm.findMany.includeManyToOne.test.d.ts +1 -0
- package/build/tests/orm.findMany.includeManyToOne.test.js +286 -0
- package/build/tests/orm.findMany.includeOneToMany.test.d.ts +1 -0
- package/build/tests/orm.findMany.includeOneToMany.test.js +530 -0
- package/build/tests/orm.findMany.middleware.test.d.ts +1 -0
- package/build/tests/orm.findMany.middleware.test.js +66 -0
- package/build/tests/orm.findMany.offsetLimit.test.d.ts +1 -0
- package/build/tests/orm.findMany.offsetLimit.test.js +108 -0
- package/build/tests/orm.findMany.orderBy.test.d.ts +1 -0
- package/build/tests/orm.findMany.orderBy.test.js +304 -0
- package/build/tests/orm.findMany.select.test.d.ts +1 -0
- package/build/tests/orm.findMany.select.test.js +278 -0
- package/build/tests/orm.findMany.test-d.d.ts +1 -0
- package/build/tests/orm.findMany.test-d.js +374 -0
- package/build/tests/orm.findMany.where.test.d.ts +1 -0
- package/build/tests/orm.findMany.where.test.js +383 -0
- package/build/tests/orm.findOne.middleware.test.d.ts +1 -0
- package/build/tests/orm.findOne.middleware.test.js +57 -0
- package/build/tests/orm.findOne.test-d.d.ts +1 -0
- package/build/tests/orm.findOne.test-d.js +377 -0
- package/build/tests/orm.findOne.test.d.ts +1 -0
- package/build/tests/orm.findOne.test.js +247 -0
- package/build/tests/orm.restrict.test-d.d.ts +1 -0
- package/build/tests/orm.restrict.test-d.js +105 -0
- package/build/tests/orm.restrict.test.d.ts +1 -0
- package/build/tests/orm.restrict.test.js +259 -0
- package/build/tests/orm.transact.test.d.ts +1 -0
- package/build/tests/orm.transact.test.js +48 -0
- package/build/tests/orm.updateMany.middleware.test.d.ts +1 -0
- package/build/tests/orm.updateMany.middleware.test.js +72 -0
- package/build/tests/orm.updateMany.test.d.ts +1 -0
- package/build/tests/orm.updateMany.test.js +210 -0
- package/build/tests/orm.updateOne.middleware.test.d.ts +1 -0
- package/build/tests/orm.updateOne.middleware.test.js +62 -0
- package/build/tests/orm.updateOne.test.d.ts +1 -0
- package/build/tests/orm.updateOne.test.js +209 -0
- package/build/tests/util/db.d.ts +1571 -0
- package/build/tests/util/db.js +10 -0
- package/build/tests/util/logger.d.ts +19 -0
- package/build/tests/util/logger.js +40 -0
- package/build/types/BaseFindParams.d.ts +1 -0
- package/build/types/BaseFindParams.js +1 -0
- package/build/types/CountParams.d.ts +16 -0
- package/build/types/CountParams.js +1 -0
- package/build/types/CountParams.test-d.d.ts +1 -0
- package/build/types/CountParams.test-d.js +89 -0
- package/build/types/CreateManyParams.d.ts +11 -0
- package/build/types/CreateManyParams.js +1 -0
- package/build/types/CreateManyParams.test-d.d.ts +1 -0
- package/build/types/CreateManyParams.test-d.js +83 -0
- package/build/types/CreateManyResult.d.ts +5 -0
- package/build/types/CreateManyResult.js +1 -0
- package/build/types/CreateManyResult.test-d.d.ts +1 -0
- package/build/types/CreateManyResult.test-d.js +22 -0
- package/build/types/CreateOneParams.d.ts +11 -0
- package/build/types/CreateOneParams.js +1 -0
- package/build/types/CreateOneParams.test-d.d.ts +1 -0
- package/build/types/CreateOneParams.test-d.js +56 -0
- package/build/types/CreateOneResult.d.ts +5 -0
- package/build/types/CreateOneResult.js +1 -0
- package/build/types/CreateOneResult.test-d.d.ts +1 -0
- package/build/types/CreateOneResult.test-d.js +23 -0
- package/build/types/CreateValues.d.ts +6 -0
- package/build/types/CreateValues.js +1 -0
- package/build/types/CreateValues.test-d.d.ts +1 -0
- package/build/types/CreateValues.test-d.js +60 -0
- package/build/types/DeleteManyResult.d.ts +5 -0
- package/build/types/DeleteManyResult.js +1 -0
- package/build/types/DeleteManyResult.test-d.d.ts +1 -0
- package/build/types/DeleteManyResult.test-d.js +23 -0
- package/build/types/DeleteOneResult.d.ts +5 -0
- package/build/types/DeleteOneResult.js +1 -0
- package/build/types/DeleteOneResult.test-d.d.ts +1 -0
- package/build/types/DeleteOneResult.test-d.js +23 -0
- package/build/types/DeleteParams.d.ts +7 -0
- package/build/types/DeleteParams.js +1 -0
- package/build/types/DeleteParams.test-d.d.ts +1 -0
- package/build/types/DeleteParams.test-d.js +46 -0
- package/build/types/FindParams.d.ts +22 -0
- package/build/types/FindParams.js +1 -0
- package/build/types/FindParams.test-d.d.ts +1 -0
- package/build/types/FindParams.test-d.js +107 -0
- package/build/types/FindResult.d.ts +13 -0
- package/build/types/FindResult.js +1 -0
- package/build/types/FindResult.test-d.d.ts +1 -0
- package/build/types/FindResult.test-d.js +30 -0
- package/build/types/IncludeClause.d.ts +5 -0
- package/build/types/IncludeClause.js +1 -0
- package/build/types/IncludeClause.test-d.d.ts +1 -0
- package/build/types/IncludeClause.test-d.js +69 -0
- package/build/types/Middleware.d.ts +51 -0
- package/build/types/Middleware.js +37 -0
- package/build/types/OptionalValues.d.ts +4 -0
- package/build/types/OptionalValues.js +1 -0
- package/build/types/OptionalValues.test-d.d.ts +1 -0
- package/build/types/OptionalValues.test-d.js +12 -0
- package/build/types/OrderByClause.d.ts +9 -0
- package/build/types/OrderByClause.js +1 -0
- package/build/types/OrderByClause.test-d.d.ts +1 -0
- package/build/types/OrderByClause.test-d.js +44 -0
- package/build/types/RequiredValues.d.ts +4 -0
- package/build/types/RequiredValues.js +1 -0
- package/build/types/RequiredValues.test-d.d.ts +1 -0
- package/build/types/RequiredValues.test-d.js +22 -0
- package/build/types/RestrictModels.d.ts +23 -0
- package/build/types/RestrictModels.js +1 -0
- package/build/types/RestrictModels.test-d.d.ts +1 -0
- package/build/types/RestrictModels.test-d.js +44 -0
- package/build/types/ReturningClause.d.ts +3 -0
- package/build/types/ReturningClause.js +1 -0
- package/build/types/ReturningClause.test-d.d.ts +1 -0
- package/build/types/ReturningClause.test-d.js +15 -0
- package/build/types/SelectClause.d.ts +3 -0
- package/build/types/SelectClause.js +1 -0
- package/build/types/SelectClause.test-d.d.ts +1 -0
- package/build/types/SelectClause.test-d.js +15 -0
- package/build/types/UpdateManyResult.d.ts +5 -0
- package/build/types/UpdateManyResult.js +1 -0
- package/build/types/UpdateManyResult.test-d.d.ts +1 -0
- package/build/types/UpdateManyResult.test-d.js +15 -0
- package/build/types/UpdateOneResult.d.ts +5 -0
- package/build/types/UpdateOneResult.js +1 -0
- package/build/types/UpdateOneResult.test-d.d.ts +1 -0
- package/build/types/UpdateOneResult.test-d.js +15 -0
- package/build/types/UpdateParams.d.ts +9 -0
- package/build/types/UpdateParams.js +1 -0
- package/build/types/UpdateParams.test-d.d.ts +1 -0
- package/build/types/UpdateParams.test-d.js +29 -0
- package/build/types/UpdateValues.d.ts +6 -0
- package/build/types/UpdateValues.js +1 -0
- package/build/types/UpdateValues.test-d.d.ts +1 -0
- package/build/types/UpdateValues.test-d.js +33 -0
- package/build/types/WhereClause.d.ts +29 -0
- package/build/types/WhereClause.js +1 -0
- package/build/types/WhereClause.test-d.d.ts +1 -0
- package/build/types/WhereClause.test-d.js +137 -0
- package/build/util/getIncludedToManySubqueries.d.ts +12 -0
- package/build/util/getIncludedToManySubqueries.js +63 -0
- package/build/util/getIncludedToManySubqueries.test.d.ts +1 -0
- package/build/util/getIncludedToManySubqueries.test.js +121 -0
- package/build/util/getLateralJoinValues.d.ts +4 -0
- package/build/util/getLateralJoinValues.js +30 -0
- package/build/util/getLateralJoinValues.test.d.ts +1 -0
- package/build/util/getLateralJoinValues.test.js +99 -0
- package/build/util/hasClauses.d.ts +1 -0
- package/build/util/hasClauses.js +9 -0
- package/build/util/hasClauses.test.d.ts +1 -0
- package/build/util/hasClauses.test.js +15 -0
- package/build/util/makeTableAlias.d.ts +1 -0
- package/build/util/makeTableAlias.js +10 -0
- package/build/util/makeTableAlias.test.d.ts +1 -0
- package/build/util/makeTableAlias.test.js +18 -0
- package/build/util/resultSchema.d.ts +10 -0
- package/build/util/resultSchema.js +42 -0
- package/build/util/rowToObject.d.ts +8 -0
- package/build/util/rowToObject.js +10 -0
- package/build/util/rowToObject.test.d.ts +1 -0
- package/build/util/rowToObject.test.js +68 -0
- package/package.json +67 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { config } from "@casekit/orm2-fixtures";
|
|
2
|
+
import { makeFactory } from "@casekit/orm2-testing";
|
|
3
|
+
import { orm } from "#orm.js";
|
|
4
|
+
import { mockLogger } from "./logger.js";
|
|
5
|
+
export const createTestDB = (overrides) => {
|
|
6
|
+
const logger = mockLogger();
|
|
7
|
+
const db = orm({ ...config, logger, ...overrides });
|
|
8
|
+
const factory = makeFactory(db.config);
|
|
9
|
+
return { db, logger, factory };
|
|
10
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Logger } from "@casekit/orm2-schema";
|
|
2
|
+
interface LogEntry {
|
|
3
|
+
message: unknown;
|
|
4
|
+
args: unknown[];
|
|
5
|
+
}
|
|
6
|
+
interface LogEntries {
|
|
7
|
+
debug: LogEntry[];
|
|
8
|
+
info: LogEntry[];
|
|
9
|
+
warn: LogEntry[];
|
|
10
|
+
error: LogEntry[];
|
|
11
|
+
}
|
|
12
|
+
export interface MockLogger extends Logger {
|
|
13
|
+
get logs(): LogEntries;
|
|
14
|
+
clear(): void;
|
|
15
|
+
}
|
|
16
|
+
export declare function mockLogger({ silence }?: {
|
|
17
|
+
silence: boolean;
|
|
18
|
+
}): MockLogger;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/* v8 ignore start */
|
|
2
|
+
export function mockLogger({ silence } = { silence: true }) {
|
|
3
|
+
const entries = { debug: [], info: [], warn: [], error: [] };
|
|
4
|
+
return {
|
|
5
|
+
get logs() {
|
|
6
|
+
return entries;
|
|
7
|
+
},
|
|
8
|
+
clear() {
|
|
9
|
+
entries.debug.length = 0;
|
|
10
|
+
entries.info.length = 0;
|
|
11
|
+
entries.warn.length = 0;
|
|
12
|
+
entries.error.length = 0;
|
|
13
|
+
},
|
|
14
|
+
debug(message, ...args) {
|
|
15
|
+
if (!silence) {
|
|
16
|
+
console.debug(message, ...args);
|
|
17
|
+
}
|
|
18
|
+
entries.debug.push({ message, args });
|
|
19
|
+
},
|
|
20
|
+
info(message, ...args) {
|
|
21
|
+
if (!silence) {
|
|
22
|
+
console.info(message, ...args);
|
|
23
|
+
}
|
|
24
|
+
entries.info.push({ message, args });
|
|
25
|
+
},
|
|
26
|
+
warn(message, ...args) {
|
|
27
|
+
if (!silence) {
|
|
28
|
+
console.warn(message, ...args);
|
|
29
|
+
}
|
|
30
|
+
entries.warn.push({ message, args });
|
|
31
|
+
},
|
|
32
|
+
error(message, ...args) {
|
|
33
|
+
if (!silence) {
|
|
34
|
+
console.error(message, ...args);
|
|
35
|
+
}
|
|
36
|
+
entries.error.push({ message, args });
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/* v8 ignore stop */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ModelDefinition, ModelDefinitions, ModelName, OperatorDefinitions, RelationDefinitions } from "@casekit/orm2-schema";
|
|
2
|
+
import { WhereClause } from "./WhereClause.js";
|
|
3
|
+
export type IncludeCountClause<Models extends ModelDefinitions, Operators extends OperatorDefinitions, M extends ModelName<Models>, Model extends ModelDefinition = Models[M], Relations extends RelationDefinitions = Model["relations"] extends undefined ? Record<string, never> : NonNullable<Model["relations"]>> = keyof {
|
|
4
|
+
[R in keyof Relations as Relations[R] extends {
|
|
5
|
+
type: "N:1";
|
|
6
|
+
} ? R : never]: true;
|
|
7
|
+
} extends never ? never : {
|
|
8
|
+
[R in keyof Relations as Relations[R] extends {
|
|
9
|
+
type: "N:1";
|
|
10
|
+
} ? R : never]?: CountParams<Models, Operators, Extract<Relations[R]["model"], string>>;
|
|
11
|
+
};
|
|
12
|
+
export interface CountParams<Models extends ModelDefinitions, Operators extends OperatorDefinitions, M extends ModelName<Models>> {
|
|
13
|
+
include?: IncludeCountClause<Models, Operators, M>;
|
|
14
|
+
where?: WhereClause<Models, Operators, M>;
|
|
15
|
+
for?: "update" | "no key update" | "share" | "key share";
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { describe, test } from "vitest";
|
|
2
|
+
import { $eq } from "#operators.js";
|
|
3
|
+
describe("CountParams", () => {
|
|
4
|
+
test("empty params", () => {
|
|
5
|
+
const _ = {};
|
|
6
|
+
});
|
|
7
|
+
test("with where clause", () => {
|
|
8
|
+
const _ = {
|
|
9
|
+
where: { id: { [$eq]: 1 } },
|
|
10
|
+
};
|
|
11
|
+
});
|
|
12
|
+
test("with include clause", () => {
|
|
13
|
+
const _ = {
|
|
14
|
+
include: { author: {} },
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
test("with nested include and where", () => {
|
|
18
|
+
const _ = {
|
|
19
|
+
include: {
|
|
20
|
+
author: {
|
|
21
|
+
where: { id: { [$eq]: 1 } },
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
where: { title: { [$eq]: "test" } },
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
test("invalid relation in include", () => {
|
|
28
|
+
const _ = {
|
|
29
|
+
include: {
|
|
30
|
+
// @ts-expect-error invalid relation
|
|
31
|
+
invalidRelation: {
|
|
32
|
+
where: { id: { [$eq]: 1 } },
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
test("invalid field in where clause", () => {
|
|
38
|
+
const _ = {
|
|
39
|
+
where: {
|
|
40
|
+
// @ts-expect-error invalid field
|
|
41
|
+
invalidField: { [$eq]: 1 },
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
test("include when model has no relations", () => {
|
|
46
|
+
const _ = {
|
|
47
|
+
where: { hex: { [$eq]: "#fff" } },
|
|
48
|
+
// @ts-expect-error color has no relations
|
|
49
|
+
include: {
|
|
50
|
+
foo: {},
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
test("include when model has relations, but no N:1 relations", () => {
|
|
55
|
+
const _ = {
|
|
56
|
+
// @ts-expect-error models with no N:1 relations
|
|
57
|
+
include: {
|
|
58
|
+
friends: {
|
|
59
|
+
where: { id: { [$eq]: 1 } },
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
test("non-N:1 relations are not allowed in include", () => {
|
|
65
|
+
const _ = {
|
|
66
|
+
include: {
|
|
67
|
+
// @ts-expect-error N:1 relations are not allowed
|
|
68
|
+
likes: {
|
|
69
|
+
where: { id: { [$eq]: 1 } },
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
test("models with no N:1 relations don't allow include clauses", () => {
|
|
75
|
+
const _ = {
|
|
76
|
+
// @ts-expect-error N:N relations are not allowed
|
|
77
|
+
include: {
|
|
78
|
+
friends: {
|
|
79
|
+
where: { id: { [$eq]: 1 } },
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
test("allows counting with a for update clause", () => {
|
|
85
|
+
const _ = {
|
|
86
|
+
for: "update",
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DeepReadonly } from "ts-essentials";
|
|
2
|
+
import { ModelDefinitions, ModelName } from "@casekit/orm2-schema";
|
|
3
|
+
import { CreateValues } from "./CreateValues.js";
|
|
4
|
+
import { ReturningClause } from "./ReturningClause.js";
|
|
5
|
+
export type CreateManyParams<Models extends ModelDefinitions, M extends ModelName<ModelDefinitions>> = {
|
|
6
|
+
values: DeepReadonly<CreateValues<Models[M]>[]>;
|
|
7
|
+
returning?: ReturningClause<Models[M]>;
|
|
8
|
+
onConflict?: {
|
|
9
|
+
do: "nothing";
|
|
10
|
+
};
|
|
11
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { describe, test } from "vitest";
|
|
2
|
+
describe("CreateManyParams", () => {
|
|
3
|
+
test("creating a single value", () => {
|
|
4
|
+
const _ = {
|
|
5
|
+
values: [
|
|
6
|
+
{
|
|
7
|
+
title: "Hello world!",
|
|
8
|
+
content: "My first post",
|
|
9
|
+
authorId: 1,
|
|
10
|
+
},
|
|
11
|
+
],
|
|
12
|
+
returning: ["id"],
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
test("creating multiple values", () => {
|
|
16
|
+
const _ = {
|
|
17
|
+
values: [
|
|
18
|
+
{
|
|
19
|
+
title: "Hello world!",
|
|
20
|
+
content: "My first post",
|
|
21
|
+
authorId: 1,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
title: "Hello world!",
|
|
25
|
+
content: "My first post",
|
|
26
|
+
authorId: 1,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
returning: ["id"],
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
test("without a returning clause", () => {
|
|
33
|
+
const _ = {
|
|
34
|
+
values: [
|
|
35
|
+
{
|
|
36
|
+
title: "Hello world!",
|
|
37
|
+
content: "My first post",
|
|
38
|
+
authorId: 1,
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
test("with on conflict behaviour specified", () => {
|
|
44
|
+
const _ = {
|
|
45
|
+
values: [
|
|
46
|
+
{
|
|
47
|
+
title: "Hello world!",
|
|
48
|
+
content: "My first post",
|
|
49
|
+
authorId: 1,
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
onConflict: { do: "nothing" },
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
test("invalid field in values", () => {
|
|
56
|
+
const _ = {
|
|
57
|
+
values: [
|
|
58
|
+
{
|
|
59
|
+
title: "Hello world!",
|
|
60
|
+
content: "My first post",
|
|
61
|
+
// @ts-expect-error invalid field
|
|
62
|
+
invalid: "wrong",
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
test("invalid field in returning clause", () => {
|
|
68
|
+
const _ = {
|
|
69
|
+
values: [
|
|
70
|
+
{
|
|
71
|
+
title: "Hello world!",
|
|
72
|
+
content: "My first post",
|
|
73
|
+
authorId: 1,
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
returning: [
|
|
77
|
+
"id",
|
|
78
|
+
// @ts-expect-error invalid field
|
|
79
|
+
"wrong",
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
});
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { FieldType, ModelDefinitions, ModelName } from "@casekit/orm2-schema";
|
|
2
|
+
import { CreateManyParams } from "./CreateManyParams.js";
|
|
3
|
+
export type CreateManyResult<Models extends ModelDefinitions, M extends ModelName<Models>, Q extends CreateManyParams<Models, M>> = Q["returning"] extends NonNullable<Q["returning"]> ? {
|
|
4
|
+
[C in Q["returning"][number]]: FieldType<Models[M], C>;
|
|
5
|
+
}[] : number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { describe, expectTypeOf, test } from "vitest";
|
|
2
|
+
describe("CreateManyResult", () => {
|
|
3
|
+
test("returns array of objects when returning clause is specified", () => {
|
|
4
|
+
// Should return an array of objects with id (number), title (string), and createdAt (Date)
|
|
5
|
+
expectTypeOf().toEqualTypeOf();
|
|
6
|
+
});
|
|
7
|
+
test("returns number when no returning clause is specified", () => {
|
|
8
|
+
expectTypeOf().toEqualTypeOf();
|
|
9
|
+
});
|
|
10
|
+
test("handles nullable fields in returning clause", () => {
|
|
11
|
+
expectTypeOf().toEqualTypeOf();
|
|
12
|
+
});
|
|
13
|
+
test("handles complex field types from model definition", () => {
|
|
14
|
+
expectTypeOf().toEqualTypeOf();
|
|
15
|
+
});
|
|
16
|
+
test("returned object only includes fields specified in returning clause", () => {
|
|
17
|
+
// Should only include id, not title or content
|
|
18
|
+
expectTypeOf().toEqualTypeOf();
|
|
19
|
+
// @ts-expect-error - title is not included in returning clause
|
|
20
|
+
expectTypeOf().toEqualTypeOf();
|
|
21
|
+
});
|
|
22
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DeepReadonly } from "ts-essentials";
|
|
2
|
+
import { ModelDefinitions, ModelName } from "@casekit/orm2-schema";
|
|
3
|
+
import { CreateValues } from "./CreateValues.js";
|
|
4
|
+
import { ReturningClause } from "./ReturningClause.js";
|
|
5
|
+
export type CreateOneParams<Models extends ModelDefinitions, M extends ModelName<ModelDefinitions>> = {
|
|
6
|
+
values: DeepReadonly<CreateValues<Models[M]>>;
|
|
7
|
+
returning?: ReturningClause<Models[M]>;
|
|
8
|
+
onConflict?: {
|
|
9
|
+
do: "nothing";
|
|
10
|
+
};
|
|
11
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { describe, test } from "vitest";
|
|
2
|
+
describe("CreateOneParams", () => {
|
|
3
|
+
test("creating a record", () => {
|
|
4
|
+
const _ = {
|
|
5
|
+
values: {
|
|
6
|
+
title: "Hello world!",
|
|
7
|
+
content: "My first post",
|
|
8
|
+
authorId: 1,
|
|
9
|
+
},
|
|
10
|
+
returning: ["id"],
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
test("without a returning clause", () => {
|
|
14
|
+
const _ = {
|
|
15
|
+
values: {
|
|
16
|
+
title: "Hello world!",
|
|
17
|
+
content: "My first post",
|
|
18
|
+
authorId: 1,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
test("with on conflict behaviour specified", () => {
|
|
23
|
+
const _ = {
|
|
24
|
+
values: {
|
|
25
|
+
title: "Hello world!",
|
|
26
|
+
content: "My first post",
|
|
27
|
+
authorId: 1,
|
|
28
|
+
},
|
|
29
|
+
onConflict: { do: "nothing" },
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
test("invalid field in values", () => {
|
|
33
|
+
const _ = {
|
|
34
|
+
values: {
|
|
35
|
+
title: "Hello world!",
|
|
36
|
+
content: "My first post",
|
|
37
|
+
// @ts-expect-error invalid field
|
|
38
|
+
invalid: "wrong",
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
test("invalid field in returning clause", () => {
|
|
43
|
+
const _ = {
|
|
44
|
+
values: {
|
|
45
|
+
title: "Hello world!",
|
|
46
|
+
content: "My first post",
|
|
47
|
+
authorId: 1,
|
|
48
|
+
},
|
|
49
|
+
returning: [
|
|
50
|
+
"id",
|
|
51
|
+
// @ts-expect-error invalid field
|
|
52
|
+
"wrong",
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { FieldType, ModelDefinitions, ModelName } from "@casekit/orm2-schema";
|
|
2
|
+
import { CreateOneParams } from "./CreateOneParams.js";
|
|
3
|
+
export type CreateOneResult<Models extends ModelDefinitions, M extends ModelName<Models>, Q extends CreateOneParams<Models, M>> = Q["returning"] extends NonNullable<Q["returning"]> ? {
|
|
4
|
+
[C in Q["returning"][number]]: FieldType<Models[M], C>;
|
|
5
|
+
} | null : number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, expectTypeOf, test } from "vitest";
|
|
2
|
+
describe("CreateOneResult", () => {
|
|
3
|
+
test("returns object with fields when returning clause specified", () => {
|
|
4
|
+
expectTypeOf().toEqualTypeOf();
|
|
5
|
+
});
|
|
6
|
+
test("returns number when no returning clause specified", () => {
|
|
7
|
+
expectTypeOf().toEqualTypeOf();
|
|
8
|
+
});
|
|
9
|
+
test("handles nullable fields in returning clause", () => {
|
|
10
|
+
expectTypeOf().toEqualTypeOf();
|
|
11
|
+
});
|
|
12
|
+
test("handles array fields in returning clause", () => {
|
|
13
|
+
expectTypeOf().toEqualTypeOf();
|
|
14
|
+
});
|
|
15
|
+
test("handles json fields in returning clause", () => {
|
|
16
|
+
expectTypeOf().toEqualTypeOf();
|
|
17
|
+
});
|
|
18
|
+
test("returned object only includes fields specified in returning clause", () => {
|
|
19
|
+
expectTypeOf().toEqualTypeOf();
|
|
20
|
+
// @ts-expect-error - title is not included in returning clause
|
|
21
|
+
expectTypeOf().toEqualTypeOf();
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { DeepReadonly } from "ts-essentials";
|
|
2
|
+
import { ModelDefinition } from "@casekit/orm2-schema";
|
|
3
|
+
import { Simplify } from "@casekit/toolbox";
|
|
4
|
+
import { OptionalValues } from "./OptionalValues.js";
|
|
5
|
+
import { RequiredValues } from "./RequiredValues.js";
|
|
6
|
+
export type CreateValues<Model extends ModelDefinition> = DeepReadonly<Simplify<RequiredValues<Model> extends never ? OptionalValues<Model> : OptionalValues<Model> extends never ? RequiredValues<Model> : RequiredValues<Model> & OptionalValues<Model>>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { describe, expectTypeOf, test } from "vitest";
|
|
2
|
+
describe("CreateValues", () => {
|
|
3
|
+
test("combines required and optional fields for post model", () => {
|
|
4
|
+
const _ = {
|
|
5
|
+
title: "Hello world",
|
|
6
|
+
content: "My first post",
|
|
7
|
+
tags: ["a", "b", "c"],
|
|
8
|
+
metadata: {
|
|
9
|
+
foo: "a",
|
|
10
|
+
bar: [
|
|
11
|
+
{ baz: "good", quux: true },
|
|
12
|
+
{ baz: "bad", quux: false },
|
|
13
|
+
],
|
|
14
|
+
},
|
|
15
|
+
authorId: 1,
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
test("enforces required fields", () => {
|
|
19
|
+
// @ts-expect-error authorId is required
|
|
20
|
+
const _ = {
|
|
21
|
+
title: "Hello",
|
|
22
|
+
content: "World",
|
|
23
|
+
metadata: { foo: "a", bar: [{ baz: "good", quux: true }] },
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
test("allows omitting optional fields", () => {
|
|
27
|
+
const values = {
|
|
28
|
+
title: "Hello",
|
|
29
|
+
content: "World",
|
|
30
|
+
authorId: 1,
|
|
31
|
+
};
|
|
32
|
+
expectTypeOf(values).toEqualTypeOf();
|
|
33
|
+
});
|
|
34
|
+
test("handles model with only required fields", () => {
|
|
35
|
+
expectTypeOf().toEqualTypeOf();
|
|
36
|
+
});
|
|
37
|
+
test("handles model with only optional fields", () => {
|
|
38
|
+
expectTypeOf().toEqualTypeOf();
|
|
39
|
+
});
|
|
40
|
+
test("nullable fields are optional but typed correctly", () => {
|
|
41
|
+
const values = {
|
|
42
|
+
title: "Hello",
|
|
43
|
+
content: "World",
|
|
44
|
+
authorId: 1,
|
|
45
|
+
deletedAt: null,
|
|
46
|
+
};
|
|
47
|
+
expectTypeOf(values.deletedAt).toEqualTypeOf();
|
|
48
|
+
});
|
|
49
|
+
test("type error for invalid field value types", () => {
|
|
50
|
+
const _ = {
|
|
51
|
+
title: "Hello",
|
|
52
|
+
content: "World",
|
|
53
|
+
authorId: 1,
|
|
54
|
+
// @ts-expect-error tags must be string[]
|
|
55
|
+
tags: "not-an-array",
|
|
56
|
+
// @ts-expect-error publishedAt must be Date | null
|
|
57
|
+
deletedAt: "not-a-date",
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
});
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { FieldType, ModelDefinitions, ModelName, OperatorDefinitions } from "@casekit/orm2-schema";
|
|
2
|
+
import { DeleteParams } from "./DeleteParams.js";
|
|
3
|
+
export type DeleteManyResult<Models extends ModelDefinitions, Operators extends OperatorDefinitions, M extends ModelName<Models>, Q extends DeleteParams<Models, Operators, M>> = Q["returning"] extends NonNullable<Q["returning"]> ? {
|
|
4
|
+
[C in Q["returning"][number]]: FieldType<Models[M], C>;
|
|
5
|
+
}[] : number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, expectTypeOf, test } from "vitest";
|
|
2
|
+
describe("DeleteManyResult", () => {
|
|
3
|
+
test("returns array of objects when returning clause is specified", () => {
|
|
4
|
+
expectTypeOf().toEqualTypeOf();
|
|
5
|
+
});
|
|
6
|
+
test("returns number when no returning clause specified", () => {
|
|
7
|
+
expectTypeOf().toEqualTypeOf();
|
|
8
|
+
});
|
|
9
|
+
test("handles nullable fields in returning clause", () => {
|
|
10
|
+
expectTypeOf().toEqualTypeOf();
|
|
11
|
+
});
|
|
12
|
+
test("handles array fields in returning clause", () => {
|
|
13
|
+
expectTypeOf().toEqualTypeOf();
|
|
14
|
+
});
|
|
15
|
+
test("handles JSON fields in returning clause", () => {
|
|
16
|
+
expectTypeOf().toEqualTypeOf();
|
|
17
|
+
});
|
|
18
|
+
test("returned objects only include fields specified in returning clause", () => {
|
|
19
|
+
expectTypeOf().toEqualTypeOf();
|
|
20
|
+
// @ts-expect-error - title is not included in returning clause
|
|
21
|
+
expectTypeOf().toEqualTypeOf();
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { FieldType, ModelDefinitions, ModelName, OperatorDefinitions } from "@casekit/orm2-schema";
|
|
2
|
+
import { DeleteParams } from "./DeleteParams.js";
|
|
3
|
+
export type DeleteOneResult<Models extends ModelDefinitions, Operators extends OperatorDefinitions, M extends ModelName<Models>, Q extends DeleteParams<Models, Operators, M>> = Q["returning"] extends NonNullable<Q["returning"]> ? {
|
|
4
|
+
[C in Q["returning"][number]]: FieldType<Models[M], C>;
|
|
5
|
+
} : number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, expectTypeOf, test } from "vitest";
|
|
2
|
+
describe("DeleteOneResult types", () => {
|
|
3
|
+
test("returns single object when returning clause is specified", () => {
|
|
4
|
+
expectTypeOf().toEqualTypeOf();
|
|
5
|
+
});
|
|
6
|
+
test("returns number when no returning clause specified", () => {
|
|
7
|
+
expectTypeOf().toEqualTypeOf();
|
|
8
|
+
});
|
|
9
|
+
test("handles nullable fields in returning clause", () => {
|
|
10
|
+
expectTypeOf().toEqualTypeOf();
|
|
11
|
+
});
|
|
12
|
+
test("handles array fields in returning clause", () => {
|
|
13
|
+
expectTypeOf().toEqualTypeOf();
|
|
14
|
+
});
|
|
15
|
+
test("handles JSON fields in returning clause", () => {
|
|
16
|
+
expectTypeOf().toEqualTypeOf();
|
|
17
|
+
});
|
|
18
|
+
test("returned object only includes fields specified in returning clause", () => {
|
|
19
|
+
expectTypeOf().toEqualTypeOf();
|
|
20
|
+
// @ts-expect-error - title is not included in returning clause
|
|
21
|
+
expectTypeOf().toEqualTypeOf();
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ModelDefinitions, ModelName, OperatorDefinitions } from "@casekit/orm2-schema";
|
|
2
|
+
import { ReturningClause } from "./ReturningClause.js";
|
|
3
|
+
import { WhereClause } from "./WhereClause.js";
|
|
4
|
+
export type DeleteParams<Models extends ModelDefinitions, Operators extends OperatorDefinitions, M extends ModelName<Models>> = {
|
|
5
|
+
returning?: ReturningClause<Models[M]>;
|
|
6
|
+
where: WhereClause<Models, Operators, M>;
|
|
7
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { describe, test } from "vitest";
|
|
2
|
+
import { $gt } from "#operators.js";
|
|
3
|
+
describe("DeleteParams", () => {
|
|
4
|
+
test("minimal valid params with just where clause", () => {
|
|
5
|
+
const _ = {
|
|
6
|
+
where: { id: 1 },
|
|
7
|
+
};
|
|
8
|
+
});
|
|
9
|
+
test("with returning clause", () => {
|
|
10
|
+
const _ = {
|
|
11
|
+
where: { id: 1 },
|
|
12
|
+
returning: ["id", "title"],
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
test("with complex where clause", () => {
|
|
16
|
+
const _ = {
|
|
17
|
+
where: { id: 1, title: "hello", publishedAt: null },
|
|
18
|
+
returning: ["id"],
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
test("invalid field in where clause", () => {
|
|
22
|
+
const _ = {
|
|
23
|
+
// @ts-expect-error invalid field
|
|
24
|
+
where: { invalidField: "wrong" },
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
test("invalid field in returning clause", () => {
|
|
28
|
+
const _ = {
|
|
29
|
+
where: { id: 1 },
|
|
30
|
+
// @ts-expect-error invalid field
|
|
31
|
+
returning: ["invalidField"],
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
test("where clause is required", () => {
|
|
35
|
+
// @ts-expect-error where clause is required
|
|
36
|
+
const _ = {
|
|
37
|
+
returning: ["id"],
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
test("handles operators in where clause", () => {
|
|
41
|
+
const _ = {
|
|
42
|
+
where: { title: { [$gt]: "hello" } },
|
|
43
|
+
returning: ["id"],
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
});
|