@c9up/atlas 0.2.0 → 0.2.1

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 (234) hide show
  1. package/README.md +8 -0
  2. package/db.darwin-arm64.node +0 -0
  3. package/db.darwin-x64.node +0 -0
  4. package/db.linux-arm64-gnu.node +0 -0
  5. package/db.linux-x64-gnu.node +0 -0
  6. package/db.win32-x64-msvc.node +0 -0
  7. package/dist/AtlasProvider.d.ts +60 -7
  8. package/dist/AtlasProvider.d.ts.map +1 -1
  9. package/dist/AtlasProvider.js +204 -38
  10. package/dist/AtlasProvider.js.map +1 -1
  11. package/dist/BaseEntity.d.ts +17 -0
  12. package/dist/BaseEntity.d.ts.map +1 -1
  13. package/dist/BaseEntity.js.map +1 -1
  14. package/dist/BaseModel.d.ts +63 -27
  15. package/dist/BaseModel.d.ts.map +1 -1
  16. package/dist/BaseModel.js +108 -51
  17. package/dist/BaseModel.js.map +1 -1
  18. package/dist/BaseRepository.d.ts +11 -1
  19. package/dist/BaseRepository.d.ts.map +1 -1
  20. package/dist/BaseRepository.js +95 -20
  21. package/dist/BaseRepository.js.map +1 -1
  22. package/dist/ConnectionManager.d.ts +106 -0
  23. package/dist/ConnectionManager.d.ts.map +1 -0
  24. package/dist/ConnectionManager.js +228 -0
  25. package/dist/ConnectionManager.js.map +1 -0
  26. package/dist/ModelQuery.d.ts +256 -43
  27. package/dist/ModelQuery.d.ts.map +1 -1
  28. package/dist/ModelQuery.js +899 -231
  29. package/dist/ModelQuery.js.map +1 -1
  30. package/dist/Transaction.d.ts +54 -1
  31. package/dist/Transaction.d.ts.map +1 -1
  32. package/dist/Transaction.js +121 -59
  33. package/dist/Transaction.js.map +1 -1
  34. package/dist/adapters/NapiDbAdapter.d.ts +11 -0
  35. package/dist/adapters/NapiDbAdapter.d.ts.map +1 -1
  36. package/dist/adapters/NapiDbAdapter.js +35 -7
  37. package/dist/adapters/NapiDbAdapter.js.map +1 -1
  38. package/dist/console/contract.d.ts +62 -0
  39. package/dist/console/contract.d.ts.map +1 -0
  40. package/dist/console/contract.js +38 -0
  41. package/dist/console/contract.js.map +1 -0
  42. package/dist/console/factoryCommands.d.ts +23 -0
  43. package/dist/console/factoryCommands.d.ts.map +1 -0
  44. package/dist/console/factoryCommands.js +62 -0
  45. package/dist/console/factoryCommands.js.map +1 -0
  46. package/dist/console/migrationCommands.d.ts +38 -8
  47. package/dist/console/migrationCommands.d.ts.map +1 -1
  48. package/dist/console/migrationCommands.js +157 -50
  49. package/dist/console/migrationCommands.js.map +1 -1
  50. package/dist/console/schemaCheckCommand.d.ts +11 -17
  51. package/dist/console/schemaCheckCommand.d.ts.map +1 -1
  52. package/dist/console/schemaCheckCommand.js +21 -15
  53. package/dist/console/schemaCheckCommand.js.map +1 -1
  54. package/dist/console/schemaDumpCommand.d.ts +30 -0
  55. package/dist/console/schemaDumpCommand.d.ts.map +1 -0
  56. package/dist/console/schemaDumpCommand.js +69 -0
  57. package/dist/console/schemaDumpCommand.js.map +1 -0
  58. package/dist/console/schemaGenerateCommand.d.ts +100 -0
  59. package/dist/console/schemaGenerateCommand.d.ts.map +1 -0
  60. package/dist/console/schemaGenerateCommand.js +246 -0
  61. package/dist/console/schemaGenerateCommand.js.map +1 -0
  62. package/dist/console/seederCommands.d.ts +46 -0
  63. package/dist/console/seederCommands.d.ts.map +1 -0
  64. package/dist/console/seederCommands.js +136 -0
  65. package/dist/console/seederCommands.js.map +1 -0
  66. package/dist/decorators/entity.d.ts +13 -2
  67. package/dist/decorators/entity.d.ts.map +1 -1
  68. package/dist/decorators/entity.js +10 -0
  69. package/dist/decorators/entity.js.map +1 -1
  70. package/dist/decorators/hooks.d.ts +3 -3
  71. package/dist/decorators/hooks.d.ts.map +1 -1
  72. package/dist/decorators/hooks.js.map +1 -1
  73. package/dist/events.d.ts +5 -0
  74. package/dist/events.d.ts.map +1 -1
  75. package/dist/events.js.map +1 -1
  76. package/dist/factories.d.ts +8 -0
  77. package/dist/factories.d.ts.map +1 -0
  78. package/dist/factories.js +8 -0
  79. package/dist/factories.js.map +1 -0
  80. package/dist/index.d.ts +11 -5
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +12 -4
  83. package/dist/index.js.map +1 -1
  84. package/dist/lucid-schema.d.ts +15 -0
  85. package/dist/lucid-schema.d.ts.map +1 -0
  86. package/dist/lucid-schema.js +16 -0
  87. package/dist/lucid-schema.js.map +1 -0
  88. package/dist/orm.d.ts +14 -0
  89. package/dist/orm.d.ts.map +1 -0
  90. package/dist/orm.js +14 -0
  91. package/dist/orm.js.map +1 -0
  92. package/dist/query/DatabaseQueryBuilder.d.ts +557 -0
  93. package/dist/query/DatabaseQueryBuilder.d.ts.map +1 -0
  94. package/dist/query/DatabaseQueryBuilder.js +1798 -0
  95. package/dist/query/DatabaseQueryBuilder.js.map +1 -0
  96. package/dist/query/DmlBuilder.d.ts +62 -0
  97. package/dist/query/DmlBuilder.d.ts.map +1 -0
  98. package/dist/query/DmlBuilder.js +84 -0
  99. package/dist/query/DmlBuilder.js.map +1 -0
  100. package/dist/query/QueryBuilder.d.ts +5 -0
  101. package/dist/query/QueryBuilder.d.ts.map +1 -1
  102. package/dist/query/QueryBuilder.js +7 -0
  103. package/dist/query/QueryBuilder.js.map +1 -1
  104. package/dist/query/RawQueryBuilder.d.ts +47 -0
  105. package/dist/query/RawQueryBuilder.d.ts.map +1 -0
  106. package/dist/query/RawQueryBuilder.js +138 -0
  107. package/dist/query/RawQueryBuilder.js.map +1 -0
  108. package/dist/query/interpolate.d.ts +45 -0
  109. package/dist/query/interpolate.d.ts.map +1 -0
  110. package/dist/query/interpolate.js +51 -0
  111. package/dist/query/interpolate.js.map +1 -0
  112. package/dist/query/native.d.ts +8 -0
  113. package/dist/query/native.d.ts.map +1 -1
  114. package/dist/query/native.js +14 -0
  115. package/dist/query/native.js.map +1 -1
  116. package/dist/query/operators.d.ts +4 -0
  117. package/dist/query/operators.d.ts.map +1 -0
  118. package/dist/query/operators.js +27 -0
  119. package/dist/query/operators.js.map +1 -0
  120. package/dist/schema/Migration.d.ts +31 -7
  121. package/dist/schema/Migration.d.ts.map +1 -1
  122. package/dist/schema/Migration.js +34 -7
  123. package/dist/schema/Migration.js.map +1 -1
  124. package/dist/schema/MigrationRunner.d.ts +56 -6
  125. package/dist/schema/MigrationRunner.d.ts.map +1 -1
  126. package/dist/schema/MigrationRunner.js +382 -112
  127. package/dist/schema/MigrationRunner.js.map +1 -1
  128. package/dist/schema/Schema.d.ts +59 -2
  129. package/dist/schema/Schema.d.ts.map +1 -1
  130. package/dist/schema/Schema.js +143 -9
  131. package/dist/schema/Schema.js.map +1 -1
  132. package/dist/schema/SchemaDumper.d.ts +121 -0
  133. package/dist/schema/SchemaDumper.d.ts.map +1 -0
  134. package/dist/schema/SchemaDumper.js +365 -0
  135. package/dist/schema/SchemaDumper.js.map +1 -0
  136. package/dist/schema/Seeder.d.ts +13 -0
  137. package/dist/schema/Seeder.d.ts.map +1 -1
  138. package/dist/schema/Seeder.js +28 -5
  139. package/dist/schema/Seeder.js.map +1 -1
  140. package/dist/schema/TableBuilder.d.ts +27 -8
  141. package/dist/schema/TableBuilder.d.ts.map +1 -1
  142. package/dist/schema/TableBuilder.js +50 -12
  143. package/dist/schema/TableBuilder.js.map +1 -1
  144. package/dist/schema/catalog.d.ts +25 -1
  145. package/dist/schema/catalog.d.ts.map +1 -1
  146. package/dist/schema/catalog.js +69 -22
  147. package/dist/schema/catalog.js.map +1 -1
  148. package/dist/schema/introspect.d.ts +1 -1
  149. package/dist/schema/introspect.d.ts.map +1 -1
  150. package/dist/schema/introspect.js +26 -11
  151. package/dist/schema/introspect.js.map +1 -1
  152. package/dist/seeders.d.ts +7 -0
  153. package/dist/seeders.d.ts.map +1 -0
  154. package/dist/seeders.js +7 -0
  155. package/dist/seeders.js.map +1 -0
  156. package/dist/services/db.d.ts +120 -9
  157. package/dist/services/db.d.ts.map +1 -1
  158. package/dist/services/db.js +182 -26
  159. package/dist/services/db.js.map +1 -1
  160. package/dist/testing/DatabaseCleanup.d.ts +29 -6
  161. package/dist/testing/DatabaseCleanup.d.ts.map +1 -1
  162. package/dist/testing/DatabaseCleanup.js +44 -17
  163. package/dist/testing/DatabaseCleanup.js.map +1 -1
  164. package/dist/testing/DbAssertions.d.ts +48 -0
  165. package/dist/testing/DbAssertions.d.ts.map +1 -0
  166. package/dist/testing/DbAssertions.js +80 -0
  167. package/dist/testing/DbAssertions.js.map +1 -0
  168. package/dist/testing/Factory.d.ts +111 -25
  169. package/dist/testing/Factory.d.ts.map +1 -1
  170. package/dist/testing/Factory.js +331 -56
  171. package/dist/testing/Factory.js.map +1 -1
  172. package/dist/testing/TestUtils.d.ts +49 -0
  173. package/dist/testing/TestUtils.d.ts.map +1 -0
  174. package/dist/testing/TestUtils.js +79 -0
  175. package/dist/testing/TestUtils.js.map +1 -0
  176. package/dist/testing/index.d.ts +3 -1
  177. package/dist/testing/index.d.ts.map +1 -1
  178. package/dist/testing/index.js +3 -1
  179. package/dist/testing/index.js.map +1 -1
  180. package/dist/types/relations.d.ts +31 -0
  181. package/dist/types/relations.d.ts.map +1 -0
  182. package/dist/types/relations.js +20 -0
  183. package/dist/types/relations.js.map +1 -0
  184. package/index.darwin-arm64.node +0 -0
  185. package/index.darwin-x64.node +0 -0
  186. package/index.linux-arm64-gnu.node +0 -0
  187. package/index.linux-x64-gnu.node +0 -0
  188. package/index.win32-x64-msvc.node +0 -0
  189. package/package.json +30 -2
  190. package/src/AtlasProvider.ts +297 -51
  191. package/src/BaseEntity.ts +29 -0
  192. package/src/BaseModel.ts +174 -37
  193. package/src/BaseRepository.ts +136 -17
  194. package/src/ConnectionManager.ts +298 -0
  195. package/src/ModelQuery.ts +1309 -260
  196. package/src/Transaction.ts +194 -60
  197. package/src/adapters/NapiDbAdapter.ts +72 -14
  198. package/src/console/contract.ts +96 -0
  199. package/src/console/factoryCommands.ts +73 -0
  200. package/src/console/migrationCommands.ts +253 -63
  201. package/src/console/schemaCheckCommand.ts +26 -22
  202. package/src/console/schemaDumpCommand.ts +96 -0
  203. package/src/console/schemaGenerateCommand.ts +380 -0
  204. package/src/console/seederCommands.ts +174 -0
  205. package/src/decorators/entity.ts +18 -2
  206. package/src/decorators/hooks.ts +5 -3
  207. package/src/events.ts +5 -0
  208. package/src/factories.ts +10 -0
  209. package/src/index.ts +50 -3
  210. package/src/lucid-schema.ts +22 -0
  211. package/src/orm.ts +13 -0
  212. package/src/query/DatabaseQueryBuilder.ts +2724 -0
  213. package/src/query/DmlBuilder.ts +131 -0
  214. package/src/query/QueryBuilder.ts +8 -0
  215. package/src/query/RawQueryBuilder.ts +173 -0
  216. package/src/query/interpolate.ts +73 -0
  217. package/src/query/native.ts +29 -0
  218. package/src/query/operators.ts +27 -0
  219. package/src/schema/Migration.ts +36 -7
  220. package/src/schema/MigrationRunner.ts +483 -119
  221. package/src/schema/Schema.ts +168 -19
  222. package/src/schema/SchemaDumper.ts +518 -0
  223. package/src/schema/Seeder.ts +47 -10
  224. package/src/schema/TableBuilder.ts +48 -11
  225. package/src/schema/catalog.ts +94 -24
  226. package/src/schema/introspect.ts +26 -9
  227. package/src/seeders.ts +16 -0
  228. package/src/services/db.ts +343 -31
  229. package/src/testing/DatabaseCleanup.ts +73 -21
  230. package/src/testing/DbAssertions.ts +127 -0
  231. package/src/testing/Factory.ts +559 -79
  232. package/src/testing/TestUtils.ts +123 -0
  233. package/src/testing/index.ts +12 -1
  234. package/src/types/relations.ts +43 -0
