Skip to content

Commit

Permalink
[minor] add generic prisma model type helpers to @augment-vir/prisma-…
Browse files Browse the repository at this point in the history
…node-js
  • Loading branch information
electrovir committed Jun 17, 2024
1 parent eb1d2cf commit 25dc027
Show file tree
Hide file tree
Showing 15 changed files with 115 additions and 42 deletions.
38 changes: 25 additions & 13 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "augment-vir",
"version": "28.1.1",
"version": "28.2.0",
"private": true,
"homepage": "https://github.com/electrovir/augment-vir",
"bugs": {
Expand Down
6 changes: 3 additions & 3 deletions packages/browser-testing/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@augment-vir/browser-testing",
"version": "28.1.1",
"version": "28.2.0",
"homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/common",
"bugs": {
"url": "https://github.com/electrovir/augment-vir/issues"
Expand All @@ -23,8 +23,8 @@
"test:coverage": "npm test"
},
"dependencies": {
"@augment-vir/common": "^28.1.1",
"@augment-vir/testing": "^28.1.1",
"@augment-vir/common": "^28.2.0",
"@augment-vir/testing": "^28.2.0",
"@open-wc/testing": "^4.0.0",
"@types/mocha": "^10.0.6",
"@web/test-runner-commands": "^0.9.0",
Expand Down
6 changes: 3 additions & 3 deletions packages/browser/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@augment-vir/browser",
"version": "28.1.1",
"version": "28.2.0",
"homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/browser",
"bugs": {
"url": "https://github.com/electrovir/augment-vir/issues"
Expand All @@ -24,12 +24,12 @@
"test:watch": "web-test-runner --color --config configs/web-test-runner.config.mjs --watch"
},
"dependencies": {
"@augment-vir/common": "^28.1.1",
"@augment-vir/common": "^28.2.0",
"html-spec-tags": "^2.2.0",
"run-time-assertions": "^1.5.1"
},
"devDependencies": {
"@augment-vir/browser-testing": "^28.1.1",
"@augment-vir/browser-testing": "^28.2.0",
"@open-wc/testing": "^4.0.0",
"@types/chai": "^4.3.16",
"@types/mocha": "^10.0.6",
Expand Down
6 changes: 3 additions & 3 deletions packages/chai/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@augment-vir/chai",
"version": "28.1.1",
"version": "28.2.0",
"homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/common",
"bugs": {
"url": "https://github.com/electrovir/augment-vir/issues"
Expand All @@ -23,8 +23,8 @@
"test:coverage": "npm test"
},
"dependencies": {
"@augment-vir/common": "^28.1.1",
"@augment-vir/testing": "^28.1.1",
"@augment-vir/common": "^28.2.0",
"@augment-vir/testing": "^28.2.0",
"type-fest": "^4.20.1"
},
"devDependencies": {
Expand Down
8 changes: 4 additions & 4 deletions packages/common-tests/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@augment-vir/common-tests",
"version": "28.1.1",
"version": "28.2.0",
"private": true,
"homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/common-tests",
"bugs": {
Expand All @@ -22,9 +22,9 @@
"test:types": "tsc --noEmit"
},
"devDependencies": {
"@augment-vir/chai": "^28.1.1",
"@augment-vir/common": "^28.1.1",
"@augment-vir/node-js": "^28.1.1",
"@augment-vir/chai": "^28.2.0",
"@augment-vir/common": "^28.2.0",
"@augment-vir/node-js": "^28.2.0",
"@electrovir/nyc": "^15.1.0-fix0",
"@istanbuljs/nyc-config-typescript": "^1.0.2",
"@types/chai": "^4.3.16",
Expand Down
2 changes: 1 addition & 1 deletion packages/common/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@augment-vir/common",
"version": "28.1.1",
"version": "28.2.0",
"homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/common",
"bugs": {
"url": "https://github.com/electrovir/augment-vir/issues"
Expand Down
6 changes: 3 additions & 3 deletions packages/docker/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@augment-vir/docker",
"version": "28.1.1",
"version": "28.2.0",
"homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/docker",
"bugs": {
"url": "https://github.com/electrovir/augment-vir/issues"
Expand All @@ -22,8 +22,8 @@
"test:coverage": "npm test"
},
"dependencies": {
"@augment-vir/common": "^28.1.1",
"@augment-vir/node-js": "^28.1.1"
"@augment-vir/common": "^28.2.0",
"@augment-vir/node-js": "^28.2.0"
},
"devDependencies": {
"typescript": "5.4.5"
Expand Down
6 changes: 3 additions & 3 deletions packages/node-js/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@augment-vir/node-js",
"version": "28.1.1",
"version": "28.2.0",
"homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/node-js",
"bugs": {
"url": "https://github.com/electrovir/augment-vir/issues"
Expand All @@ -22,7 +22,7 @@
"test:coverage": "npm test coverage"
},
"dependencies": {
"@augment-vir/common": "^28.1.1",
"@augment-vir/common": "^28.2.0",
"ansi-colors": "^4.1.3",
"axios": "^1.7.2",
"fs-extra": "^11.2.0",
Expand All @@ -31,7 +31,7 @@
"type-fest": "^4.20.1"
},
"devDependencies": {
"@augment-vir/chai": "^28.1.1",
"@augment-vir/chai": "^28.2.0",
"@electrovir/nyc": "^15.1.0-fix0",
"@istanbuljs/nyc-config-typescript": "^1.0.2",
"@types/chai": "^4.3.16",
Expand Down
7 changes: 4 additions & 3 deletions packages/prisma-node-js/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@augment-vir/prisma-node-js",
"version": "28.1.1",
"version": "28.2.0",
"homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/prisma-node-js",
"bugs": {
"url": "https://github.com/electrovir/augment-vir/issues"
Expand All @@ -22,8 +22,9 @@
"test:coverage": "npm test"
},
"dependencies": {
"@augment-vir/common": "^28.1.1",
"@augment-vir/node-js": "^28.1.1"
"@augment-vir/common": "^28.2.0",
"@augment-vir/node-js": "^28.2.0",
"type-fest": "^4.20.1"
},
"devDependencies": {
"istanbul-smart-text-reporter": "^1.1.4",
Expand Down
10 changes: 10 additions & 0 deletions packages/prisma-node-js/src/augments/generic-prisma-client.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/** This is not completely filled out yet. */
export type GenericPrismaClient = Readonly<
Record<
string,
{
findFirstOrThrow: () => Promise<any>;
create: () => Promise<any>;
}
>
>;
48 changes: 48 additions & 0 deletions packages/prisma-node-js/src/augments/prisma-models.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import {EmptyObject} from 'type-fest';
import {GenericPrismaClient} from './generic-prisma-client';

/** Extracts all model names from the given Prisma client. */
export type ModelName<PrismaClient extends GenericPrismaClient> = keyof {
[Model in keyof PrismaClient as PrismaClient[Model] extends {findFirstOrThrow: Function}
? Model
: never]: boolean;
};

/** Extracts the creation data for a model from the given Prisma client. */
export type ModelCreationEntry<
PrismaClient extends GenericPrismaClient,
Model extends ModelName<PrismaClient>,
> = NonNullable<NonNullable<Parameters<PrismaClient[Model]['create']>[0]>['data']>;

/** For a given model, extract all the available "include" properties and set them all to true. */
export type IncludeAll<
PrismaClient extends GenericPrismaClient,
Model extends ModelName<PrismaClient>,
> =
NonNullable<NonNullable<Parameters<PrismaClient[Model]['findFirstOrThrow']>[0]>> extends {
include?: infer IncludeArg;
}
? Record<Exclude<keyof NonNullable<IncludeArg>, '_count'>, true>
: EmptyObject;

export type BaseModel<
PrismaClient extends GenericPrismaClient,
Model extends ModelName<PrismaClient>,
> = NonNullable<Awaited<ReturnType<PrismaClient[Model]['findFirstOrThrow']>>>;

export type JoinedModel<
PrismaClient extends GenericPrismaClient,
Model extends ModelName<PrismaClient>,
> = {
[FieldName in Extract<keyof IncludeAll<PrismaClient, Model>, string>]: Omit<
ReturnType<PrismaClient[Model]['findFirstOrThrow']>,
'then' | 'catch' | 'finally'
> extends Record<FieldName, () => Promise<infer Result>>
? Result
: `Error: failed to find relation for ${FieldName}`;
};

export type FullModel<
PrismaClient extends GenericPrismaClient,
Model extends ModelName<PrismaClient>,
> = JoinedModel<PrismaClient, Model> & BaseModel<PrismaClient, Model>;
2 changes: 2 additions & 0 deletions packages/prisma-node-js/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
export * from './augments/generic-prisma-client';
export * from './augments/prisma-clients-generation';
export * from './augments/prisma-database';
export * from './augments/prisma-migrations';
export * from './augments/prisma-models';
6 changes: 3 additions & 3 deletions packages/scripts/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@augment-vir/scripts",
"version": "28.1.1",
"version": "28.2.0",
"private": true,
"license": "MIT",
"author": {
Expand All @@ -14,8 +14,8 @@
"verify": "ts-node src/index.ts"
},
"dependencies": {
"@augment-vir/common": "^28.1.1",
"@augment-vir/node-js": "^28.1.1"
"@augment-vir/common": "^28.2.0",
"@augment-vir/node-js": "^28.2.0"
},
"devDependencies": {
"@electrovir/nyc": "^15.1.0-fix0",
Expand Down
4 changes: 2 additions & 2 deletions packages/testing/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@augment-vir/testing",
"version": "28.1.1",
"version": "28.2.0",
"homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/testing",
"bugs": {
"url": "https://github.com/electrovir/augment-vir/issues"
Expand All @@ -23,7 +23,7 @@
"test:coverage": "npm test coverage"
},
"dependencies": {
"@augment-vir/common": "^28.1.1",
"@augment-vir/common": "^28.2.0",
"expect-type": "^0.15.0",
"type-fest": "^4.20.1"
},
Expand Down

0 comments on commit 25dc027

Please sign in to comment.