@breadstone-infrastructure/prisma-seeds 0.0.231
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/CHANGELOG.md +9 -0
- package/LICENSE +21 -0
- package/README.md +284 -0
- package/ai/AISeedGenerator.d.ts +127 -0
- package/ai/AISeedGenerator.d.ts.map +1 -0
- package/ai/AISeedGenerator.js +438 -0
- package/ai/AISeedGenerator.js.map +1 -0
- package/ai/AISeedTypes.d.ts +138 -0
- package/ai/AISeedTypes.d.ts.map +1 -0
- package/ai/AISeedTypes.js +3 -0
- package/ai/AISeedTypes.js.map +1 -0
- package/ai/PrismaModelAnalyzer.d.ts +36 -0
- package/ai/PrismaModelAnalyzer.d.ts.map +1 -0
- package/ai/PrismaModelAnalyzer.js +110 -0
- package/ai/PrismaModelAnalyzer.js.map +1 -0
- package/ai/PrismaTypeSchemaGenerator.d.ts +38 -0
- package/ai/PrismaTypeSchemaGenerator.d.ts.map +1 -0
- package/ai/PrismaTypeSchemaGenerator.js +71 -0
- package/ai/PrismaTypeSchemaGenerator.js.map +1 -0
- package/ai/createAISeeder.d.ts +11 -0
- package/ai/createAISeeder.d.ts.map +1 -0
- package/ai/createAISeeder.js +72 -0
- package/ai/createAISeeder.js.map +1 -0
- package/ai/index.d.ts +6 -0
- package/ai/index.d.ts.map +1 -0
- package/ai/index.js +5 -0
- package/ai/index.js.map +1 -0
- package/assets/AssetManager.d.ts +213 -0
- package/assets/AssetManager.d.ts.map +1 -0
- package/assets/AssetManager.js +460 -0
- package/assets/AssetManager.js.map +1 -0
- package/assets/IImageTransformOptions.d.ts +42 -0
- package/assets/IImageTransformOptions.d.ts.map +1 -0
- package/assets/IImageTransformOptions.js +22 -0
- package/assets/IImageTransformOptions.js.map +1 -0
- package/assets/adapters/BlobAdapterFactory.d.ts +21 -0
- package/assets/adapters/BlobAdapterFactory.d.ts.map +1 -0
- package/assets/adapters/BlobAdapterFactory.js +3 -0
- package/assets/adapters/BlobAdapterFactory.js.map +1 -0
- package/assets/adapters/CloudflareR2BlobAdapter.d.ts +97 -0
- package/assets/adapters/CloudflareR2BlobAdapter.d.ts.map +1 -0
- package/assets/adapters/CloudflareR2BlobAdapter.js +265 -0
- package/assets/adapters/CloudflareR2BlobAdapter.js.map +1 -0
- package/assets/adapters/EmptyBlobAdapter.d.ts +42 -0
- package/assets/adapters/EmptyBlobAdapter.d.ts.map +1 -0
- package/assets/adapters/EmptyBlobAdapter.js +65 -0
- package/assets/adapters/EmptyBlobAdapter.js.map +1 -0
- package/assets/adapters/LocalFileAdapter.d.ts +34 -0
- package/assets/adapters/LocalFileAdapter.d.ts.map +1 -0
- package/assets/adapters/LocalFileAdapter.js +74 -0
- package/assets/adapters/LocalFileAdapter.js.map +1 -0
- package/assets/adapters/VercelBlobAdapter.d.ts +73 -0
- package/assets/adapters/VercelBlobAdapter.d.ts.map +1 -0
- package/assets/adapters/VercelBlobAdapter.js +168 -0
- package/assets/adapters/VercelBlobAdapter.js.map +1 -0
- package/assets/adapters/abstracts/BlobAdapterBase.d.ts +62 -0
- package/assets/adapters/abstracts/BlobAdapterBase.d.ts.map +1 -0
- package/assets/adapters/abstracts/BlobAdapterBase.js +58 -0
- package/assets/adapters/abstracts/BlobAdapterBase.js.map +1 -0
- package/assets/adapters/abstracts/HttpBlobAdapterBase.d.ts +43 -0
- package/assets/adapters/abstracts/HttpBlobAdapterBase.d.ts.map +1 -0
- package/assets/adapters/abstracts/HttpBlobAdapterBase.js +88 -0
- package/assets/adapters/abstracts/HttpBlobAdapterBase.js.map +1 -0
- package/assets/adapters/createBlobAdapter.d.ts +47 -0
- package/assets/adapters/createBlobAdapter.d.ts.map +1 -0
- package/assets/adapters/createBlobAdapter.js +63 -0
- package/assets/adapters/createBlobAdapter.js.map +1 -0
- package/assets/adapters/index.d.ts +11 -0
- package/assets/adapters/index.d.ts.map +1 -0
- package/assets/adapters/index.js +7 -0
- package/assets/adapters/index.js.map +1 -0
- package/assets/adapters/interfaces/IBlobAdapter.d.ts +41 -0
- package/assets/adapters/interfaces/IBlobAdapter.d.ts.map +1 -0
- package/assets/adapters/interfaces/IBlobAdapter.js +3 -0
- package/assets/adapters/interfaces/IBlobAdapter.js.map +1 -0
- package/assets/adapters/interfaces/IBlobAdapterConfig.d.ts +16 -0
- package/assets/adapters/interfaces/IBlobAdapterConfig.d.ts.map +1 -0
- package/assets/adapters/interfaces/IBlobAdapterConfig.js +2 -0
- package/assets/adapters/interfaces/IBlobAdapterConfig.js.map +1 -0
- package/assets/adapters/interfaces/IBlobUploadResult.d.ts +24 -0
- package/assets/adapters/interfaces/IBlobUploadResult.d.ts.map +1 -0
- package/assets/adapters/interfaces/IBlobUploadResult.js +2 -0
- package/assets/adapters/interfaces/IBlobUploadResult.js.map +1 -0
- package/base/BaseSeeder.d.ts +21 -0
- package/base/BaseSeeder.d.ts.map +1 -0
- package/base/BaseSeeder.js +45 -0
- package/base/BaseSeeder.js.map +1 -0
- package/base/functionalSeeder.d.ts +31 -0
- package/base/functionalSeeder.d.ts.map +1 -0
- package/base/functionalSeeder.js +33 -0
- package/base/functionalSeeder.js.map +1 -0
- package/cli/Cli.d.ts +2 -0
- package/cli/Cli.d.ts.map +1 -0
- package/cli/Cli.js +32 -0
- package/cli/Cli.js.map +1 -0
- package/cli/CliArgs.d.ts +2 -0
- package/cli/CliArgs.d.ts.map +1 -0
- package/cli/CliArgs.js +133 -0
- package/cli/CliArgs.js.map +1 -0
- package/cli/CliArgsConfig.d.ts +2 -0
- package/cli/CliArgsConfig.d.ts.map +1 -0
- package/cli/CliArgsConfig.js +15 -0
- package/cli/CliArgsConfig.js.map +1 -0
- package/cli/CliRun.d.ts +2 -0
- package/cli/CliRun.d.ts.map +1 -0
- package/cli/CliRun.js +34 -0
- package/cli/CliRun.js.map +1 -0
- package/cli/commands/SeedCommand.d.ts +2 -0
- package/cli/commands/SeedCommand.d.ts.map +1 -0
- package/cli/commands/SeedCommand.js +73 -0
- package/cli/commands/SeedCommand.js.map +1 -0
- package/cli/commands/SeedCommandArgsConfig.d.ts +2 -0
- package/cli/commands/SeedCommandArgsConfig.d.ts.map +1 -0
- package/cli/commands/SeedCommandArgsConfig.js +31 -0
- package/cli/commands/SeedCommandArgsConfig.js.map +1 -0
- package/cli/seed.d.ts +2 -0
- package/cli/seed.d.ts.map +1 -0
- package/cli/seed.js +42 -0
- package/cli/seed.js.map +1 -0
- package/config/IAssetConfig.d.ts +36 -0
- package/config/IAssetConfig.d.ts.map +1 -0
- package/config/IAssetConfig.js +3 -0
- package/config/IAssetConfig.js.map +1 -0
- package/config/IComposedSeedConfig.d.ts +32 -0
- package/config/IComposedSeedConfig.d.ts.map +1 -0
- package/config/IComposedSeedConfig.js +3 -0
- package/config/IComposedSeedConfig.js.map +1 -0
- package/config/ISeedConfig.d.ts +75 -0
- package/config/ISeedConfig.d.ts.map +1 -0
- package/config/ISeedConfig.js +3 -0
- package/config/ISeedConfig.js.map +1 -0
- package/config/ISeedContext.d.ts +92 -0
- package/config/ISeedContext.d.ts.map +1 -0
- package/config/ISeedContext.js +3 -0
- package/config/ISeedContext.js.map +1 -0
- package/config/ISeedDefinition.d.ts +38 -0
- package/config/ISeedDefinition.d.ts.map +1 -0
- package/config/ISeedDefinition.js +3 -0
- package/config/ISeedDefinition.js.map +1 -0
- package/config/ISeedFactory.d.ts +15 -0
- package/config/ISeedFactory.d.ts.map +1 -0
- package/config/ISeedFactory.js +3 -0
- package/config/ISeedFactory.js.map +1 -0
- package/config/ISeedOptions.d.ts +44 -0
- package/config/ISeedOptions.d.ts.map +1 -0
- package/config/ISeedOptions.js +2 -0
- package/config/ISeedOptions.js.map +1 -0
- package/config/ISeedResult.d.ts +44 -0
- package/config/ISeedResult.d.ts.map +1 -0
- package/config/ISeedResult.js +2 -0
- package/config/ISeedResult.js.map +1 -0
- package/config/ISeeder.d.ts +37 -0
- package/config/ISeeder.d.ts.map +1 -0
- package/config/ISeeder.js +3 -0
- package/config/ISeeder.js.map +1 -0
- package/config/createAdapter.d.ts +13 -0
- package/config/createAdapter.d.ts.map +1 -0
- package/config/createAdapter.js +16 -0
- package/config/createAdapter.js.map +1 -0
- package/config/createSeed.d.ts +6 -0
- package/config/createSeed.d.ts.map +1 -0
- package/config/createSeed.js +16 -0
- package/config/createSeed.js.map +1 -0
- package/config/defineConfig.d.ts +27 -0
- package/config/defineConfig.d.ts.map +1 -0
- package/config/defineConfig.js +35 -0
- package/config/defineConfig.js.map +1 -0
- package/discovery/SeedConfigDiscovery.d.ts +16 -0
- package/discovery/SeedConfigDiscovery.d.ts.map +1 -0
- package/discovery/SeedConfigDiscovery.js +137 -0
- package/discovery/SeedConfigDiscovery.js.map +1 -0
- package/index.d.ts +32 -0
- package/index.d.ts.map +1 -0
- package/index.js +32 -0
- package/index.js.map +1 -0
- package/json/JsonReferenceResolver.d.ts +23 -0
- package/json/JsonReferenceResolver.d.ts.map +1 -0
- package/json/JsonReferenceResolver.js +99 -0
- package/json/JsonReferenceResolver.js.map +1 -0
- package/json/JsonSchemaValidator.d.ts +23 -0
- package/json/JsonSchemaValidator.d.ts.map +1 -0
- package/json/JsonSchemaValidator.js +98 -0
- package/json/JsonSchemaValidator.js.map +1 -0
- package/json/JsonSeedLoader.d.ts +33 -0
- package/json/JsonSeedLoader.d.ts.map +1 -0
- package/json/JsonSeedLoader.js +176 -0
- package/json/JsonSeedLoader.js.map +1 -0
- package/json/JsonSeedTypes.d.ts +204 -0
- package/json/JsonSeedTypes.d.ts.map +1 -0
- package/json/JsonSeedTypes.js +3 -0
- package/json/JsonSeedTypes.js.map +1 -0
- package/json/createJsonSeeder.d.ts +13 -0
- package/json/createJsonSeeder.d.ts.map +1 -0
- package/json/createJsonSeeder.js +240 -0
- package/json/createJsonSeeder.js.map +1 -0
- package/json/index.d.ts +6 -0
- package/json/index.d.ts.map +1 -0
- package/json/index.js +7 -0
- package/json/index.js.map +1 -0
- package/logging/ISeedLogger.d.ts +55 -0
- package/logging/ISeedLogger.d.ts.map +1 -0
- package/logging/ISeedLogger.js +3 -0
- package/logging/ISeedLogger.js.map +1 -0
- package/logging/LogLevel.d.ts +30 -0
- package/logging/LogLevel.d.ts.map +1 -0
- package/logging/LogLevel.js +37 -0
- package/logging/LogLevel.js.map +1 -0
- package/logging/SeedLogger.d.ts +24 -0
- package/logging/SeedLogger.d.ts.map +1 -0
- package/logging/SeedLogger.js +94 -0
- package/logging/SeedLogger.js.map +1 -0
- package/orchestration/SeedOrchestrator.d.ts +30 -0
- package/orchestration/SeedOrchestrator.d.ts.map +1 -0
- package/orchestration/SeedOrchestrator.js +262 -0
- package/orchestration/SeedOrchestrator.js.map +1 -0
- package/package.json +27 -0
- package/resolvers/EntityResolver.d.ts +43 -0
- package/resolvers/EntityResolver.d.ts.map +1 -0
- package/resolvers/EntityResolver.js +95 -0
- package/resolvers/EntityResolver.js.map +1 -0
- package/utils/AssetReferenceResolver.d.ts +49 -0
- package/utils/AssetReferenceResolver.d.ts.map +1 -0
- package/utils/AssetReferenceResolver.js +62 -0
- package/utils/AssetReferenceResolver.js.map +1 -0
- package/utils/EntityLookupCache.d.ts +47 -0
- package/utils/EntityLookupCache.d.ts.map +1 -0
- package/utils/EntityLookupCache.js +64 -0
- package/utils/EntityLookupCache.js.map +1 -0
- package/utils/ISeedRandom.d.ts +70 -0
- package/utils/ISeedRandom.d.ts.map +1 -0
- package/utils/ISeedRandom.js +3 -0
- package/utils/ISeedRandom.js.map +1 -0
- package/utils/LocalizationToolkit.d.ts +125 -0
- package/utils/LocalizationToolkit.d.ts.map +1 -0
- package/utils/LocalizationToolkit.js +131 -0
- package/utils/LocalizationToolkit.js.map +1 -0
- package/utils/SeededRandom.d.ts +15 -0
- package/utils/SeededRandom.d.ts.map +1 -0
- package/utils/SeededRandom.js +56 -0
- package/utils/SeededRandom.js.map +1 -0
- package/utils/StringArrayToolkit.d.ts +25 -0
- package/utils/StringArrayToolkit.d.ts.map +1 -0
- package/utils/StringArrayToolkit.js +56 -0
- package/utils/StringArrayToolkit.js.map +1 -0
- package/utils/StringValueGuard.d.ts +24 -0
- package/utils/StringValueGuard.d.ts.map +1 -0
- package/utils/StringValueGuard.js +46 -0
- package/utils/StringValueGuard.js.map +1 -0
- package/utils/WarningCollector.d.ts +40 -0
- package/utils/WarningCollector.d.ts.map +1 -0
- package/utils/WarningCollector.js +83 -0
- package/utils/WarningCollector.js.map +1 -0
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
/* eslint-disable no-unused-vars */
|
|
2
|
+
// #region Imports
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { PrismaModelAnalyzer } from './PrismaModelAnalyzer.js';
|
|
5
|
+
import { SeedLogger } from '../logging/SeedLogger.js';
|
|
6
|
+
// #endregion
|
|
7
|
+
/**
|
|
8
|
+
* AI-powered seed generator that uses LLMs to generate realistic test data.
|
|
9
|
+
*
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
export class AISeedGenerator {
|
|
13
|
+
_prisma;
|
|
14
|
+
// #region Fields
|
|
15
|
+
_modelAnalyzer;
|
|
16
|
+
_logger = new SeedLogger();
|
|
17
|
+
// #endregion
|
|
18
|
+
// #region Ctor
|
|
19
|
+
constructor(_prisma) {
|
|
20
|
+
this._prisma = _prisma;
|
|
21
|
+
this._modelAnalyzer = new PrismaModelAnalyzer(_prisma);
|
|
22
|
+
}
|
|
23
|
+
// #endregion
|
|
24
|
+
// #region Methods
|
|
25
|
+
/**
|
|
26
|
+
* Generate entities using AI based on configuration.
|
|
27
|
+
*
|
|
28
|
+
* @public
|
|
29
|
+
* @template T The type of the entity to be generated
|
|
30
|
+
* @param config AI seed configuration
|
|
31
|
+
* @param context Seed context with Prisma client and logger
|
|
32
|
+
* @param utilities Utilities for seeding operations
|
|
33
|
+
* @returns Result of the seeding operation
|
|
34
|
+
*/
|
|
35
|
+
async generateEntities(config, context, utilities) {
|
|
36
|
+
if (!config.enabled) {
|
|
37
|
+
context.logger.info(`AI generation disabled for ${config.schema.modelName}`);
|
|
38
|
+
return utilities.createSeedResult(0, 0);
|
|
39
|
+
}
|
|
40
|
+
const { result: generatedEntities, duration } = await utilities.measureExecutionTime(async () => {
|
|
41
|
+
// 1. Analyze the Prisma model
|
|
42
|
+
const executionContext = await this._modelAnalyzer.analyzeModel(config.schema.modelName);
|
|
43
|
+
// 2. Prepare chunking configuration
|
|
44
|
+
const chunkSize = this.resolveChunkSize(config);
|
|
45
|
+
const totalCount = config.generation.count;
|
|
46
|
+
const totalChunks = Math.max(1, Math.ceil(totalCount / chunkSize));
|
|
47
|
+
const uniqueFieldTracker = this.initializeUniqueFieldTracker(config, executionContext);
|
|
48
|
+
const aggregatedEntities = new Array();
|
|
49
|
+
this._logger.info(`Preparing AI generation in ${totalChunks} chunk(s) with a maximum of ${chunkSize} entities per request.`);
|
|
50
|
+
for (let chunkIndex = 0; chunkIndex < totalChunks; chunkIndex++) {
|
|
51
|
+
const remaining = totalCount - aggregatedEntities.length;
|
|
52
|
+
if (remaining <= 0) {
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
const requestedCount = Math.min(chunkSize, remaining);
|
|
56
|
+
this._logger.debug(`Starting AI generation chunk ${chunkIndex + 1}/${totalChunks} targeting ${requestedCount} entities.`);
|
|
57
|
+
// 3. Generate AI prompt for the current chunk
|
|
58
|
+
const prompt = this.buildPrompt(config, executionContext, requestedCount, chunkIndex + 1, totalChunks);
|
|
59
|
+
// 4. Call AI to generate entities
|
|
60
|
+
const aiResult = await this.callAI(config, prompt, requestedCount);
|
|
61
|
+
// 5. Validate and transform data
|
|
62
|
+
const validatedData = this.validateAndTransform(aiResult, config, requestedCount, uniqueFieldTracker);
|
|
63
|
+
aggregatedEntities.push(...validatedData);
|
|
64
|
+
this._logger.info(`Chunk ${chunkIndex + 1}/${totalChunks} produced ${validatedData.length} valid entit${validatedData.length === 1 ? 'y' : 'ies'}.`);
|
|
65
|
+
}
|
|
66
|
+
if (aggregatedEntities.length < totalCount) {
|
|
67
|
+
this._logger.warn(`Requested ${totalCount} entit${totalCount === 1 ? 'y' : 'ies'} but only ${aggregatedEntities.length} valid entit${aggregatedEntities.length === 1 ? 'y was' : 'ies were'} generated.`);
|
|
68
|
+
}
|
|
69
|
+
// 6. Save to database
|
|
70
|
+
const savedEntities = await this.saveEntities(aggregatedEntities.slice(0, totalCount), config, context);
|
|
71
|
+
return savedEntities;
|
|
72
|
+
});
|
|
73
|
+
context.logger.info(`AI generated ${generatedEntities.length} ${config.schema.modelName} entities`);
|
|
74
|
+
return utilities.createSeedResult(generatedEntities.length, duration);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Build a comprehensive prompt for AI generation.
|
|
78
|
+
*
|
|
79
|
+
* @private
|
|
80
|
+
* @template T The type of the entity to be generated
|
|
81
|
+
* @param config AI seed configuration
|
|
82
|
+
* @param executionContext Execution context with model schema and existing data
|
|
83
|
+
* @returns The constructed prompt string
|
|
84
|
+
*/
|
|
85
|
+
buildPrompt(config, executionContext, requestedCount, chunkIndex, totalChunks) {
|
|
86
|
+
const { generation, schema } = config;
|
|
87
|
+
if (config.promptTemplate) {
|
|
88
|
+
return this.interpolateTemplate(config.promptTemplate, {
|
|
89
|
+
config,
|
|
90
|
+
executionContext,
|
|
91
|
+
chunk: {
|
|
92
|
+
current: chunkIndex,
|
|
93
|
+
total: totalChunks,
|
|
94
|
+
count: requestedCount
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
// Build default prompt
|
|
99
|
+
let prompt = `Generate ${requestedCount} realistic ${schema.modelName} entities for a fitness/nutrition application.\n\n`;
|
|
100
|
+
if (totalChunks > 1) {
|
|
101
|
+
prompt += `This is chunk ${chunkIndex} of ${totalChunks} to fulfil a total request of ${generation.count} entities. Avoid duplicating entries from earlier chunks and respect uniqueness constraints.\n\n`;
|
|
102
|
+
}
|
|
103
|
+
// Add context description
|
|
104
|
+
prompt += `Context: ${generation.description}\n\n`;
|
|
105
|
+
// Add schema information
|
|
106
|
+
prompt += 'Schema requirements:\n';
|
|
107
|
+
const fields = Object.entries(executionContext.modelSchema);
|
|
108
|
+
for (const [fieldName, fieldInfo] of fields) {
|
|
109
|
+
const info = fieldInfo;
|
|
110
|
+
prompt += `- ${fieldName}: ${info.type}${info.isRequired ? ' (required)' : ' (optional)'}${info.isUnique ? ' (must be unique)' : ''}\n`;
|
|
111
|
+
}
|
|
112
|
+
prompt += '\n';
|
|
113
|
+
// Add constraints
|
|
114
|
+
if (generation.constraints.length > 0) {
|
|
115
|
+
prompt += 'Constraints:\n';
|
|
116
|
+
for (const constraint of generation.constraints) {
|
|
117
|
+
prompt += `- ${constraint}\n`;
|
|
118
|
+
}
|
|
119
|
+
prompt += '\n';
|
|
120
|
+
}
|
|
121
|
+
// Add uniqueness requirements
|
|
122
|
+
if (generation.uniqueFields.length > 0) {
|
|
123
|
+
prompt += 'Unique fields (must not duplicate existing data):\n';
|
|
124
|
+
for (const field of generation.uniqueFields) {
|
|
125
|
+
const existingValues = this.getExistingFieldValues(executionContext.existingData, field);
|
|
126
|
+
prompt += `- ${field}: avoid [${existingValues.slice(0, 10).join(', ')}${existingValues.length > 10 ? '...' : ''}]\n`;
|
|
127
|
+
}
|
|
128
|
+
prompt += '\n';
|
|
129
|
+
}
|
|
130
|
+
// Add relationship context
|
|
131
|
+
if (generation.relationships.length > 0 && Object.keys(executionContext.relatedData).length > 0) {
|
|
132
|
+
prompt += 'Related data for references:\n';
|
|
133
|
+
for (const [modelName, data] of Object.entries(executionContext.relatedData)) {
|
|
134
|
+
const sampleIds = data.slice(0, 5).map((item) => item.id);
|
|
135
|
+
prompt += `- ${modelName} IDs: [${sampleIds.join(', ')}${data.length > 5 ? '...' : ''}]\n`;
|
|
136
|
+
}
|
|
137
|
+
prompt += '\n';
|
|
138
|
+
}
|
|
139
|
+
prompt += `Generate an array of ${requestedCount} objects that match this schema. `;
|
|
140
|
+
prompt += 'Ensure all data is realistic, diverse, and follows the constraints. ';
|
|
141
|
+
prompt += 'Return only valid JSON data.';
|
|
142
|
+
return prompt;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Call AI service to generate data.
|
|
146
|
+
*
|
|
147
|
+
* @private
|
|
148
|
+
* @template T The type of the entity to be generated
|
|
149
|
+
* @param config AI seed configuration
|
|
150
|
+
* @param prompt The prompt string to send to the AI
|
|
151
|
+
* @returns Array of generated objects
|
|
152
|
+
*/
|
|
153
|
+
async callAI(config, prompt, requestedCount) {
|
|
154
|
+
const provider = this.createAIProvider(config.provider);
|
|
155
|
+
// Get or create Zod schema
|
|
156
|
+
const entitySchema = this.getZodSchema(config);
|
|
157
|
+
const minimumCount = Math.max(1, requestedCount);
|
|
158
|
+
const arraySchema = z.array(entitySchema)
|
|
159
|
+
.min(minimumCount)
|
|
160
|
+
.max(minimumCount * 2);
|
|
161
|
+
try {
|
|
162
|
+
// Dynamic import will be available when AI SDK is installed
|
|
163
|
+
const { generateObject } = await import('ai');
|
|
164
|
+
const result = await generateObject({
|
|
165
|
+
model: provider,
|
|
166
|
+
schema: arraySchema,
|
|
167
|
+
prompt: prompt
|
|
168
|
+
});
|
|
169
|
+
return result.object;
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
throw new Error(`AI generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
resolveChunkSize(config) {
|
|
176
|
+
const { count, chunkSize } = config.generation;
|
|
177
|
+
if (chunkSize === undefined) {
|
|
178
|
+
return count;
|
|
179
|
+
}
|
|
180
|
+
const normalizedSize = Math.max(1, Math.floor(chunkSize));
|
|
181
|
+
return Math.min(normalizedSize, Math.max(1, count));
|
|
182
|
+
}
|
|
183
|
+
initializeUniqueFieldTracker(config, executionContext) {
|
|
184
|
+
const uniqueFields = config.generation.uniqueFields ?? [];
|
|
185
|
+
if (uniqueFields.length === 0) {
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
const tracker = new Map();
|
|
189
|
+
for (const field of uniqueFields) {
|
|
190
|
+
tracker.set(field, new Set());
|
|
191
|
+
}
|
|
192
|
+
const shouldIncludeExisting = config.generation.includeExistingData ?? true;
|
|
193
|
+
const existingDataSource = shouldIncludeExisting ? executionContext.existingData ?? [] : [];
|
|
194
|
+
for (const entry of existingDataSource) {
|
|
195
|
+
this.registerUniqueFieldValues(tracker, entry, uniqueFields);
|
|
196
|
+
}
|
|
197
|
+
return tracker;
|
|
198
|
+
}
|
|
199
|
+
hasDuplicateUniqueField(item, tracker, uniqueFields) {
|
|
200
|
+
if (item === null || typeof item !== 'object') {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
const record = item;
|
|
204
|
+
for (const field of uniqueFields) {
|
|
205
|
+
const set = tracker.get(field);
|
|
206
|
+
if (!set) {
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
const normalizedValue = this.extractUniqueFieldValue(record[field]);
|
|
210
|
+
if (normalizedValue !== undefined && set.has(normalizedValue)) {
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
registerUniqueFieldValues(tracker, item, uniqueFields) {
|
|
217
|
+
if (item === null || typeof item !== 'object') {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const record = item;
|
|
221
|
+
for (const field of uniqueFields) {
|
|
222
|
+
const set = tracker.get(field);
|
|
223
|
+
if (!set) {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
const normalizedValue = this.extractUniqueFieldValue(record[field]);
|
|
227
|
+
if (normalizedValue !== undefined) {
|
|
228
|
+
set.add(normalizedValue);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
extractUniqueFieldValue(value) {
|
|
233
|
+
if (value === null || value === undefined) {
|
|
234
|
+
return undefined;
|
|
235
|
+
}
|
|
236
|
+
if (value instanceof Date) {
|
|
237
|
+
return value.toISOString();
|
|
238
|
+
}
|
|
239
|
+
if (typeof value === 'object') {
|
|
240
|
+
try {
|
|
241
|
+
return JSON.stringify(value);
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
return undefined;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return String(value);
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Create AI provider based on configuration.
|
|
251
|
+
*
|
|
252
|
+
* @private
|
|
253
|
+
* @param provider The AI provider name
|
|
254
|
+
* @returns The corresponding environment variable key
|
|
255
|
+
*/
|
|
256
|
+
createAIProvider(providerConfig) {
|
|
257
|
+
switch (providerConfig.provider) {
|
|
258
|
+
case 'openai': {
|
|
259
|
+
// Dynamic import to avoid dependency issues if not used
|
|
260
|
+
const { openai } = require('@ai-sdk/openai');
|
|
261
|
+
return openai(providerConfig.model, {
|
|
262
|
+
apiKey: providerConfig.apiKey || process.env['OPENAI_API_KEY'],
|
|
263
|
+
...providerConfig.options
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
case 'anthropic': {
|
|
267
|
+
const { anthropic } = require('@ai-sdk/anthropic');
|
|
268
|
+
return anthropic(providerConfig.model, {
|
|
269
|
+
apiKey: providerConfig.apiKey || process.env['ANTHROPIC_API_KEY'],
|
|
270
|
+
...providerConfig.options
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
case 'google': {
|
|
274
|
+
const { google } = require('@ai-sdk/google');
|
|
275
|
+
return google(providerConfig.model, {
|
|
276
|
+
apiKey: providerConfig.apiKey || process.env['GOOGLE_API_KEY'],
|
|
277
|
+
...providerConfig.options
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
default:
|
|
281
|
+
throw new Error(`Unsupported AI provider: ${providerConfig.provider}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Validate generated data and apply transformations.
|
|
286
|
+
*
|
|
287
|
+
* @private
|
|
288
|
+
* @template T The type of the entity to be generated
|
|
289
|
+
* @param data The raw generated data from AI
|
|
290
|
+
* @param config AI seed configuration
|
|
291
|
+
* @returns Array of validated and transformed entities
|
|
292
|
+
*/
|
|
293
|
+
validateAndTransform(data, config, limit, uniqueFieldTracker) {
|
|
294
|
+
const validatedData = new Array();
|
|
295
|
+
const zodSchema = this.getZodSchema(config);
|
|
296
|
+
const uniqueFields = config.generation.uniqueFields ?? [];
|
|
297
|
+
for (const item of data) {
|
|
298
|
+
try {
|
|
299
|
+
// Validate with Zod schema
|
|
300
|
+
const validated = zodSchema.parse(item);
|
|
301
|
+
// Apply transformer if provided
|
|
302
|
+
const transformed = config.schema.transformer
|
|
303
|
+
? config.schema.transformer(validated)
|
|
304
|
+
: validated;
|
|
305
|
+
if (uniqueFieldTracker && uniqueFields.length > 0) {
|
|
306
|
+
if (this.hasDuplicateUniqueField(transformed, uniqueFieldTracker, uniqueFields)) {
|
|
307
|
+
this._logger.warn('Duplicate detected for configured unique fields. Skipping generated item.');
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
this.registerUniqueFieldValues(uniqueFieldTracker, transformed, uniqueFields);
|
|
311
|
+
}
|
|
312
|
+
validatedData.push(transformed);
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
// Log validation errors but continue with other items
|
|
316
|
+
this._logger.warn(`Validation failed for generated item: ${error}`);
|
|
317
|
+
}
|
|
318
|
+
if (validatedData.length >= limit) {
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return validatedData;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Save generated entities to database.
|
|
326
|
+
*
|
|
327
|
+
* @private
|
|
328
|
+
* @template T The type of the entity to be generated
|
|
329
|
+
* @param entities The array of entities to save
|
|
330
|
+
* @param config AI seed configuration
|
|
331
|
+
* @param context Seed context with Prisma client and logger
|
|
332
|
+
* @returns The saved entities
|
|
333
|
+
*/
|
|
334
|
+
async saveEntities(entities, config, context) {
|
|
335
|
+
const modelName = this.toCamelCase(config.schema.modelName);
|
|
336
|
+
const modelDelegate = this._prisma[modelName];
|
|
337
|
+
if (!modelDelegate) {
|
|
338
|
+
throw new Error(`Model ${config.schema.modelName} not found in Prisma client`);
|
|
339
|
+
}
|
|
340
|
+
// Use transaction for consistency
|
|
341
|
+
return await this._prisma.$transaction(entities.map((entity) => modelDelegate.create({ data: entity })));
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Get existing values for a field to avoid duplicates.
|
|
345
|
+
*
|
|
346
|
+
* @private
|
|
347
|
+
* @param existingData The existing data array
|
|
348
|
+
* @param fieldName The field name to extract values from
|
|
349
|
+
* @returns Array of existing values for the specified field
|
|
350
|
+
*/
|
|
351
|
+
getExistingFieldValues(existingData, fieldName) {
|
|
352
|
+
return existingData
|
|
353
|
+
.map((item) => item?.[fieldName])
|
|
354
|
+
.filter((value) => value !== null && value !== undefined)
|
|
355
|
+
.map((value) => String(value));
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Interpolate template with variables.
|
|
359
|
+
*
|
|
360
|
+
* @private
|
|
361
|
+
* @template T The type of the entity to be generated
|
|
362
|
+
* @param template The template string with placeholders
|
|
363
|
+
* @param variables Variables to replace in the template
|
|
364
|
+
* @returns The interpolated string
|
|
365
|
+
*/
|
|
366
|
+
interpolateTemplate(template, variables) {
|
|
367
|
+
// Simple template interpolation - can be enhanced with a proper template engine
|
|
368
|
+
let result = template;
|
|
369
|
+
const chunkInfo = variables.chunk;
|
|
370
|
+
// Replace common variables
|
|
371
|
+
result = result.replace(/\{\{count\}\}/g, String(chunkInfo?.count ?? variables.config.generation.count));
|
|
372
|
+
result = result.replace(/\{\{totalCount\}\}/g, String(variables.config.generation.count));
|
|
373
|
+
result = result.replace(/\{\{chunkIndex\}\}/g, String(chunkInfo?.current ?? 1));
|
|
374
|
+
result = result.replace(/\{\{chunkTotal\}\}/g, String(chunkInfo?.total ?? 1));
|
|
375
|
+
result = result.replace(/\{\{modelName\}\}/g, variables.config.schema.modelName);
|
|
376
|
+
result = result.replace(/\{\{description\}\}/g, variables.config.generation.description);
|
|
377
|
+
return result;
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Convert model name to camelCase for Prisma client access.
|
|
381
|
+
*
|
|
382
|
+
* @private
|
|
383
|
+
* @param modelName The Prisma model name
|
|
384
|
+
* @returns The camelCased model name
|
|
385
|
+
*/
|
|
386
|
+
toCamelCase(modelName) {
|
|
387
|
+
return modelName.charAt(0).toLowerCase() + modelName.slice(1);
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Get or create Zod schema from config.
|
|
391
|
+
*
|
|
392
|
+
* @private
|
|
393
|
+
* @template T The type of the entity to be generated
|
|
394
|
+
* @param config AI seed configuration
|
|
395
|
+
* @returns Zod schema for validating generated entities
|
|
396
|
+
*/
|
|
397
|
+
getZodSchema(config) {
|
|
398
|
+
if (config.schema.zodSchema) {
|
|
399
|
+
// Use provided Zod schema
|
|
400
|
+
return config.schema.zodSchema;
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
// Auto-generate basic schema for common Prisma patterns
|
|
404
|
+
return this.generateBasicPrismaSchema(config.schema.modelName);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Generate a basic Zod schema for common Prisma model patterns.
|
|
409
|
+
*
|
|
410
|
+
* @private
|
|
411
|
+
* @template T The type of the entity to be generated
|
|
412
|
+
* @param config AI seed configuration
|
|
413
|
+
* @returns Zod schema for validating generated entities
|
|
414
|
+
*/
|
|
415
|
+
generateBasicPrismaSchema(modelName) {
|
|
416
|
+
// Create a flexible schema that accepts common Prisma fields
|
|
417
|
+
const schema = z.object({
|
|
418
|
+
id: z.string().cuid()
|
|
419
|
+
.optional(),
|
|
420
|
+
createdAt: z.date().optional(),
|
|
421
|
+
updatedAt: z.date().optional(),
|
|
422
|
+
// Common fields based on model name patterns
|
|
423
|
+
...modelName.toLowerCase() === 'user'
|
|
424
|
+
? {
|
|
425
|
+
email: z.string().email()
|
|
426
|
+
.optional(),
|
|
427
|
+
username: z.string().optional(),
|
|
428
|
+
firstName: z.string().optional(),
|
|
429
|
+
lastName: z.string().optional(),
|
|
430
|
+
name: z.string().optional()
|
|
431
|
+
}
|
|
432
|
+
: {}
|
|
433
|
+
// Allow any additional fields for flexibility
|
|
434
|
+
}).passthrough();
|
|
435
|
+
return schema;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
//# sourceMappingURL=AISeedGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AISeedGenerator.js","sourceRoot":"","sources":["../../src/ai/AISeedGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* AI provider configuration for seed generation.
|
|
4
|
+
*
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
export interface IAIProviderConfig {
|
|
8
|
+
/**
|
|
9
|
+
* The AI provider to use.
|
|
10
|
+
*/
|
|
11
|
+
readonly provider: 'openai' | 'anthropic' | 'google' | 'custom';
|
|
12
|
+
/**
|
|
13
|
+
* The model to use for generation.
|
|
14
|
+
*/
|
|
15
|
+
readonly model: string;
|
|
16
|
+
/**
|
|
17
|
+
* API key or configuration for the provider.
|
|
18
|
+
* Can be environment variable name or direct config.
|
|
19
|
+
*/
|
|
20
|
+
readonly apiKey?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Additional provider-specific options.
|
|
23
|
+
*/
|
|
24
|
+
readonly options?: Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Context and constraints for AI generation.
|
|
28
|
+
*
|
|
29
|
+
* @public
|
|
30
|
+
*/
|
|
31
|
+
export interface IAIGenerationContext {
|
|
32
|
+
/**
|
|
33
|
+
* Human-readable description of what data should be generated.
|
|
34
|
+
* Example: "Generate realistic user profiles for a fitness app"
|
|
35
|
+
*/
|
|
36
|
+
readonly description: string;
|
|
37
|
+
/**
|
|
38
|
+
* Specific constraints and requirements.
|
|
39
|
+
* Example: ["unique email addresses", "realistic names", "varied ages 18-80"]
|
|
40
|
+
*/
|
|
41
|
+
readonly constraints: readonly string[];
|
|
42
|
+
/**
|
|
43
|
+
* Fields that must be unique across all generated entities.
|
|
44
|
+
*/
|
|
45
|
+
readonly uniqueFields: readonly string[];
|
|
46
|
+
/**
|
|
47
|
+
* Relationships to consider when generating data.
|
|
48
|
+
* Example: ["userId must reference existing users"]
|
|
49
|
+
*/
|
|
50
|
+
readonly relationships: readonly string[];
|
|
51
|
+
/**
|
|
52
|
+
* Number of entities to generate.
|
|
53
|
+
*/
|
|
54
|
+
readonly count: number;
|
|
55
|
+
/**
|
|
56
|
+
* Maximum number of entities to request per AI call.
|
|
57
|
+
* Enables sequential chunking to respect token limits of the provider.
|
|
58
|
+
*/
|
|
59
|
+
readonly chunkSize?: number;
|
|
60
|
+
/**
|
|
61
|
+
* Whether to include existing data context for uniqueness validation.
|
|
62
|
+
*/
|
|
63
|
+
readonly includeExistingData?: boolean;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Schema configuration for AI generation.
|
|
67
|
+
* Uses Prisma model type directly - no external dependencies needed in seed configs.
|
|
68
|
+
*
|
|
69
|
+
* @public
|
|
70
|
+
*/
|
|
71
|
+
export interface IAISeedSchema<T = unknown> {
|
|
72
|
+
/**
|
|
73
|
+
* Prisma model name this schema corresponds to.
|
|
74
|
+
*/
|
|
75
|
+
readonly modelName: string;
|
|
76
|
+
/**
|
|
77
|
+
* Zod schema for validation - can be constructed using PrismaTypeSchemaGenerator.
|
|
78
|
+
* Pass undefined to auto-generate a basic schema based on common Prisma patterns.
|
|
79
|
+
*/
|
|
80
|
+
readonly zodSchema?: z.ZodSchema<T>;
|
|
81
|
+
/**
|
|
82
|
+
* Optional transformer to convert generated data to Prisma input format.
|
|
83
|
+
* Receives the AI-generated data and returns data suitable for Prisma.create()
|
|
84
|
+
*/
|
|
85
|
+
readonly transformer?: (data: T) => unknown;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Complete AI configuration for a seed.
|
|
89
|
+
*
|
|
90
|
+
* @public
|
|
91
|
+
*/
|
|
92
|
+
export interface IAISeedConfig<T = unknown> {
|
|
93
|
+
/**
|
|
94
|
+
* Whether AI generation is enabled for this seed.
|
|
95
|
+
*/
|
|
96
|
+
readonly enabled: boolean;
|
|
97
|
+
/**
|
|
98
|
+
* AI provider configuration.
|
|
99
|
+
*/
|
|
100
|
+
readonly provider: IAIProviderConfig;
|
|
101
|
+
/**
|
|
102
|
+
* Generation context and constraints.
|
|
103
|
+
*/
|
|
104
|
+
readonly generation: IAIGenerationContext;
|
|
105
|
+
/**
|
|
106
|
+
* Schema for validation and type safety.
|
|
107
|
+
*/
|
|
108
|
+
readonly schema: IAISeedSchema<T>;
|
|
109
|
+
/**
|
|
110
|
+
* Optional custom prompt template.
|
|
111
|
+
* If not provided, a default template based on schema and context will be used.
|
|
112
|
+
*/
|
|
113
|
+
readonly promptTemplate?: string;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Context provided to AI seeders during execution.
|
|
117
|
+
*
|
|
118
|
+
* @public
|
|
119
|
+
*/
|
|
120
|
+
export interface IAISeedExecutionContext {
|
|
121
|
+
/**
|
|
122
|
+
* Prisma model schema information.
|
|
123
|
+
*/
|
|
124
|
+
readonly modelSchema: Record<string, unknown>;
|
|
125
|
+
/**
|
|
126
|
+
* Existing data in the model for uniqueness checking.
|
|
127
|
+
*/
|
|
128
|
+
readonly existingData: readonly unknown[];
|
|
129
|
+
/**
|
|
130
|
+
* Related data from other models.
|
|
131
|
+
*/
|
|
132
|
+
readonly relatedData: Record<string, readonly unknown[]>;
|
|
133
|
+
/**
|
|
134
|
+
* Database constraints and indexes.
|
|
135
|
+
*/
|
|
136
|
+
readonly constraints: Record<string, unknown>;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=AISeedTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AISeedTypes.d.ts","sourceRoot":"","sources":["../../src/ai/AISeedTypes.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAI7B;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAE9B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAEhE;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAE9C;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IAEjC;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAExC;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAEzC;;;OAGG;IACH,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAE1C;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAE1C;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IAEtC;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAEpC;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;CAE/C;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IAEtC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IAErC;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAE1C;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAElC;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAEpC;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IAEpC;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9C;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,SAAS,OAAO,EAAE,CAAC;IAE1C;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC;IAEzD;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAEjD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AISeedTypes.js","sourceRoot":"","sources":["../../src/ai/AISeedTypes.ts"],"names":[],"mappings":"AAAA,mCAAmC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { PrismaClient } from '@prisma/client';
|
|
2
|
+
import type { IAISeedExecutionContext } from './AISeedTypes.js';
|
|
3
|
+
/**
|
|
4
|
+
* Service for analyzing Prisma models and providing context for AI generation.
|
|
5
|
+
*
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export declare class PrismaModelAnalyzer {
|
|
9
|
+
private readonly _prisma;
|
|
10
|
+
constructor(_prisma: PrismaClient);
|
|
11
|
+
/**
|
|
12
|
+
* Analyze a Prisma model and extract schema information.
|
|
13
|
+
*/
|
|
14
|
+
analyzeModel(modelName: string): Promise<IAISeedExecutionContext>;
|
|
15
|
+
/**
|
|
16
|
+
* Extract the schema definition for a Prisma model.
|
|
17
|
+
*/
|
|
18
|
+
private _extractModelSchema;
|
|
19
|
+
/**
|
|
20
|
+
* Get existing data for uniqueness validation.
|
|
21
|
+
*/
|
|
22
|
+
private _getExistingData;
|
|
23
|
+
/**
|
|
24
|
+
* Get related data from other models that this model references.
|
|
25
|
+
*/
|
|
26
|
+
private _getRelatedData;
|
|
27
|
+
/**
|
|
28
|
+
* Get database constraints for the model.
|
|
29
|
+
*/
|
|
30
|
+
private _getModelConstraints;
|
|
31
|
+
/**
|
|
32
|
+
* Convert model name to camelCase for Prisma client access.
|
|
33
|
+
*/
|
|
34
|
+
private _toCamelCase;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=PrismaModelAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrismaModelAnalyzer.d.ts","sourceRoot":"","sources":["../../src/ai/PrismaModelAnalyzer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAIhE;;;;GAIG;AACH,qBAAa,mBAAmB;IAKxB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,YAAY;IAO1C;;OAEG;IACU,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAc9E;;OAEG;YACW,mBAAmB;IAajC;;OAEG;YACW,gBAAgB;IAkB9B;;OAEG;YACW,eAAe;IA0B7B;;OAEG;YACW,oBAAoB;IAUlC;;OAEG;IACH,OAAO,CAAC,YAAY;CAMvB"}
|