@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.
Files changed (252) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +21 -0
  3. package/README.md +284 -0
  4. package/ai/AISeedGenerator.d.ts +127 -0
  5. package/ai/AISeedGenerator.d.ts.map +1 -0
  6. package/ai/AISeedGenerator.js +438 -0
  7. package/ai/AISeedGenerator.js.map +1 -0
  8. package/ai/AISeedTypes.d.ts +138 -0
  9. package/ai/AISeedTypes.d.ts.map +1 -0
  10. package/ai/AISeedTypes.js +3 -0
  11. package/ai/AISeedTypes.js.map +1 -0
  12. package/ai/PrismaModelAnalyzer.d.ts +36 -0
  13. package/ai/PrismaModelAnalyzer.d.ts.map +1 -0
  14. package/ai/PrismaModelAnalyzer.js +110 -0
  15. package/ai/PrismaModelAnalyzer.js.map +1 -0
  16. package/ai/PrismaTypeSchemaGenerator.d.ts +38 -0
  17. package/ai/PrismaTypeSchemaGenerator.d.ts.map +1 -0
  18. package/ai/PrismaTypeSchemaGenerator.js +71 -0
  19. package/ai/PrismaTypeSchemaGenerator.js.map +1 -0
  20. package/ai/createAISeeder.d.ts +11 -0
  21. package/ai/createAISeeder.d.ts.map +1 -0
  22. package/ai/createAISeeder.js +72 -0
  23. package/ai/createAISeeder.js.map +1 -0
  24. package/ai/index.d.ts +6 -0
  25. package/ai/index.d.ts.map +1 -0
  26. package/ai/index.js +5 -0
  27. package/ai/index.js.map +1 -0
  28. package/assets/AssetManager.d.ts +213 -0
  29. package/assets/AssetManager.d.ts.map +1 -0
  30. package/assets/AssetManager.js +460 -0
  31. package/assets/AssetManager.js.map +1 -0
  32. package/assets/IImageTransformOptions.d.ts +42 -0
  33. package/assets/IImageTransformOptions.d.ts.map +1 -0
  34. package/assets/IImageTransformOptions.js +22 -0
  35. package/assets/IImageTransformOptions.js.map +1 -0
  36. package/assets/adapters/BlobAdapterFactory.d.ts +21 -0
  37. package/assets/adapters/BlobAdapterFactory.d.ts.map +1 -0
  38. package/assets/adapters/BlobAdapterFactory.js +3 -0
  39. package/assets/adapters/BlobAdapterFactory.js.map +1 -0
  40. package/assets/adapters/CloudflareR2BlobAdapter.d.ts +97 -0
  41. package/assets/adapters/CloudflareR2BlobAdapter.d.ts.map +1 -0
  42. package/assets/adapters/CloudflareR2BlobAdapter.js +265 -0
  43. package/assets/adapters/CloudflareR2BlobAdapter.js.map +1 -0
  44. package/assets/adapters/EmptyBlobAdapter.d.ts +42 -0
  45. package/assets/adapters/EmptyBlobAdapter.d.ts.map +1 -0
  46. package/assets/adapters/EmptyBlobAdapter.js +65 -0
  47. package/assets/adapters/EmptyBlobAdapter.js.map +1 -0
  48. package/assets/adapters/LocalFileAdapter.d.ts +34 -0
  49. package/assets/adapters/LocalFileAdapter.d.ts.map +1 -0
  50. package/assets/adapters/LocalFileAdapter.js +74 -0
  51. package/assets/adapters/LocalFileAdapter.js.map +1 -0
  52. package/assets/adapters/VercelBlobAdapter.d.ts +73 -0
  53. package/assets/adapters/VercelBlobAdapter.d.ts.map +1 -0
  54. package/assets/adapters/VercelBlobAdapter.js +168 -0
  55. package/assets/adapters/VercelBlobAdapter.js.map +1 -0
  56. package/assets/adapters/abstracts/BlobAdapterBase.d.ts +62 -0
  57. package/assets/adapters/abstracts/BlobAdapterBase.d.ts.map +1 -0
  58. package/assets/adapters/abstracts/BlobAdapterBase.js +58 -0
  59. package/assets/adapters/abstracts/BlobAdapterBase.js.map +1 -0
  60. package/assets/adapters/abstracts/HttpBlobAdapterBase.d.ts +43 -0
  61. package/assets/adapters/abstracts/HttpBlobAdapterBase.d.ts.map +1 -0
  62. package/assets/adapters/abstracts/HttpBlobAdapterBase.js +88 -0
  63. package/assets/adapters/abstracts/HttpBlobAdapterBase.js.map +1 -0
  64. package/assets/adapters/createBlobAdapter.d.ts +47 -0
  65. package/assets/adapters/createBlobAdapter.d.ts.map +1 -0
  66. package/assets/adapters/createBlobAdapter.js +63 -0
  67. package/assets/adapters/createBlobAdapter.js.map +1 -0
  68. package/assets/adapters/index.d.ts +11 -0
  69. package/assets/adapters/index.d.ts.map +1 -0
  70. package/assets/adapters/index.js +7 -0
  71. package/assets/adapters/index.js.map +1 -0
  72. package/assets/adapters/interfaces/IBlobAdapter.d.ts +41 -0
  73. package/assets/adapters/interfaces/IBlobAdapter.d.ts.map +1 -0
  74. package/assets/adapters/interfaces/IBlobAdapter.js +3 -0
  75. package/assets/adapters/interfaces/IBlobAdapter.js.map +1 -0
  76. package/assets/adapters/interfaces/IBlobAdapterConfig.d.ts +16 -0
  77. package/assets/adapters/interfaces/IBlobAdapterConfig.d.ts.map +1 -0
  78. package/assets/adapters/interfaces/IBlobAdapterConfig.js +2 -0
  79. package/assets/adapters/interfaces/IBlobAdapterConfig.js.map +1 -0
  80. package/assets/adapters/interfaces/IBlobUploadResult.d.ts +24 -0
  81. package/assets/adapters/interfaces/IBlobUploadResult.d.ts.map +1 -0
  82. package/assets/adapters/interfaces/IBlobUploadResult.js +2 -0
  83. package/assets/adapters/interfaces/IBlobUploadResult.js.map +1 -0
  84. package/base/BaseSeeder.d.ts +21 -0
  85. package/base/BaseSeeder.d.ts.map +1 -0
  86. package/base/BaseSeeder.js +45 -0
  87. package/base/BaseSeeder.js.map +1 -0
  88. package/base/functionalSeeder.d.ts +31 -0
  89. package/base/functionalSeeder.d.ts.map +1 -0
  90. package/base/functionalSeeder.js +33 -0
  91. package/base/functionalSeeder.js.map +1 -0
  92. package/cli/Cli.d.ts +2 -0
  93. package/cli/Cli.d.ts.map +1 -0
  94. package/cli/Cli.js +32 -0
  95. package/cli/Cli.js.map +1 -0
  96. package/cli/CliArgs.d.ts +2 -0
  97. package/cli/CliArgs.d.ts.map +1 -0
  98. package/cli/CliArgs.js +133 -0
  99. package/cli/CliArgs.js.map +1 -0
  100. package/cli/CliArgsConfig.d.ts +2 -0
  101. package/cli/CliArgsConfig.d.ts.map +1 -0
  102. package/cli/CliArgsConfig.js +15 -0
  103. package/cli/CliArgsConfig.js.map +1 -0
  104. package/cli/CliRun.d.ts +2 -0
  105. package/cli/CliRun.d.ts.map +1 -0
  106. package/cli/CliRun.js +34 -0
  107. package/cli/CliRun.js.map +1 -0
  108. package/cli/commands/SeedCommand.d.ts +2 -0
  109. package/cli/commands/SeedCommand.d.ts.map +1 -0
  110. package/cli/commands/SeedCommand.js +73 -0
  111. package/cli/commands/SeedCommand.js.map +1 -0
  112. package/cli/commands/SeedCommandArgsConfig.d.ts +2 -0
  113. package/cli/commands/SeedCommandArgsConfig.d.ts.map +1 -0
  114. package/cli/commands/SeedCommandArgsConfig.js +31 -0
  115. package/cli/commands/SeedCommandArgsConfig.js.map +1 -0
  116. package/cli/seed.d.ts +2 -0
  117. package/cli/seed.d.ts.map +1 -0
  118. package/cli/seed.js +42 -0
  119. package/cli/seed.js.map +1 -0
  120. package/config/IAssetConfig.d.ts +36 -0
  121. package/config/IAssetConfig.d.ts.map +1 -0
  122. package/config/IAssetConfig.js +3 -0
  123. package/config/IAssetConfig.js.map +1 -0
  124. package/config/IComposedSeedConfig.d.ts +32 -0
  125. package/config/IComposedSeedConfig.d.ts.map +1 -0
  126. package/config/IComposedSeedConfig.js +3 -0
  127. package/config/IComposedSeedConfig.js.map +1 -0
  128. package/config/ISeedConfig.d.ts +75 -0
  129. package/config/ISeedConfig.d.ts.map +1 -0
  130. package/config/ISeedConfig.js +3 -0
  131. package/config/ISeedConfig.js.map +1 -0
  132. package/config/ISeedContext.d.ts +92 -0
  133. package/config/ISeedContext.d.ts.map +1 -0
  134. package/config/ISeedContext.js +3 -0
  135. package/config/ISeedContext.js.map +1 -0
  136. package/config/ISeedDefinition.d.ts +38 -0
  137. package/config/ISeedDefinition.d.ts.map +1 -0
  138. package/config/ISeedDefinition.js +3 -0
  139. package/config/ISeedDefinition.js.map +1 -0
  140. package/config/ISeedFactory.d.ts +15 -0
  141. package/config/ISeedFactory.d.ts.map +1 -0
  142. package/config/ISeedFactory.js +3 -0
  143. package/config/ISeedFactory.js.map +1 -0
  144. package/config/ISeedOptions.d.ts +44 -0
  145. package/config/ISeedOptions.d.ts.map +1 -0
  146. package/config/ISeedOptions.js +2 -0
  147. package/config/ISeedOptions.js.map +1 -0
  148. package/config/ISeedResult.d.ts +44 -0
  149. package/config/ISeedResult.d.ts.map +1 -0
  150. package/config/ISeedResult.js +2 -0
  151. package/config/ISeedResult.js.map +1 -0
  152. package/config/ISeeder.d.ts +37 -0
  153. package/config/ISeeder.d.ts.map +1 -0
  154. package/config/ISeeder.js +3 -0
  155. package/config/ISeeder.js.map +1 -0
  156. package/config/createAdapter.d.ts +13 -0
  157. package/config/createAdapter.d.ts.map +1 -0
  158. package/config/createAdapter.js +16 -0
  159. package/config/createAdapter.js.map +1 -0
  160. package/config/createSeed.d.ts +6 -0
  161. package/config/createSeed.d.ts.map +1 -0
  162. package/config/createSeed.js +16 -0
  163. package/config/createSeed.js.map +1 -0
  164. package/config/defineConfig.d.ts +27 -0
  165. package/config/defineConfig.d.ts.map +1 -0
  166. package/config/defineConfig.js +35 -0
  167. package/config/defineConfig.js.map +1 -0
  168. package/discovery/SeedConfigDiscovery.d.ts +16 -0
  169. package/discovery/SeedConfigDiscovery.d.ts.map +1 -0
  170. package/discovery/SeedConfigDiscovery.js +137 -0
  171. package/discovery/SeedConfigDiscovery.js.map +1 -0
  172. package/index.d.ts +32 -0
  173. package/index.d.ts.map +1 -0
  174. package/index.js +32 -0
  175. package/index.js.map +1 -0
  176. package/json/JsonReferenceResolver.d.ts +23 -0
  177. package/json/JsonReferenceResolver.d.ts.map +1 -0
  178. package/json/JsonReferenceResolver.js +99 -0
  179. package/json/JsonReferenceResolver.js.map +1 -0
  180. package/json/JsonSchemaValidator.d.ts +23 -0
  181. package/json/JsonSchemaValidator.d.ts.map +1 -0
  182. package/json/JsonSchemaValidator.js +98 -0
  183. package/json/JsonSchemaValidator.js.map +1 -0
  184. package/json/JsonSeedLoader.d.ts +33 -0
  185. package/json/JsonSeedLoader.d.ts.map +1 -0
  186. package/json/JsonSeedLoader.js +176 -0
  187. package/json/JsonSeedLoader.js.map +1 -0
  188. package/json/JsonSeedTypes.d.ts +204 -0
  189. package/json/JsonSeedTypes.d.ts.map +1 -0
  190. package/json/JsonSeedTypes.js +3 -0
  191. package/json/JsonSeedTypes.js.map +1 -0
  192. package/json/createJsonSeeder.d.ts +13 -0
  193. package/json/createJsonSeeder.d.ts.map +1 -0
  194. package/json/createJsonSeeder.js +240 -0
  195. package/json/createJsonSeeder.js.map +1 -0
  196. package/json/index.d.ts +6 -0
  197. package/json/index.d.ts.map +1 -0
  198. package/json/index.js +7 -0
  199. package/json/index.js.map +1 -0
  200. package/logging/ISeedLogger.d.ts +55 -0
  201. package/logging/ISeedLogger.d.ts.map +1 -0
  202. package/logging/ISeedLogger.js +3 -0
  203. package/logging/ISeedLogger.js.map +1 -0
  204. package/logging/LogLevel.d.ts +30 -0
  205. package/logging/LogLevel.d.ts.map +1 -0
  206. package/logging/LogLevel.js +37 -0
  207. package/logging/LogLevel.js.map +1 -0
  208. package/logging/SeedLogger.d.ts +24 -0
  209. package/logging/SeedLogger.d.ts.map +1 -0
  210. package/logging/SeedLogger.js +94 -0
  211. package/logging/SeedLogger.js.map +1 -0
  212. package/orchestration/SeedOrchestrator.d.ts +30 -0
  213. package/orchestration/SeedOrchestrator.d.ts.map +1 -0
  214. package/orchestration/SeedOrchestrator.js +262 -0
  215. package/orchestration/SeedOrchestrator.js.map +1 -0
  216. package/package.json +27 -0
  217. package/resolvers/EntityResolver.d.ts +43 -0
  218. package/resolvers/EntityResolver.d.ts.map +1 -0
  219. package/resolvers/EntityResolver.js +95 -0
  220. package/resolvers/EntityResolver.js.map +1 -0
  221. package/utils/AssetReferenceResolver.d.ts +49 -0
  222. package/utils/AssetReferenceResolver.d.ts.map +1 -0
  223. package/utils/AssetReferenceResolver.js +62 -0
  224. package/utils/AssetReferenceResolver.js.map +1 -0
  225. package/utils/EntityLookupCache.d.ts +47 -0
  226. package/utils/EntityLookupCache.d.ts.map +1 -0
  227. package/utils/EntityLookupCache.js +64 -0
  228. package/utils/EntityLookupCache.js.map +1 -0
  229. package/utils/ISeedRandom.d.ts +70 -0
  230. package/utils/ISeedRandom.d.ts.map +1 -0
  231. package/utils/ISeedRandom.js +3 -0
  232. package/utils/ISeedRandom.js.map +1 -0
  233. package/utils/LocalizationToolkit.d.ts +125 -0
  234. package/utils/LocalizationToolkit.d.ts.map +1 -0
  235. package/utils/LocalizationToolkit.js +131 -0
  236. package/utils/LocalizationToolkit.js.map +1 -0
  237. package/utils/SeededRandom.d.ts +15 -0
  238. package/utils/SeededRandom.d.ts.map +1 -0
  239. package/utils/SeededRandom.js +56 -0
  240. package/utils/SeededRandom.js.map +1 -0
  241. package/utils/StringArrayToolkit.d.ts +25 -0
  242. package/utils/StringArrayToolkit.d.ts.map +1 -0
  243. package/utils/StringArrayToolkit.js +56 -0
  244. package/utils/StringArrayToolkit.js.map +1 -0
  245. package/utils/StringValueGuard.d.ts +24 -0
  246. package/utils/StringValueGuard.d.ts.map +1 -0
  247. package/utils/StringValueGuard.js +46 -0
  248. package/utils/StringValueGuard.js.map +1 -0
  249. package/utils/WarningCollector.d.ts +40 -0
  250. package/utils/WarningCollector.d.ts.map +1 -0
  251. package/utils/WarningCollector.js +83 -0
  252. package/utils/WarningCollector.js.map +1 -0
