@c9up/atlas 0.1.19 → 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.
- package/README.md +63 -14
- package/db.darwin-arm64.node +0 -0
- package/db.darwin-x64.node +0 -0
- package/db.linux-arm64-gnu.node +0 -0
- package/db.linux-x64-gnu.node +0 -0
- package/db.win32-x64-msvc.node +0 -0
- package/dist/AtlasProvider.d.ts +66 -7
- package/dist/AtlasProvider.d.ts.map +1 -1
- package/dist/AtlasProvider.js +205 -39
- package/dist/AtlasProvider.js.map +1 -1
- package/dist/BaseEntity.d.ts +181 -5
- package/dist/BaseEntity.d.ts.map +1 -1
- package/dist/BaseEntity.js +339 -33
- package/dist/BaseEntity.js.map +1 -1
- package/dist/BaseModel.d.ts +127 -0
- package/dist/BaseModel.d.ts.map +1 -0
- package/dist/BaseModel.js +250 -0
- package/dist/BaseModel.js.map +1 -0
- package/dist/BaseRepository.d.ts +81 -15
- package/dist/BaseRepository.d.ts.map +1 -1
- package/dist/BaseRepository.js +1433 -387
- package/dist/BaseRepository.js.map +1 -1
- package/dist/ConnectionManager.d.ts +106 -0
- package/dist/ConnectionManager.d.ts.map +1 -0
- package/dist/ConnectionManager.js +228 -0
- package/dist/ConnectionManager.js.map +1 -0
- package/dist/ModelQuery.d.ts +577 -41
- package/dist/ModelQuery.d.ts.map +1 -1
- package/dist/ModelQuery.js +2188 -291
- package/dist/ModelQuery.js.map +1 -1
- package/dist/Transaction.d.ts +71 -1
- package/dist/Transaction.d.ts.map +1 -1
- package/dist/Transaction.js +138 -24
- package/dist/Transaction.js.map +1 -1
- package/dist/adapters/NapiDbAdapter.d.ts +44 -4
- package/dist/adapters/NapiDbAdapter.d.ts.map +1 -1
- package/dist/adapters/NapiDbAdapter.js +131 -13
- package/dist/adapters/NapiDbAdapter.js.map +1 -1
- package/dist/console/contract.d.ts +62 -0
- package/dist/console/contract.d.ts.map +1 -0
- package/dist/console/contract.js +38 -0
- package/dist/console/contract.js.map +1 -0
- package/dist/console/factoryCommands.d.ts +23 -0
- package/dist/console/factoryCommands.d.ts.map +1 -0
- package/dist/console/factoryCommands.js +62 -0
- package/dist/console/factoryCommands.js.map +1 -0
- package/dist/console/migrationCommands.d.ts +78 -0
- package/dist/console/migrationCommands.d.ts.map +1 -0
- package/dist/console/migrationCommands.js +327 -0
- package/dist/console/migrationCommands.js.map +1 -0
- package/dist/console/schemaCheckCommand.d.ts +11 -17
- package/dist/console/schemaCheckCommand.d.ts.map +1 -1
- package/dist/console/schemaCheckCommand.js +21 -15
- package/dist/console/schemaCheckCommand.js.map +1 -1
- package/dist/console/schemaDumpCommand.d.ts +30 -0
- package/dist/console/schemaDumpCommand.d.ts.map +1 -0
- package/dist/console/schemaDumpCommand.js +69 -0
- package/dist/console/schemaDumpCommand.js.map +1 -0
- package/dist/console/schemaGenerateCommand.d.ts +100 -0
- package/dist/console/schemaGenerateCommand.d.ts.map +1 -0
- package/dist/console/schemaGenerateCommand.js +246 -0
- package/dist/console/schemaGenerateCommand.js.map +1 -0
- package/dist/console/seederCommands.d.ts +46 -0
- package/dist/console/seederCommands.d.ts.map +1 -0
- package/dist/console/seederCommands.js +136 -0
- package/dist/console/seederCommands.js.map +1 -0
- package/dist/decorators/entity.d.ts +50 -8
- package/dist/decorators/entity.d.ts.map +1 -1
- package/dist/decorators/entity.js +42 -2
- package/dist/decorators/entity.js.map +1 -1
- package/dist/decorators/hooks.d.ts +3 -3
- package/dist/decorators/hooks.d.ts.map +1 -1
- package/dist/decorators/hooks.js.map +1 -1
- package/dist/events.d.ts +69 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +82 -0
- package/dist/events.js.map +1 -0
- package/dist/factories.d.ts +8 -0
- package/dist/factories.d.ts.map +1 -0
- package/dist/factories.js +8 -0
- package/dist/factories.js.map +1 -0
- package/dist/index.d.ts +15 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/lucid-schema.d.ts +15 -0
- package/dist/lucid-schema.d.ts.map +1 -0
- package/dist/lucid-schema.js +16 -0
- package/dist/lucid-schema.js.map +1 -0
- package/dist/metadata-keys.d.ts +3 -2
- package/dist/metadata-keys.d.ts.map +1 -1
- package/dist/naming/NamingStrategy.d.ts +7 -0
- package/dist/naming/NamingStrategy.d.ts.map +1 -1
- package/dist/naming/NamingStrategy.js +16 -0
- package/dist/naming/NamingStrategy.js.map +1 -1
- package/dist/orm.d.ts +14 -0
- package/dist/orm.d.ts.map +1 -0
- package/dist/orm.js +14 -0
- package/dist/orm.js.map +1 -0
- package/dist/query/DatabaseQueryBuilder.d.ts +557 -0
- package/dist/query/DatabaseQueryBuilder.d.ts.map +1 -0
- package/dist/query/DatabaseQueryBuilder.js +1798 -0
- package/dist/query/DatabaseQueryBuilder.js.map +1 -0
- package/dist/query/DmlBuilder.d.ts +62 -0
- package/dist/query/DmlBuilder.d.ts.map +1 -0
- package/dist/query/DmlBuilder.js +84 -0
- package/dist/query/DmlBuilder.js.map +1 -0
- package/dist/query/QueryBuilder.d.ts +5 -0
- package/dist/query/QueryBuilder.d.ts.map +1 -1
- package/dist/query/QueryBuilder.js +7 -0
- package/dist/query/QueryBuilder.js.map +1 -1
- package/dist/query/RawQueryBuilder.d.ts +47 -0
- package/dist/query/RawQueryBuilder.d.ts.map +1 -0
- package/dist/query/RawQueryBuilder.js +138 -0
- package/dist/query/RawQueryBuilder.js.map +1 -0
- package/dist/query/interpolate.d.ts +45 -0
- package/dist/query/interpolate.d.ts.map +1 -0
- package/dist/query/interpolate.js +51 -0
- package/dist/query/interpolate.js.map +1 -0
- package/dist/query/native.d.ts +8 -0
- package/dist/query/native.d.ts.map +1 -1
- package/dist/query/native.js +14 -0
- package/dist/query/native.js.map +1 -1
- package/dist/query/operators.d.ts +4 -0
- package/dist/query/operators.d.ts.map +1 -0
- package/dist/query/operators.js +27 -0
- package/dist/query/operators.js.map +1 -0
- package/dist/schema/Migration.d.ts +50 -3
- package/dist/schema/Migration.d.ts.map +1 -1
- package/dist/schema/Migration.js +60 -24
- package/dist/schema/Migration.js.map +1 -1
- package/dist/schema/MigrationRunner.d.ts +95 -34
- package/dist/schema/MigrationRunner.d.ts.map +1 -1
- package/dist/schema/MigrationRunner.js +523 -68
- package/dist/schema/MigrationRunner.js.map +1 -1
- package/dist/schema/Schema.d.ts +114 -0
- package/dist/schema/Schema.d.ts.map +1 -1
- package/dist/schema/Schema.js +272 -3
- package/dist/schema/Schema.js.map +1 -1
- package/dist/schema/SchemaDumper.d.ts +121 -0
- package/dist/schema/SchemaDumper.d.ts.map +1 -0
- package/dist/schema/SchemaDumper.js +365 -0
- package/dist/schema/SchemaDumper.js.map +1 -0
- package/dist/schema/Seeder.d.ts +13 -0
- package/dist/schema/Seeder.d.ts.map +1 -1
- package/dist/schema/Seeder.js +28 -5
- package/dist/schema/Seeder.js.map +1 -1
- package/dist/schema/TableBuilder.d.ts +274 -16
- package/dist/schema/TableBuilder.d.ts.map +1 -1
- package/dist/schema/TableBuilder.js +656 -52
- package/dist/schema/TableBuilder.js.map +1 -1
- package/dist/schema/catalog.d.ts +71 -0
- package/dist/schema/catalog.d.ts.map +1 -0
- package/dist/schema/catalog.js +158 -0
- package/dist/schema/catalog.js.map +1 -0
- package/dist/schema/introspect.d.ts +1 -1
- package/dist/schema/introspect.d.ts.map +1 -1
- package/dist/schema/introspect.js +26 -11
- package/dist/schema/introspect.js.map +1 -1
- package/dist/schema/types.d.ts +150 -1
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/types.js +11 -0
- package/dist/schema/types.js.map +1 -1
- package/dist/seeders.d.ts +7 -0
- package/dist/seeders.d.ts.map +1 -0
- package/dist/seeders.js +7 -0
- package/dist/seeders.js.map +1 -0
- package/dist/services/db.d.ts +122 -5
- package/dist/services/db.d.ts.map +1 -1
- package/dist/services/db.js +187 -14
- package/dist/services/db.js.map +1 -1
- package/dist/testing/DatabaseCleanup.d.ts +33 -7
- package/dist/testing/DatabaseCleanup.d.ts.map +1 -1
- package/dist/testing/DatabaseCleanup.js +54 -24
- package/dist/testing/DatabaseCleanup.js.map +1 -1
- package/dist/testing/DbAssertions.d.ts +48 -0
- package/dist/testing/DbAssertions.d.ts.map +1 -0
- package/dist/testing/DbAssertions.js +80 -0
- package/dist/testing/DbAssertions.js.map +1 -0
- package/dist/testing/Factory.d.ts +166 -15
- package/dist/testing/Factory.d.ts.map +1 -1
- package/dist/testing/Factory.js +497 -23
- package/dist/testing/Factory.js.map +1 -1
- package/dist/testing/TestUtils.d.ts +49 -0
- package/dist/testing/TestUtils.d.ts.map +1 -0
- package/dist/testing/TestUtils.js +79 -0
- package/dist/testing/TestUtils.js.map +1 -0
- package/dist/testing/index.d.ts +3 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +3 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/types/relations.d.ts +31 -0
- package/dist/types/relations.d.ts.map +1 -0
- package/dist/types/relations.js +20 -0
- package/dist/types/relations.js.map +1 -0
- package/index.darwin-arm64.node +0 -0
- package/index.darwin-x64.node +0 -0
- package/index.linux-arm64-gnu.node +0 -0
- package/index.linux-x64-gnu.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +32 -2
- package/scripts/guard-publish.mjs +15 -0
- package/src/AtlasProvider.ts +305 -52
- package/src/BaseEntity.ts +460 -41
- package/src/BaseModel.ts +461 -0
- package/src/BaseRepository.ts +1710 -421
- package/src/ConnectionManager.ts +298 -0
- package/src/ModelQuery.ts +2998 -335
- package/src/Transaction.ts +227 -30
- package/src/adapters/NapiDbAdapter.ts +224 -17
- package/src/console/contract.ts +96 -0
- package/src/console/factoryCommands.ts +73 -0
- package/src/console/migrationCommands.ts +448 -0
- package/src/console/schemaCheckCommand.ts +26 -22
- package/src/console/schemaDumpCommand.ts +96 -0
- package/src/console/schemaGenerateCommand.ts +380 -0
- package/src/console/seederCommands.ts +174 -0
- package/src/decorators/entity.ts +71 -8
- package/src/decorators/hooks.ts +5 -3
- package/src/events.ts +117 -0
- package/src/factories.ts +10 -0
- package/src/index.ts +69 -3
- package/src/lucid-schema.ts +22 -0
- package/src/metadata-keys.ts +3 -2
- package/src/naming/NamingStrategy.ts +23 -0
- package/src/orm.ts +13 -0
- package/src/query/DatabaseQueryBuilder.ts +2724 -0
- package/src/query/DmlBuilder.ts +131 -0
- package/src/query/QueryBuilder.ts +8 -0
- package/src/query/RawQueryBuilder.ts +173 -0
- package/src/query/interpolate.ts +73 -0
- package/src/query/native.ts +29 -0
- package/src/query/operators.ts +27 -0
- package/src/schema/Migration.ts +71 -3
- package/src/schema/MigrationRunner.ts +676 -69
- package/src/schema/Schema.ts +359 -3
- package/src/schema/SchemaDumper.ts +518 -0
- package/src/schema/Seeder.ts +47 -10
- package/src/schema/TableBuilder.ts +783 -52
- package/src/schema/catalog.ts +236 -0
- package/src/schema/introspect.ts +26 -9
- package/src/schema/types.ts +137 -2
- package/src/seeders.ts +16 -0
- package/src/services/db.ts +361 -21
- package/src/testing/DatabaseCleanup.ts +78 -25
- package/src/testing/DbAssertions.ts +127 -0
- package/src/testing/Factory.ts +837 -40
- package/src/testing/TestUtils.ts +123 -0
- package/src/testing/index.ts +12 -1
- package/src/types/relations.ts +43 -0
|
@@ -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":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAA0B,QAAQ,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAevE,wDAAwD;AACxD,MAAM,WAAW,GAAG;;;;;;;;CAQnB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAChC,OAA6B;IAE7B,OAAO,MAAM,UAAU;QACtB,MAAM,CAAC,WAAW,GAAG,aAAa,CAAC;QACnC,MAAM,CAAC,WAAW,GAAG,4BAA4B,CAAC;QAClD,0CAA0C;QAC1C,MAAM,CAAC,OAAO,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;QAItE,KAAK,CAAC,GAAG;YACR,qEAAqE;YACrE,mCAAmC;YACnC,IAAI,CAAC;gBACJ,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,CAAC,KAAK,CAAC,gCAAgC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC3D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACR,CAAC;YACD,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;YACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACzD,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC;QACpC,CAAC;KACD,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC5B,OAA6B;IAE7B,OAAO,MAAM,MAAM;QAClB,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC;QAC/B,MAAM,CAAC,WAAW,GACjB,uDAAuD,CAAC;QACzD,MAAM,CAAC,OAAO,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACpC,MAAM,CAAC,KAAK,GAAG;YACd,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE;gBACvB,WAAW,EAAE,qCAAqC;aAClD,CAAC;YACF,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE;gBAC5B,WAAW,EAAE,0BAA0B;aACvC,CAAC;YACF,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE;gBAChC,WAAW,EAAE,+CAA+C;aAC5D,CAAC;YACF,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE;gBAC7B,WAAW,EAAE,mCAAmC;aAChD,CAAC;YACF,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE;gBAC9B,WAAW,EAAE,qDAAqD;aAClE,CAAC;SACF,CAAC;QAQF,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,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;gBAC/B,OAAO,CAAC,IAAI,CACX,sGAAsG,CACtG,CAAC;YACH,CAAC;YACD,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,WAAW,GAChB,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YACjE,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,EAAE;gBACjE,KAAK;gBACL,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,WAAW;aACX,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC;YAC5C,IAAI,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,UAAU,QAAQ,CAAC,MAAM,YAAY,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CACV,QAAQ,CAAC,MAAM;oBACd,CAAC,CAAC,WAAW,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAClC,CAAC,CAAC,mBAAmB,CACtB,CAAC;YACH,CAAC;QACF,CAAC;KACD,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,SAAS,cAAc,CACtB,KAAmC;IAEnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACtE,OAAO,KAAK;SACV,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -46,8 +46,14 @@ export interface ColumnAdapter {
|
|
|
46
46
|
*
|
|
47
47
|
* MUST stay synchronous; the bind layer cannot await before handing values
|
|
48
48
|
* to the Rust DML compiler. Returning a Promise throws.
|
|
49
|
+
*
|
|
50
|
+
* Signature mirrors Adonis Lucid: `(value, attribute, model)`. `attribute` is
|
|
51
|
+
* the model property key; `model` is the entity instance being persisted, or
|
|
52
|
+
* `undefined` on query-builder paths that carry no instance (e.g.
|
|
53
|
+
* `updateWhere`). Both extra args are optional — a one-argument adapter keeps
|
|
54
|
+
* working unchanged.
|
|
49
55
|
*/
|
|
50
|
-
prepare?: (value: unknown) => unknown;
|
|
56
|
+
prepare?: (value: unknown, attribute?: string, model?: unknown) => unknown;
|
|
51
57
|
/**
|
|
52
58
|
* Transform the raw DB value into the model attribute (DB → model). Mirror
|
|
53
59
|
* of Adonis Lucid's `@column.consume`. For entity columns, runs in
|
|
@@ -60,8 +66,12 @@ export interface ColumnAdapter {
|
|
|
60
66
|
* null/undefined inputs to preserve nullable semantics.
|
|
61
67
|
*
|
|
62
68
|
* MUST stay synchronous (same constraint as `prepare`).
|
|
69
|
+
*
|
|
70
|
+
* Signature mirrors Adonis Lucid: `(value, attribute, model)`. `attribute` is
|
|
71
|
+
* the model property key; `model` is the entity being hydrated. Both extra
|
|
72
|
+
* args are optional — a one-argument adapter keeps working unchanged.
|
|
63
73
|
*/
|
|
64
|
-
consume?: (value: unknown) => unknown;
|
|
74
|
+
consume?: (value: unknown, attribute?: string, model?: unknown) => unknown;
|
|
65
75
|
}
|
|
66
76
|
export interface ColumnMetadata extends ColumnAdapter {
|
|
67
77
|
propertyKey: string;
|
|
@@ -69,16 +79,24 @@ export interface ColumnMetadata extends ColumnAdapter {
|
|
|
69
79
|
nullable?: boolean;
|
|
70
80
|
default?: unknown;
|
|
71
81
|
serializeAs?: string | null;
|
|
72
|
-
serialize?: (value: unknown) => unknown;
|
|
82
|
+
serialize?: (value: unknown, attribute?: string, model?: unknown) => unknown;
|
|
83
|
+
/** Explicit DB column name override (AdonisJS Lucid `columnName`). */
|
|
84
|
+
columnName?: string;
|
|
73
85
|
}
|
|
74
86
|
export interface ColumnOptions extends ColumnAdapter {
|
|
75
87
|
type?: string;
|
|
76
88
|
nullable?: boolean;
|
|
77
89
|
default?: unknown;
|
|
90
|
+
/**
|
|
91
|
+
* Map this property to an explicitly-named DB column (AdonisJS Lucid
|
|
92
|
+
* `columnName`), instead of the default `camelCase → snake_case` convention.
|
|
93
|
+
* For legacy/non-conventional schemas, e.g. `@Column({ columnName: 'USR_MAIL' })`.
|
|
94
|
+
*/
|
|
95
|
+
columnName?: string;
|
|
78
96
|
/** Rename this column at `toJSON` time. Use `null` to hide it entirely. */
|
|
79
97
|
serializeAs?: string | null;
|
|
80
98
|
/** Transform the value at `toJSON` time (e.g. mask a phone number, coerce a Date). */
|
|
81
|
-
serialize?: (value: unknown) => unknown;
|
|
99
|
+
serialize?: (value: unknown, attribute?: string, model?: unknown) => unknown;
|
|
82
100
|
}
|
|
83
101
|
type Constructor = new (...args: unknown[]) => unknown;
|
|
84
102
|
export interface ManyToManyOptions {
|
|
@@ -88,6 +106,12 @@ export interface ManyToManyOptions {
|
|
|
88
106
|
foreignKey?: string;
|
|
89
107
|
/** Foreign key in the pivot table pointing to the RELATED entity (default: `${relatedTable}_id`). */
|
|
90
108
|
otherKey?: string;
|
|
109
|
+
/**
|
|
110
|
+
* The column ON THE RELATED model that `otherKey` references (Adonis Lucid
|
|
111
|
+
* `relatedKey`). Defaults to the related model's primary key; override when the
|
|
112
|
+
* pivot points at a non-PK column of the related side.
|
|
113
|
+
*/
|
|
114
|
+
relatedKey?: string;
|
|
91
115
|
/** Pivot extra columns to project into `$extras.pivot_<col>` on loaded relations (Story 31.8). */
|
|
92
116
|
pivotColumns?: string[];
|
|
93
117
|
/** Auto-write `created_at`/`updated_at` on `attach`/`sync` (Story 31.8). */
|
|
@@ -100,8 +124,7 @@ export interface ManyToManyOptions {
|
|
|
100
124
|
* `@Column({ prepare, consume })` for entity columns: `prepare` runs on
|
|
101
125
|
* every `attach()` / `sync()` write, before the value reaches the SQL bind
|
|
102
126
|
* layer; `consume` runs on every load that projects the extra into
|
|
103
|
-
* `$extras.pivot_<col>` (
|
|
104
|
-
* the load-side hook is dormant).
|
|
127
|
+
* `$extras.pivot_<col>` (Adonis Lucid signature `(value, attribute, model)`).
|
|
105
128
|
*
|
|
106
129
|
* Keys are pivot-row column names as written in the SQL (e.g. `amount`);
|
|
107
130
|
* adapters are reused verbatim from `@c9up/atom/atlas` and friends so a
|
|
@@ -226,17 +249,36 @@ export declare function BelongsTo(target: () => Constructor, options?: RelationO
|
|
|
226
249
|
export declare function HasOne(target: () => Constructor, options?: RelationOptions): PropertyDecorator;
|
|
227
250
|
/** @HasMany(() => Related, { localKey, foreignKey, onQuery, serializeAs }) */
|
|
228
251
|
export declare function HasMany(target: () => Constructor, options?: RelationOptions): PropertyDecorator;
|
|
229
|
-
/**
|
|
252
|
+
/**
|
|
253
|
+
* `@HasOneThrough(() => Related, () => Through, { firstKey, secondKey, localKey, secondLocalKey, onQuery })`
|
|
254
|
+
*
|
|
255
|
+
* An atlas addition — Lucid has no hasOneThrough relation. Same two-hop
|
|
256
|
+
* traversal as {@link HasManyThrough}, returning a single row.
|
|
257
|
+
*/
|
|
230
258
|
export declare function HasOneThrough(target: () => Constructor, through: () => Constructor, options?: ThroughOptions): PropertyDecorator;
|
|
231
259
|
/** @HasManyThrough(() => Related, () => Through, { firstKey, secondKey, localKey, secondLocalKey, onQuery }) */
|
|
232
260
|
export declare function HasManyThrough(target: () => Constructor, through: () => Constructor, options?: ThroughOptions): PropertyDecorator;
|
|
233
261
|
/** @ManyToMany(() => Related, { pivotTable: 'users_roles' }) */
|
|
234
262
|
export declare function ManyToMany(target: () => Constructor, options: ManyToManyOptions & RelationOptions): PropertyDecorator;
|
|
263
|
+
export declare const belongsTo: typeof BelongsTo;
|
|
264
|
+
export declare const hasOne: typeof HasOne;
|
|
265
|
+
export declare const hasMany: typeof HasMany;
|
|
266
|
+
export declare const hasOneThrough: typeof HasOneThrough;
|
|
267
|
+
export declare const hasManyThrough: typeof HasManyThrough;
|
|
268
|
+
export declare const manyToMany: typeof ManyToMany;
|
|
235
269
|
/** Get entity metadata for a class. */
|
|
236
270
|
export declare function getEntityMetadata(target: Constructor): EntityMetadata | undefined;
|
|
271
|
+
/**
|
|
272
|
+
* Return the class's `@Entity` metadata, SYNTHESIZING it when the decorator is
|
|
273
|
+
* absent: the table name is inferred from the class name via the naming strategy
|
|
274
|
+
* (or an explicit `static table`). AdonisJS Lucid parity — a model needs no
|
|
275
|
+
* explicit `@Entity('table')`. Used by both `BaseModel` and the `BaseRepository`
|
|
276
|
+
* constructor so the Data-Mapper and Active-Record paths share one convention.
|
|
277
|
+
*/
|
|
278
|
+
export declare function ensureEntityMetadata(target: Constructor): EntityMetadata;
|
|
237
279
|
/** Get column metadata for a class (returns a copy). */
|
|
238
280
|
export declare function getColumnMetadata(target: Constructor): ColumnMetadata[];
|
|
239
|
-
/** Get primary key property name. */
|
|
281
|
+
/** Get primary key property name. A `static primaryKey` (AdonisJS Lucid) wins over the `@PrimaryKey()` decorator. */
|
|
240
282
|
export declare function getPrimaryKey(target: Constructor): string | undefined;
|
|
241
283
|
/** Get relation metadata for a class (returns a copy). */
|
|
242
284
|
export declare function getRelationMetadata(target: Constructor): RelationMetadata[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/decorators/entity.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/decorators/entity.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import "reflect-metadata";
|
|
7
7
|
import { COLUMN_SERIALIZE_KEY, COMPUTED_KEY, } from "../metadata-keys.js";
|
|
8
|
+
import { getNamingStrategy } from "../naming/NamingStrategy.js";
|
|
8
9
|
const ENTITY_KEY = Symbol("atlas:entity");
|
|
9
10
|
const COLUMNS_KEY = Symbol("atlas:columns");
|
|
10
11
|
const PRIMARY_KEY = Symbol("atlas:primary");
|
|
@@ -32,6 +33,7 @@ export function Column(options) {
|
|
|
32
33
|
serialize: options?.serialize,
|
|
33
34
|
prepare: options?.prepare,
|
|
34
35
|
consume: options?.consume,
|
|
36
|
+
columnName: options?.columnName,
|
|
35
37
|
});
|
|
36
38
|
Reflect.defineMetadata(COLUMNS_KEY, columns, target.constructor);
|
|
37
39
|
}
|
|
@@ -202,7 +204,12 @@ export function HasMany(target, options = {}) {
|
|
|
202
204
|
});
|
|
203
205
|
};
|
|
204
206
|
}
|
|
205
|
-
/**
|
|
207
|
+
/**
|
|
208
|
+
* `@HasOneThrough(() => Related, () => Through, { firstKey, secondKey, localKey, secondLocalKey, onQuery })`
|
|
209
|
+
*
|
|
210
|
+
* An atlas addition — Lucid has no hasOneThrough relation. Same two-hop
|
|
211
|
+
* traversal as {@link HasManyThrough}, returning a single row.
|
|
212
|
+
*/
|
|
206
213
|
export function HasOneThrough(target, through, options = {}) {
|
|
207
214
|
return (proto, propertyKey) => {
|
|
208
215
|
addRelation(proto.constructor, {
|
|
@@ -234,11 +241,25 @@ export function ManyToMany(target, options) {
|
|
|
234
241
|
type: "manyToMany",
|
|
235
242
|
target,
|
|
236
243
|
pivot: options,
|
|
244
|
+
// `localKey` selects which parent column the pivot FK references
|
|
245
|
+
// (default: the parent PK). Without copying it here the value the type
|
|
246
|
+
// accepts is silently dropped and the pivot always targets the PK.
|
|
247
|
+
localKey: options.localKey,
|
|
237
248
|
onQuery: options.onQuery,
|
|
238
249
|
serializeAs: options.serializeAs,
|
|
239
250
|
});
|
|
240
251
|
};
|
|
241
252
|
}
|
|
253
|
+
// camelCase aliases matching Adonis Lucid's decorator naming (`@belongsTo`,
|
|
254
|
+
// `@hasMany`, `@manyToMany`, …), alongside atlas's PascalCase originals — so a
|
|
255
|
+
// migration/model copied from Lucid resolves without renaming. Same decorators,
|
|
256
|
+
// same options; just the Lucid-idiomatic spelling.
|
|
257
|
+
export const belongsTo = BelongsTo;
|
|
258
|
+
export const hasOne = HasOne;
|
|
259
|
+
export const hasMany = HasMany;
|
|
260
|
+
export const hasOneThrough = HasOneThrough;
|
|
261
|
+
export const hasManyThrough = HasManyThrough;
|
|
262
|
+
export const manyToMany = ManyToMany;
|
|
242
263
|
function addRelation(target, relation) {
|
|
243
264
|
const relations = Reflect.getOwnMetadata(RELATIONS_KEY, target) ?? [];
|
|
244
265
|
relations.push(relation);
|
|
@@ -248,12 +269,31 @@ function addRelation(target, relation) {
|
|
|
248
269
|
export function getEntityMetadata(target) {
|
|
249
270
|
return Reflect.getMetadata(ENTITY_KEY, target);
|
|
250
271
|
}
|
|
272
|
+
/**
|
|
273
|
+
* Return the class's `@Entity` metadata, SYNTHESIZING it when the decorator is
|
|
274
|
+
* absent: the table name is inferred from the class name via the naming strategy
|
|
275
|
+
* (or an explicit `static table`). AdonisJS Lucid parity — a model needs no
|
|
276
|
+
* explicit `@Entity('table')`. Used by both `BaseModel` and the `BaseRepository`
|
|
277
|
+
* constructor so the Data-Mapper and Active-Record paths share one convention.
|
|
278
|
+
*/
|
|
279
|
+
export function ensureEntityMetadata(target) {
|
|
280
|
+
const existing = getEntityMetadata(target);
|
|
281
|
+
if (existing)
|
|
282
|
+
return existing;
|
|
283
|
+
const staticTable = target.table;
|
|
284
|
+
const table = staticTable ?? getNamingStrategy(target).tableName(target.name);
|
|
285
|
+
Entity(table)(target);
|
|
286
|
+
return getEntityMetadata(target) ?? { tableName: table };
|
|
287
|
+
}
|
|
251
288
|
/** Get column metadata for a class (returns a copy). */
|
|
252
289
|
export function getColumnMetadata(target) {
|
|
253
290
|
return [...(Reflect.getMetadata(COLUMNS_KEY, target) ?? [])];
|
|
254
291
|
}
|
|
255
|
-
/** Get primary key property name. */
|
|
292
|
+
/** Get primary key property name. A `static primaryKey` (AdonisJS Lucid) wins over the `@PrimaryKey()` decorator. */
|
|
256
293
|
export function getPrimaryKey(target) {
|
|
294
|
+
const staticPk = target.primaryKey;
|
|
295
|
+
if (staticPk)
|
|
296
|
+
return staticPk;
|
|
257
297
|
return Reflect.getMetadata(PRIMARY_KEY, target);
|
|
258
298
|
}
|
|
259
299
|
/** Get relation metadata for a class (returns a copy). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../../src/decorators/entity.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EACN,oBAAoB,EACpB,YAAY,GAEZ,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../../src/decorators/entity.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import "reflect-metadata";
|
|
21
21
|
import type { BaseEntity } from "../BaseEntity.js";
|
|
22
|
-
import type { ModelQuery } from "../ModelQuery.js";
|
|
22
|
+
import type { ModelQuery, Paginator } from "../ModelQuery.js";
|
|
23
23
|
/** All hook kinds Atlas supports — mirrors Lucid's surface. */
|
|
24
24
|
export type HookKind = "beforeSave" | "afterSave" | "beforeCreate" | "afterCreate" | "beforeUpdate" | "afterUpdate" | "beforeDelete" | "afterDelete" | "beforeFind" | "afterFind" | "beforeFetch" | "afterFetch" | "beforePaginate" | "afterPaginate";
|
|
25
25
|
/** Argument shape for each hook kind. */
|
|
@@ -36,8 +36,8 @@ export interface HookArgs {
|
|
|
36
36
|
afterFind: BaseEntity | null;
|
|
37
37
|
beforeFetch: ModelQuery<BaseEntity>;
|
|
38
38
|
afterFetch: BaseEntity[];
|
|
39
|
-
beforePaginate: ModelQuery<BaseEntity
|
|
40
|
-
afterPaginate: BaseEntity
|
|
39
|
+
beforePaginate: [ModelQuery<BaseEntity>, ModelQuery<BaseEntity>];
|
|
40
|
+
afterPaginate: Paginator<BaseEntity>;
|
|
41
41
|
}
|
|
42
42
|
/** A hook handler is a static function that receives the kind-specific arg. */
|
|
43
43
|
export type HookHandler<K extends HookKind = HookKind> = (arg: HookArgs[K]) => void | Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/decorators/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/decorators/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE9D,+DAA+D;AAC/D,MAAM,MAAM,QAAQ,GACjB,YAAY,GACZ,WAAW,GACX,cAAc,GACd,aAAa,GACb,cAAc,GACd,aAAa,GACb,cAAc,GACd,aAAa,GACb,YAAY,GACZ,WAAW,GACX,aAAa,GACb,YAAY,GACZ,gBAAgB,GAChB,eAAe,CAAC;AAEnB,yCAAyC;AACzC,MAAM,WAAW,QAAQ;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,UAAU,CAAC;IACtB,YAAY,EAAE,UAAU,CAAC;IACzB,WAAW,EAAE,UAAU,CAAC;IACxB,YAAY,EAAE,UAAU,CAAC;IACzB,WAAW,EAAE,UAAU,CAAC;IACxB,YAAY,EAAE,UAAU,CAAC;IACzB,WAAW,EAAE,UAAU,CAAC;IACxB,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IACnC,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IACpC,UAAU,EAAE,UAAU,EAAE,CAAC;IAGzB,cAAc,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,aAAa,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;CACrC;AAED,+EAA+E;AAC/E,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,IAAI,CACxD,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,KACZ,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AA8C1B,eAAO,MAAM,UAAU,QAAO,eAAyC,CAAC;AACxE,eAAO,MAAM,SAAS,QAAO,eAAwC,CAAC;AACtE,eAAO,MAAM,YAAY,QAAO,eAA2C,CAAC;AAC5E,eAAO,MAAM,WAAW,QAAO,eAA0C,CAAC;AAC1E,eAAO,MAAM,YAAY,QAAO,eAA2C,CAAC;AAC5E,eAAO,MAAM,WAAW,QAAO,eAA0C,CAAC;AAC1E,eAAO,MAAM,YAAY,QAAO,eAA2C,CAAC;AAC5E,eAAO,MAAM,WAAW,QAAO,eAA0C,CAAC;AAC1E,eAAO,MAAM,UAAU,QAAO,eAAyC,CAAC;AACxE,eAAO,MAAM,SAAS,QAAO,eAAwC,CAAC;AACtE,eAAO,MAAM,WAAW,QAAO,eAA0C,CAAC;AAC1E,eAAO,MAAM,UAAU,QAAO,eAAyC,CAAC;AACxE,eAAO,MAAM,cAAc,QAAO,eAA6C,CAAC;AAChF,eAAO,MAAM,aAAa,QAAO,eAA4C,CAAC;AAE9E;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,QAAQ,EAC9C,WAAW,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,UAAU,EACnD,IAAI,EAAE,CAAC,GACL,WAAW,CAAC,CAAC,CAAC,EAAE,CAqBlB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,CAAC,SAAS,QAAQ,EACjD,WAAW,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,UAAU,EACnD,IAAI,EAAE,CAAC,EACP,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,GACd,OAAO,CAAC,IAAI,CAAC,CAKf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/decorators/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/decorators/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query observability — atlas's equivalent of Lucid's `db:query` event.
|
|
3
|
+
*
|
|
4
|
+
* Agnostic by design: atlas cannot import the framework's emitter (it is a
|
|
5
|
+
* standalone package), so it owns a tiny listener registry instead. An
|
|
6
|
+
* integration package bridges it to whatever emitter the app uses:
|
|
7
|
+
*
|
|
8
|
+
* onDbQuery((event) => emitter.emit('db:query', event))
|
|
9
|
+
*
|
|
10
|
+
* Emission is opt-in. It costs a `performance.now()` pair per query, so it only
|
|
11
|
+
* happens when a connection is configured with `debug: true` or a single query
|
|
12
|
+
* asks via `.debug()` — and even then, only if someone is listening.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* A single executed SQL statement. Mirrors Lucid's `db:query` payload, minus
|
|
16
|
+
* the fields that only make sense inside AdonisJS.
|
|
17
|
+
*/
|
|
18
|
+
export interface DbQueryEvent {
|
|
19
|
+
/** The SQL as sent to the driver, placeholders included. */
|
|
20
|
+
sql: string;
|
|
21
|
+
/** The bound parameters. Never interpolated into `sql`. */
|
|
22
|
+
bindings: readonly unknown[];
|
|
23
|
+
/** Wall-clock duration in milliseconds, including the NAPI round-trip. */
|
|
24
|
+
duration: number;
|
|
25
|
+
/** Connection name, when the app named it. */
|
|
26
|
+
connection?: string;
|
|
27
|
+
/** Entity class name, when the query came from a repository/model. */
|
|
28
|
+
model?: string;
|
|
29
|
+
/** The call that produced it (`exec`, `first`, `paginate`, …). */
|
|
30
|
+
method?: string;
|
|
31
|
+
/** True for schema statements (migrations), false for DML/queries. */
|
|
32
|
+
ddl?: boolean;
|
|
33
|
+
/** True when the statement ran inside an interactive transaction. */
|
|
34
|
+
inTransaction?: boolean;
|
|
35
|
+
/** Set when the statement threw — the event is emitted either way. */
|
|
36
|
+
error?: Error;
|
|
37
|
+
/**
|
|
38
|
+
* Arbitrary metadata a caller attached via `query.reporterData({...})`
|
|
39
|
+
* (Adonis Lucid `reporterData`) — request id, user id, feature flag, …
|
|
40
|
+
*/
|
|
41
|
+
reporterData?: Record<string, unknown>;
|
|
42
|
+
}
|
|
43
|
+
export type DbQueryListener = (event: DbQueryEvent) => void;
|
|
44
|
+
/**
|
|
45
|
+
* Subscribe to every observed query. Returns an unsubscribe function.
|
|
46
|
+
*
|
|
47
|
+
* A listener that throws would otherwise take down the query that triggered it,
|
|
48
|
+
* so throws are swallowed — observability must never change behaviour.
|
|
49
|
+
*/
|
|
50
|
+
export declare function onDbQuery(listener: DbQueryListener): () => void;
|
|
51
|
+
/** Remove every listener. Intended for test teardown. */
|
|
52
|
+
export declare function clearDbQueryListeners(): void;
|
|
53
|
+
/**
|
|
54
|
+
* Whether anyone is listening. Checked before timing a query so the
|
|
55
|
+
* instrumentation costs nothing when unused.
|
|
56
|
+
*/
|
|
57
|
+
export declare function hasDbQueryListeners(): boolean;
|
|
58
|
+
/** Emit to every listener. Package-internal. */
|
|
59
|
+
export declare function emitDbQuery(event: DbQueryEvent): void;
|
|
60
|
+
/**
|
|
61
|
+
* Render a query event as a single log line (Lucid's `prettyPrint`).
|
|
62
|
+
*
|
|
63
|
+
* The bindings are appended as JSON, NOT interpolated into the SQL: an
|
|
64
|
+
* interpolated line reads like runnable SQL while having none of the escaping
|
|
65
|
+
* that made the real statement safe, and it is exactly the string someone
|
|
66
|
+
* copies into a console later.
|
|
67
|
+
*/
|
|
68
|
+
export declare function prettyPrintQuery(event: DbQueryEvent): string;
|
|
69
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC5B,4DAA4D;IAC5D,GAAG,EAAE,MAAM,CAAC;IACZ,2DAA2D;IAC3D,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,qEAAqE;IACrE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,KAAK,CAAC,EAAE,KAAK,CAAC;IACd;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;AAI5D;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,IAAI,CAK/D;AAED,yDAAyD;AACzD,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAQrD;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAY5D"}
|
package/dist/events.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query observability — atlas's equivalent of Lucid's `db:query` event.
|
|
3
|
+
*
|
|
4
|
+
* Agnostic by design: atlas cannot import the framework's emitter (it is a
|
|
5
|
+
* standalone package), so it owns a tiny listener registry instead. An
|
|
6
|
+
* integration package bridges it to whatever emitter the app uses:
|
|
7
|
+
*
|
|
8
|
+
* onDbQuery((event) => emitter.emit('db:query', event))
|
|
9
|
+
*
|
|
10
|
+
* Emission is opt-in. It costs a `performance.now()` pair per query, so it only
|
|
11
|
+
* happens when a connection is configured with `debug: true` or a single query
|
|
12
|
+
* asks via `.debug()` — and even then, only if someone is listening.
|
|
13
|
+
*/
|
|
14
|
+
const listeners = new Set();
|
|
15
|
+
/**
|
|
16
|
+
* Subscribe to every observed query. Returns an unsubscribe function.
|
|
17
|
+
*
|
|
18
|
+
* A listener that throws would otherwise take down the query that triggered it,
|
|
19
|
+
* so throws are swallowed — observability must never change behaviour.
|
|
20
|
+
*/
|
|
21
|
+
export function onDbQuery(listener) {
|
|
22
|
+
listeners.add(listener);
|
|
23
|
+
return () => {
|
|
24
|
+
listeners.delete(listener);
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** Remove every listener. Intended for test teardown. */
|
|
28
|
+
export function clearDbQueryListeners() {
|
|
29
|
+
listeners.clear();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Whether anyone is listening. Checked before timing a query so the
|
|
33
|
+
* instrumentation costs nothing when unused.
|
|
34
|
+
*/
|
|
35
|
+
export function hasDbQueryListeners() {
|
|
36
|
+
return listeners.size > 0;
|
|
37
|
+
}
|
|
38
|
+
/** Emit to every listener. Package-internal. */
|
|
39
|
+
export function emitDbQuery(event) {
|
|
40
|
+
for (const listener of listeners) {
|
|
41
|
+
try {
|
|
42
|
+
listener(event);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// A broken listener must not fail the query it is reporting on.
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Render a query event as a single log line (Lucid's `prettyPrint`).
|
|
51
|
+
*
|
|
52
|
+
* The bindings are appended as JSON, NOT interpolated into the SQL: an
|
|
53
|
+
* interpolated line reads like runnable SQL while having none of the escaping
|
|
54
|
+
* that made the real statement safe, and it is exactly the string someone
|
|
55
|
+
* copies into a console later.
|
|
56
|
+
*/
|
|
57
|
+
export function prettyPrintQuery(event) {
|
|
58
|
+
const parts = [`${event.duration.toFixed(2)}ms`];
|
|
59
|
+
if (event.connection)
|
|
60
|
+
parts.push(event.connection);
|
|
61
|
+
if (event.model)
|
|
62
|
+
parts.push(event.model);
|
|
63
|
+
if (event.method)
|
|
64
|
+
parts.push(event.method);
|
|
65
|
+
if (event.inTransaction)
|
|
66
|
+
parts.push("trx");
|
|
67
|
+
if (event.error)
|
|
68
|
+
parts.push(`ERROR: ${event.error.message}`);
|
|
69
|
+
const head = `[atlas] ${parts.join(" ")}`;
|
|
70
|
+
const bindings = event.bindings.length > 0 ? ` -- ${safeJson(event.bindings)}` : "";
|
|
71
|
+
return `${head} ${event.sql}${bindings}`;
|
|
72
|
+
}
|
|
73
|
+
/** JSON that can't throw on a circular / non-serialisable binding. */
|
|
74
|
+
function safeJson(value) {
|
|
75
|
+
try {
|
|
76
|
+
return JSON.stringify(value, (_k, v) => typeof v === "bigint" ? `${v}n` : v);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return "[unserialisable bindings]";
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAkCH,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,QAAyB;IAClD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE;QACX,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,qBAAqB;IACpC,SAAS,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IAClC,OAAO,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,WAAW,CAAC,KAAmB;IAC9C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC;YACJ,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACR,gEAAgE;QACjE,CAAC;IACF,CAAC;AACF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAmB;IACnD,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,aAAa;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAE7D,MAAM,IAAI,GAAG,WAAW,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1C,MAAM,QAAQ,GACb,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,GAAG,IAAI,IAAI,KAAK,CAAC,GAAG,GAAG,QAAQ,EAAE,CAAC;AAC1C,CAAC;AAED,sEAAsE;AACtE,SAAS,QAAQ,CAAC,KAAc;IAC/B,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CACtC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACnC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,2BAA2B,CAAC;IACpC,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@c9up/atlas/factories` — Adonis Lucid `@adonisjs/lucid/factories` parity
|
|
3
|
+
* subpath. The model factory: `Factory.define(Model, cb).build()` (or the
|
|
4
|
+
* `factory()` shorthand) for generating and persisting test data.
|
|
5
|
+
*/
|
|
6
|
+
export { type FactoryCommandOptions, makeFactoryCommand, } from "./console/factoryCommands.js";
|
|
7
|
+
export { Factory, type FactoryBuilder, factory } from "./testing/Factory.js";
|
|
8
|
+
//# sourceMappingURL=factories.d.ts.map
|