@@ -0,0 +1,69 @@
1
+ /**
2
+ * `schema:dump` — serialise the live database's schema to a `.sql` dump + a
3
+ * `.meta.json` manifest (Adonis Lucid `schema:dump` / `SchemaDumper`), so a
4
+ * fresh database can be rebuilt from the dump via `migration:run --schema-path`
5
+ * instead of replaying every migration.
6
+ *
7
+ * @example
8
+ * // commands/schema-dump.ts
9
+ * import { schemaDumpCommand } from '@c9up/atlas'
10
+ * export default schemaDumpCommand({ migrationsDir: 'database/migrations' })
11
+ * // run: <console-entry> schema:dump → database/schema/default-schema.sql
12
+ * // schema:dump --prune → also squashes the migration files
13
+ */
14
+ import { SchemaDumper } from "../schema/SchemaDumper.js";
15
+ import { getConnection, getDb } from "../services/db.js";
16
+ import { flag } from "./contract.js";
17
+ /** `schema:dump` — dump the schema; `--prune` squashes migrations, `--connection` targets one. */
18
+ export function schemaDumpCommand(options = {}) {
19
+ return class SchemaDump {
20
+ static commandName = "schema:dump";
21
+ static description = "Dump the database schema to a .sql file + manifest (--prune, --connection, --path)";
22
+ static options = { startApp: true };
23
+ static flags = [
24
+ flag("connection", "string", {
25
+ description: "Named connection to dump (defaults to the primary one)",
26
+ }),
27
+ flag("prune", "boolean", {
28
+ description: "Squash the migrations the dump replaces",
29
+ }),
30
+ flag("path", "string", {
31
+ description: "Destination .sql file (not a directory)",
32
+ }),
33
+ ];
34
+ async run() {
35
+ const connName = this.connection;
36
+ const db = connName ? getConnection(connName) : getDb();
37
+ if (!db) {
38
+ console.error(connName
39
+ ? `[atlas] no connection registered under '${connName}'`
40
+ : "[atlas] no database connection — is AtlasProvider registered?");
41
+ process.exitCode = 1;
42
+ return;
43
+ }
44
+ // Typed by the kernel now — no string/boolean coercion to redo here.
45
+ const prune = this.prune === true;
46
+ // `--path <file>` is the SQL dump FILE path (Adonis Lucid), not a dir.
47
+ const dumpPath = this.path;
48
+ const dumper = new SchemaDumper(db, {
49
+ connectionName: connName ?? "default",
50
+ dumpPath,
51
+ outputDir: options.outputDir,
52
+ migrationsDir: options.migrationsDir,
53
+ schemaTableName: options.schemaTableName,
54
+ prune,
55
+ generatedAt: options.generatedAt,
56
+ });
57
+ await dumper.run();
58
+ if (dumper.error) {
59
+ console.error(`[atlas] schema:dump failed: ${dumper.error.message}`);
60
+ process.exitCode = 1;
61
+ return;
62
+ }
63
+ const r = dumper.result;
64
+ console.log(`Dumped ${r?.tableCount ?? 0} table(s) → ${r?.dumpPath}` +
65
+ (prune ? " (migrations squashed)" : ""));
66
+ }
67
+ };
68
+ }
69
+ //# sourceMappingURL=schemaDumpCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaDumpCommand.js","sourceRoot":"","sources":["../../src/console/schemaDumpCommand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAA0B,IAAI,EAAE,MAAM,eAAe,CAAC;AAgB7D,kGAAkG;AAClG,MAAM,UAAU,iBAAiB,CAChC,UAAoC,EAAE;IAEtC,OAAO,MAAM,UAAU;QACtB,MAAM,CAAC,WAAW,GAAG,aAAa,CAAC;QACnC,MAAM,CAAC,WAAW,GACjB,oFAAoF,CAAC;QACtF,MAAM,CAAC,OAAO,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACpC,MAAM,CAAC,KAAK,GAAG;YACd,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE;gBAC5B,WAAW,EAAE,wDAAwD;aACrE,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE;gBACxB,WAAW,EAAE,yCAAyC;aACtD,CAAC;YACF,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE;gBACtB,WAAW,EAAE,yCAAyC;aACtD,CAAC;SACF,CAAC;QAMF,KAAK,CAAC,GAAG;YACR,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;YACjC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACxD,IAAI,CAAC,EAAE,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CACZ,QAAQ;oBACP,CAAC,CAAC,2CAA2C,QAAQ,GAAG;oBACxD,CAAC,CAAC,+DAA+D,CAClE,CAAC;gBACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACR,CAAC;YACD,qEAAqE;YACrE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC;YAClC,uEAAuE;YACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,EAAE;gBACnC,cAAc,EAAE,QAAQ,IAAI,SAAS;gBACrC,QAAQ;gBACR,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,KAAK;gBACL,WAAW,EAAE,OAAO,CAAC,WAAW;aAChC,CAAC,CAAC;YACH,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;YACnB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,+BAA+B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACrE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACR,CAAC;YACD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;YACxB,OAAO,CAAC,GAAG,CACV,UAAU,CAAC,EAAE,UAAU,IAAI,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE;gBACvD,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,CACxC,CAAC;QACH,CAAC;KACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * `schema:generate` — database-first codegen (Adonis Lucid parity). Introspects
3
+ * the live database and writes a `schema.ts` file with one `BaseModel` subclass
4
+ * per table, mirroring Lucid's `schema:generate` → `database/schema.ts`.
5
+ *
6
+ * @example
7
+ * // commands/schema-generate.ts
8
+ * import { schemaGenerateCommand } from '@c9up/atlas'
9
+ * export default schemaGenerateCommand({ outputPath: 'database/schema.ts' })
10
+ */
11
+ import type { AsyncDatabaseConnection } from "../adapters/NapiDbAdapter.js";
12
+ import { type IntrospectedColumn } from "../schema/introspect.js";
13
+ import { type AtlasCommandClass } from "./contract.js";
14
+ export interface SchemaGenerateOptions {
15
+ /** File to write the generated schema classes to (Lucid `outputPath`). */
16
+ outputPath: string;
17
+ /** Extra tables to skip (framework tables are always skipped). */
18
+ excludeTables?: string[];
19
+ /**
20
+ * When `false`, the `schema:generate` command and post-migration regeneration
21
+ * are both disabled (Adonis Lucid `schemaGeneration.enabled`). Any other value
22
+ * (incl. `undefined`) leaves generation on.
23
+ */
24
+ enabled?: boolean;
25
+ /**
26
+ * Paths to rule modules that customise how columns are emitted (Adonis Lucid
27
+ * `schemaGeneration.rulesPaths`). Each module default-exports a {@link SchemaRules}
28
+ * object; multiple files deep-merge, later paths overriding earlier ones.
29
+ */
30
+ rulesPaths?: string[];
31
+ /**
32
+ * Emit a denser file — no blank line between a class's `$columns` and its
33
+ * column declarations (Adonis Lucid `--compact-output`). Also settable per-run
34
+ * with the `--compact-output` flag.
35
+ */
36
+ compact?: boolean;
37
+ /**
38
+ * PostgreSQL only — restrict generation to these schemas (Adonis Lucid
39
+ * `schemaGeneration.schemas`). Ignored on sqlite/mysql. NOTE: the runtime
40
+ * behaviour is not yet proven against a live PostgreSQL in atlas's test env.
41
+ */
42
+ schemas?: string[];
43
+ }
44
+ /**
45
+ * Per-column override for schema generation (Adonis Lucid schema rules). A rule
46
+ * can force the TypeScript `tsType`, the `decorator`, and the `imports` the
47
+ * generated file needs for that type.
48
+ */
49
+ export interface ColumnRule {
50
+ /** TypeScript type for the property (e.g. `"UserStatus"`). */
51
+ tsType?: string;
52
+ /** Full decorator string (e.g. `"@column()"`, `"@column({ isPrimary: true })"`). */
53
+ decorator?: string;
54
+ /** Imports the `tsType`/`decorator` needs, added to the generated file header. */
55
+ imports?: Array<{
56
+ source: string;
57
+ namedImports: string[];
58
+ }>;
59
+ }
60
+ /**
61
+ * Schema-generation rules (Adonis Lucid). Resolution is most-specific-first:
62
+ * `tables[table].columns[col]` > `columns[col]` > `types[rawType]`.
63
+ */
64
+ export interface SchemaRules {
65
+ /** Rules keyed by column name, applied to that column on every table. */
66
+ columns?: Record<string, ColumnRule>;
67
+ /** Rules keyed by raw dialect type (lower-cased), applied by column type. */
68
+ types?: Record<string, ColumnRule>;
69
+ /** Table-scoped column rules, the highest-priority match. */
70
+ tables?: Record<string, {
71
+ columns?: Record<string, ColumnRule>;
72
+ }>;
73
+ }
74
+ /**
75
+ * Load + deep-merge the rule modules named by `rulesPaths` (later files win).
76
+ * Each module default-exports a {@link SchemaRules}; a module without a usable
77
+ * default export is skipped.
78
+ */
79
+ export declare function loadSchemaRules(rulesPaths: string[] | undefined): Promise<SchemaRules>;
80
+ /**
81
+ * Render the full `schema.ts` source from introspected tables. Pure — no DB
82
+ * access — so it is unit-testable. `rules` (Adonis Lucid `rulesPaths`) override
83
+ * per-column TS types/decorators. Manual edits to the output are lost on
84
+ * regeneration (same contract as Lucid).
85
+ */
86
+ export declare function renderSchemaFile(tables: ReadonlyArray<{
87
+ table: string;
88
+ columns: IntrospectedColumn[];
89
+ schema?: string;
90
+ }>, rules?: SchemaRules, compact?: boolean): string;
91
+ /**
92
+ * Introspect the live database and (re)write the schema file. Returns the number
93
+ * of tables written. Reused by the {@link schemaGenerateCommand} and by the
94
+ * migration commands' auto-regeneration (Adonis Lucid regenerates after
95
+ * migrate/rollback/etc).
96
+ */
97
+ export declare function generateSchemaFile(db: AsyncDatabaseConnection, options: SchemaGenerateOptions): Promise<number>;
98
+ /** `schema:generate` — introspect the DB and (re)write the schema file. */
99
+ export declare function schemaGenerateCommand(options: SchemaGenerateOptions): AtlasCommandClass;
100
+ //# sourceMappingURL=schemaGenerateCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaGenerateCommand.d.ts","sourceRoot":"","sources":["../../src/console/schemaGenerateCommand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5E,OAAO,EACN,KAAK,kBAAkB,EAEvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,iBAAiB,EAAQ,MAAM,eAAe,CAAC;AAE7D,MAAM,WAAW,qBAAqB;IACrC,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IAC1B,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC5D;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC3B,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnC,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;KAAE,CAAC,CAAC;CAClE;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACpC,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,GAC9B,OAAO,CAAC,WAAW,CAAC,CAUtB;AA0JD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,EACF,KAAK,GAAE,WAAgB,EACvB,OAAO,UAAQ,GACb,MAAM,CAmBR;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACvC,EAAE,EAAE,uBAAuB,EAC3B,OAAO,EAAE,qBAAqB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAiCjB;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,qBAAqB,GAC5B,iBAAiB,CA8CnB"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * `schema:generate` — database-first codegen (Adonis Lucid parity). Introspects
3
+ * the live database and writes a `schema.ts` file with one `BaseModel` subclass
4
+ * per table, mirroring Lucid's `schema:generate` → `database/schema.ts`.
5
+ *
6
+ * @example
7
+ * // commands/schema-generate.ts
8
+ * import { schemaGenerateCommand } from '@c9up/atlas'
9
+ * export default schemaGenerateCommand({ outputPath: 'database/schema.ts' })
10
+ */
11
+ import * as fsp from "node:fs/promises";
12
+ import * as path from "node:path";
13
+ import { listUserTables } from "../schema/catalog.js";
14
+ import { introspectTable, } from "../schema/introspect.js";
15
+ import { getConnection, getDb } from "../services/db.js";
16
+ import { flag } from "./contract.js";
17
+ /**
18
+ * Load + deep-merge the rule modules named by `rulesPaths` (later files win).
19
+ * Each module default-exports a {@link SchemaRules}; a module without a usable
20
+ * default export is skipped.
21
+ */
22
+ export async function loadSchemaRules(rulesPaths) {
23
+ const merged = {};
24
+ for (const p of rulesPaths ?? []) {
25
+ const mod = await import(p);
26
+ const rules = mod.default ?? mod;
27
+ if (rules && typeof rules === "object") {
28
+ mergeRules(merged, rules);
29
+ }
30
+ }
31
+ return merged;
32
+ }
33
+ /** Deep-merge `src` rules into `dst` (column/type/table maps), src winning. */
34
+ function mergeRules(dst, src) {
35
+ dst.columns = { ...dst.columns, ...src.columns };
36
+ dst.types = { ...dst.types, ...src.types };
37
+ dst.tables = { ...dst.tables };
38
+ for (const [table, rule] of Object.entries(src.tables ?? {})) {
39
+ dst.tables[table] = {
40
+ columns: { ...dst.tables[table]?.columns, ...rule.columns },
41
+ };
42
+ }
43
+ }
44
+ /** Resolve the winning rule for a column (table-scoped > column > type), if any. */
45
+ function resolveRule(rules, table, col) {
46
+ return (rules.tables?.[table]?.columns?.[col.name] ??
47
+ rules.columns?.[col.name] ??
48
+ rules.types?.[col.type.toLowerCase()]);
49
+ }
50
+ /** `snake_case` / `snake_case_id` → `camelCase`. */
51
+ function toCamel(name) {
52
+ return name.replace(/_([a-z0-9])/g, (_, c) => c.toUpperCase());
53
+ }
54
+ /** `snake_case` table → `PascalCase` class stem. */
55
+ function toPascal(name) {
56
+ const camel = toCamel(name);
57
+ return camel.charAt(0).toUpperCase() + camel.slice(1);
58
+ }
59
+ /** `camelCase` → `snake_case`, to detect when a DB column needs `columnName`. */
60
+ function toSnake(name) {
61
+ return name.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`);
62
+ }
63
+ /** Is this a date/time column (→ `@column.dateTime` + a Chronos `DateTime`)? */
64
+ function isDateType(rawType) {
65
+ return /timestamp|datetime|date|time/.test(rawType.toLowerCase());
66
+ }
67
+ /** Map a NON-date raw dialect column type to a TypeScript type. */
68
+ function toTsType(rawType) {
69
+ const t = rawType.toLowerCase();
70
+ if (/bool/.test(t))
71
+ return "boolean";
72
+ if (/int|serial|real|float|double|number/.test(t))
73
+ return "number";
74
+ // decimal/numeric hydrate as strings (atlas keeps precision) — Lucid parity.
75
+ if (/decimal|numeric/.test(t))
76
+ return "string";
77
+ if (/json/.test(t))
78
+ return "unknown";
79
+ if (/bytea|blob|binary/.test(t))
80
+ return "Uint8Array";
81
+ return "string"; // varchar / text / char / uuid / everything else
82
+ }
83
+ /** `columnName: "..."` fragment when the DB name doesn't round-trip from camelCase. */
84
+ function columnNameOpt(col, prop) {
85
+ return toSnake(prop) === col.name ? "" : `columnName: "${col.name}"`;
86
+ }
87
+ /** Record a rule's imports into the sink. */
88
+ function collectImports(sink, rule) {
89
+ for (const imp of rule?.imports ?? []) {
90
+ const set = sink.get(imp.source) ?? new Set();
91
+ for (const n of imp.namedImports)
92
+ set.add(n);
93
+ sink.set(imp.source, set);
94
+ }
95
+ }
96
+ /**
97
+ * Render one column declaration line (Lucid decorator + typed property). A
98
+ * matching {@link SchemaRules} entry overrides the decorator and TS type and
99
+ * contributes its imports to `sink`.
100
+ */
101
+ function renderColumn(col, table, rules, sink) {
102
+ const prop = toCamel(col.name);
103
+ const cn = columnNameOpt(col, prop);
104
+ const nullable = col.nullable && !col.primaryKey ? " | null" : "";
105
+ // A rule wins over the built-in mapping (custom enum types, decorators, …).
106
+ const rule = resolveRule(rules, table, col);
107
+ if (rule?.decorator || rule?.tsType) {
108
+ collectImports(sink, rule);
109
+ const decorator = rule.decorator ?? (col.primaryKey ? "@PrimaryKey()" : "@Column()");
110
+ const tsType = rule.tsType ?? toTsType(col.type);
111
+ return `\t${decorator} declare ${prop}: ${tsType}${nullable};`;
112
+ }
113
+ if (isDateType(col.type) && !col.primaryKey) {
114
+ const opts = cn ? `{ ${cn} }` : "";
115
+ const dateNullable = col.nullable ? " | null" : "";
116
+ return `\t@column.dateTime(${opts}) declare ${prop}: DateTime${dateNullable};`;
117
+ }
118
+ const opts = cn ? `{ ${cn} }` : "";
119
+ const decorator = col.primaryKey ? "@PrimaryKey()" : `@Column(${opts})`;
120
+ return `\t${decorator} declare ${prop}: ${toTsType(col.type)}${nullable};`;
121
+ }
122
+ /**
123
+ * Render one `<Table>Schema extends BaseModel` class (with Lucid `$columns`).
124
+ * A non-default `schema` qualifies `static table` (`"schema.table"` — the Rust
125
+ * compiler quotes it as `"schema"."table"`) and prefixes the class name to keep
126
+ * `public.users` / `tenant.users` distinct.
127
+ */
128
+ function renderClass(table, columns, rules, sink, compact, schema) {
129
+ const className = schema
130
+ ? `${toPascal(schema)}${toPascal(table)}Schema`
131
+ : `${toPascal(table)}Schema`;
132
+ const qualifiedTable = schema ? `${schema}.${table}` : table;
133
+ const props = columns.map((c) => toCamel(c.name));
134
+ const cols = props.map((p) => `"${p}"`).join(", ");
135
+ const body = columns
136
+ .map((c) => renderColumn(c, table, rules, sink))
137
+ .join("\n");
138
+ // Compact drops the blank line between `$columns` and the column declarations.
139
+ const gap = compact ? "\n" : "\n\n";
140
+ return (`export class ${className} extends BaseModel {\n` +
141
+ `\tstatic table = "${qualifiedTable}";\n` +
142
+ `\tstatic $columns = [${cols}] as const;\n` +
143
+ `\t$columns = ${className}.$columns;${gap}${body}\n}`);
144
+ }
145
+ /** Emit the deduped `import { a, b } from "source"` lines from a sink. */
146
+ function renderRuleImports(sink) {
147
+ const lines = [];
148
+ for (const [source, names] of sink) {
149
+ lines.push(`import { ${[...names].join(", ")} } from "${source}";\n`);
150
+ }
151
+ return lines.join("");
152
+ }
153
+ /**
154
+ * Render the full `schema.ts` source from introspected tables. Pure — no DB
155
+ * access — so it is unit-testable. `rules` (Adonis Lucid `rulesPaths`) override
156
+ * per-column TS types/decorators. Manual edits to the output are lost on
157
+ * regeneration (same contract as Lucid).
158
+ */
159
+ export function renderSchemaFile(tables, rules = {}, compact = false) {
160
+ const sink = new Map();
161
+ // Render the classes first so rule imports are fully collected for the header.
162
+ const classes = tables
163
+ .map((t) => renderClass(t.table, t.columns, rules, sink, compact, t.schema))
164
+ .join(compact ? "\n" : "\n\n");
165
+ const hasDate = tables.some((t) => t.columns.some((c) => isDateType(c.type) && !resolveRule(rules, t.table, c)?.tsType));
166
+ const header = "// Generated by @c9up/atlas schema:generate — DO NOT EDIT.\n" +
167
+ "// Manual edits are lost on regeneration.\n" +
168
+ 'import { BaseModel, Column, column, PrimaryKey } from "@c9up/atlas";\n' +
169
+ (hasDate ? 'import { DateTime } from "@c9up/chronos";\n' : "") +
170
+ renderRuleImports(sink);
171
+ if (tables.length === 0)
172
+ return `${header}\n// (no tables)\n`;
173
+ return `${header}\n${classes}\n`;
174
+ }
175
+ /**
176
+ * Introspect the live database and (re)write the schema file. Returns the number
177
+ * of tables written. Reused by the {@link schemaGenerateCommand} and by the
178
+ * migration commands' auto-regeneration (Adonis Lucid regenerates after
179
+ * migrate/rollback/etc).
180
+ */
181
+ export async function generateSchemaFile(db, options) {
182
+ const exclude = new Set(options.excludeTables ?? []);
183
+ const tables = [];
184
+ // With `schemas`, list + introspect each named schema's tables against THAT
185
+ // schema (Lucid). Without it, use the current schema/database as before.
186
+ const schemaScopes = options.schemas && options.schemas.length > 0
187
+ ? options.schemas
188
+ : [undefined];
189
+ for (const schema of schemaScopes) {
190
+ const names = (await listUserTables(db, db.dialect, {
191
+ schemas: schema ? [schema] : undefined,
192
+ }))
193
+ .filter((n) => !exclude.has(n))
194
+ .sort();
195
+ for (const table of names) {
196
+ const columns = await introspectTable(db, db.dialect, table, schema);
197
+ if (columns)
198
+ tables.push({ table, columns, schema });
199
+ }
200
+ }
201
+ const rules = await loadSchemaRules(options.rulesPaths);
202
+ const source = renderSchemaFile(tables, rules, options.compact ?? false);
203
+ await fsp.mkdir(path.dirname(options.outputPath), { recursive: true });
204
+ await fsp.writeFile(options.outputPath, source);
205
+ return tables.length;
206
+ }
207
+ /** `schema:generate` — introspect the DB and (re)write the schema file. */
208
+ export function schemaGenerateCommand(options) {
209
+ return class SchemaGenerate {
210
+ static commandName = "schema:generate";
211
+ static description = "Introspect the database and generate BaseModel schema classes";
212
+ static options = { startApp: true };
213
+ static flags = [
214
+ flag("connection", "string", {
215
+ description: "Named connection to introspect",
216
+ }),
217
+ flag("compactOutput", "boolean", {
218
+ description: "Override the configured `compact` rendering",
219
+ }),
220
+ ];
221
+ async run() {
222
+ // `enabled: false` disables the command too (Adonis Lucid), not just the
223
+ // post-migration regeneration.
224
+ if (options.enabled === false) {
225
+ console.log("[atlas] schema generation is disabled (enabled: false)");
226
+ return;
227
+ }
228
+ // `--connection <name>` targets a specific registered connection (Adonis
229
+ // Lucid); without it, the default connection is used.
230
+ const connName = this.connection;
231
+ const db = connName ? getConnection(connName) : getDb();
232
+ if (!db) {
233
+ console.error(connName
234
+ ? `[atlas] no connection registered under '${connName}'`
235
+ : "[atlas] no database connection — is AtlasProvider registered?");
236
+ process.exitCode = 1;
237
+ return;
238
+ }
239
+ // `--compact-output` overrides the configured `compact`.
240
+ const compact = this.compactOutput === true ? true : options.compact;
241
+ const n = await generateSchemaFile(db, { ...options, compact });
242
+ console.log(`Generated ${options.outputPath} (${n} table${n === 1 ? "" : "s"})`);
243
+ }
244
+ };
245
+ }
246
+ //# sourceMappingURL=schemaGenerateCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaGenerateCommand.js","sourceRoot":"","sources":["../../src/console/schemaGenerateCommand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAEN,eAAe,GACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAA0B,IAAI,EAAE,MAAM,eAAe,CAAC;AA4D7D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,UAAgC;IAEhC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,UAAU,IAAI,EAAE,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAY,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC;QAC1C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,UAAU,CAAC,MAAM,EAAE,KAAoB,CAAC,CAAC;QAC1C,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,+EAA+E;AAC/E,SAAS,UAAU,CAAC,GAAgB,EAAE,GAAgB;IACrD,GAAG,CAAC,OAAO,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IACjD,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;IAC3C,GAAG,CAAC,MAAM,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG;YACnB,OAAO,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;SAC3D,CAAC;IACH,CAAC;AACF,CAAC;AAED,oFAAoF;AACpF,SAAS,WAAW,CACnB,KAAkB,EAClB,KAAa,EACb,GAAuB;IAEvB,OAAO,CACN,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1C,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;QACzB,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CACrC,CAAC;AACH,CAAC;AAED,oDAAoD;AACpD,SAAS,OAAO,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,oDAAoD;AACpD,SAAS,QAAQ,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,iFAAiF;AACjF,SAAS,OAAO,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,gFAAgF;AAChF,SAAS,UAAU,CAAC,OAAe;IAClC,OAAO,8BAA8B,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,mEAAmE;AACnE,SAAS,QAAQ,CAAC,OAAe;IAChC,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAChC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,qCAAqC,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IACnE,6EAA6E;IAC7E,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC/C,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IACrD,OAAO,QAAQ,CAAC,CAAC,iDAAiD;AACnE,CAAC;AAED,uFAAuF;AACvF,SAAS,aAAa,CAAC,GAAuB,EAAE,IAAY;IAC3D,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,IAAI,GAAG,CAAC;AACtE,CAAC;AAKD,6CAA6C;AAC7C,SAAS,cAAc,CAAC,IAAgB,EAAE,IAA4B;IACrE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QACtD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,YAAY;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CACpB,GAAuB,EACvB,KAAa,EACb,KAAkB,EAClB,IAAgB;IAEhB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAElE,4EAA4E;IAC5E,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5C,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;QACrC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3B,MAAM,SAAS,GACd,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,KAAK,SAAS,YAAY,IAAI,KAAK,MAAM,GAAG,QAAQ,GAAG,CAAC;IAChE,CAAC;IAED,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,OAAO,sBAAsB,IAAI,aAAa,IAAI,aAAa,YAAY,GAAG,CAAC;IAChF,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC;IACxE,OAAO,KAAK,SAAS,YAAY,IAAI,KAAK,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC;AAC5E,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CACnB,KAAa,EACb,OAA6B,EAC7B,KAAkB,EAClB,IAAgB,EAChB,OAAgB,EAChB,MAAe;IAEf,MAAM,SAAS,GAAG,MAAM;QACvB,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ;QAC/C,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC9B,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,OAAO;SAClB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;SAC/C,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,+EAA+E;IAC/E,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IACpC,OAAO,CACN,gBAAgB,SAAS,wBAAwB;QACjD,qBAAqB,cAAc,MAAM;QACzC,wBAAwB,IAAI,eAAe;QAC3C,gBAAgB,SAAS,aAAa,GAAG,GAAG,IAAI,KAAK,CACrD,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,SAAS,iBAAiB,CAAC,IAAgB;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,MAAM,MAAM,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC/B,MAIE,EACF,QAAqB,EAAE,EACvB,OAAO,GAAG,KAAK;IAEf,MAAM,IAAI,GAAe,IAAI,GAAG,EAAE,CAAC;IACnC,+EAA+E;IAC/E,MAAM,OAAO,GAAG,MAAM;SACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;SAC3E,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACjC,CAAC,CAAC,OAAO,CAAC,IAAI,CACb,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,CACpE,CACD,CAAC;IACF,MAAM,MAAM,GACX,8DAA8D;QAC9D,6CAA6C;QAC7C,wEAAwE;QACxE,CAAC,OAAO,CAAC,CAAC,CAAC,6CAA6C,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,MAAM,oBAAoB,CAAC;IAC9D,OAAO,GAAG,MAAM,KAAK,OAAO,IAAI,CAAC;AAClC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,EAA2B,EAC3B,OAA8B;IAE9B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,MAAM,GAIP,EAAE,CAAC;IAER,4EAA4E;IAC5E,yEAAyE;IACzE,MAAM,YAAY,GACjB,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QAC5C,CAAC,CAAC,OAAO,CAAC,OAAO;QACjB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAChB,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,CACb,MAAM,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE;YACpC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;SACtC,CAAC,CACF;aACC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aAC9B,IAAI,EAAE,CAAC;QACT,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACrE,IAAI,OAAO;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IACzE,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,MAAM,CAAC;AACtB,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,qBAAqB,CACpC,OAA8B;IAE9B,OAAO,MAAM,cAAc;QAC1B,MAAM,CAAC,WAAW,GAAG,iBAAiB,CAAC;QACvC,MAAM,CAAC,WAAW,GACjB,+DAA+D,CAAC;QACjE,MAAM,CAAC,OAAO,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACpC,MAAM,CAAC,KAAK,GAAG;YACd,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE;gBAC5B,WAAW,EAAE,gCAAgC;aAC7C,CAAC;YACF,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE;gBAChC,WAAW,EAAE,6CAA6C;aAC1D,CAAC;SACF,CAAC;QAKF,KAAK,CAAC,GAAG;YACR,yEAAyE;YACzE,+BAA+B;YAC/B,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;gBACtE,OAAO;YACR,CAAC;YACD,yEAAyE;YACzE,sDAAsD;YACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;YACjC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACxD,IAAI,CAAC,EAAE,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CACZ,QAAQ;oBACP,CAAC,CAAC,2CAA2C,QAAQ,GAAG;oBACxD,CAAC,CAAC,+DAA+D,CAClE,CAAC;gBACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACR,CAAC;YACD,yDAAyD;YACzD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;YACrE,MAAM,CAAC,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CACV,aAAa,OAAO,CAAC,UAAU,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CACnE,CAAC;QACH,CAAC;KACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Seeder console commands — the Ream-idiomatic CLI for scaffolding and running
3
+ * database seeders (Adonis Lucid `make:seeder` / `db:seed`). Same shape as the
4
+ * migration commands: plain `{ name, description, run }` objects registered in
5
+ * `reamrc.commands` and dispatched by the console kernel.
6
+ *
7
+ * Atlas has no global config registry (Lucid parity — you pass your own paths),
8
+ * so every factory takes the `seedersDir`.
9
+ *
10
+ * @example
11
+ * // commands/seed.ts
12
+ * import { dbSeedCommand } from '@c9up/atlas'
13
+ * export default dbSeedCommand({ seedersDir: 'database/seeders' })
14
+ * // run: <console-entry> db:seed (or --files=UserSeeder,PostSeeder)
15
+ */
16
+ import { type AtlasCommandClass } from "./contract.js";
17
+ export interface SeederCommandOptions {
18
+ /** Directory holding the seeder files. */
19
+ seedersDir: string;
20
+ /** Sort files numerically (`2_x` before `10_x`) — Adonis Lucid `naturalSort`. */
21
+ naturalSort?: boolean;
22
+ /**
23
+ * Current environment (`development`/`testing`/`production`), used to skip a
24
+ * seeder whose `static environment` excludes it. Falls back to `NODE_ENV`;
25
+ * override per-run with `--environment`.
26
+ */
27
+ environment?: string;
28
+ }
29
+ /**
30
+ * `make:seeder <name>` — scaffold a timestamped seeder file in `seedersDir`. The
31
+ * `Date.now()` prefix keeps files in creation order under the runner's
32
+ * lexicographic sort (same convention as migrations). The name is validated (no
33
+ * path separators / traversal) and written with `wx` so an existing seeder is
34
+ * never clobbered.
35
+ */
36
+ export declare function makeSeederCommand(options: SeederCommandOptions): AtlasCommandClass;
37
+ /**
38
+ * `db:seed` — run every seeder in `seedersDir` (Adonis Lucid `db:seed`). Flags:
39
+ * --files=A,B run only the named seeders (Lucid `--files`)
40
+ * --connection=name run against a registered connection (Lucid `--connection`)
41
+ * --compact-output terse output (one summary line, not per-seeder)
42
+ * --interactive accepted for Lucid compat; the console kernel is
43
+ * non-interactive, so it runs every seeder (no prompt)
44
+ */
45
+ export declare function dbSeedCommand(options: SeederCommandOptions): AtlasCommandClass;
46
+ //# sourceMappingURL=seederCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seederCommands.d.ts","sourceRoot":"","sources":["../../src/console/seederCommands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,eAAe,CAAC;AAEvE,MAAM,WAAW,oBAAoB;IACpC,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAaD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,oBAAoB,GAC3B,iBAAiB,CA2BnB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC5B,OAAO,EAAE,oBAAoB,GAC3B,iBAAiB,CAmEnB"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Seeder console commands — the Ream-idiomatic CLI for scaffolding and running
3
+ * database seeders (Adonis Lucid `make:seeder` / `db:seed`). Same shape as the
4
+ * migration commands: plain `{ name, description, run }` objects registered in
5
+ * `reamrc.commands` and dispatched by the console kernel.
6
+ *
7
+ * Atlas has no global config registry (Lucid parity — you pass your own paths),
8
+ * so every factory takes the `seedersDir`.
9
+ *
10
+ * @example
11
+ * // commands/seed.ts
12
+ * import { dbSeedCommand } from '@c9up/atlas'
13
+ * export default dbSeedCommand({ seedersDir: 'database/seeders' })
14
+ * // run: <console-entry> db:seed (or --files=UserSeeder,PostSeeder)
15
+ */
16
+ import * as fsp from "node:fs/promises";
17
+ import * as path from "node:path";
18
+ import { runSeederDirectory } from "../schema/Seeder.js";
19
+ import { getConnection, getDb } from "../services/db.js";
20
+ import { assertSafeName } from "../utils/safePath.js";
21
+ import { argument, flag } from "./contract.js";
22
+ /** Scaffold body for a fresh seeder (`make:seeder`). */
23
+ const SEEDER_STUB = `import { BaseSeeder } from '@c9up/atlas'
24
+
25
+ export default class extends BaseSeeder {
26
+ async run() {
27
+ // const repo = new BaseRepository(Model, this.db)
28
+ // await repo.upsert([{ /* ... */ }], ['uniqueColumn'], ['columnToUpdate'])
29
+ }
30
+ }
31
+ `;
32
+ /**
33
+ * `make:seeder <name>` — scaffold a timestamped seeder file in `seedersDir`. The
34
+ * `Date.now()` prefix keeps files in creation order under the runner's
35
+ * lexicographic sort (same convention as migrations). The name is validated (no
36
+ * path separators / traversal) and written with `wx` so an existing seeder is
37
+ * never clobbered.
38
+ */
39
+ export function makeSeederCommand(options) {
40
+ return class MakeSeeder {
41
+ static commandName = "make:seeder";
42
+ static description = "Scaffold a new seeder file";
43
+ // Filesystem only — no connection needed.
44
+ static options = { startApp: false };
45
+ static args = [argument("name", { description: "Seeder file name" })];
46
+ async run() {
47
+ // A missing name never reaches here: the kernel reports the required
48
+ // argument by name before `run()`.
49
+ try {
50
+ assertSafeName(this.name, "SEEDER_INVALID", "seeder");
51
+ }
52
+ catch {
53
+ console.error(`[atlas] invalid seeder name: ${this.name}`);
54
+ process.exitCode = 1;
55
+ return;
56
+ }
57
+ const fileName = `${Date.now()}_${this.name}.ts`;
58
+ const filePath = path.join(options.seedersDir, fileName);
59
+ await fsp.mkdir(options.seedersDir, { recursive: true });
60
+ await fsp.writeFile(filePath, SEEDER_STUB, { flag: "wx" });
61
+ console.log(`Created ${filePath}`);
62
+ }
63
+ };
64
+ }
65
+ /**
66
+ * `db:seed` — run every seeder in `seedersDir` (Adonis Lucid `db:seed`). Flags:
67
+ * --files=A,B run only the named seeders (Lucid `--files`)
68
+ * --connection=name run against a registered connection (Lucid `--connection`)
69
+ * --compact-output terse output (one summary line, not per-seeder)
70
+ * --interactive accepted for Lucid compat; the console kernel is
71
+ * non-interactive, so it runs every seeder (no prompt)
72
+ */
73
+ export function dbSeedCommand(options) {
74
+ return class DbSeed {
75
+ static commandName = "db:seed";
76
+ static description = "Run database seeders (--files=A,B, --connection=name)";
77
+ static options = { startApp: true };
78
+ static flags = [
79
+ flag("files", "string", {
80
+ description: "Comma-separated seeder names to run",
81
+ }),
82
+ flag("connection", "string", {
83
+ description: "Named connection to seed",
84
+ }),
85
+ flag("compactOutput", "boolean", {
86
+ description: "One summary line instead of per-seeder output",
87
+ }),
88
+ flag("environment", "string", {
89
+ description: "Environment the seeders run under",
90
+ }),
91
+ flag("interactive", "boolean", {
92
+ description: "Accepted for Lucid compatibility; runs every seeder",
93
+ }),
94
+ ];
95
+ async run() {
96
+ const connName = this.connection;
97
+ const db = connName ? getConnection(connName) : getDb();
98
+ if (!db) {
99
+ console.error(connName
100
+ ? `[atlas] no connection registered under '${connName}'`
101
+ : "[atlas] no database connection — is AtlasProvider registered?");
102
+ process.exitCode = 1;
103
+ return;
104
+ }
105
+ if (this.interactive === true) {
106
+ console.warn("[atlas] --interactive is not supported in the non-interactive console; running all selected seeders.");
107
+ }
108
+ const files = parseFilesFlag(this.files);
109
+ const environment = this.environment ?? options.environment ?? process.env.NODE_ENV;
110
+ const executed = await runSeederDirectory(options.seedersDir, db, {
111
+ files,
112
+ naturalSort: options.naturalSort,
113
+ environment,
114
+ });
115
+ const compact = this.compactOutput === true;
116
+ if (compact) {
117
+ console.log(`Seeded ${executed.length} seeder(s)`);
118
+ }
119
+ else {
120
+ console.log(executed.length
121
+ ? `Seeded: ${executed.join(", ")}`
122
+ : "No seeders to run");
123
+ }
124
+ }
125
+ };
126
+ }
127
+ /** Parse `--files=A,B,C` into a name list, or undefined when absent. */
128
+ function parseFilesFlag(value) {
129
+ if (typeof value !== "string" || value.length === 0)
130
+ return undefined;
131
+ return value
132
+ .split(",")
133
+ .map((f) => f.trim())
134
+ .filter((f) => f.length > 0);
135
+ }
136
+ //# sourceMappingURL=seederCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seederCommands.js","sourceRoot":"","sources":["../../src/console/seederCommands.ts"],"names":[],"mappings":"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"}