@ackplus/nest-seeder 1.1.17 → 2.1.0
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 +90 -0
- package/MIGRATION.md +89 -0
- package/QUICKSTART.md +45 -149
- package/README.md +87 -521
- package/dist/cli.js +617 -235
- package/dist/cli.js.map +1 -1
- package/dist/index.d.mts +88 -0
- package/dist/index.d.ts +88 -8
- package/dist/index.js +417 -24
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +390 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +46 -25
- package/dist/cli.d.ts +0 -3
- package/dist/lib/decorators/factory.decorator.d.ts +0 -6
- package/dist/lib/decorators/factory.decorator.js +0 -17
- package/dist/lib/decorators/factory.decorator.js.map +0 -1
- package/dist/lib/factory/data.factory.d.ts +0 -6
- package/dist/lib/factory/data.factory.js +0 -57
- package/dist/lib/factory/data.factory.js.map +0 -1
- package/dist/lib/index.d.ts +0 -4
- package/dist/lib/index.js +0 -21
- package/dist/lib/index.js.map +0 -1
- package/dist/lib/interfaces/factory.interface.d.ts +0 -4
- package/dist/lib/interfaces/factory.interface.js +0 -3
- package/dist/lib/interfaces/factory.interface.js.map +0 -1
- package/dist/lib/interfaces/index.d.ts +0 -2
- package/dist/lib/interfaces/index.js +0 -19
- package/dist/lib/interfaces/index.js.map +0 -1
- package/dist/lib/interfaces/property-metadata.interface.d.ts +0 -6
- package/dist/lib/interfaces/property-metadata.interface.js +0 -3
- package/dist/lib/interfaces/property-metadata.interface.js.map +0 -1
- package/dist/lib/interfaces/seeder-module-async-options.interface.d.ts +0 -10
- package/dist/lib/interfaces/seeder-module-async-options.interface.js +0 -3
- package/dist/lib/interfaces/seeder-module-async-options.interface.js.map +0 -1
- package/dist/lib/interfaces/seeder-options-factory.interface.d.ts +0 -4
- package/dist/lib/interfaces/seeder-options-factory.interface.js +0 -3
- package/dist/lib/interfaces/seeder-options-factory.interface.js.map +0 -1
- package/dist/lib/seeder/seeder.d.ts +0 -10
- package/dist/lib/seeder/seeder.interface.d.ts +0 -9
- package/dist/lib/seeder/seeder.interface.js +0 -3
- package/dist/lib/seeder/seeder.interface.js.map +0 -1
- package/dist/lib/seeder/seeder.js +0 -40
- package/dist/lib/seeder/seeder.js.map +0 -1
- package/dist/lib/seeder/seeder.module.d.ts +0 -17
- package/dist/lib/seeder/seeder.module.js +0 -80
- package/dist/lib/seeder/seeder.module.js.map +0 -1
- package/dist/lib/seeder/seeder.service.d.ts +0 -10
- package/dist/lib/seeder/seeder.service.js +0 -73
- package/dist/lib/seeder/seeder.service.js.map +0 -1
- package/dist/lib/storages/factory.metadata.storage.d.ts +0 -16
- package/dist/lib/storages/factory.metadata.storage.js +0 -17
- package/dist/lib/storages/factory.metadata.storage.js.map +0 -1
- package/dist/tsconfig.build.tsbuildinfo +0 -1
- package/examples/post.seeder.example.ts +0 -65
- package/examples/product.factory.example.ts +0 -84
- package/examples/seed.script.example.ts +0 -32
- package/examples/seeder.config.example.ts +0 -50
- package/examples/user.factory.example.ts +0 -59
- package/examples/user.seeder.example.ts +0 -55
package/dist/index.js
CHANGED
|
@@ -1,25 +1,418 @@
|
|
|
1
|
-
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
19
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
20
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
21
|
+
if (decorator = decorators[i])
|
|
22
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
23
|
+
if (kind && result) __defProp(target, key, result);
|
|
24
|
+
return result;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// src/index.ts
|
|
28
|
+
var src_exports = {};
|
|
29
|
+
__export(src_exports, {
|
|
30
|
+
DataFactory: () => DataFactory,
|
|
31
|
+
Factory: () => Factory,
|
|
32
|
+
SeederModule: () => SeederModule,
|
|
33
|
+
SeederName: () => SeederName,
|
|
34
|
+
SeederService: () => SeederService,
|
|
35
|
+
defineSeederConfig: () => defineSeederConfig,
|
|
36
|
+
getSeederName: () => getSeederName,
|
|
37
|
+
seeder: () => seeder
|
|
38
|
+
});
|
|
39
|
+
module.exports = __toCommonJS(src_exports);
|
|
40
|
+
|
|
41
|
+
// src/lib/seeder/seeder.ts
|
|
42
|
+
var import_core = require("@nestjs/core");
|
|
43
|
+
|
|
44
|
+
// src/lib/seeder/seeder.module.ts
|
|
45
|
+
var import_common2 = require("@nestjs/common");
|
|
46
|
+
|
|
47
|
+
// src/lib/seeder/seeder.service.ts
|
|
48
|
+
var import_common = require("@nestjs/common");
|
|
49
|
+
|
|
50
|
+
// src/lib/decorators/seeder.decorator.ts
|
|
51
|
+
var SEEDER_NAME = /* @__PURE__ */ Symbol.for("nest-seeder:name");
|
|
52
|
+
function SeederName(name) {
|
|
53
|
+
return (target) => {
|
|
54
|
+
Object.defineProperty(target, SEEDER_NAME, {
|
|
55
|
+
value: name,
|
|
56
|
+
enumerable: false,
|
|
57
|
+
configurable: true,
|
|
58
|
+
writable: false
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function getSeederName(seeder2) {
|
|
63
|
+
const ctor = typeof seeder2 === "function" ? seeder2 : seeder2?.constructor;
|
|
64
|
+
return ctor?.[SEEDER_NAME] || ctor?.seederName || ctor?.name || "UnknownSeeder";
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// src/lib/seeder/seeder.service.ts
|
|
68
|
+
var SeederService = class {
|
|
69
|
+
constructor(seeders = [], options = {}) {
|
|
70
|
+
this.seeders = seeders;
|
|
71
|
+
this.options = options;
|
|
72
|
+
}
|
|
73
|
+
seeders;
|
|
74
|
+
options;
|
|
75
|
+
logger = new import_common.Logger("Seeder");
|
|
76
|
+
/**
|
|
77
|
+
* Runs the configured seeders. In `refresh` mode every selected seeder is
|
|
78
|
+
* dropped first (in reverse order to respect foreign-key dependencies),
|
|
79
|
+
* then all are seeded.
|
|
80
|
+
*/
|
|
81
|
+
async run() {
|
|
82
|
+
const seeders = this.getSeedersToRun();
|
|
83
|
+
if (seeders.length === 0) {
|
|
84
|
+
this.logger.warn("No seeders to run.");
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (this.options.dryRun) {
|
|
88
|
+
this.logger.log("Dry run \u2014 the following seeders would execute:");
|
|
89
|
+
seeders.forEach((seeder2, index) => {
|
|
90
|
+
this.logger.log(` ${index + 1}. ${getSeederName(seeder2)}`);
|
|
91
|
+
});
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (this.options.refresh) {
|
|
95
|
+
await this.drop(seeders);
|
|
96
|
+
}
|
|
97
|
+
await this.seed(seeders);
|
|
98
|
+
}
|
|
99
|
+
/** Seeds the given seeders (defaults to the configured selection). */
|
|
100
|
+
async seed(seeders = this.getSeedersToRun()) {
|
|
101
|
+
for (const seeder2 of seeders) {
|
|
102
|
+
const name = getSeederName(seeder2);
|
|
103
|
+
try {
|
|
104
|
+
this.logger.log(`Seeding: ${name}`);
|
|
105
|
+
await seeder2.seed(this.options);
|
|
106
|
+
this.logger.log(`Completed: ${name}`);
|
|
107
|
+
} catch (error) {
|
|
108
|
+
this.handleError(name, "seed", error);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** Drops the given seeders in reverse order (defaults to the selection). */
|
|
113
|
+
async drop(seeders = this.getSeedersToRun()) {
|
|
114
|
+
for (const seeder2 of [...seeders].reverse()) {
|
|
115
|
+
const name = getSeederName(seeder2);
|
|
116
|
+
if (typeof seeder2.drop !== "function") {
|
|
117
|
+
this.logger.debug(`Skipping drop for ${name} (no drop() defined)`);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
this.logger.log(`Dropping: ${name}`);
|
|
122
|
+
await seeder2.drop(this.options);
|
|
123
|
+
this.logger.log(`Dropped: ${name}`);
|
|
124
|
+
} catch (error) {
|
|
125
|
+
this.handleError(name, "drop", error);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** Resolves the seeders to run based on the `name` option. */
|
|
130
|
+
getSeedersToRun() {
|
|
131
|
+
const names = this.normalizeNames(this.options.name);
|
|
132
|
+
if (!names) {
|
|
133
|
+
if (this.seeders.length === 0) {
|
|
134
|
+
this.logger.warn(
|
|
135
|
+
'No seeders registered. Did you add them to the "seeders" array in your config?'
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
return this.seeders;
|
|
139
|
+
}
|
|
140
|
+
const wanted = new Set(names.map((name) => name.toLowerCase()));
|
|
141
|
+
const matched = this.seeders.filter((seeder2) => {
|
|
142
|
+
const name = getSeederName(seeder2).toLowerCase();
|
|
143
|
+
return wanted.has(name) || wanted.has(name.replace(/seeder$/, ""));
|
|
144
|
+
});
|
|
145
|
+
if (matched.length === 0) {
|
|
146
|
+
const available = this.seeders.map((seeder2) => getSeederName(seeder2));
|
|
147
|
+
this.logger.warn(
|
|
148
|
+
`No seeders matched [${names.join(", ")}]. Available seeders: ${available.length ? available.join(", ") : "(none)"}`
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
return matched;
|
|
152
|
+
}
|
|
153
|
+
handleError(name, phase, error) {
|
|
154
|
+
const message = error?.message ?? error;
|
|
155
|
+
if (this.options.continueOnError) {
|
|
156
|
+
this.logger.error(`Seeder "${name}" failed during ${phase}: ${message}`);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
throw error;
|
|
160
|
+
}
|
|
161
|
+
normalizeNames(name) {
|
|
162
|
+
if (!name) {
|
|
163
|
+
return void 0;
|
|
164
|
+
}
|
|
165
|
+
const list = (Array.isArray(name) ? name : [name]).filter(Boolean);
|
|
166
|
+
return list.length ? list : void 0;
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
SeederService = __decorateClass([
|
|
170
|
+
(0, import_common.Injectable)()
|
|
171
|
+
], SeederService);
|
|
172
|
+
|
|
173
|
+
// src/lib/seeder/seeder.module.ts
|
|
174
|
+
var SEEDER_MODULE_OPTIONS = "SEEDER_MODULE_OPTIONS";
|
|
175
|
+
var SeederModule = class {
|
|
176
|
+
static register(options) {
|
|
177
|
+
return {
|
|
178
|
+
module: SeederModule,
|
|
179
|
+
imports: options.imports || [],
|
|
180
|
+
providers: [
|
|
181
|
+
...options.providers || [],
|
|
182
|
+
...options.seeders || [],
|
|
183
|
+
{
|
|
184
|
+
provide: SeederService,
|
|
185
|
+
useFactory: (...seeders) => {
|
|
186
|
+
return new SeederService(seeders, options);
|
|
187
|
+
},
|
|
188
|
+
inject: options.seeders || []
|
|
189
|
+
}
|
|
190
|
+
]
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
static forRootAsync(options) {
|
|
194
|
+
return {
|
|
195
|
+
module: SeederModule,
|
|
196
|
+
global: options.isGlobal,
|
|
197
|
+
imports: options.imports || [],
|
|
198
|
+
providers: [
|
|
199
|
+
...this.createAsyncProviders(options),
|
|
200
|
+
{
|
|
201
|
+
provide: SeederService,
|
|
202
|
+
useFactory: (seederOptions, ...seeders) => {
|
|
203
|
+
return new SeederService(seeders, seederOptions);
|
|
204
|
+
},
|
|
205
|
+
inject: [SEEDER_MODULE_OPTIONS, ...options.inject || []]
|
|
206
|
+
}
|
|
207
|
+
]
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
static createAsyncProviders(options) {
|
|
211
|
+
if (options.useExisting || options.useFactory) {
|
|
212
|
+
return [this.createAsyncOptionsProvider(options)];
|
|
213
|
+
}
|
|
214
|
+
return [
|
|
215
|
+
this.createAsyncOptionsProvider(options),
|
|
216
|
+
{
|
|
217
|
+
provide: options.useClass,
|
|
218
|
+
useClass: options.useClass
|
|
219
|
+
}
|
|
220
|
+
];
|
|
221
|
+
}
|
|
222
|
+
static createAsyncOptionsProvider(options) {
|
|
223
|
+
if (options.useFactory) {
|
|
224
|
+
return {
|
|
225
|
+
provide: SEEDER_MODULE_OPTIONS,
|
|
226
|
+
useFactory: options.useFactory,
|
|
227
|
+
inject: options.inject || []
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
provide: SEEDER_MODULE_OPTIONS,
|
|
232
|
+
useFactory: async (optionsFactory) => await optionsFactory.createSeederOptions(),
|
|
233
|
+
inject: [options.useExisting || options.useClass]
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
SeederModule = __decorateClass([
|
|
238
|
+
(0, import_common2.Module)({})
|
|
239
|
+
], SeederModule);
|
|
240
|
+
|
|
241
|
+
// src/lib/seeder/seeder.ts
|
|
242
|
+
async function bootstrap(options) {
|
|
243
|
+
const app = await import_core.NestFactory.createApplicationContext(
|
|
244
|
+
SeederModule.register(options),
|
|
245
|
+
{ logger: ["error", "warn", "log"] }
|
|
246
|
+
);
|
|
247
|
+
try {
|
|
248
|
+
const seedersService = app.get(SeederService);
|
|
249
|
+
await seedersService.run();
|
|
250
|
+
} finally {
|
|
251
|
+
await app.close();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
var seeder = (options) => {
|
|
255
|
+
return {
|
|
256
|
+
run(extraOptions = {}) {
|
|
257
|
+
return bootstrap({
|
|
258
|
+
...options,
|
|
259
|
+
...extraOptions
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
// src/lib/factory/data.factory.ts
|
|
266
|
+
var import_faker = require("@faker-js/faker");
|
|
267
|
+
|
|
268
|
+
// src/lib/storages/factory.metadata.storage.ts
|
|
269
|
+
var FactoryMetadataStorageHost = class {
|
|
270
|
+
properties = [];
|
|
271
|
+
addPropertyMetadata(metadata) {
|
|
272
|
+
this.properties.push(metadata);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Returns the factory property metadata for a target class.
|
|
276
|
+
*
|
|
277
|
+
* The whole prototype chain is walked so that a factory which `extends`
|
|
278
|
+
* another factory inherits the parent's `@Factory` properties. Properties
|
|
279
|
+
* are returned base-class-first, in declaration order. When a subclass
|
|
280
|
+
* re-declares a property, the subclass definition wins but keeps the
|
|
281
|
+
* original position.
|
|
282
|
+
*/
|
|
283
|
+
getPropertyMetadatasByTarget(target) {
|
|
284
|
+
const chain = this.getPrototypeChain(target);
|
|
285
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
286
|
+
for (const ctor of chain) {
|
|
287
|
+
for (const property of this.properties) {
|
|
288
|
+
if (property.target === ctor) {
|
|
289
|
+
byKey.set(property.propertyKey, property);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return Array.from(byKey.values());
|
|
294
|
+
}
|
|
295
|
+
/** Removes all stored metadata. Primarily useful in tests. */
|
|
296
|
+
clear() {
|
|
297
|
+
this.properties = [];
|
|
298
|
+
}
|
|
299
|
+
getPrototypeChain(target) {
|
|
300
|
+
const chain = [];
|
|
301
|
+
let current = target;
|
|
302
|
+
while (typeof current === "function" && current !== Function.prototype && current !== Object) {
|
|
303
|
+
chain.unshift(current);
|
|
304
|
+
current = Object.getPrototypeOf(current);
|
|
305
|
+
}
|
|
306
|
+
return chain;
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
var globalRef = global;
|
|
310
|
+
var FactoryMetadataStorage = globalRef.FactoryMetadataStorage || (globalRef.FactoryMetadataStorage = new FactoryMetadataStorageHost());
|
|
311
|
+
|
|
312
|
+
// src/lib/factory/data.factory.ts
|
|
313
|
+
var DataFactory = class _DataFactory {
|
|
314
|
+
/**
|
|
315
|
+
* Creates a factory for a class decorated with `@Factory` properties.
|
|
316
|
+
*
|
|
317
|
+
* @example
|
|
318
|
+
* const factory = DataFactory.createForClass(UserFactory);
|
|
319
|
+
* const users = factory.generate(10);
|
|
320
|
+
* const admin = factory.generateOne({ role: 'admin' });
|
|
321
|
+
*/
|
|
322
|
+
static createForClass(target) {
|
|
323
|
+
if (!target) {
|
|
324
|
+
throw new Error(
|
|
325
|
+
'A target class is required by "DataFactory.createForClass()" but received "undefined".'
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
const properties = FactoryMetadataStorage.getPropertyMetadatasByTarget(target);
|
|
329
|
+
return {
|
|
330
|
+
generate: (count, overrides = {}) => {
|
|
331
|
+
if (!Number.isInteger(count) || count < 0) {
|
|
332
|
+
throw new Error(
|
|
333
|
+
`"generate(count)" expects a non-negative integer but received "${count}".`
|
|
334
|
+
);
|
|
335
|
+
}
|
|
336
|
+
const records = [];
|
|
337
|
+
for (let i = 0; i < count; i++) {
|
|
338
|
+
records.push(_DataFactory.generateOne(properties, overrides));
|
|
339
|
+
}
|
|
340
|
+
return records;
|
|
341
|
+
},
|
|
342
|
+
generateOne: (overrides = {}) => _DataFactory.generateOne(properties, overrides)
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
static generateOne(properties, overrides) {
|
|
346
|
+
const overrideValues = overrides ?? {};
|
|
347
|
+
const ctx = { ...overrideValues };
|
|
348
|
+
const result = { ...overrideValues };
|
|
349
|
+
const propertyByKey = /* @__PURE__ */ new Map();
|
|
350
|
+
for (const property of properties) {
|
|
351
|
+
propertyByKey.set(property.propertyKey, property);
|
|
352
|
+
}
|
|
353
|
+
const resolving = /* @__PURE__ */ new Set();
|
|
354
|
+
const ensure = (key) => {
|
|
355
|
+
if (key in ctx) {
|
|
356
|
+
return ctx[key];
|
|
357
|
+
}
|
|
358
|
+
const property = propertyByKey.get(key);
|
|
359
|
+
if (!property) {
|
|
360
|
+
return void 0;
|
|
361
|
+
}
|
|
362
|
+
if (resolving.has(key)) {
|
|
363
|
+
return void 0;
|
|
364
|
+
}
|
|
365
|
+
resolving.add(key);
|
|
366
|
+
const { generator, dependsOn } = property.arg;
|
|
367
|
+
if (Array.isArray(dependsOn)) {
|
|
368
|
+
for (const dependency of dependsOn) {
|
|
369
|
+
ensure(dependency);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
ctx[key] = typeof generator === "function" ? generator(import_faker.faker, ctx) : generator;
|
|
373
|
+
resolving.delete(key);
|
|
374
|
+
return ctx[key];
|
|
375
|
+
};
|
|
376
|
+
for (const property of properties) {
|
|
377
|
+
const key = property.propertyKey;
|
|
378
|
+
if (key in overrideValues) {
|
|
379
|
+
ctx[key] = overrideValues[key];
|
|
380
|
+
result[key] = overrideValues[key];
|
|
381
|
+
continue;
|
|
382
|
+
}
|
|
383
|
+
result[key] = ensure(key);
|
|
384
|
+
}
|
|
385
|
+
return result;
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
// src/lib/decorators/factory.decorator.ts
|
|
390
|
+
function Factory(generator, dependsOn) {
|
|
391
|
+
return (target, propertyKey) => {
|
|
392
|
+
FactoryMetadataStorage.addPropertyMetadata({
|
|
393
|
+
target: target.constructor,
|
|
394
|
+
propertyKey,
|
|
395
|
+
arg: {
|
|
396
|
+
generator,
|
|
397
|
+
dependsOn
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// src/lib/config/define-config.ts
|
|
404
|
+
function defineSeederConfig(config) {
|
|
405
|
+
return config;
|
|
406
|
+
}
|
|
407
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
408
|
+
0 && (module.exports = {
|
|
409
|
+
DataFactory,
|
|
410
|
+
Factory,
|
|
411
|
+
SeederModule,
|
|
412
|
+
SeederName,
|
|
413
|
+
SeederService,
|
|
414
|
+
defineSeederConfig,
|
|
415
|
+
getSeederName,
|
|
416
|
+
seeder
|
|
417
|
+
});
|
|
25
418
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AAEpC,gEAA8C;AAE9C,6DAA2C;AAE3C,8DAA4C;AAE5C,6DAA2C;AAE3C,qEAAmD;AAEnD,oFAAkE;AAElE,yFAAuE"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/seeder/seeder.ts","../src/lib/seeder/seeder.module.ts","../src/lib/seeder/seeder.service.ts","../src/lib/decorators/seeder.decorator.ts","../src/lib/factory/data.factory.ts","../src/lib/storages/factory.metadata.storage.ts","../src/lib/decorators/factory.decorator.ts","../src/lib/config/define-config.ts"],"sourcesContent":["export * from './lib/seeder/seeder';\n\nexport * from './lib/seeder/seeder.interface';\n\nexport * from './lib/seeder/seeder.module';\n\nexport * from './lib/seeder/seeder.service';\n\nexport * from './lib/factory/data.factory';\n\nexport * from './lib/decorators/factory.decorator';\n\nexport * from './lib/decorators/seeder.decorator';\n\nexport * from './lib/config/define-config';\n\nexport * from './lib/interfaces/factory.interface';\n\nexport * from './lib/interfaces/seeder-options-factory.interface';\n\nexport * from './lib/interfaces/seeder-module-async-options.interface';\n","import {\n Provider,\n Type,\n DynamicModule,\n ForwardReference,\n} from '@nestjs/common';\nimport { NestFactory } from '@nestjs/core';\n\nimport {\n SeederModule,\n SeederModuleExtraOptions,\n SeederModuleOptions,\n} from './seeder.module';\nimport { SeederService } from './seeder.service';\n\n\nexport interface SeederOptions {\n imports?: Array<\n Type<any> | DynamicModule | Promise<DynamicModule> | ForwardReference\n >;\n providers?: Provider[];\n}\n\nexport interface SeederRunner {\n run(extraOptions?: SeederModuleExtraOptions): Promise<void>;\n}\n\nasync function bootstrap(options: SeederModuleOptions): Promise<void> {\n const app = await NestFactory.createApplicationContext(\n SeederModule.register(options),\n { logger: ['error', 'warn', 'log'] },\n );\n\n try {\n const seedersService = app.get(SeederService);\n await seedersService.run();\n } finally {\n await app.close();\n }\n}\n\n/**\n * Programmatic entry point. Prefer the `nest-seed` CLI for most workflows; use\n * this when you need to seed from your own script.\n *\n * @example\n * await seeder({ imports: [AppModule] }).run({ seeders: [UserSeeder], refresh: true });\n */\nexport const seeder = (options: SeederOptions): SeederRunner => {\n return {\n run(extraOptions: SeederModuleExtraOptions = {}): Promise<void> {\n return bootstrap({\n ...options,\n ...extraOptions,\n });\n },\n };\n};\n","import {\n Module,\n DynamicModule,\n Provider,\n Type,\n ForwardReference,\n} from '@nestjs/common';\n\nimport { Seeder, SeederServiceOptions } from './seeder.interface';\nimport { SeederService } from './seeder.service';\nimport { SeederModuleAsyncOptions } from '../interfaces/seeder-module-async-options.interface';\nimport { SeederOptionsFactory } from '../interfaces/seeder-options-factory.interface';\n\nexport interface SeederModuleExtraOptions extends SeederServiceOptions {\n seeders?: Provider<Seeder>[];\n plugins?: any[];\n}\n\nexport interface SeederModuleOptions extends SeederModuleExtraOptions {\n imports?: Array<\n Type<any> | DynamicModule | Promise<DynamicModule> | ForwardReference\n >;\n providers?: Provider[];\n}\n\nconst SEEDER_MODULE_OPTIONS = 'SEEDER_MODULE_OPTIONS';\n\n@Module({})\nexport class SeederModule {\n\n static register(options: SeederModuleOptions): DynamicModule {\n return {\n module: SeederModule,\n imports: options.imports || [],\n providers: [\n ...(options.providers || []),\n ...options.seeders || [],\n {\n provide: SeederService,\n useFactory: (...seeders: Seeder[]): SeederService => {\n return new SeederService(seeders, options);\n },\n inject: (options.seeders || []) as Type<any>[],\n },\n ],\n };\n }\n\n static forRootAsync(options: SeederModuleAsyncOptions): DynamicModule {\n return {\n module: SeederModule,\n global: options.isGlobal,\n imports: options.imports || [],\n providers: [\n ...this.createAsyncProviders(options),\n {\n provide: SeederService,\n useFactory: (seederOptions: SeederModuleOptions, ...seeders: Seeder[]): Promise<SeederService> | SeederService => {\n return new SeederService(seeders, seederOptions);\n },\n inject: [SEEDER_MODULE_OPTIONS, ...(options.inject || []) as Type<any>[]],\n },\n ],\n };\n }\n\n private static createAsyncProviders(options: SeederModuleAsyncOptions): Provider[] {\n if (options.useExisting || options.useFactory) {\n return [this.createAsyncOptionsProvider(options)];\n }\n\n return [\n this.createAsyncOptionsProvider(options),\n {\n provide: options.useClass!,\n useClass: options.useClass!,\n },\n ];\n }\n\n private static createAsyncOptionsProvider(options: SeederModuleAsyncOptions): Provider {\n if (options.useFactory) {\n return {\n provide: SEEDER_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject || [],\n };\n }\n\n return {\n provide: SEEDER_MODULE_OPTIONS,\n useFactory: async (optionsFactory: SeederOptionsFactory) =>\n await optionsFactory.createSeederOptions(),\n inject: [options.useExisting || options.useClass!],\n };\n }\n}\n","import { Injectable, Logger } from '@nestjs/common';\n\nimport { getSeederName } from '../decorators/seeder.decorator';\nimport type { Seeder, SeederServiceOptions } from './seeder.interface';\n\n\n@Injectable()\nexport class SeederService {\n\n private readonly logger = new Logger('Seeder');\n\n constructor(\n private readonly seeders: Seeder[] = [],\n private readonly options: SeederServiceOptions = {},\n ) {}\n\n /**\n * Runs the configured seeders. In `refresh` mode every selected seeder is\n * dropped first (in reverse order to respect foreign-key dependencies),\n * then all are seeded.\n */\n async run(): Promise<void> {\n const seeders = this.getSeedersToRun();\n\n if (seeders.length === 0) {\n this.logger.warn('No seeders to run.');\n return;\n }\n\n if (this.options.dryRun) {\n this.logger.log('Dry run — the following seeders would execute:');\n seeders.forEach((seeder, index) => {\n this.logger.log(` ${index + 1}. ${getSeederName(seeder)}`);\n });\n return;\n }\n\n if (this.options.refresh) {\n await this.drop(seeders);\n }\n\n await this.seed(seeders);\n }\n\n /** Seeds the given seeders (defaults to the configured selection). */\n async seed(seeders: Seeder[] = this.getSeedersToRun()): Promise<void> {\n for (const seeder of seeders) {\n const name = getSeederName(seeder);\n try {\n this.logger.log(`Seeding: ${name}`);\n await seeder.seed(this.options);\n this.logger.log(`Completed: ${name}`);\n } catch (error) {\n this.handleError(name, 'seed', error);\n }\n }\n }\n\n /** Drops the given seeders in reverse order (defaults to the selection). */\n async drop(seeders: Seeder[] = this.getSeedersToRun()): Promise<void> {\n for (const seeder of [...seeders].reverse()) {\n const name = getSeederName(seeder);\n if (typeof seeder.drop !== 'function') {\n this.logger.debug(`Skipping drop for ${name} (no drop() defined)`);\n continue;\n }\n try {\n this.logger.log(`Dropping: ${name}`);\n await seeder.drop(this.options);\n this.logger.log(`Dropped: ${name}`);\n } catch (error) {\n this.handleError(name, 'drop', error);\n }\n }\n }\n\n /** Resolves the seeders to run based on the `name` option. */\n getSeedersToRun(): Seeder[] {\n const names = this.normalizeNames(this.options.name);\n\n if (!names) {\n if (this.seeders.length === 0) {\n this.logger.warn(\n 'No seeders registered. Did you add them to the \"seeders\" array in your config?',\n );\n }\n return this.seeders;\n }\n\n const wanted = new Set(names.map((name) => name.toLowerCase()));\n const matched = this.seeders.filter((seeder) => {\n const name = getSeederName(seeder).toLowerCase();\n return wanted.has(name) || wanted.has(name.replace(/seeder$/, ''));\n });\n\n if (matched.length === 0) {\n const available = this.seeders.map((seeder) => getSeederName(seeder));\n this.logger.warn(\n `No seeders matched [${names.join(', ')}]. Available seeders: ${\n available.length ? available.join(', ') : '(none)'\n }`,\n );\n }\n\n return matched;\n }\n\n private handleError(name: string, phase: 'seed' | 'drop', error: any): void {\n const message = error?.message ?? error;\n if (this.options.continueOnError) {\n this.logger.error(`Seeder \"${name}\" failed during ${phase}: ${message}`);\n return;\n }\n throw error;\n }\n\n private normalizeNames(\n name?: string | string[],\n ): string[] | undefined {\n if (!name) {\n return undefined;\n }\n const list = (Array.isArray(name) ? name : [name]).filter(Boolean);\n return list.length ? list : undefined;\n }\n\n}\n","/**\n * Stable, minification-safe identifier for a seeder.\n *\n * By default the CLI selects seeders by their class name (`--name UserSeeder`).\n * That breaks when your build minifies class names. Decorate the seeder with\n * `@SeederName('users')` to give it a stable name that survives minification\n * and is nicer to type.\n *\n * @example\n * @Injectable()\n * @SeederName('users')\n * export class UserSeeder implements Seeder { ... }\n *\n * // then: nest-seed --name users\n */\nconst SEEDER_NAME = Symbol.for('nest-seeder:name');\n\nexport function SeederName(name: string): ClassDecorator {\n return (target: any): void => {\n Object.defineProperty(target, SEEDER_NAME, {\n value: name,\n enumerable: false,\n configurable: true,\n writable: false,\n });\n };\n}\n\n/**\n * Resolves the stable name of a seeder class or instance.\n *\n * Resolution order:\n * 1. `@SeederName('...')` decorator value\n * 2. a static `seederName` property\n * 3. the constructor name (default, not minification-safe)\n */\nexport function getSeederName(seeder: any): string {\n const ctor =\n typeof seeder === 'function' ? seeder : seeder?.constructor;\n\n return (\n ctor?.[SEEDER_NAME] ||\n ctor?.seederName ||\n ctor?.name ||\n 'UnknownSeeder'\n );\n}\n","import { faker } from '@faker-js/faker';\nimport { Type } from '@nestjs/common';\n\nimport { FactoryInstance, FactoryOverrides } from '../interfaces';\nimport {\n FactoryMetadataStorage,\n PropertyMetadataType,\n} from '../storages/factory.metadata.storage';\n\n\nexport class DataFactory {\n\n /**\n * Creates a factory for a class decorated with `@Factory` properties.\n *\n * @example\n * const factory = DataFactory.createForClass(UserFactory);\n * const users = factory.generate(10);\n * const admin = factory.generateOne({ role: 'admin' });\n */\n static createForClass<T = Record<string, any>>(\n target: Type<T>,\n ): FactoryInstance<T> {\n if (!target) {\n throw new Error(\n 'A target class is required by \"DataFactory.createForClass()\" but received \"undefined\".',\n );\n }\n\n const properties =\n FactoryMetadataStorage.getPropertyMetadatasByTarget(target as Type<unknown>);\n\n return {\n generate: (count: number, overrides: FactoryOverrides<T> = {}): T[] => {\n if (!Number.isInteger(count) || count < 0) {\n throw new Error(\n `\"generate(count)\" expects a non-negative integer but received \"${count}\".`,\n );\n }\n const records: T[] = [];\n for (let i = 0; i < count; i++) {\n records.push(DataFactory.generateOne<T>(properties, overrides));\n }\n return records;\n },\n generateOne: (overrides: FactoryOverrides<T> = {}): T =>\n DataFactory.generateOne<T>(properties, overrides),\n };\n }\n\n private static generateOne<T>(\n properties: PropertyMetadataType[],\n overrides: FactoryOverrides<T>,\n ): T {\n const overrideValues = (overrides ?? {}) as Record<string, any>;\n\n // The context seeds dependency resolution and starts from the\n // overrides so that generators can read passed-in values.\n const ctx: Record<string, any> = { ...overrideValues };\n\n // The result always includes overrides — even keys that are not\n // declared with `@Factory` (e.g. a foreign key set in a seeder).\n const result: Record<string, any> = { ...overrideValues };\n\n const propertyByKey = new Map<string, PropertyMetadataType>();\n for (const property of properties) {\n propertyByKey.set(property.propertyKey, property);\n }\n\n const resolving = new Set<string>();\n\n const ensure = (key: string): any => {\n if (key in ctx) {\n return ctx[key];\n }\n\n const property = propertyByKey.get(key);\n if (!property) {\n return undefined;\n }\n\n // Guard against circular `dependsOn` chains.\n if (resolving.has(key)) {\n return undefined;\n }\n resolving.add(key);\n\n const { generator, dependsOn } = property.arg;\n\n if (Array.isArray(dependsOn)) {\n for (const dependency of dependsOn) {\n ensure(dependency);\n }\n }\n\n ctx[key] =\n typeof generator === 'function' ? generator(faker, ctx) : generator;\n\n resolving.delete(key);\n return ctx[key];\n };\n\n for (const property of properties) {\n const key = property.propertyKey;\n\n // An explicit override always wins.\n if (key in overrideValues) {\n ctx[key] = overrideValues[key];\n result[key] = overrideValues[key];\n continue;\n }\n\n result[key] = ensure(key);\n }\n\n return result as T;\n }\n\n}\n","import { Type } from '@nestjs/common';\n\nimport {\n FactoryValue,\n FactoryValueGenerator,\n} from '../decorators/factory.decorator';\n\n\nexport type PropertyMetadataType = {\n target?: any;\n propertyKey?: any;\n arg: {\n generator: FactoryValueGenerator | FactoryValue;\n dependsOn?: string[];\n };\n};\n\nexport class FactoryMetadataStorageHost {\n\n private properties: PropertyMetadataType[] = [];\n\n addPropertyMetadata(metadata: PropertyMetadataType): void {\n this.properties.push(metadata);\n }\n\n /**\n * Returns the factory property metadata for a target class.\n *\n * The whole prototype chain is walked so that a factory which `extends`\n * another factory inherits the parent's `@Factory` properties. Properties\n * are returned base-class-first, in declaration order. When a subclass\n * re-declares a property, the subclass definition wins but keeps the\n * original position.\n */\n getPropertyMetadatasByTarget(\n target: Type<unknown>,\n ): PropertyMetadataType[] {\n const chain = this.getPrototypeChain(target);\n const byKey = new Map<string, PropertyMetadataType>();\n\n for (const ctor of chain) {\n for (const property of this.properties) {\n if (property.target === ctor) {\n byKey.set(property.propertyKey, property);\n }\n }\n }\n\n return Array.from(byKey.values());\n }\n\n /** Removes all stored metadata. Primarily useful in tests. */\n clear(): void {\n this.properties = [];\n }\n\n private getPrototypeChain(target: Type<unknown>): Array<Type<unknown>> {\n const chain: Array<Type<unknown>> = [];\n let current: any = target;\n\n while (\n typeof current === 'function' &&\n current !== Function.prototype &&\n current !== Object\n ) {\n chain.unshift(current); // base class first\n current = Object.getPrototypeOf(current);\n }\n\n return chain;\n }\n\n}\n\nconst globalRef = global as any;\n\nexport const FactoryMetadataStorage: FactoryMetadataStorageHost = globalRef.FactoryMetadataStorage ||\n (globalRef.FactoryMetadataStorage = new FactoryMetadataStorageHost());\n","import { Faker } from '@faker-js/faker';\n\nimport { FactoryMetadataStorage } from '../storages/factory.metadata.storage';\n\n\ntype BaseType = string | number | Date | Buffer | boolean | Record<string, any>;\n\nexport type FactoryValue = BaseType | Array<BaseType>;\n\n/**\n * A generator function invoked for each generated record.\n *\n * @param faker the shared Faker instance\n * @param ctx the partially-built record (override values + already-generated\n * fields), useful for derived values via `dependsOn`\n */\nexport type FactoryValueGenerator = (\n faker: Faker,\n ctx: Record<string, any>\n) => FactoryValue;\n\n/**\n * Marks a class property as a generated field.\n *\n * @param generator a generator function or a static value\n * @param dependsOn names of other factory properties that must be generated\n * before this one (resolved transitively)\n *\n * @example\n * class UserFactory {\n * @Factory((faker) => faker.person.firstName())\n * firstName: string;\n *\n * @Factory((faker, ctx) => `${ctx.firstName}@example.com`.toLowerCase(), ['firstName'])\n * email: string;\n * }\n */\nexport function Factory(\n generator: FactoryValueGenerator | FactoryValue,\n dependsOn?: string[],\n) {\n return (\n target: Record<string, any>,\n propertyKey: string | symbol,\n ): void => {\n FactoryMetadataStorage.addPropertyMetadata({\n target: target.constructor,\n propertyKey: propertyKey as string,\n arg: {\n generator,\n dependsOn,\n },\n });\n };\n}\n","import { SeederModuleOptions } from '../seeder/seeder.module';\n\n/**\n * The shape of a `seeder.config.ts` default export.\n */\nexport type SeederConfig = SeederModuleOptions;\n\n/**\n * Identity helper that gives you full type-checking and IntelliSense for your\n * seeder configuration. Using it is optional — a plain object works too — but\n * it catches typos and surfaces the available options as you type.\n *\n * @example\n * // seeder.config.ts\n * import { defineSeederConfig } from '@ackplus/nest-seeder';\n *\n * export default defineSeederConfig({\n * imports: [TypeOrmModule.forRoot({ ... }), TypeOrmModule.forFeature([User])],\n * seeders: [UserSeeder],\n * });\n */\nexport function defineSeederConfig(config: SeederConfig): SeederConfig {\n return config;\n}\n"],"mappings":"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","names":["import_common","seeder","seeder"]}
|