schema-seed-core 0.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/LICENSE +21 -0
- package/README.md +5 -0
- package/dist/index.cjs +953 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +443 -0
- package/dist/index.d.ts +443 -0
- package/dist/index.js +908 -0
- package/dist/index.js.map +1 -0
- package/dist/mongo/types.cjs +19 -0
- package/dist/mongo/types.cjs.map +1 -0
- package/dist/mongo/types.d.cts +31 -0
- package/dist/mongo/types.d.ts +31 -0
- package/dist/mongo/types.js +1 -0
- package/dist/mongo/types.js.map +1 -0
- package/package.json +57 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
import { MongoSeedConfig } from './mongo/types.js';
|
|
2
|
+
export { MongoCollectionConfig, MongoFieldConfig, MongoFieldConfigObject, MongoFieldType } from './mongo/types.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Normalized SQL types that map various database-specific types to a common set.
|
|
6
|
+
*/
|
|
7
|
+
declare enum NormalizedSqlType {
|
|
8
|
+
STRING = "string",
|
|
9
|
+
TEXT = "text",
|
|
10
|
+
INT = "int",
|
|
11
|
+
BIGINT = "bigint",
|
|
12
|
+
FLOAT = "float",
|
|
13
|
+
DECIMAL = "decimal",
|
|
14
|
+
BOOLEAN = "boolean",
|
|
15
|
+
DATE = "date",
|
|
16
|
+
DATETIME = "datetime",
|
|
17
|
+
JSON = "json",
|
|
18
|
+
UUID = "uuid",
|
|
19
|
+
ENUM = "enum",
|
|
20
|
+
BINARY = "binary",
|
|
21
|
+
OBJECTID = "objectid"
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Metadata for a single column in a table.
|
|
25
|
+
*/
|
|
26
|
+
interface ColumnSchema {
|
|
27
|
+
name: string;
|
|
28
|
+
type: NormalizedSqlType;
|
|
29
|
+
/** The raw database-specific type string */
|
|
30
|
+
rawType: string;
|
|
31
|
+
nullable: boolean;
|
|
32
|
+
defaultValue?: any;
|
|
33
|
+
/** For ENUM types, the list of allowed values */
|
|
34
|
+
enumValues?: string[];
|
|
35
|
+
/** Precision for decimal/float types */
|
|
36
|
+
precision?: number;
|
|
37
|
+
/** Scale for decimal types */
|
|
38
|
+
scale?: number;
|
|
39
|
+
/** Maximum length for string/binary types */
|
|
40
|
+
maxLength?: number;
|
|
41
|
+
/** Whether this column is auto-incrementing / identity */
|
|
42
|
+
isAutoIncrement: boolean;
|
|
43
|
+
/** Documentation or comments from the database */
|
|
44
|
+
comment?: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Primary key definition.
|
|
48
|
+
*/
|
|
49
|
+
interface PrimaryKeySchema {
|
|
50
|
+
name?: string;
|
|
51
|
+
columns: string[];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Foreign key relationship definition.
|
|
55
|
+
*/
|
|
56
|
+
interface ForeignKeySchema {
|
|
57
|
+
name?: string;
|
|
58
|
+
/** Columns in the current table */
|
|
59
|
+
columns: string[];
|
|
60
|
+
/** Referenced table name */
|
|
61
|
+
referencedTable: string;
|
|
62
|
+
/** Referenced columns in the target table */
|
|
63
|
+
referencedColumns: string[];
|
|
64
|
+
onUpdate?: 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION';
|
|
65
|
+
onDelete?: 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION';
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Unique constraint definition.
|
|
69
|
+
*/
|
|
70
|
+
interface UniqueConstraintSchema {
|
|
71
|
+
name?: string;
|
|
72
|
+
columns: string[];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Metadata for a single table.
|
|
76
|
+
*/
|
|
77
|
+
interface TableSchema {
|
|
78
|
+
name: string;
|
|
79
|
+
schema?: string;
|
|
80
|
+
columns: Record<string, ColumnSchema>;
|
|
81
|
+
primaryKey?: PrimaryKeySchema;
|
|
82
|
+
foreignKeys: ForeignKeySchema[];
|
|
83
|
+
uniqueConstraints: UniqueConstraintSchema[];
|
|
84
|
+
/** Estimated or actual row count */
|
|
85
|
+
rowCount?: number;
|
|
86
|
+
comment?: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* A complete representation of the database schema as a graph of tables.
|
|
90
|
+
*/
|
|
91
|
+
interface SchemaGraph {
|
|
92
|
+
tables: Record<string, TableSchema>;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Metadata for a single MongoDB collection.
|
|
96
|
+
*/
|
|
97
|
+
interface MongoCollectionSchema {
|
|
98
|
+
name: string;
|
|
99
|
+
fields: Record<string, ColumnSchema>;
|
|
100
|
+
/** Mapping of field names to referenced collections and fields, e.g. { "userId": "users._id" } */
|
|
101
|
+
references?: Record<string, string>;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* A complete representation of the MongoDB schema.
|
|
105
|
+
*/
|
|
106
|
+
interface MongoSchema {
|
|
107
|
+
collections: Record<string, MongoCollectionSchema>;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* A batch of data to be inserted into a table.
|
|
111
|
+
*/
|
|
112
|
+
interface SeedBatch {
|
|
113
|
+
tableName: string;
|
|
114
|
+
rows: Record<string, any>[];
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The execution plan for seeding the database.
|
|
118
|
+
*/
|
|
119
|
+
interface SeedPlan {
|
|
120
|
+
/** The order in which tables should be seeded to satisfy foreign key constraints */
|
|
121
|
+
insertOrder: string[];
|
|
122
|
+
/** Grouped batches for execution */
|
|
123
|
+
batches: SeedBatch[];
|
|
124
|
+
/** Mapping of virtual IDs to actual database IDs for resolving references */
|
|
125
|
+
referencesMap: Map<string, any>;
|
|
126
|
+
}
|
|
127
|
+
type OverrideFunction = (ctx: {
|
|
128
|
+
i: number;
|
|
129
|
+
random: any;
|
|
130
|
+
refs: any;
|
|
131
|
+
}) => any;
|
|
132
|
+
interface WeightedEnumOverride {
|
|
133
|
+
enum: any[];
|
|
134
|
+
weights?: number[];
|
|
135
|
+
}
|
|
136
|
+
interface DateBetweenOverride {
|
|
137
|
+
dateBetween: [string | Date, string | Date];
|
|
138
|
+
}
|
|
139
|
+
type ColumnOverride = OverrideFunction | WeightedEnumOverride | DateBetweenOverride | any;
|
|
140
|
+
type TableOverrides = Record<string, ColumnOverride>;
|
|
141
|
+
interface Hooks {
|
|
142
|
+
beforeInsert?: (table: string, rows: any[]) => any[] | Promise<any[]>;
|
|
143
|
+
afterInsert?: (table: string, result: {
|
|
144
|
+
insertedCount: number;
|
|
145
|
+
durationMs: number;
|
|
146
|
+
}) => void | Promise<void>;
|
|
147
|
+
}
|
|
148
|
+
interface Plugin {
|
|
149
|
+
name: string;
|
|
150
|
+
overrides?: Record<string, TableOverrides>;
|
|
151
|
+
generators?: Record<string, (ctx: any) => any>;
|
|
152
|
+
hooks?: Hooks;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Options for the seeding process.
|
|
156
|
+
*/
|
|
157
|
+
interface SeedOptions {
|
|
158
|
+
/** Number of rows to generate per table (can be a global number or per-table map) */
|
|
159
|
+
rows?: number | Record<string, number>;
|
|
160
|
+
/** Seed for the random number generator to ensure reproducibility */
|
|
161
|
+
seed?: number | string;
|
|
162
|
+
/** If true, only show what would happen without executing any writes */
|
|
163
|
+
dryRun?: boolean;
|
|
164
|
+
/** Number of rows to insert in a single batch */
|
|
165
|
+
batchSize?: number;
|
|
166
|
+
/** Safety flag to allow running against production environments */
|
|
167
|
+
allowProduction?: boolean;
|
|
168
|
+
/** If true, also seed parent tables required by foreign keys even if not explicitly requested */
|
|
169
|
+
withParents?: boolean;
|
|
170
|
+
/** If true, truncate tables before seeding */
|
|
171
|
+
truncate?: boolean;
|
|
172
|
+
/** Specific tables to include in the seeding process */
|
|
173
|
+
includeTables?: string[];
|
|
174
|
+
/** Specific tables to exclude from the seeding process */
|
|
175
|
+
excludeTables?: string[];
|
|
176
|
+
/** Custom overrides for specific tables and columns */
|
|
177
|
+
overrides?: Record<string, TableOverrides>;
|
|
178
|
+
/** Lifecycle hooks */
|
|
179
|
+
hooks?: Hooks;
|
|
180
|
+
/** List of plugins to load */
|
|
181
|
+
plugins?: (string | Plugin)[];
|
|
182
|
+
}
|
|
183
|
+
interface RunnerContext {
|
|
184
|
+
generators: Record<string, (ctx: any) => any>;
|
|
185
|
+
inferGenerator: (columnName: string, sqlType: any) => {
|
|
186
|
+
generatorId: string;
|
|
187
|
+
options?: any;
|
|
188
|
+
};
|
|
189
|
+
overrides?: Record<string, any>;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Detailed report of the seeding operation's effects.
|
|
193
|
+
*/
|
|
194
|
+
interface EffectReport {
|
|
195
|
+
success: boolean;
|
|
196
|
+
/** Total time taken in milliseconds */
|
|
197
|
+
durationMs: number;
|
|
198
|
+
/** Stats per table */
|
|
199
|
+
tables: Record<string, {
|
|
200
|
+
insertedCount: number;
|
|
201
|
+
error?: string;
|
|
202
|
+
durationMs: number;
|
|
203
|
+
}>;
|
|
204
|
+
/** Any global errors that occurred during the process */
|
|
205
|
+
errors: Error[];
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* A deterministic pseudo-random number generator (PRNG) using the Mulberry32 algorithm.
|
|
210
|
+
*/
|
|
211
|
+
declare class Random {
|
|
212
|
+
private state;
|
|
213
|
+
constructor(seed: number | string);
|
|
214
|
+
private hashString;
|
|
215
|
+
next(): number;
|
|
216
|
+
nextInt(min: number, max: number): number;
|
|
217
|
+
pick<T>(array: T[], weights?: number[]): T;
|
|
218
|
+
boolean(probability?: number): boolean;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Base interface for all database adapters.
|
|
223
|
+
*/
|
|
224
|
+
interface DbAdapter {
|
|
225
|
+
/** Establish connection to the database */
|
|
226
|
+
connect(): Promise<void>;
|
|
227
|
+
/** Close the database connection */
|
|
228
|
+
disconnect(): Promise<void>;
|
|
229
|
+
/** Start a new transaction */
|
|
230
|
+
begin(): Promise<void>;
|
|
231
|
+
/** Commit the current transaction */
|
|
232
|
+
commit(): Promise<void>;
|
|
233
|
+
/** Rollback the current transaction */
|
|
234
|
+
rollback(): Promise<void>;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Adapter interface for SQL-based databases (Postgres, MySQL, SQLite, etc.)
|
|
238
|
+
*/
|
|
239
|
+
interface SqlAdapter extends DbAdapter {
|
|
240
|
+
/**
|
|
241
|
+
* Introspect the database to build a SchemaGraph.
|
|
242
|
+
*/
|
|
243
|
+
introspectSchema(): Promise<SchemaGraph>;
|
|
244
|
+
/**
|
|
245
|
+
* Insert a batch of rows into a table.
|
|
246
|
+
* @param batch The batch of data to insert
|
|
247
|
+
*/
|
|
248
|
+
insertBatch(batch: SeedBatch): Promise<void>;
|
|
249
|
+
/**
|
|
250
|
+
* Truncate the specified tables.
|
|
251
|
+
* @param tableNames List of tables to truncate
|
|
252
|
+
*/
|
|
253
|
+
truncateTables(tableNames: string[]): Promise<void>;
|
|
254
|
+
/**
|
|
255
|
+
* Capabilities and flags for the specific SQL dialect.
|
|
256
|
+
*/
|
|
257
|
+
readonly capabilities: {
|
|
258
|
+
/** Supports native ENUM types */
|
|
259
|
+
enums: boolean;
|
|
260
|
+
/** Supports deferrable constraints (e.g., Postgres) */
|
|
261
|
+
deferrableConstraints: boolean;
|
|
262
|
+
/** Supports RETURNING clause for inserted IDs */
|
|
263
|
+
returning: boolean;
|
|
264
|
+
/** Requires explicit IDENTITY_INSERT ON for manual ID insertion (e.g., MSSQL) */
|
|
265
|
+
identityInsert: boolean;
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Adapter interface for MongoDB.
|
|
270
|
+
*/
|
|
271
|
+
interface MongoAdapter extends DbAdapter {
|
|
272
|
+
/**
|
|
273
|
+
* Introspect collections and their schemas if possible.
|
|
274
|
+
*/
|
|
275
|
+
introspectCollections?(): Promise<any>;
|
|
276
|
+
/**
|
|
277
|
+
* Insert many documents into a collection.
|
|
278
|
+
* @param collection Name of the collection
|
|
279
|
+
* @param documents Array of documents to insert
|
|
280
|
+
*/
|
|
281
|
+
insertMany(collection: string, documents: any[]): Promise<void>;
|
|
282
|
+
/**
|
|
283
|
+
* Get the JSON Schema validator for a collection if it exists.
|
|
284
|
+
* @param collection Name of the collection
|
|
285
|
+
*/
|
|
286
|
+
getValidatorSchema?(collection: string): Promise<any>;
|
|
287
|
+
/**
|
|
288
|
+
* Truncate (delete all documents from) the specified collections.
|
|
289
|
+
* @param collections List of collection names
|
|
290
|
+
*/
|
|
291
|
+
truncateCollections?(collections: string[]): Promise<void>;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Registry to track and enforce uniqueness for generated values.
|
|
296
|
+
*/
|
|
297
|
+
declare class UniquenessRegistry {
|
|
298
|
+
private registry;
|
|
299
|
+
/**
|
|
300
|
+
* Generates a unique key for a table and column.
|
|
301
|
+
*/
|
|
302
|
+
private getRegistryKey;
|
|
303
|
+
/**
|
|
304
|
+
* Attempts to generate a unique value using a generator function.
|
|
305
|
+
* If the generated value is already in the registry, it retries up to `maxRetries` times.
|
|
306
|
+
* If it still fails, it uses a deterministic fallback.
|
|
307
|
+
*
|
|
308
|
+
* @param table Table name
|
|
309
|
+
* @param column Column name
|
|
310
|
+
* @param generator Function that generates a value
|
|
311
|
+
* @param maxRetries Maximum number of retries before fallback
|
|
312
|
+
* @returns A unique value
|
|
313
|
+
*/
|
|
314
|
+
ensureUnique<T>(table: string, column: string, generator: () => T | Promise<T>, maxRetries?: number): Promise<T>;
|
|
315
|
+
/**
|
|
316
|
+
* Clears the registry for a specific table/column or all.
|
|
317
|
+
*/
|
|
318
|
+
clear(table?: string, column?: string): void;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Helper to redact sensitive information from reports and logs.
|
|
323
|
+
*/
|
|
324
|
+
declare class Redactor {
|
|
325
|
+
private static readonly SENSITIVE_PATTERNS;
|
|
326
|
+
/**
|
|
327
|
+
* Checks if a column name is considered sensitive.
|
|
328
|
+
*/
|
|
329
|
+
static isSensitive(columnName: string): boolean;
|
|
330
|
+
/**
|
|
331
|
+
* Redacts sensitive values in a row object.
|
|
332
|
+
* @param row The row data to redact
|
|
333
|
+
* @returns A new object with sensitive values replaced by a placeholder
|
|
334
|
+
*/
|
|
335
|
+
static redactRow(row: Record<string, any>): Record<string, any>;
|
|
336
|
+
/**
|
|
337
|
+
* Redacts sensitive values in a list of rows.
|
|
338
|
+
*/
|
|
339
|
+
static redactRows(rows: Record<string, any>[]): Record<string, any>[];
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
interface DependencyNode {
|
|
343
|
+
tableName: string;
|
|
344
|
+
dependencies: Set<string>;
|
|
345
|
+
dependents: Set<string>;
|
|
346
|
+
}
|
|
347
|
+
declare class DependencyGraph {
|
|
348
|
+
nodes: Map<string, DependencyNode>;
|
|
349
|
+
constructor(schema: SchemaGraph);
|
|
350
|
+
getNodes(): DependencyNode[];
|
|
351
|
+
getNode(tableName: string): DependencyNode | undefined;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
interface TopoSortResult {
|
|
355
|
+
order: string[];
|
|
356
|
+
cycles: string[][];
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Performs a topological sort on the dependency graph.
|
|
360
|
+
* Uses Kahn's algorithm or DFS-based approach. Here we use DFS for easier cycle path extraction.
|
|
361
|
+
*/
|
|
362
|
+
declare function topologicalSort(graph: DependencyGraph): TopoSortResult;
|
|
363
|
+
|
|
364
|
+
interface CycleResolution {
|
|
365
|
+
resolved: boolean;
|
|
366
|
+
strategy?: 'NULLABLE_FK' | 'DEFERRABLE';
|
|
367
|
+
breakingTable?: string;
|
|
368
|
+
breakingColumn?: string;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Attempts to resolve cycles in the dependency graph.
|
|
372
|
+
*/
|
|
373
|
+
declare function resolveCycles(cycles: string[][], schema: SchemaGraph, supportsDeferrable: boolean): CycleResolution[];
|
|
374
|
+
|
|
375
|
+
declare function createSeedPlan(schema: SchemaGraph, options: SeedOptions, supportsDeferrable?: boolean): SeedPlan;
|
|
376
|
+
/**
|
|
377
|
+
* Heuristic to identify if a table is likely a join table.
|
|
378
|
+
*/
|
|
379
|
+
declare function isJoinTable(table: TableSchema): boolean;
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Registry to store and retrieve primary key values for foreign key resolution.
|
|
383
|
+
*/
|
|
384
|
+
declare class ReferenceRegistry {
|
|
385
|
+
private refs;
|
|
386
|
+
/**
|
|
387
|
+
* Records an inserted primary key for a table.
|
|
388
|
+
*/
|
|
389
|
+
addReference(table: string, pk: any): void;
|
|
390
|
+
/**
|
|
391
|
+
* Picks a random primary key from the specified table.
|
|
392
|
+
*/
|
|
393
|
+
getRandomReference(table: string, random: Random): any;
|
|
394
|
+
/**
|
|
395
|
+
* Returns all recorded references for a table.
|
|
396
|
+
*/
|
|
397
|
+
getReferences(table: string): any[];
|
|
398
|
+
clear(): void;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
interface GenerationContext {
|
|
402
|
+
random: Random;
|
|
403
|
+
uniqueness: UniquenessRegistry;
|
|
404
|
+
refs: ReferenceRegistry;
|
|
405
|
+
/** Current row index in the batch */
|
|
406
|
+
i: number;
|
|
407
|
+
/** Map of column name or table.column to a specific generator function */
|
|
408
|
+
overrides?: Record<string, any>;
|
|
409
|
+
/** Map of generator IDs to their implementation */
|
|
410
|
+
generators: Record<string, (ctx: any) => any>;
|
|
411
|
+
/** Function to infer generator ID from column metadata */
|
|
412
|
+
inferGenerator: (columnName: string, sqlType: NormalizedSqlType) => {
|
|
413
|
+
generatorId: string;
|
|
414
|
+
options?: any;
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Generates multiple rows for a table.
|
|
419
|
+
*/
|
|
420
|
+
declare function generateRows(table: TableSchema, count: number, context: Omit<GenerationContext, 'i'>): Promise<Record<string, any>[]>;
|
|
421
|
+
/**
|
|
422
|
+
* Generates a single row for a table.
|
|
423
|
+
*/
|
|
424
|
+
declare function generateRow(table: TableSchema, context: GenerationContext): Promise<Record<string, any>>;
|
|
425
|
+
|
|
426
|
+
declare function runSeedSql(adapter: SqlAdapter, schema: any, // SchemaGraph
|
|
427
|
+
plan: SeedPlan, options: SeedOptions, context: RunnerContext): Promise<EffectReport>;
|
|
428
|
+
|
|
429
|
+
declare function runSeedMongo(adapter: MongoAdapter, config: MongoSeedConfig, options: {
|
|
430
|
+
dryRun?: boolean;
|
|
431
|
+
allowProduction?: boolean;
|
|
432
|
+
} | undefined, context: RunnerContext): Promise<EffectReport>;
|
|
433
|
+
|
|
434
|
+
declare function loadPlugins(options: SeedOptions, context: RunnerContext): Promise<void>;
|
|
435
|
+
|
|
436
|
+
declare function reportToConsole(report: EffectReport): void;
|
|
437
|
+
|
|
438
|
+
declare function reportToJson(report: EffectReport): string;
|
|
439
|
+
|
|
440
|
+
declare const version = "0.0.1";
|
|
441
|
+
declare function defineSeed(options: SeedOptions): SeedOptions;
|
|
442
|
+
|
|
443
|
+
export { type ColumnOverride, type ColumnSchema, type CycleResolution, type DateBetweenOverride, type DbAdapter, DependencyGraph, type DependencyNode, type EffectReport, type ForeignKeySchema, type GenerationContext, type Hooks, type MongoAdapter, type MongoCollectionSchema, type MongoSchema, MongoSeedConfig, NormalizedSqlType, type OverrideFunction, type Plugin, type PrimaryKeySchema, Random, Redactor, ReferenceRegistry, type RunnerContext, type SchemaGraph, type SeedBatch, type SeedOptions, type SeedPlan, type SqlAdapter, type TableOverrides, type TableSchema, type TopoSortResult, type UniqueConstraintSchema, UniquenessRegistry, type WeightedEnumOverride, createSeedPlan, defineSeed, generateRow, generateRows, isJoinTable, loadPlugins, reportToConsole, reportToJson, resolveCycles, runSeedMongo, runSeedSql, topologicalSort, version };
|