Skip to content

Commit

Permalink
refactor: Merged test generate and helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
unlight committed Mar 12, 2022
1 parent 8822af1 commit 7934b98
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 75 deletions.
71 changes: 0 additions & 71 deletions src/test/create-generator-options.ts

This file was deleted.

74 changes: 70 additions & 4 deletions src/test/test-generate.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,21 @@
/* eslint-disable sonarjs/cognitive-complexity */
import { GeneratorOptions } from '@prisma/generator-helper';
import { ok } from 'assert';
import AwaitEventEmitter from 'await-event-emitter/types';
import { exec } from 'child_process';
import crypto from 'crypto';
import fs from 'fs';
import { uniq } from 'lodash';
import cachePath from 'temp-dir';
import { ImportSpecifierStructure, Project } from 'ts-morph';

import { generate } from '../generate';
import { generateFileName } from '../helpers/generate-file-name';
import { EventArguments } from '../types';
import { createGeneratorOptions } from './create-generator-options';
import { DMMF, EventArguments } from '../types';

const {
dependencies: { '@prisma/generator-helper': generatorVersion },
// eslint-disable-next-line @typescript-eslint/no-var-requires
} = require('../../package.json');

export async function testGenerate(args: {
schema: string;
Expand All @@ -23,7 +31,6 @@ export async function testGenerate(args: {
let project: Project | undefined;
const connectCallback = (emitter: AwaitEventEmitter) => {
onConnect && onConnect(emitter);
emitter.off('GenerateFiles');
if (createSouceFile) {
emitter.on(
'PostBegin',
Expand Down Expand Up @@ -106,3 +113,62 @@ export async function testGenerate(args: {

return { project, sourceFiles };
}

/**
* Get generator options after run prisma generate.
*/
async function createGeneratorOptions(
schema: string,
options?: string[],
): Promise<GeneratorOptions & { prismaClientDmmf: DMMF.Document }> {
const schemaHeader = `
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
previewFeatures = ["filterJson", "mongoDb", "fullTextSearch", "referentialIntegrity", "extendedIndexes", "fullTextIndex"]
}
`;
// eslint-disable-next-line prefer-rest-params
const hash = createHash(generatorVersion, schemaHeader, arguments);
const cacheFile = `${cachePath}/options-${hash}.js`;
if (!fs.existsSync(cacheFile)) {
const schemaFile = `${cachePath}/schema-${hash}.prisma`;
const schemaContent = `
${schemaHeader}
generator proxy {
provider = "node -r ts-node/register/transpile-only src/test/proxy-generator.ts"
output = "."
hash = "${hash}"
${options?.join('\n') || ''}
}
${schema}
`;
fs.writeFileSync(schemaFile, schemaContent);

await new Promise((resolve, reject) => {
const proc = exec(
`node node_modules/prisma/build/index.js generate --schema=${schemaFile}`,
);
if (!proc.stderr) {
throw new Error('Generate error');
}
proc.stdout?.pipe(process.stdout);
proc.stderr.on('data', data => {
reject(String(data));
});
proc.on('error', reject);
proc.on('exit', code => {
code === 0 ? resolve(0) : reject();
});
});
}
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
return require(cacheFile);
}

function createHash(...data: unknown[]) {
return crypto.createHash('md5').update(JSON.stringify(data)).digest('hex');
}

0 comments on commit 7934b98

Please sign in to comment.