prisma-frontend
Version:
A Prisma generator for creating frontend-friendly exports (types and enums).
61 lines (54 loc) • 2.35 kB
text/typescript
import {log} from '@augment-vir/common';
import generatorHelper from '@prisma/generator-helper';
import prismaInternals from '@prisma/internals';
import {resolve} from 'node:path';
import {readThisPackageJson} from '../util/package-file.js';
import {generate} from './generate.js';
import {waitForClientJs} from './wait-for-client-js.js';
/**
* Registers the generator with Prisma so it can be triggered via a `prisma generate` command.
*
* @category Prisma Generator
*/
export function registerGenerator() {
generatorHelper.generatorHandler({
onManifest() {
return {
/**
* There's no way to convince Prisma to print a different output path other than
* this default, so we just have to leave it as is even though the generator will be
* much more intelligent about where to generate the output.
*/
defaultOutput: '-',
requiresGenerators: ['prisma-client-js'],
prettyName: 'Frontend Generator',
version: readThisPackageJson().version,
};
},
async onGenerate({generator, otherGenerators, schemaPath}) {
const jsGenerator = otherGenerators.find(
(generator) => generator.provider.value === 'prisma-client-js',
);
if (!jsGenerator) {
throw new Error(
'Cannot use prisma-frontend generator without prisma-client-js generator.',
);
} else if (!jsGenerator.output) {
throw new Error('Cannot find prisma-client-js output path.');
}
const jsOutputDir = prismaInternals.parseEnvValue(jsGenerator.output);
log.faint(`Waiting for JS client generation...`);
const jsClientPath = await waitForClientJs(schemaPath, jsOutputDir);
const frontendOutputDir =
generator.isCustomOutput && generator.output
? prismaInternals.parseEnvValue(generator.output)
: resolve(jsOutputDir, 'frontend');
try {
await generate(jsClientPath, frontendOutputDir);
} catch (error) {
console.error(error);
throw error;
}
},
});
}