prisma-flare 1.1.6 → 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 +147 -56
- package/dist/cli/index.js +147 -56
- package/package.json +1 -1
- package/readme.md +29 -3
package/dist/cli/index.cjs
CHANGED
|
@@ -376,25 +376,6 @@ function hasCustomPrismaOutput(rootDir) {
|
|
|
376
376
|
}
|
|
377
377
|
|
|
378
378
|
// src/cli/generate-client.ts
|
|
379
|
-
function createSymlinkSafe(target, linkPath) {
|
|
380
|
-
try {
|
|
381
|
-
if (fs5.existsSync(linkPath)) {
|
|
382
|
-
const stats = fs5.lstatSync(linkPath);
|
|
383
|
-
if (stats.isSymbolicLink()) {
|
|
384
|
-
fs5.unlinkSync(linkPath);
|
|
385
|
-
} else if (stats.isDirectory()) {
|
|
386
|
-
fs5.rmSync(linkPath, { recursive: true });
|
|
387
|
-
} else {
|
|
388
|
-
fs5.unlinkSync(linkPath);
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
const linkType = process.platform === "win32" ? "junction" : "dir";
|
|
392
|
-
fs5.symlinkSync(target, linkPath, linkType);
|
|
393
|
-
return true;
|
|
394
|
-
} catch (error) {
|
|
395
|
-
return false;
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
379
|
function generateClient() {
|
|
399
380
|
const rootDir = findProjectRoot(process.cwd());
|
|
400
381
|
const config = loadConfig(rootDir);
|
|
@@ -404,40 +385,24 @@ function generateClient() {
|
|
|
404
385
|
} else {
|
|
405
386
|
prismaClientImport = getPrismaClientPath(rootDir);
|
|
406
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) {
|
|
407
397
|
const nodeModulesDir = path5.join(rootDir, "node_modules");
|
|
408
398
|
const prismaFlareDir = path5.join(nodeModulesDir, ".prisma-flare");
|
|
409
399
|
if (!fs5.existsSync(prismaFlareDir)) {
|
|
410
400
|
fs5.mkdirSync(prismaFlareDir, { recursive: true });
|
|
411
401
|
}
|
|
412
|
-
let resolvedImport;
|
|
413
|
-
let useSymlink = false;
|
|
414
|
-
if (prismaClientImport === "@prisma/client") {
|
|
415
|
-
resolvedImport = "@prisma/client";
|
|
416
|
-
} else {
|
|
417
|
-
const symlinkPath = path5.join(prismaFlareDir, "prisma-client");
|
|
418
|
-
let targetDir = prismaClientImport;
|
|
419
|
-
if (targetDir.endsWith("/client") || targetDir.endsWith("\\client")) {
|
|
420
|
-
targetDir = path5.dirname(targetDir);
|
|
421
|
-
}
|
|
422
|
-
if (createSymlinkSafe(targetDir, symlinkPath)) {
|
|
423
|
-
useSymlink = true;
|
|
424
|
-
const hasClientEntry = fs5.existsSync(path5.join(targetDir, "client.ts")) || fs5.existsSync(path5.join(targetDir, "client.js"));
|
|
425
|
-
resolvedImport = hasClientEntry ? "./prisma-client/client" : "./prisma-client";
|
|
426
|
-
} else {
|
|
427
|
-
console.warn("\u26A0\uFE0F Could not create symlink. Some bundlers may have issues with the generated import path.");
|
|
428
|
-
resolvedImport = path5.relative(prismaFlareDir, prismaClientImport);
|
|
429
|
-
if (!resolvedImport.startsWith(".")) {
|
|
430
|
-
resolvedImport = "./" + resolvedImport;
|
|
431
|
-
}
|
|
432
|
-
resolvedImport = resolvedImport.replace(/\\/g, "/");
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
const isCustomOutput = hasCustomPrismaOutput(rootDir);
|
|
436
402
|
const esmContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
437
403
|
// This file provides FlareClient configured for your Prisma client output path
|
|
438
|
-
// Import path: ${prismaClientImport}
|
|
439
404
|
|
|
440
|
-
import { PrismaClient, Prisma } from '
|
|
405
|
+
import { PrismaClient, Prisma } from '@prisma/client';
|
|
441
406
|
import { createFlareClient } from 'prisma-flare';
|
|
442
407
|
|
|
443
408
|
// Create and export FlareClient using the factory
|
|
@@ -448,9 +413,8 @@ export { PrismaClient, Prisma };
|
|
|
448
413
|
`;
|
|
449
414
|
const cjsContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
450
415
|
// This file provides FlareClient configured for your Prisma client output path
|
|
451
|
-
// Import path: ${prismaClientImport}
|
|
452
416
|
|
|
453
|
-
const { PrismaClient, Prisma } = require('
|
|
417
|
+
const { PrismaClient, Prisma } = require('@prisma/client');
|
|
454
418
|
const { createFlareClient } = require('prisma-flare');
|
|
455
419
|
|
|
456
420
|
// Create FlareClient using the factory
|
|
@@ -465,7 +429,7 @@ module.exports = {
|
|
|
465
429
|
const dtsContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
466
430
|
// This file provides FlareClient configured for your Prisma client output path
|
|
467
431
|
|
|
468
|
-
import { PrismaClient as BasePrismaClient, Prisma as BasePrisma } from '
|
|
432
|
+
import { PrismaClient as BasePrismaClient, Prisma as BasePrisma } from '@prisma/client';
|
|
469
433
|
import type { FlareClientOptions } from 'prisma-flare';
|
|
470
434
|
import type { ModelName } from 'prisma-flare';
|
|
471
435
|
import type FlareBuilder from 'prisma-flare/flareBuilder';
|
|
@@ -518,18 +482,145 @@ export declare class FlareClient extends BasePrismaClient {
|
|
|
518
482
|
path5.join(prismaFlareDir, "package.json"),
|
|
519
483
|
JSON.stringify(packageJson, null, 2)
|
|
520
484
|
);
|
|
521
|
-
|
|
522
|
-
console.log(`\u2705 Generated prisma-flare client with custom Prisma output: ${prismaClientImport}`);
|
|
523
|
-
if (useSymlink) {
|
|
524
|
-
console.log(` Using symlink for bundler compatibility`);
|
|
525
|
-
}
|
|
526
|
-
} else {
|
|
527
|
-
console.log(`\u2705 Generated prisma-flare client using @prisma/client`);
|
|
528
|
-
}
|
|
485
|
+
console.log(`\u2705 Generated prisma-flare client using @prisma/client`);
|
|
529
486
|
console.log(` Location: ${prismaFlareDir}`);
|
|
530
487
|
console.log(`
|
|
531
488
|
Import: import { FlareClient } from 'prisma-flare';`);
|
|
532
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
|
+
}
|
|
533
624
|
|
|
534
625
|
// src/cli/index.ts
|
|
535
626
|
var import_child_process = require("child_process");
|
package/dist/cli/index.js
CHANGED
|
@@ -353,25 +353,6 @@ function hasCustomPrismaOutput(rootDir) {
|
|
|
353
353
|
}
|
|
354
354
|
|
|
355
355
|
// src/cli/generate-client.ts
|
|
356
|
-
function createSymlinkSafe(target, linkPath) {
|
|
357
|
-
try {
|
|
358
|
-
if (fs5.existsSync(linkPath)) {
|
|
359
|
-
const stats = fs5.lstatSync(linkPath);
|
|
360
|
-
if (stats.isSymbolicLink()) {
|
|
361
|
-
fs5.unlinkSync(linkPath);
|
|
362
|
-
} else if (stats.isDirectory()) {
|
|
363
|
-
fs5.rmSync(linkPath, { recursive: true });
|
|
364
|
-
} else {
|
|
365
|
-
fs5.unlinkSync(linkPath);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
const linkType = process.platform === "win32" ? "junction" : "dir";
|
|
369
|
-
fs5.symlinkSync(target, linkPath, linkType);
|
|
370
|
-
return true;
|
|
371
|
-
} catch (error) {
|
|
372
|
-
return false;
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
356
|
function generateClient() {
|
|
376
357
|
const rootDir = findProjectRoot(process.cwd());
|
|
377
358
|
const config = loadConfig(rootDir);
|
|
@@ -381,40 +362,24 @@ function generateClient() {
|
|
|
381
362
|
} else {
|
|
382
363
|
prismaClientImport = getPrismaClientPath(rootDir);
|
|
383
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) {
|
|
384
374
|
const nodeModulesDir = path5.join(rootDir, "node_modules");
|
|
385
375
|
const prismaFlareDir = path5.join(nodeModulesDir, ".prisma-flare");
|
|
386
376
|
if (!fs5.existsSync(prismaFlareDir)) {
|
|
387
377
|
fs5.mkdirSync(prismaFlareDir, { recursive: true });
|
|
388
378
|
}
|
|
389
|
-
let resolvedImport;
|
|
390
|
-
let useSymlink = false;
|
|
391
|
-
if (prismaClientImport === "@prisma/client") {
|
|
392
|
-
resolvedImport = "@prisma/client";
|
|
393
|
-
} else {
|
|
394
|
-
const symlinkPath = path5.join(prismaFlareDir, "prisma-client");
|
|
395
|
-
let targetDir = prismaClientImport;
|
|
396
|
-
if (targetDir.endsWith("/client") || targetDir.endsWith("\\client")) {
|
|
397
|
-
targetDir = path5.dirname(targetDir);
|
|
398
|
-
}
|
|
399
|
-
if (createSymlinkSafe(targetDir, symlinkPath)) {
|
|
400
|
-
useSymlink = true;
|
|
401
|
-
const hasClientEntry = fs5.existsSync(path5.join(targetDir, "client.ts")) || fs5.existsSync(path5.join(targetDir, "client.js"));
|
|
402
|
-
resolvedImport = hasClientEntry ? "./prisma-client/client" : "./prisma-client";
|
|
403
|
-
} else {
|
|
404
|
-
console.warn("\u26A0\uFE0F Could not create symlink. Some bundlers may have issues with the generated import path.");
|
|
405
|
-
resolvedImport = path5.relative(prismaFlareDir, prismaClientImport);
|
|
406
|
-
if (!resolvedImport.startsWith(".")) {
|
|
407
|
-
resolvedImport = "./" + resolvedImport;
|
|
408
|
-
}
|
|
409
|
-
resolvedImport = resolvedImport.replace(/\\/g, "/");
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
const isCustomOutput = hasCustomPrismaOutput(rootDir);
|
|
413
379
|
const esmContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
414
380
|
// This file provides FlareClient configured for your Prisma client output path
|
|
415
|
-
// Import path: ${prismaClientImport}
|
|
416
381
|
|
|
417
|
-
import { PrismaClient, Prisma } from '
|
|
382
|
+
import { PrismaClient, Prisma } from '@prisma/client';
|
|
418
383
|
import { createFlareClient } from 'prisma-flare';
|
|
419
384
|
|
|
420
385
|
// Create and export FlareClient using the factory
|
|
@@ -425,9 +390,8 @@ export { PrismaClient, Prisma };
|
|
|
425
390
|
`;
|
|
426
391
|
const cjsContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
427
392
|
// This file provides FlareClient configured for your Prisma client output path
|
|
428
|
-
// Import path: ${prismaClientImport}
|
|
429
393
|
|
|
430
|
-
const { PrismaClient, Prisma } = require('
|
|
394
|
+
const { PrismaClient, Prisma } = require('@prisma/client');
|
|
431
395
|
const { createFlareClient } = require('prisma-flare');
|
|
432
396
|
|
|
433
397
|
// Create FlareClient using the factory
|
|
@@ -442,7 +406,7 @@ module.exports = {
|
|
|
442
406
|
const dtsContent = `// Generated by prisma-flare - DO NOT EDIT
|
|
443
407
|
// This file provides FlareClient configured for your Prisma client output path
|
|
444
408
|
|
|
445
|
-
import { PrismaClient as BasePrismaClient, Prisma as BasePrisma } from '
|
|
409
|
+
import { PrismaClient as BasePrismaClient, Prisma as BasePrisma } from '@prisma/client';
|
|
446
410
|
import type { FlareClientOptions } from 'prisma-flare';
|
|
447
411
|
import type { ModelName } from 'prisma-flare';
|
|
448
412
|
import type FlareBuilder from 'prisma-flare/flareBuilder';
|
|
@@ -495,18 +459,145 @@ export declare class FlareClient extends BasePrismaClient {
|
|
|
495
459
|
path5.join(prismaFlareDir, "package.json"),
|
|
496
460
|
JSON.stringify(packageJson, null, 2)
|
|
497
461
|
);
|
|
498
|
-
|
|
499
|
-
console.log(`\u2705 Generated prisma-flare client with custom Prisma output: ${prismaClientImport}`);
|
|
500
|
-
if (useSymlink) {
|
|
501
|
-
console.log(` Using symlink for bundler compatibility`);
|
|
502
|
-
}
|
|
503
|
-
} else {
|
|
504
|
-
console.log(`\u2705 Generated prisma-flare client using @prisma/client`);
|
|
505
|
-
}
|
|
462
|
+
console.log(`\u2705 Generated prisma-flare client using @prisma/client`);
|
|
506
463
|
console.log(` Location: ${prismaFlareDir}`);
|
|
507
464
|
console.log(`
|
|
508
465
|
Import: import { FlareClient } from 'prisma-flare';`);
|
|
509
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
|
+
}
|
|
510
601
|
|
|
511
602
|
// src/cli/index.ts
|
|
512
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
|
|