prisma-flare 1.1.5 → 1.1.7
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/dist/cli/index.cjs +152 -21
- package/dist/cli/index.js +152 -21
- package/package.json +1 -1
- package/readme.md +29 -3
package/dist/cli/index.cjs
CHANGED
|
@@ -349,6 +349,11 @@ function resolvePrismaClientPath(rootDir, output) {
|
|
|
349
349
|
}
|
|
350
350
|
const schemaDir = path4.join(rootDir, "prisma");
|
|
351
351
|
const absolutePath = path4.resolve(schemaDir, output);
|
|
352
|
+
const clientEntryPath = path4.join(absolutePath, "client.ts");
|
|
353
|
+
const clientEntryPathJs = path4.join(absolutePath, "client.js");
|
|
354
|
+
if (fs4.existsSync(clientEntryPath) || fs4.existsSync(clientEntryPathJs)) {
|
|
355
|
+
return path4.join(absolutePath, "client");
|
|
356
|
+
}
|
|
352
357
|
return absolutePath;
|
|
353
358
|
}
|
|
354
359
|
function getPrismaClientPath(rootDir) {
|
|
@@ -380,27 +385,24 @@ function generateClient() {
|
|
|
380
385
|
} else {
|
|
381
386
|
prismaClientImport = getPrismaClientPath(rootDir);
|
|
382
387
|
}
|
|
388
|
+
const isCustomOutput = hasCustomPrismaOutput(rootDir);
|
|
389
|
+
if (isCustomOutput || config.prismaClientPath && config.prismaClientPath !== "@prisma/client") {
|
|
390
|
+
generateNextToPrismaClient(rootDir, prismaClientImport);
|
|
391
|
+
generateErrorStubInNodeModules(rootDir, prismaClientImport);
|
|
392
|
+
} else {
|
|
393
|
+
generateInNodeModules(rootDir);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
function generateInNodeModules(rootDir) {
|
|
383
397
|
const nodeModulesDir = path5.join(rootDir, "node_modules");
|
|
384
398
|
const prismaFlareDir = path5.join(nodeModulesDir, ".prisma-flare");
|
|
385
399
|
if (!fs5.existsSync(prismaFlareDir)) {
|
|
386
400
|
fs5.mkdirSync(prismaFlareDir, { recursive: true });
|
|
387
401
|
}
|
|
388
|
-
let resolvedImport;
|
|
389
|
-
if (prismaClientImport === "@prisma/client") {
|
|
390
|
-
resolvedImport = "@prisma/client";
|
|
391
|
-
} else {
|
|
392
|
-
resolvedImport = path5.relative(prismaFlareDir, prismaClientImport);
|
|
393
|
-
if (!resolvedImport.startsWith(".")) {
|
|
394
|
-
resolvedImport = "./" + resolvedImport;
|
|
395
|
-
}
|
|
396
|
-
resolvedImport = resolvedImport.replace(/\\/g, "/");
|
|
397
|
-
}
|
|
398
|
-
const isCustomOutput = hasCustomPrismaOutput(rootDir);
|
|
399
402
|
const esmContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
400
403
|
// This file provides FlareClient configured for your Prisma client output path
|
|
401
|
-
// Import path: ${prismaClientImport}
|
|
402
404
|
|
|
403
|
-
import { PrismaClient, Prisma } from '
|
|
405
|
+
import { PrismaClient, Prisma } from '@prisma/client';
|
|
404
406
|
import { createFlareClient } from 'prisma-flare';
|
|
405
407
|
|
|
406
408
|
// Create and export FlareClient using the factory
|
|
@@ -411,9 +413,8 @@ export { PrismaClient, Prisma };
|
|
|
411
413
|
`;
|
|
412
414
|
const cjsContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
413
415
|
// This file provides FlareClient configured for your Prisma client output path
|
|
414
|
-
// Import path: ${prismaClientImport}
|
|
415
416
|
|
|
416
|
-
const { PrismaClient, Prisma } = require('
|
|
417
|
+
const { PrismaClient, Prisma } = require('@prisma/client');
|
|
417
418
|
const { createFlareClient } = require('prisma-flare');
|
|
418
419
|
|
|
419
420
|
// Create FlareClient using the factory
|
|
@@ -428,7 +429,7 @@ module.exports = {
|
|
|
428
429
|
const dtsContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
429
430
|
// This file provides FlareClient configured for your Prisma client output path
|
|
430
431
|
|
|
431
|
-
import { PrismaClient as BasePrismaClient, Prisma as BasePrisma } from '
|
|
432
|
+
import { PrismaClient as BasePrismaClient, Prisma as BasePrisma } from '@prisma/client';
|
|
432
433
|
import type { FlareClientOptions } from 'prisma-flare';
|
|
433
434
|
import type { ModelName } from 'prisma-flare';
|
|
434
435
|
import type FlareBuilder from 'prisma-flare/flareBuilder';
|
|
@@ -481,15 +482,145 @@ export declare class FlareClient extends BasePrismaClient {
|
|
|
481
482
|
path5.join(prismaFlareDir, "package.json"),
|
|
482
483
|
JSON.stringify(packageJson, null, 2)
|
|
483
484
|
);
|
|
484
|
-
|
|
485
|
-
console.log(`\u2705 Generated prisma-flare client with custom Prisma output: ${prismaClientImport}`);
|
|
486
|
-
} else {
|
|
487
|
-
console.log(`\u2705 Generated prisma-flare client using @prisma/client`);
|
|
488
|
-
}
|
|
485
|
+
console.log(`\u2705 Generated prisma-flare client using @prisma/client`);
|
|
489
486
|
console.log(` Location: ${prismaFlareDir}`);
|
|
490
487
|
console.log(`
|
|
491
488
|
Import: import { FlareClient } from 'prisma-flare';`);
|
|
492
489
|
}
|
|
490
|
+
function generateErrorStubInNodeModules(rootDir, prismaClientImport) {
|
|
491
|
+
const nodeModulesDir = path5.join(rootDir, "node_modules");
|
|
492
|
+
const prismaFlareDir = path5.join(nodeModulesDir, ".prisma-flare");
|
|
493
|
+
if (!fs5.existsSync(prismaFlareDir)) {
|
|
494
|
+
fs5.mkdirSync(prismaFlareDir, { recursive: true });
|
|
495
|
+
}
|
|
496
|
+
let prismaOutputDir = prismaClientImport;
|
|
497
|
+
if (prismaOutputDir.endsWith("/client") || prismaOutputDir.endsWith("\\client")) {
|
|
498
|
+
prismaOutputDir = path5.dirname(prismaOutputDir);
|
|
499
|
+
}
|
|
500
|
+
const relativeFlareDir = path5.relative(rootDir, prismaOutputDir);
|
|
501
|
+
const correctImportPath = "./" + path5.join(relativeFlareDir, "flare").replace(/\\/g, "/");
|
|
502
|
+
const errorMessage = `
|
|
503
|
+
You are using a custom Prisma output path.
|
|
504
|
+
|
|
505
|
+
Instead of importing from 'prisma-flare', import from your generated flare file:
|
|
506
|
+
|
|
507
|
+
import { FlareClient } from '${correctImportPath}';
|
|
508
|
+
|
|
509
|
+
Run 'npx prisma-flare generate' after 'npx prisma generate' to regenerate.
|
|
510
|
+
`.trim();
|
|
511
|
+
const esmContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
512
|
+
// This project uses a custom Prisma output path.
|
|
513
|
+
// You must import from the generated flare.ts file instead.
|
|
514
|
+
|
|
515
|
+
throw new Error(\`${errorMessage.replace(/`/g, "\\`")}\`);
|
|
516
|
+
`;
|
|
517
|
+
const cjsContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
518
|
+
// This project uses a custom Prisma output path.
|
|
519
|
+
// You must import from the generated flare.ts file instead.
|
|
520
|
+
|
|
521
|
+
throw new Error(\`${errorMessage.replace(/`/g, "\\`")}\`);
|
|
522
|
+
`;
|
|
523
|
+
const dtsContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
524
|
+
// This project uses a custom Prisma output path.
|
|
525
|
+
//
|
|
526
|
+
// DO NOT import from 'prisma-flare' - import from your generated flare file:
|
|
527
|
+
//
|
|
528
|
+
// import { FlareClient } from '${correctImportPath}';
|
|
529
|
+
//
|
|
530
|
+
|
|
531
|
+
/** @deprecated Import from '${correctImportPath}' instead */
|
|
532
|
+
export declare const FlareClient: never;
|
|
533
|
+
|
|
534
|
+
/** @deprecated Import from '${correctImportPath}' instead */
|
|
535
|
+
export declare const PrismaClient: never;
|
|
536
|
+
|
|
537
|
+
/** @deprecated Import from '${correctImportPath}' instead */
|
|
538
|
+
export declare const Prisma: never;
|
|
539
|
+
`;
|
|
540
|
+
fs5.writeFileSync(path5.join(prismaFlareDir, "index.js"), esmContent);
|
|
541
|
+
fs5.writeFileSync(path5.join(prismaFlareDir, "index.cjs"), cjsContent);
|
|
542
|
+
fs5.writeFileSync(path5.join(prismaFlareDir, "index.d.ts"), dtsContent);
|
|
543
|
+
const packageJson = {
|
|
544
|
+
name: ".prisma-flare",
|
|
545
|
+
version: "0.0.0",
|
|
546
|
+
main: "./index.cjs",
|
|
547
|
+
module: "./index.js",
|
|
548
|
+
types: "./index.d.ts",
|
|
549
|
+
type: "module",
|
|
550
|
+
exports: {
|
|
551
|
+
".": {
|
|
552
|
+
types: "./index.d.ts",
|
|
553
|
+
import: "./index.js",
|
|
554
|
+
require: "./index.cjs"
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
};
|
|
558
|
+
fs5.writeFileSync(
|
|
559
|
+
path5.join(prismaFlareDir, "package.json"),
|
|
560
|
+
JSON.stringify(packageJson, null, 2)
|
|
561
|
+
);
|
|
562
|
+
}
|
|
563
|
+
function generateNextToPrismaClient(rootDir, prismaClientImport) {
|
|
564
|
+
let prismaOutputDir = prismaClientImport;
|
|
565
|
+
if (prismaOutputDir.endsWith("/client") || prismaOutputDir.endsWith("\\client")) {
|
|
566
|
+
prismaOutputDir = path5.dirname(prismaOutputDir);
|
|
567
|
+
}
|
|
568
|
+
const hasClientEntry = fs5.existsSync(path5.join(prismaOutputDir, "client.ts")) || fs5.existsSync(path5.join(prismaOutputDir, "client.js"));
|
|
569
|
+
const prismaImportPath = hasClientEntry ? "./client" : "./index";
|
|
570
|
+
const flareFilePath = path5.join(prismaOutputDir, "flare.ts");
|
|
571
|
+
const flareContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
572
|
+
// This file provides FlareClient configured for your Prisma client
|
|
573
|
+
// Re-run 'npx prisma-flare generate' after 'npx prisma generate'
|
|
574
|
+
|
|
575
|
+
import { PrismaClient, Prisma } from '${prismaImportPath}';
|
|
576
|
+
import { createFlareClient } from 'prisma-flare';
|
|
577
|
+
|
|
578
|
+
// Create and export FlareClient using the factory
|
|
579
|
+
export const FlareClient = createFlareClient(PrismaClient, Prisma);
|
|
580
|
+
|
|
581
|
+
// Re-export PrismaClient and Prisma for convenience
|
|
582
|
+
export { PrismaClient, Prisma };
|
|
583
|
+
|
|
584
|
+
// Re-export types from prisma-flare for convenience
|
|
585
|
+
export type { FlareClientOptions, ModelName } from 'prisma-flare';
|
|
586
|
+
export { default as FlareBuilder } from 'prisma-flare/flareBuilder';
|
|
587
|
+
`;
|
|
588
|
+
const flareDtsPath = path5.join(prismaOutputDir, "flare.d.ts");
|
|
589
|
+
const flareDtsContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
590
|
+
// TypeScript declarations for FlareClient
|
|
591
|
+
|
|
592
|
+
import { PrismaClient as BasePrismaClient, Prisma as BasePrisma } from '${prismaImportPath}';
|
|
593
|
+
import type { FlareClientOptions, ModelName } from 'prisma-flare';
|
|
594
|
+
import type FlareBuilder from 'prisma-flare/flareBuilder';
|
|
595
|
+
|
|
596
|
+
// Re-export PrismaClient and Prisma
|
|
597
|
+
export { BasePrismaClient as PrismaClient, BasePrisma as Prisma };
|
|
598
|
+
|
|
599
|
+
// Re-export types from prisma-flare
|
|
600
|
+
export type { FlareClientOptions, ModelName };
|
|
601
|
+
export { FlareBuilder };
|
|
602
|
+
|
|
603
|
+
// FlareClient type that extends the project's PrismaClient
|
|
604
|
+
export declare const FlareClient: {
|
|
605
|
+
new (options?: FlareClientOptions): BasePrismaClient & {
|
|
606
|
+
from<T extends ModelName>(modelName: T): FlareBuilder<T>;
|
|
607
|
+
transaction<R>(
|
|
608
|
+
fn: (tx: BasePrismaClient) => Promise<R>,
|
|
609
|
+
options?: { maxWait?: number; timeout?: number; isolationLevel?: any }
|
|
610
|
+
): Promise<R>;
|
|
611
|
+
};
|
|
612
|
+
};
|
|
613
|
+
`;
|
|
614
|
+
fs5.writeFileSync(flareFilePath, flareContent);
|
|
615
|
+
fs5.writeFileSync(flareDtsPath, flareDtsContent);
|
|
616
|
+
const relativeFlareDir = path5.relative(rootDir, prismaOutputDir);
|
|
617
|
+
const relativeImportPath = "./" + path5.join(relativeFlareDir, "flare").replace(/\\/g, "/");
|
|
618
|
+
console.log(`\u2705 Generated prisma-flare client with custom Prisma output`);
|
|
619
|
+
console.log(` Location: ${prismaOutputDir}`);
|
|
620
|
+
console.log(` Files: flare.ts, flare.d.ts`);
|
|
621
|
+
console.log(`
|
|
622
|
+
Import: import { FlareClient } from '${relativeImportPath}';`);
|
|
623
|
+
}
|
|
493
624
|
|
|
494
625
|
// src/cli/index.ts
|
|
495
626
|
var import_child_process = require("child_process");
|
package/dist/cli/index.js
CHANGED
|
@@ -326,6 +326,11 @@ function resolvePrismaClientPath(rootDir, output) {
|
|
|
326
326
|
}
|
|
327
327
|
const schemaDir = path4.join(rootDir, "prisma");
|
|
328
328
|
const absolutePath = path4.resolve(schemaDir, output);
|
|
329
|
+
const clientEntryPath = path4.join(absolutePath, "client.ts");
|
|
330
|
+
const clientEntryPathJs = path4.join(absolutePath, "client.js");
|
|
331
|
+
if (fs4.existsSync(clientEntryPath) || fs4.existsSync(clientEntryPathJs)) {
|
|
332
|
+
return path4.join(absolutePath, "client");
|
|
333
|
+
}
|
|
329
334
|
return absolutePath;
|
|
330
335
|
}
|
|
331
336
|
function getPrismaClientPath(rootDir) {
|
|
@@ -357,27 +362,24 @@ function generateClient() {
|
|
|
357
362
|
} else {
|
|
358
363
|
prismaClientImport = getPrismaClientPath(rootDir);
|
|
359
364
|
}
|
|
365
|
+
const isCustomOutput = hasCustomPrismaOutput(rootDir);
|
|
366
|
+
if (isCustomOutput || config.prismaClientPath && config.prismaClientPath !== "@prisma/client") {
|
|
367
|
+
generateNextToPrismaClient(rootDir, prismaClientImport);
|
|
368
|
+
generateErrorStubInNodeModules(rootDir, prismaClientImport);
|
|
369
|
+
} else {
|
|
370
|
+
generateInNodeModules(rootDir);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
function generateInNodeModules(rootDir) {
|
|
360
374
|
const nodeModulesDir = path5.join(rootDir, "node_modules");
|
|
361
375
|
const prismaFlareDir = path5.join(nodeModulesDir, ".prisma-flare");
|
|
362
376
|
if (!fs5.existsSync(prismaFlareDir)) {
|
|
363
377
|
fs5.mkdirSync(prismaFlareDir, { recursive: true });
|
|
364
378
|
}
|
|
365
|
-
let resolvedImport;
|
|
366
|
-
if (prismaClientImport === "@prisma/client") {
|
|
367
|
-
resolvedImport = "@prisma/client";
|
|
368
|
-
} else {
|
|
369
|
-
resolvedImport = path5.relative(prismaFlareDir, prismaClientImport);
|
|
370
|
-
if (!resolvedImport.startsWith(".")) {
|
|
371
|
-
resolvedImport = "./" + resolvedImport;
|
|
372
|
-
}
|
|
373
|
-
resolvedImport = resolvedImport.replace(/\\/g, "/");
|
|
374
|
-
}
|
|
375
|
-
const isCustomOutput = hasCustomPrismaOutput(rootDir);
|
|
376
379
|
const esmContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
377
380
|
// This file provides FlareClient configured for your Prisma client output path
|
|
378
|
-
// Import path: ${prismaClientImport}
|
|
379
381
|
|
|
380
|
-
import { PrismaClient, Prisma } from '
|
|
382
|
+
import { PrismaClient, Prisma } from '@prisma/client';
|
|
381
383
|
import { createFlareClient } from 'prisma-flare';
|
|
382
384
|
|
|
383
385
|
// Create and export FlareClient using the factory
|
|
@@ -388,9 +390,8 @@ export { PrismaClient, Prisma };
|
|
|
388
390
|
`;
|
|
389
391
|
const cjsContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
390
392
|
// This file provides FlareClient configured for your Prisma client output path
|
|
391
|
-
// Import path: ${prismaClientImport}
|
|
392
393
|
|
|
393
|
-
const { PrismaClient, Prisma } = require('
|
|
394
|
+
const { PrismaClient, Prisma } = require('@prisma/client');
|
|
394
395
|
const { createFlareClient } = require('prisma-flare');
|
|
395
396
|
|
|
396
397
|
// Create FlareClient using the factory
|
|
@@ -405,7 +406,7 @@ module.exports = {
|
|
|
405
406
|
const dtsContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
406
407
|
// This file provides FlareClient configured for your Prisma client output path
|
|
407
408
|
|
|
408
|
-
import { PrismaClient as BasePrismaClient, Prisma as BasePrisma } from '
|
|
409
|
+
import { PrismaClient as BasePrismaClient, Prisma as BasePrisma } from '@prisma/client';
|
|
409
410
|
import type { FlareClientOptions } from 'prisma-flare';
|
|
410
411
|
import type { ModelName } from 'prisma-flare';
|
|
411
412
|
import type FlareBuilder from 'prisma-flare/flareBuilder';
|
|
@@ -458,15 +459,145 @@ export declare class FlareClient extends BasePrismaClient {
|
|
|
458
459
|
path5.join(prismaFlareDir, "package.json"),
|
|
459
460
|
JSON.stringify(packageJson, null, 2)
|
|
460
461
|
);
|
|
461
|
-
|
|
462
|
-
console.log(`\u2705 Generated prisma-flare client with custom Prisma output: ${prismaClientImport}`);
|
|
463
|
-
} else {
|
|
464
|
-
console.log(`\u2705 Generated prisma-flare client using @prisma/client`);
|
|
465
|
-
}
|
|
462
|
+
console.log(`\u2705 Generated prisma-flare client using @prisma/client`);
|
|
466
463
|
console.log(` Location: ${prismaFlareDir}`);
|
|
467
464
|
console.log(`
|
|
468
465
|
Import: import { FlareClient } from 'prisma-flare';`);
|
|
469
466
|
}
|
|
467
|
+
function generateErrorStubInNodeModules(rootDir, prismaClientImport) {
|
|
468
|
+
const nodeModulesDir = path5.join(rootDir, "node_modules");
|
|
469
|
+
const prismaFlareDir = path5.join(nodeModulesDir, ".prisma-flare");
|
|
470
|
+
if (!fs5.existsSync(prismaFlareDir)) {
|
|
471
|
+
fs5.mkdirSync(prismaFlareDir, { recursive: true });
|
|
472
|
+
}
|
|
473
|
+
let prismaOutputDir = prismaClientImport;
|
|
474
|
+
if (prismaOutputDir.endsWith("/client") || prismaOutputDir.endsWith("\\client")) {
|
|
475
|
+
prismaOutputDir = path5.dirname(prismaOutputDir);
|
|
476
|
+
}
|
|
477
|
+
const relativeFlareDir = path5.relative(rootDir, prismaOutputDir);
|
|
478
|
+
const correctImportPath = "./" + path5.join(relativeFlareDir, "flare").replace(/\\/g, "/");
|
|
479
|
+
const errorMessage = `
|
|
480
|
+
You are using a custom Prisma output path.
|
|
481
|
+
|
|
482
|
+
Instead of importing from 'prisma-flare', import from your generated flare file:
|
|
483
|
+
|
|
484
|
+
import { FlareClient } from '${correctImportPath}';
|
|
485
|
+
|
|
486
|
+
Run 'npx prisma-flare generate' after 'npx prisma generate' to regenerate.
|
|
487
|
+
`.trim();
|
|
488
|
+
const esmContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
489
|
+
// This project uses a custom Prisma output path.
|
|
490
|
+
// You must import from the generated flare.ts file instead.
|
|
491
|
+
|
|
492
|
+
throw new Error(\`${errorMessage.replace(/`/g, "\\`")}\`);
|
|
493
|
+
`;
|
|
494
|
+
const cjsContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
495
|
+
// This project uses a custom Prisma output path.
|
|
496
|
+
// You must import from the generated flare.ts file instead.
|
|
497
|
+
|
|
498
|
+
throw new Error(\`${errorMessage.replace(/`/g, "\\`")}\`);
|
|
499
|
+
`;
|
|
500
|
+
const dtsContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
501
|
+
// This project uses a custom Prisma output path.
|
|
502
|
+
//
|
|
503
|
+
// DO NOT import from 'prisma-flare' - import from your generated flare file:
|
|
504
|
+
//
|
|
505
|
+
// import { FlareClient } from '${correctImportPath}';
|
|
506
|
+
//
|
|
507
|
+
|
|
508
|
+
/** @deprecated Import from '${correctImportPath}' instead */
|
|
509
|
+
export declare const FlareClient: never;
|
|
510
|
+
|
|
511
|
+
/** @deprecated Import from '${correctImportPath}' instead */
|
|
512
|
+
export declare const PrismaClient: never;
|
|
513
|
+
|
|
514
|
+
/** @deprecated Import from '${correctImportPath}' instead */
|
|
515
|
+
export declare const Prisma: never;
|
|
516
|
+
`;
|
|
517
|
+
fs5.writeFileSync(path5.join(prismaFlareDir, "index.js"), esmContent);
|
|
518
|
+
fs5.writeFileSync(path5.join(prismaFlareDir, "index.cjs"), cjsContent);
|
|
519
|
+
fs5.writeFileSync(path5.join(prismaFlareDir, "index.d.ts"), dtsContent);
|
|
520
|
+
const packageJson = {
|
|
521
|
+
name: ".prisma-flare",
|
|
522
|
+
version: "0.0.0",
|
|
523
|
+
main: "./index.cjs",
|
|
524
|
+
module: "./index.js",
|
|
525
|
+
types: "./index.d.ts",
|
|
526
|
+
type: "module",
|
|
527
|
+
exports: {
|
|
528
|
+
".": {
|
|
529
|
+
types: "./index.d.ts",
|
|
530
|
+
import: "./index.js",
|
|
531
|
+
require: "./index.cjs"
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
};
|
|
535
|
+
fs5.writeFileSync(
|
|
536
|
+
path5.join(prismaFlareDir, "package.json"),
|
|
537
|
+
JSON.stringify(packageJson, null, 2)
|
|
538
|
+
);
|
|
539
|
+
}
|
|
540
|
+
function generateNextToPrismaClient(rootDir, prismaClientImport) {
|
|
541
|
+
let prismaOutputDir = prismaClientImport;
|
|
542
|
+
if (prismaOutputDir.endsWith("/client") || prismaOutputDir.endsWith("\\client")) {
|
|
543
|
+
prismaOutputDir = path5.dirname(prismaOutputDir);
|
|
544
|
+
}
|
|
545
|
+
const hasClientEntry = fs5.existsSync(path5.join(prismaOutputDir, "client.ts")) || fs5.existsSync(path5.join(prismaOutputDir, "client.js"));
|
|
546
|
+
const prismaImportPath = hasClientEntry ? "./client" : "./index";
|
|
547
|
+
const flareFilePath = path5.join(prismaOutputDir, "flare.ts");
|
|
548
|
+
const flareContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
549
|
+
// This file provides FlareClient configured for your Prisma client
|
|
550
|
+
// Re-run 'npx prisma-flare generate' after 'npx prisma generate'
|
|
551
|
+
|
|
552
|
+
import { PrismaClient, Prisma } from '${prismaImportPath}';
|
|
553
|
+
import { createFlareClient } from 'prisma-flare';
|
|
554
|
+
|
|
555
|
+
// Create and export FlareClient using the factory
|
|
556
|
+
export const FlareClient = createFlareClient(PrismaClient, Prisma);
|
|
557
|
+
|
|
558
|
+
// Re-export PrismaClient and Prisma for convenience
|
|
559
|
+
export { PrismaClient, Prisma };
|
|
560
|
+
|
|
561
|
+
// Re-export types from prisma-flare for convenience
|
|
562
|
+
export type { FlareClientOptions, ModelName } from 'prisma-flare';
|
|
563
|
+
export { default as FlareBuilder } from 'prisma-flare/flareBuilder';
|
|
564
|
+
`;
|
|
565
|
+
const flareDtsPath = path5.join(prismaOutputDir, "flare.d.ts");
|
|
566
|
+
const flareDtsContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
567
|
+
// TypeScript declarations for FlareClient
|
|
568
|
+
|
|
569
|
+
import { PrismaClient as BasePrismaClient, Prisma as BasePrisma } from '${prismaImportPath}';
|
|
570
|
+
import type { FlareClientOptions, ModelName } from 'prisma-flare';
|
|
571
|
+
import type FlareBuilder from 'prisma-flare/flareBuilder';
|
|
572
|
+
|
|
573
|
+
// Re-export PrismaClient and Prisma
|
|
574
|
+
export { BasePrismaClient as PrismaClient, BasePrisma as Prisma };
|
|
575
|
+
|
|
576
|
+
// Re-export types from prisma-flare
|
|
577
|
+
export type { FlareClientOptions, ModelName };
|
|
578
|
+
export { FlareBuilder };
|
|
579
|
+
|
|
580
|
+
// FlareClient type that extends the project's PrismaClient
|
|
581
|
+
export declare const FlareClient: {
|
|
582
|
+
new (options?: FlareClientOptions): BasePrismaClient & {
|
|
583
|
+
from<T extends ModelName>(modelName: T): FlareBuilder<T>;
|
|
584
|
+
transaction<R>(
|
|
585
|
+
fn: (tx: BasePrismaClient) => Promise<R>,
|
|
586
|
+
options?: { maxWait?: number; timeout?: number; isolationLevel?: any }
|
|
587
|
+
): Promise<R>;
|
|
588
|
+
};
|
|
589
|
+
};
|
|
590
|
+
`;
|
|
591
|
+
fs5.writeFileSync(flareFilePath, flareContent);
|
|
592
|
+
fs5.writeFileSync(flareDtsPath, flareDtsContent);
|
|
593
|
+
const relativeFlareDir = path5.relative(rootDir, prismaOutputDir);
|
|
594
|
+
const relativeImportPath = "./" + path5.join(relativeFlareDir, "flare").replace(/\\/g, "/");
|
|
595
|
+
console.log(`\u2705 Generated prisma-flare client with custom Prisma output`);
|
|
596
|
+
console.log(` Location: ${prismaOutputDir}`);
|
|
597
|
+
console.log(` Files: flare.ts, flare.d.ts`);
|
|
598
|
+
console.log(`
|
|
599
|
+
Import: import { FlareClient } from '${relativeImportPath}';`);
|
|
600
|
+
}
|
|
470
601
|
|
|
471
602
|
// src/cli/index.ts
|
|
472
603
|
import { spawn } from "child_process";
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -149,17 +149,43 @@ Example with custom plurals:
|
|
|
149
149
|
|
|
150
150
|
### Custom Prisma Output Path
|
|
151
151
|
|
|
152
|
-
If you use a custom `output` in your Prisma schema, prisma-flare automatically detects and
|
|
152
|
+
If you use a custom `output` in your Prisma schema (common with Prisma 7+), prisma-flare automatically detects it and generates the FlareClient next to your Prisma client for full bundler compatibility (Turbopack, Webpack, Vite, etc.):
|
|
153
153
|
|
|
154
154
|
```prisma
|
|
155
155
|
// schema.prisma
|
|
156
156
|
generator client {
|
|
157
157
|
provider = "prisma-client-js"
|
|
158
|
-
output = "./generated
|
|
158
|
+
output = "./generated" // Custom output path
|
|
159
159
|
}
|
|
160
160
|
```
|
|
161
161
|
|
|
162
|
-
|
|
162
|
+
Run `npx prisma-flare generate` after `npx prisma generate`:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
npx prisma generate
|
|
166
|
+
npx prisma-flare generate
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
This creates `flare.ts` next to your Prisma client:
|
|
170
|
+
```
|
|
171
|
+
prisma/
|
|
172
|
+
generated/
|
|
173
|
+
client.ts ← Prisma generates this
|
|
174
|
+
flare.ts ← prisma-flare generates this
|
|
175
|
+
flare.d.ts ← TypeScript declarations
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**Import from the generated flare file:**
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
// prisma/db.ts
|
|
182
|
+
import './callbacks';
|
|
183
|
+
import { FlareClient } from './generated/flare'; // ← Different import path!
|
|
184
|
+
|
|
185
|
+
export const db = new FlareClient();
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
> **Note:** With custom outputs, importing from `'prisma-flare'` directly will throw an error guiding you to the correct import path.
|
|
163
189
|
|
|
164
190
|
**Manual override:** If auto-detection doesn't work, add to `prisma-flare.config.json`:
|
|
165
191
|
|