@@ -0,0 +1,262 @@
1
+ // #region Imports
2
+ import { createAdapter } from '../config/createAdapter.js';
3
+ import { SeedConfigDiscovery } from '../discovery/SeedConfigDiscovery.js';
4
+ import { SeedLogger } from '../logging/SeedLogger.js';
5
+ import { SeededRandom } from '../utils/SeededRandom.js';
6
+ export class SeedOrchestrator {
7
+ // #region Fields
8
+ _discovery;
9
+ _logger;
10
+ // #endregion
11
+ // #region Ctor
12
+ constructor() {
13
+ this._discovery = new SeedConfigDiscovery();
14
+ // Logger will be created with proper logLevel in execute method
15
+ this._logger = new SeedLogger();
16
+ }
17
+ // #endregion
18
+ // #region Methods
19
+ /**
20
+ * @description Discovers seed configs and merges runtime options.
21
+ * Config file `options` are the defaults, NX executor overrides take priority.
22
+ * This follows the Vite pattern: config file is primary, executor options override.
23
+ */
24
+ async executeWithOverrides(rootPath, overrides) {
25
+ const composedConfig = await this._discovery.discover({
26
+ rootPath,
27
+ searchPaths: ['libs/**', 'apps/**'],
28
+ });
29
+ const configOptions = composedConfig.rootConfig.options ?? {};
30
+ const merged = {
31
+ drop: overrides.drop ?? configOptions.drop,
32
+ count: overrides.count ?? configOptions.count,
33
+ force: overrides.force ?? configOptions.force,
34
+ dryRun: overrides.dryRun ?? configOptions.dryRun,
35
+ seed: overrides.seed ?? configOptions.seed,
36
+ environment: overrides.environment ?? configOptions.environment,
37
+ };
38
+ return this._executeWithComposedConfig(composedConfig, merged);
39
+ }
40
+ /**
41
+ * @description Runs seeding with explicit options (no config file merging).
42
+ */
43
+ async execute(rootPath, options) {
44
+ const composedConfig = await this._discovery.discover({
45
+ rootPath,
46
+ searchPaths: ['libs/**', 'apps/**'],
47
+ });
48
+ return this._executeWithComposedConfig(composedConfig, options);
49
+ }
50
+ async _executeWithComposedConfig(composedConfig, options) {
51
+ const startTime = Date.now();
52
+ try {
53
+ // Create logger with logLevel from composed config
54
+ const logLevel = composedConfig.resolved.logLevel;
55
+ this._logger = new SeedLogger(logLevel);
56
+ this._logger.info('🌱 Starting seed orchestration...');
57
+ this._logger.info(`Found ${composedConfig.featureConfigs.length} feature configs`);
58
+ this._logger.info(`Execution order: ${composedConfig.resolved.executionOrder.join(' → ')}`);
59
+ // Initialize shared context
60
+ const context = await this.createContext(composedConfig, options);
61
+ // Execute seeds in order
62
+ const seedResults = [];
63
+ let totalItemsCreated = 0;
64
+ for (const seedDef of composedConfig.resolved.seeds) {
65
+ if (seedDef.enabled === false) {
66
+ continue;
67
+ }
68
+ // Clear warnings for each new seed
69
+ context.warnings?.clear();
70
+ this._logger.startGroup(`Executing: ${seedDef.name}`);
71
+ try {
72
+ const seeder = seedDef.factory.create();
73
+ const seedContext = {
74
+ ...context,
75
+ seedConfigPath: seedDef.configPath ?? context.seedConfigPath
76
+ };
77
+ const result = await seeder.seed(seedContext);
78
+ seedResults.push({
79
+ name: seedDef.name,
80
+ result
81
+ });
82
+ totalItemsCreated += result.itemsCreated;
83
+ if (result.success) {
84
+ this._logger.success(`${result.itemsCreated} items in ${result.duration}ms`);
85
+ }
86
+ else {
87
+ this._logger.error(`Failed with ${result.errors.length} errors`);
88
+ for (const error of result.errors) {
89
+ this._logger.error(error);
90
+ }
91
+ }
92
+ for (const warning of result.warnings) {
93
+ this._logger.warn(warning);
94
+ }
95
+ }
96
+ catch (error) {
97
+ const errorMsg = `Seed threw exception: ${error}` + (error instanceof Error && error.stack ? `\n${error.stack}` : '');
98
+ this._logger.error(errorMsg);
99
+ seedResults.push({
100
+ name: seedDef.name,
101
+ result: {
102
+ success: false,
103
+ itemsCreated: 0,
104
+ duration: 0,
105
+ errors: [errorMsg],
106
+ warnings: []
107
+ }
108
+ });
109
+ }
110
+ finally {
111
+ this._logger.endGroup();
112
+ }
113
+ }
114
+ const totalDuration = Date.now() - startTime;
115
+ const allSuccessful = seedResults.every((sr) => sr.result.success);
116
+ const allErrors = seedResults.flatMap((sr) => sr.result.errors);
117
+ if (allSuccessful) {
118
+ this._logger.info('🎉 Seeding completed successfully!');
119
+ this._logger.info(`📈 Total items created: ${totalItemsCreated}`);
120
+ this._logger.info(`⏱️ Total duration: ${totalDuration}ms`);
121
+ }
122
+ else {
123
+ this._logger.error('💥 Seeding completed with errors!');
124
+ }
125
+ return {
126
+ success: allSuccessful,
127
+ totalItemsCreated: totalItemsCreated,
128
+ totalDuration: totalDuration,
129
+ seedResults: seedResults,
130
+ errors: allErrors
131
+ };
132
+ }
133
+ catch (error) {
134
+ const errorMsg = `Fatal error during seeding: ${error}`;
135
+ this._logger.error(errorMsg);
136
+ return {
137
+ success: false,
138
+ totalItemsCreated: 0,
139
+ totalDuration: Date.now() - startTime,
140
+ seedResults: [],
141
+ errors: [errorMsg]
142
+ };
143
+ }
144
+ }
145
+ async createContext(composedConfig, options) {
146
+ // Import PrismaClient dynamically to avoid compile-time dependency
147
+ const { PrismaClient } = await import('@prisma/client');
148
+ const prisma = new PrismaClient();
149
+ // Handle drop option
150
+ if (options.drop) {
151
+ this._logger.info('🗑️ Dropping existing data...');
152
+ // Note: Individual seeders should handle their own cleanup
153
+ }
154
+ // Import AssetManager for asset handling
155
+ const { AssetManager } = await import('../assets/AssetManager.js');
156
+ // Check if any seed configuration has asset configuration
157
+ const firstAssetConfig = composedConfig.featureConfigs.find((config) => config.assets)?.assets;
158
+ // Create a default blob adapter (will be overridden per feature if needed)
159
+ const defaultBlobAdapter = createAdapter('empty');
160
+ // Create AssetManager with default adapter (will be reconfigured per feature)
161
+ const assetManager = new AssetManager(this._logger, {
162
+ assetsDir: firstAssetConfig?.assetsDir || '.seed/assets',
163
+ uploadToBlob: firstAssetConfig?.uploadToBlob ?? !options.dryRun,
164
+ blobAdapter: defaultBlobAdapter,
165
+ imageTransforms: firstAssetConfig?.imageTransforms
166
+ });
167
+ // Import EntityResolver, LocalizationToolkit, and WarningCollector for factory methods
168
+ const { EntityResolver } = await import('../resolvers/EntityResolver.js');
169
+ const { LocalizationToolkit } = await import('../utils/LocalizationToolkit.js');
170
+ const { WarningCollector } = await import('../utils/WarningCollector.js');
171
+ // Create warning collector
172
+ const warningCollector = new WarningCollector(this._logger);
173
+ // Create complete context with factory methods
174
+ const context = {
175
+ prisma,
176
+ options,
177
+ logger: this._logger,
178
+ random: new SeededRandom(options.seed),
179
+ assets: assetManager,
180
+ seedConfigPath: undefined,
181
+ warnings: warningCollector,
182
+ // Factory method for creating cached entity resolvers
183
+ entity(modelName, uniqueField) {
184
+ return new EntityResolver(modelName, uniqueField, ['id'], // Default: only select 'id' field
185
+ context);
186
+ },
187
+ // Alias for batch resolution (same implementation)
188
+ manyEntity(modelName, uniqueField) {
189
+ return new EntityResolver(modelName, uniqueField, ['id'], context);
190
+ },
191
+ // Localization helpers namespace (direct passthrough to LocalizationToolkit)
192
+ localize: {
193
+ resolvePrimary: LocalizationToolkit.resolvePrimary.bind(LocalizationToolkit),
194
+ mapValues: LocalizationToolkit.mapValues.bind(LocalizationToolkit),
195
+ createGroup: LocalizationToolkit.createGroup.bind(LocalizationToolkit),
196
+ updateGroup: LocalizationToolkit.updateGroup.bind(LocalizationToolkit),
197
+ createOrUpdateGroup: LocalizationToolkit.createOrUpdateGroup.bind(LocalizationToolkit)
198
+ }
199
+ };
200
+ // Process assets for each feature that has them
201
+ const featuresWithAssets = composedConfig.featureConfigs.filter((config) => config.assets?.files && config.configPath);
202
+ if (featuresWithAssets.length > 0) {
203
+ this._logger.info('🖼️ Processing configured assets...');
204
+ for (const featureConfig of featuresWithAssets) {
205
+ if (!featureConfig.assets || !featureConfig.configPath || !featureConfig.assets.files) {
206
+ continue;
207
+ }
208
+ const assetConfig = featureConfig.assets;
209
+ // Create blob adapter for this specific feature
210
+ let blobAdapter = createAdapter('empty');
211
+ if (assetConfig.blobAdapter) {
212
+ const adapterType = assetConfig.blobAdapter.type;
213
+ if (adapterType === 'empty') {
214
+ blobAdapter = createAdapter('empty');
215
+ }
216
+ else if (adapterType === 'local' && assetConfig.blobAdapter.config) {
217
+ blobAdapter = createAdapter('local', {
218
+ keyPrefix: assetConfig.blobAdapter.config.keyPrefix,
219
+ baseDirectory: assetConfig.blobAdapter.config.baseDirectory || './uploads',
220
+ baseUrl: assetConfig.blobAdapter.config.baseUrl || 'http://localhost:3000/uploads'
221
+ });
222
+ }
223
+ else if (adapterType === 'vercel' && assetConfig.blobAdapter.config) {
224
+ const token = assetConfig.blobAdapter.config.token;
225
+ if (token) {
226
+ blobAdapter = createAdapter('vercel', {
227
+ token: token,
228
+ keyPrefix: assetConfig.blobAdapter.config.keyPrefix,
229
+ baseUrl: assetConfig.blobAdapter.config.baseUrl
230
+ });
231
+ }
232
+ else {
233
+ this._logger.warn(`Vercel blob adapter configured for ${featureConfig.name} but missing token - using empty adapter`);
234
+ }
235
+ }
236
+ else if (adapterType === 'cloudflare-r2' && assetConfig.blobAdapter.config) {
237
+ const { accessKeyId, secretAccessKey, bucketName, accountId } = assetConfig.blobAdapter.config;
238
+ if (accessKeyId && secretAccessKey && bucketName && accountId) {
239
+ blobAdapter = createAdapter('cloudflare-r2', {
240
+ accessKeyId: accessKeyId,
241
+ secretAccessKey: secretAccessKey,
242
+ bucketName: bucketName,
243
+ accountId: accountId,
244
+ keyPrefix: assetConfig.blobAdapter.config.keyPrefix,
245
+ baseUrl: assetConfig.blobAdapter.config.publicBaseUrl
246
+ });
247
+ }
248
+ else {
249
+ this._logger.warn(`Cloudflare R2 blob adapter configured for ${featureConfig.name} but missing required credentials - using empty adapter`);
250
+ }
251
+ }
252
+ }
253
+ // Reconfigure AssetManager with feature-specific adapter
254
+ assetManager.reconfigureBlobAdapter(blobAdapter);
255
+ // Process assets for this feature
256
+ await assetManager.processAssets(featureConfig.configPath, assetConfig.files);
257
+ }
258
+ }
259
+ return context;
260
+ }
261
+ }
262
+ //# sourceMappingURL=SeedOrchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeedOrchestrator.js","sourceRoot":"","sources":["../../src/orchestration/SeedOrchestrator.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@breadstone-infrastructure/prisma-seeds",
3
+ "description": "Prisma seeds",
4
+ "version": "0.0.231",
5
+ "license": "MIT",
6
+ "author": "andre.wehlert <awehlert@breadstone.de> (https://www.breadstone.de)",
7
+ "repository": {
8
+ "url": "git+ssh://git@github.com/RueDeRennes/mosaik.git"
9
+ },
10
+ "type": "module",
11
+ "main": "./index.js",
12
+ "types": "./index.d.ts",
13
+ "bin": "./bin/prisma-seeds.js",
14
+ "dependencies": {
15
+ "@ai-sdk/openai": "3.0.45",
16
+ "@breadstone-infrastructure/utilities": "0.0.231",
17
+ "@nx/vite": "22.5.4",
18
+ "@prisma/client": "6.19.2",
19
+ "ai": "6.0.127",
20
+ "axios": "1.13.6",
21
+ "glob": "13.0.6",
22
+ "sharp": "0.34.5",
23
+ "tslib": "2.8.1",
24
+ "vitest": "4.1.0",
25
+ "zod": "4.3.6"
26
+ }
27
+ }
@@ -0,0 +1,43 @@
1
+ import type { ISeedContext } from '../config/ISeedContext.js';
2
+ /**
3
+ * Generic entity resolver with built-in caching.
4
+ * Resolves entity IDs or full entities from unique keys with automatic cache management.
5
+ *
6
+ * @template TKey - Type of the lookup key (usually string)
7
+ * @template TResult - Type of the resolved result (ID or full entity)
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * // In seed mapper:
12
+ * const categoryId = await ctx.entity('exerciseCategory', 'key').resolve(data.categoryKey);
13
+ * const muscleIds = await ctx.manyEntity('muscleGroup', 'name').resolve(data.muscles);
14
+ * ```
15
+ */
16
+ export declare class EntityResolver<TKey = string, TResult = string> {
17
+ private readonly _cache;
18
+ private readonly _modelName;
19
+ private readonly _uniqueField;
20
+ private readonly _selectFields;
21
+ private readonly _context;
22
+ constructor(modelName: string, uniqueField: string, selectFields: string[], context: ISeedContext);
23
+ /**
24
+ * Resolve a single entity by key (cached).
25
+ *
26
+ * @param key - Unique key to look up
27
+ * @returns Resolved entity data or throws if not found
28
+ */
29
+ resolve(key: TKey): Promise<TResult>;
30
+ /**
31
+ * Resolve multiple entities by keys (batched, cached).
32
+ *
33
+ * @param keys - Array of unique keys
34
+ * @returns Array of resolved entity data in same order
35
+ */
36
+ resolveMany(keys: TKey[]): Promise<TResult[]>;
37
+ /**
38
+ * Clear the internal cache (useful for testing or re-seeding scenarios).
39
+ */
40
+ clearCache(): void;
41
+ private _performLookup;
42
+ }
43
+ //# sourceMappingURL=EntityResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/EntityResolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D;;;;;;;;;;;;;GAaG;AACH,qBAAa,cAAc,CAAC,IAAI,GAAG,MAAM,EAAE,OAAO,GAAG,MAAM;IAIvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAW;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;gBAOpC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE,YAAY;IAYzB;;;;;OAKG;IACU,OAAO,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBjD;;;;;OAKG;IACU,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAQ1D;;OAEG;IACI,UAAU,IAAI,IAAI;YAIX,cAAc;CAqC/B"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Generic entity resolver with built-in caching.
3
+ * Resolves entity IDs or full entities from unique keys with automatic cache management.
4
+ *
5
+ * @template TKey - Type of the lookup key (usually string)
6
+ * @template TResult - Type of the resolved result (ID or full entity)
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * // In seed mapper:
11
+ * const categoryId = await ctx.entity('exerciseCategory', 'key').resolve(data.categoryKey);
12
+ * const muscleIds = await ctx.manyEntity('muscleGroup', 'name').resolve(data.muscles);
13
+ * ```
14
+ */
15
+ export class EntityResolver {
16
+ // #region Fields
17
+ _cache = new Map();
18
+ _modelName;
19
+ _uniqueField;
20
+ _selectFields;
21
+ _context;
22
+ // #endregion
23
+ // #region Ctor
24
+ constructor(modelName, uniqueField, selectFields, context) {
25
+ this._modelName = modelName;
26
+ this._uniqueField = uniqueField;
27
+ this._selectFields = selectFields;
28
+ this._context = context;
29
+ }
30
+ // #endregion
31
+ // #region Methods
32
+ /**
33
+ * Resolve a single entity by key (cached).
34
+ *
35
+ * @param key - Unique key to look up
36
+ * @returns Resolved entity data or throws if not found
37
+ */
38
+ async resolve(key) {
39
+ if (!key) {
40
+ throw new Error(`Cannot resolve ${this._modelName}: key is null or undefined`);
41
+ }
42
+ // Return cached promise if available
43
+ const cached = this._cache.get(key);
44
+ if (cached) {
45
+ return cached;
46
+ }
47
+ // Create new lookup promise and cache it immediately (prevents duplicate queries)
48
+ const promise = this._performLookup(key);
49
+ this._cache.set(key, promise);
50
+ return promise;
51
+ }
52
+ /**
53
+ * Resolve multiple entities by keys (batched, cached).
54
+ *
55
+ * @param keys - Array of unique keys
56
+ * @returns Array of resolved entity data in same order
57
+ */
58
+ async resolveMany(keys) {
59
+ if (!Array.isArray(keys) || keys.length === 0) {
60
+ throw new Error(`Cannot resolve ${this._modelName}: keys must be a non-empty array`);
61
+ }
62
+ return Promise.all(keys.map((key) => this.resolve(key)));
63
+ }
64
+ /**
65
+ * Clear the internal cache (useful for testing or re-seeding scenarios).
66
+ */
67
+ clearCache() {
68
+ this._cache.clear();
69
+ }
70
+ async _performLookup(key) {
71
+ // Build select projection dynamically
72
+ const select = this._selectFields.reduce((acc, field) => {
73
+ acc[field] = true;
74
+ return acc;
75
+ }, {});
76
+ // Access Prisma model dynamically via bracket notation
77
+ const model = this._context.prisma[this._modelName];
78
+ if (!model || typeof model.findFirst !== 'function') {
79
+ throw new Error(`Invalid Prisma model: ${this._modelName}`);
80
+ }
81
+ const result = await model.findFirst({
82
+ where: { [this._uniqueField]: key },
83
+ select
84
+ });
85
+ if (!result) {
86
+ throw new Error(`${this._modelName} not found with ${this._uniqueField}="${String(key)}"`);
87
+ }
88
+ // If only one field selected and it's 'id', return scalar; otherwise return full object
89
+ if (this._selectFields.length === 1 && this._selectFields[0] === 'id') {
90
+ return result.id;
91
+ }
92
+ return result;
93
+ }
94
+ }
95
+ //# sourceMappingURL=EntityResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityResolver.js","sourceRoot":"","sources":["../../src/resolvers/EntityResolver.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,cAAc;IAEvB,iBAAiB;IAEA,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC3C,UAAU,CAAS;IACnB,YAAY,CAAS;IACrB,aAAa,CAAW;IACxB,QAAQ,CAAe;IAExC,aAAa;IAEb,eAAe;IAEf,YACI,SAAiB,EACjB,WAAmB,EACnB,YAAsB,EACtB,OAAqB;QAErB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED,aAAa;IAEb,kBAAkB;IAElB;;;;;OAKG;IACI,KAAK,CAAC,OAAO,CAAC,GAAS;QAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,UAAU,4BAA4B,CAAC,CAAC;QACnF,CAAC;QAED,qCAAqC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,MAAM,EAAE,CAAC;YACT,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,kFAAkF;QAClF,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAE9B,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,WAAW,CAAC,IAAY;QACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,UAAU,kCAAkC,CAAC,CAAC;QACzF,CAAC;QAED,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACI,UAAU;QACb,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,GAAS;QAClC,sCAAsC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CACpC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACX,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;YAClB,OAAO,GAAG,CAAC;QACf,CAAC,EACD,EAA6B,CAChC,CAAC;QAEF,uDAAuD;QACvD,MAAM,KAAK,GAAI,IAAI,CAAC,QAAQ,CAAC,MAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC;YACjC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE;YACnC,MAAM;SACT,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CACX,GAAG,IAAI,CAAC,UAAU,mBAAmB,IAAI,CAAC,YAAY,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,CAC5E,CAAC;QACN,CAAC;QAED,wFAAwF;QACxF,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACpE,OAAO,MAAM,CAAC,EAAa,CAAC;QAChC,CAAC;QAED,OAAO,MAAiB,CAAC;IAC7B,CAAC;CAIJ"}
@@ -0,0 +1,49 @@
1
+ import type { ISeedContext } from '../config/ISeedContext.js';
2
+ /**
3
+ * Options controlling how asset references are resolved within JSON seeds.
4
+ *
5
+ * @public
6
+ */
7
+ export interface IAssetReferenceOptions {
8
+ /**
9
+ * Prefix used to detect asset references.
10
+ *
11
+ * @defaultValue "@asset:"
12
+ */
13
+ readonly prefix?: string;
14
+ /**
15
+ * Whether to trim surrounding whitespace from asset references prior to evaluation.
16
+ *
17
+ * @defaultValue true
18
+ */
19
+ readonly trim?: boolean;
20
+ }
21
+ /**
22
+ * Resolves asset references inside JSON seed payloads.
23
+ *
24
+ * @public
25
+ */
26
+ export declare class AssetReferenceResolver {
27
+ /**
28
+ * Default prefix that indicates an asset reference.
29
+ */
30
+ static readonly DEFAULT_PREFIX: string;
31
+ private constructor();
32
+ /**
33
+ * Resolves a potential asset reference to a concrete asset URL.
34
+ *
35
+ * @param value The JSON value that may contain an asset reference
36
+ * @param context Seeder execution context
37
+ * @param options Optional resolution configuration
38
+ * @returns The resolved asset URL or the normalized value when no prefix is present
39
+ */
40
+ static resolve(value: unknown, context: ISeedContext, options?: IAssetReferenceOptions): string | null;
41
+ /**
42
+ * Creates a reusable resolver function with the provided options.
43
+ *
44
+ * @param options Optional resolution options
45
+ * @returns A resolver function suitable for mapper usage
46
+ */
47
+ static createResolver(options?: IAssetReferenceOptions): (value: unknown, context: ISeedContext) => string | null;
48
+ }
49
+ //# sourceMappingURL=AssetReferenceResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetReferenceResolver.d.ts","sourceRoot":"","sources":["../../src/utils/AssetReferenceResolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAI9D;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IAInC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CAI3B;AAED;;;;GAIG;AACH,qBAAa,sBAAsB;IAI/B;;OAEG;IACH,gBAAuB,cAAc,EAAE,MAAM,CAAa;IAM1D,OAAO;IAQP;;;;;;;OAOG;WACW,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI;IA4B7G;;;;;OAKG;WACW,cAAc,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,KAAK,MAAM,GAAG,IAAI;CAQ3H"}
@@ -0,0 +1,62 @@
1
+ // #region Imports
2
+ /**
3
+ * Resolves asset references inside JSON seed payloads.
4
+ *
5
+ * @public
6
+ */
7
+ export class AssetReferenceResolver {
8
+ // #region Fields
9
+ /**
10
+ * Default prefix that indicates an asset reference.
11
+ */
12
+ static DEFAULT_PREFIX = '@asset:';
13
+ // #endregion
14
+ // #region Ctor
15
+ constructor() {
16
+ // Utility class
17
+ }
18
+ // #endregion
19
+ // #region Methods
20
+ /**
21
+ * Resolves a potential asset reference to a concrete asset URL.
22
+ *
23
+ * @param value The JSON value that may contain an asset reference
24
+ * @param context Seeder execution context
25
+ * @param options Optional resolution configuration
26
+ * @returns The resolved asset URL or the normalized value when no prefix is present
27
+ */
28
+ static resolve(value, context, options) {
29
+ if (typeof value !== 'string') {
30
+ return value === undefined || value === null ? null : String(value);
31
+ }
32
+ const prefix = options?.prefix ?? AssetReferenceResolver.DEFAULT_PREFIX;
33
+ const shouldTrim = options?.trim ?? true;
34
+ const normalizedValue = shouldTrim ? value.trim() : value;
35
+ if (!normalizedValue.startsWith(prefix)) {
36
+ return normalizedValue;
37
+ }
38
+ const assetKey = normalizedValue.slice(prefix.length);
39
+ if (assetKey.length === 0) {
40
+ context.logger.warn('Encountered empty asset reference.');
41
+ return null;
42
+ }
43
+ const assetUrl = context.assets.getAsset(assetKey);
44
+ if (!assetUrl) {
45
+ context.logger.warn(`Asset not found for key: ${assetKey}`);
46
+ return null;
47
+ }
48
+ return assetUrl;
49
+ }
50
+ /**
51
+ * Creates a reusable resolver function with the provided options.
52
+ *
53
+ * @param options Optional resolution options
54
+ * @returns A resolver function suitable for mapper usage
55
+ */
56
+ static createResolver(options) {
57
+ return (value, context) => {
58
+ return AssetReferenceResolver.resolve(value, context, options);
59
+ };
60
+ }
61
+ }
62
+ //# sourceMappingURL=AssetReferenceResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetReferenceResolver.js","sourceRoot":"","sources":["../../src/utils/AssetReferenceResolver.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAiClB;;;;GAIG;AACH,MAAM,OAAO,sBAAsB;IAE/B,iBAAiB;IAEjB;;OAEG;IACI,MAAM,CAAU,cAAc,GAAW,SAAS,CAAC;IAE1D,aAAa;IAEb,eAAe;IAEf;QACI,gBAAgB;IACpB,CAAC;IAED,aAAa;IAEb,kBAAkB;IAElB;;;;;;;OAOG;IACI,MAAM,CAAC,OAAO,CAAC,KAAc,EAAE,OAAqB,EAAE,OAAgC;QACzF,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,MAAM,GAAW,OAAO,EAAE,MAAM,IAAI,sBAAsB,CAAC,cAAc,CAAC;QAChF,MAAM,UAAU,GAAY,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC;QAClD,MAAM,eAAe,GAAW,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAElE,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,OAAO,eAAe,CAAC;QAC3B,CAAC;QAED,MAAM,QAAQ,GAAW,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YAC1D,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,QAAQ,GAAuB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACvE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,cAAc,CAAC,OAAgC;QACzD,OAAO,CAAC,KAAc,EAAE,OAAqB,EAAiB,EAAE;YAC5D,OAAO,sBAAsB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACnE,CAAC,CAAC;IACN,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { ISeedContext } from '../config/ISeedContext.js';
2
+ /**
3
+ * Describes a resolver capable of translating string keys to entity identifiers.
4
+ *
5
+ * @public
6
+ */
7
+ export interface IEntityLookupResolver<TResult> {
8
+ /**
9
+ * Resolves the entity identifier for the provided key.
10
+ *
11
+ * @param key Key identifying the entity
12
+ * @param context Seeder execution context
13
+ */
14
+ resolve(key: string, context: ISeedContext): Promise<TResult>;
15
+ }
16
+ /**
17
+ * Provides a caching layer for expensive lookup operations in JSON seed mappers.
18
+ *
19
+ * @public
20
+ */
21
+ export declare class EntityLookupCache<TResult> {
22
+ private readonly cache;
23
+ private readonly resolver;
24
+ constructor(resolver: IEntityLookupResolver<TResult>);
25
+ /**
26
+ * Resolves a value for the provided key, using the cache when available.
27
+ *
28
+ * @param key Lookup key
29
+ * @param context Seeder execution context
30
+ * @returns Resolved value
31
+ */
32
+ resolve(key: string, context: ISeedContext): Promise<TResult>;
33
+ /**
34
+ * Resolves multiple keys sequentially, preserving order.
35
+ *
36
+ * @param keys Lookup keys
37
+ * @param context Seeder execution context
38
+ * @returns Resolved values
39
+ */
40
+ resolveMany(keys: readonly string[], context: ISeedContext): Promise<readonly TResult[]>;
41
+ /**
42
+ * Clears the internal cache.
43
+ */
44
+ clear(): void;
45
+ private static normalizeKey;
46
+ }
47
+ //# sourceMappingURL=EntityLookupCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityLookupCache.d.ts","sourceRoot":"","sources":["../../src/utils/EntityLookupCache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAI9D;;;;GAIG;AACH,MAAM,WAAW,qBAAqB,CAAC,OAAO;IAI1C;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAIjE;AAED;;;;GAIG;AACH,qBAAa,iBAAiB,CAAC,OAAO;IAIlC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;gBAMvC,QAAQ,EAAE,qBAAqB,CAAC,OAAO,CAAC;IAS3D;;;;;;OAMG;IACU,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAY1E;;;;;;OAMG;IACU,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC;IASrG;;OAEG;IACI,KAAK,IAAI,IAAI;IAIpB,OAAO,CAAC,MAAM,CAAC,YAAY;CAW9B"}