From 25dc027b6d2d05ea55b25509ee400457156a8a9d Mon Sep 17 00:00:00 2001 From: electrovir Date: Mon, 17 Jun 2024 23:16:07 +0000 Subject: [PATCH] [minor] add generic prisma model type helpers to @augment-vir/prisma-node-js --- package-lock.json | 38 ++++++++++----- package.json | 2 +- packages/browser-testing/package.json | 6 +-- packages/browser/package.json | 6 +-- packages/chai/package.json | 6 +-- packages/common-tests/package.json | 8 ++-- packages/common/package.json | 2 +- packages/docker/package.json | 6 +-- packages/node-js/package.json | 6 +-- packages/prisma-node-js/package.json | 7 +-- .../src/augments/generic-prisma-client.ts | 10 ++++ .../src/augments/prisma-models.ts | 48 +++++++++++++++++++ packages/prisma-node-js/src/index.ts | 2 + packages/scripts/package.json | 6 +-- packages/testing/package.json | 4 +- 15 files changed, 115 insertions(+), 42 deletions(-) create mode 100644 packages/prisma-node-js/src/augments/generic-prisma-client.ts create mode 100644 packages/prisma-node-js/src/augments/prisma-models.ts diff --git a/package-lock.json b/package-lock.json index d089543a..6ce7e572 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "augment-vir", - "version": "28.1.1", + "version": "28.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "augment-vir", - "version": "28.1.1", + "version": "28.2.0", "license": "(MIT or CC0 1.0)", "workspaces": [ "./packages/*" @@ -15071,7 +15071,7 @@ }, "packages/browser": { "name": "@augment-vir/browser", - "version": "28.1.1", + "version": "28.2.0", "license": "MIT", "dependencies": { "@augment-vir/common": "^28.1.1", @@ -15098,7 +15098,7 @@ }, "packages/browser-testing": { "name": "@augment-vir/browser-testing", - "version": "28.1.1", + "version": "28.2.0", "license": "MIT", "dependencies": { "@augment-vir/common": "^28.1.1", @@ -15142,7 +15142,7 @@ }, "packages/chai": { "name": "@augment-vir/chai", - "version": "28.1.1", + "version": "28.2.0", "license": "MIT", "dependencies": { "@augment-vir/common": "^28.1.1", @@ -15169,7 +15169,7 @@ }, "packages/common": { "name": "@augment-vir/common", - "version": "28.1.1", + "version": "28.2.0", "license": "MIT", "dependencies": { "browser-or-node": "^3.0.0", @@ -15182,7 +15182,7 @@ }, "packages/common-tests": { "name": "@augment-vir/common-tests", - "version": "28.1.1", + "version": "28.2.0", "license": "MIT", "devDependencies": { "@augment-vir/chai": "^28.1.1", @@ -15227,7 +15227,7 @@ }, "packages/docker": { "name": "@augment-vir/docker", - "version": "28.1.1", + "version": "28.2.0", "license": "MIT", "dependencies": { "@augment-vir/common": "^28.1.1", @@ -15239,7 +15239,7 @@ }, "packages/node-js": { "name": "@augment-vir/node-js", - "version": "28.1.1", + "version": "28.2.0", "license": "MIT", "dependencies": { "@augment-vir/common": "^28.1.1", @@ -15279,20 +15279,32 @@ }, "packages/prisma-node-js": { "name": "@augment-vir/prisma-node-js", - "version": "28.1.1", + "version": "28.2.0", "license": "MIT", "dependencies": { "@augment-vir/common": "^28.1.1", - "@augment-vir/node-js": "^28.1.1" + "@augment-vir/node-js": "^28.1.1", + "type-fest": "^4.20.1" }, "devDependencies": { "istanbul-smart-text-reporter": "^1.1.4", "typescript": "5.4.5" } }, + "packages/prisma-node-js/node_modules/type-fest": { + "version": "4.20.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz", + "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/scripts": { "name": "@augment-vir/scripts", - "version": "28.1.1", + "version": "28.2.0", "license": "MIT", "dependencies": { "@augment-vir/common": "^28.1.1", @@ -15327,7 +15339,7 @@ }, "packages/testing": { "name": "@augment-vir/testing", - "version": "28.1.1", + "version": "28.2.0", "license": "MIT", "dependencies": { "@augment-vir/common": "^28.1.1", diff --git a/package.json b/package.json index 57d6c45d..f55b8115 100644 --- a/package.json +++ b/package.json @@ -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": { diff --git a/packages/browser-testing/package.json b/packages/browser-testing/package.json index 7fa6e40b..6954897f 100644 --- a/packages/browser-testing/package.json +++ b/packages/browser-testing/package.json @@ -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" @@ -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", diff --git a/packages/browser/package.json b/packages/browser/package.json index 8285e3f8..5a81af8e 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -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" @@ -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", diff --git a/packages/chai/package.json b/packages/chai/package.json index fcea0763..8567022e 100644 --- a/packages/chai/package.json +++ b/packages/chai/package.json @@ -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" @@ -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": { diff --git a/packages/common-tests/package.json b/packages/common-tests/package.json index 698c769e..94e97016 100644 --- a/packages/common-tests/package.json +++ b/packages/common-tests/package.json @@ -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": { @@ -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", diff --git a/packages/common/package.json b/packages/common/package.json index 23e66ee6..52e5dfbd 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -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" diff --git a/packages/docker/package.json b/packages/docker/package.json index c71d4cbd..808d4a79 100644 --- a/packages/docker/package.json +++ b/packages/docker/package.json @@ -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" @@ -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" diff --git a/packages/node-js/package.json b/packages/node-js/package.json index ec0fdfeb..00802c6e 100644 --- a/packages/node-js/package.json +++ b/packages/node-js/package.json @@ -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" @@ -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", @@ -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", diff --git a/packages/prisma-node-js/package.json b/packages/prisma-node-js/package.json index 4e80e7a6..6b8e5047 100644 --- a/packages/prisma-node-js/package.json +++ b/packages/prisma-node-js/package.json @@ -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" @@ -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", diff --git a/packages/prisma-node-js/src/augments/generic-prisma-client.ts b/packages/prisma-node-js/src/augments/generic-prisma-client.ts new file mode 100644 index 00000000..ad1d52c6 --- /dev/null +++ b/packages/prisma-node-js/src/augments/generic-prisma-client.ts @@ -0,0 +1,10 @@ +/** This is not completely filled out yet. */ +export type GenericPrismaClient = Readonly< + Record< + string, + { + findFirstOrThrow: () => Promise; + create: () => Promise; + } + > +>; diff --git a/packages/prisma-node-js/src/augments/prisma-models.ts b/packages/prisma-node-js/src/augments/prisma-models.ts new file mode 100644 index 00000000..2548d0f2 --- /dev/null +++ b/packages/prisma-node-js/src/augments/prisma-models.ts @@ -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 = 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, +> = NonNullable[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, +> = + NonNullable[0]>> extends { + include?: infer IncludeArg; + } + ? Record, '_count'>, true> + : EmptyObject; + +export type BaseModel< + PrismaClient extends GenericPrismaClient, + Model extends ModelName, +> = NonNullable>>; + +export type JoinedModel< + PrismaClient extends GenericPrismaClient, + Model extends ModelName, +> = { + [FieldName in Extract, string>]: Omit< + ReturnType, + 'then' | 'catch' | 'finally' + > extends Record Promise> + ? Result + : `Error: failed to find relation for ${FieldName}`; +}; + +export type FullModel< + PrismaClient extends GenericPrismaClient, + Model extends ModelName, +> = JoinedModel & BaseModel; diff --git a/packages/prisma-node-js/src/index.ts b/packages/prisma-node-js/src/index.ts index 176bbd93..a67ecdda 100644 --- a/packages/prisma-node-js/src/index.ts +++ b/packages/prisma-node-js/src/index.ts @@ -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'; diff --git a/packages/scripts/package.json b/packages/scripts/package.json index c3ce216e..723ae88e 100644 --- a/packages/scripts/package.json +++ b/packages/scripts/package.json @@ -1,6 +1,6 @@ { "name": "@augment-vir/scripts", - "version": "28.1.1", + "version": "28.2.0", "private": true, "license": "MIT", "author": { @@ -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", diff --git a/packages/testing/package.json b/packages/testing/package.json index 49c95927..7de81a04 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -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" @@ -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" },