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.
@@ -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 '${resolvedImport}';
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('${resolvedImport}');
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 '${resolvedImport}';
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
- if (isCustomOutput) {
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 '${resolvedImport}';
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('${resolvedImport}');
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 '${resolvedImport}';
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
- if (isCustomOutput) {
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prisma-flare",
3
- "version": "1.1.6",
3
+ "version": "1.1.7",
4
4
  "description": "Prisma utilities package with callback system and query builder for chained operations",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
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 supports it:
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/client" // Custom output path
158
+ output = "./generated" // Custom output path
159
159
  }
160
160
  ```
161
161
 
162
- Just run `npx prisma-flare generate` - it parses your `schema.prisma` and configures everything automatically. No extra configuration needed.
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