@c9up/atlas 0.1.3 → 0.1.4

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 (143) hide show
  1. package/db.darwin-arm64.node +0 -0
  2. package/db.darwin-x64.node +0 -0
  3. package/db.linux-arm64-gnu.node +0 -0
  4. package/db.linux-x64-gnu.node +0 -0
  5. package/db.win32-x64-msvc.node +0 -0
  6. package/dist/AtlasProvider.d.ts +106 -0
  7. package/dist/AtlasProvider.d.ts.map +1 -0
  8. package/dist/AtlasProvider.js +190 -0
  9. package/dist/AtlasProvider.js.map +1 -0
  10. package/dist/BaseEntity.d.ts +255 -0
  11. package/dist/BaseEntity.d.ts.map +1 -0
  12. package/dist/BaseEntity.js +420 -0
  13. package/dist/BaseEntity.js.map +1 -0
  14. package/dist/BaseRepository.d.ts +175 -0
  15. package/dist/BaseRepository.d.ts.map +1 -0
  16. package/dist/BaseRepository.js +1394 -0
  17. package/dist/BaseRepository.js.map +1 -0
  18. package/dist/ModelQuery.d.ts +338 -0
  19. package/dist/ModelQuery.d.ts.map +1 -0
  20. package/dist/ModelQuery.js +1598 -0
  21. package/dist/ModelQuery.js.map +1 -0
  22. package/dist/Transaction.d.ts +15 -0
  23. package/dist/Transaction.d.ts.map +1 -0
  24. package/dist/Transaction.js +67 -0
  25. package/dist/Transaction.js.map +1 -0
  26. package/dist/adapters/NapiDbAdapter.d.ts +34 -0
  27. package/dist/adapters/NapiDbAdapter.d.ts.map +1 -0
  28. package/dist/adapters/NapiDbAdapter.js +96 -0
  29. package/dist/adapters/NapiDbAdapter.js.map +1 -0
  30. package/dist/config.d.ts +4 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +4 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/configure.d.ts +10 -0
  35. package/dist/configure.d.ts.map +1 -0
  36. package/dist/configure.js +25 -0
  37. package/dist/configure.js.map +1 -0
  38. package/dist/decorators/entity.d.ts +235 -0
  39. package/dist/decorators/entity.d.ts.map +1 -0
  40. package/dist/decorators/entity.js +264 -0
  41. package/dist/decorators/entity.js.map +1 -0
  42. package/dist/decorators/hooks.d.ts +70 -0
  43. package/dist/decorators/hooks.d.ts.map +1 -0
  44. package/dist/decorators/hooks.js +107 -0
  45. package/dist/decorators/hooks.js.map +1 -0
  46. package/dist/decorators/scope.d.ts +35 -0
  47. package/dist/decorators/scope.d.ts.map +1 -0
  48. package/dist/decorators/scope.js +29 -0
  49. package/dist/decorators/scope.js.map +1 -0
  50. package/dist/errors.d.ts +54 -0
  51. package/dist/errors.d.ts.map +1 -0
  52. package/dist/errors.js +82 -0
  53. package/dist/errors.js.map +1 -0
  54. package/dist/index.d.ts +39 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +28 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/naming/NamingStrategy.d.ts +52 -0
  59. package/dist/naming/NamingStrategy.d.ts.map +1 -0
  60. package/dist/naming/NamingStrategy.js +65 -0
  61. package/dist/naming/NamingStrategy.js.map +1 -0
  62. package/dist/query/QueryBuilder.d.ts +95 -0
  63. package/dist/query/QueryBuilder.d.ts.map +1 -0
  64. package/dist/query/QueryBuilder.js +310 -0
  65. package/dist/query/QueryBuilder.js.map +1 -0
  66. package/dist/query/native.d.ts +18 -0
  67. package/dist/query/native.d.ts.map +1 -0
  68. package/dist/query/native.js +49 -0
  69. package/dist/query/native.js.map +1 -0
  70. package/dist/schema/Migration.d.ts +55 -0
  71. package/dist/schema/Migration.d.ts.map +1 -0
  72. package/dist/schema/Migration.js +68 -0
  73. package/dist/schema/Migration.js.map +1 -0
  74. package/dist/schema/MigrationRunner.d.ts +115 -0
  75. package/dist/schema/MigrationRunner.d.ts.map +1 -0
  76. package/dist/schema/MigrationRunner.js +402 -0
  77. package/dist/schema/MigrationRunner.js.map +1 -0
  78. package/dist/schema/Schema.d.ts +22 -0
  79. package/dist/schema/Schema.d.ts.map +1 -0
  80. package/dist/schema/Schema.js +51 -0
  81. package/dist/schema/Schema.js.map +1 -0
  82. package/dist/schema/SchemaBuilder.d.ts +14 -0
  83. package/dist/schema/SchemaBuilder.d.ts.map +1 -0
  84. package/dist/schema/SchemaBuilder.js +13 -0
  85. package/dist/schema/SchemaBuilder.js.map +1 -0
  86. package/dist/schema/Seeder.d.ts +54 -0
  87. package/dist/schema/Seeder.d.ts.map +1 -0
  88. package/dist/schema/Seeder.js +89 -0
  89. package/dist/schema/Seeder.js.map +1 -0
  90. package/dist/schema/TableBuilder.d.ts +86 -0
  91. package/dist/schema/TableBuilder.d.ts.map +1 -0
  92. package/dist/schema/TableBuilder.js +211 -0
  93. package/dist/schema/TableBuilder.js.map +1 -0
  94. package/dist/schema/types.d.ts +28 -0
  95. package/dist/schema/types.d.ts.map +1 -0
  96. package/dist/schema/types.js +19 -0
  97. package/dist/schema/types.js.map +1 -0
  98. package/dist/services/db.d.ts +22 -0
  99. package/dist/services/db.d.ts.map +1 -0
  100. package/dist/services/db.js +37 -0
  101. package/dist/services/db.js.map +1 -0
  102. package/dist/testing/DatabaseCleanup.d.ts +19 -0
  103. package/dist/testing/DatabaseCleanup.d.ts.map +1 -0
  104. package/dist/testing/DatabaseCleanup.js +40 -0
  105. package/dist/testing/DatabaseCleanup.js.map +1 -0
  106. package/dist/testing/Factory.d.ts +59 -0
  107. package/dist/testing/Factory.d.ts.map +1 -0
  108. package/dist/testing/Factory.js +105 -0
  109. package/dist/testing/Factory.js.map +1 -0
  110. package/dist/testing/TestDatabase.d.ts +25 -0
  111. package/dist/testing/TestDatabase.d.ts.map +1 -0
  112. package/dist/testing/TestDatabase.js +52 -0
  113. package/dist/testing/TestDatabase.js.map +1 -0
  114. package/dist/testing/index.d.ts +4 -0
  115. package/dist/testing/index.d.ts.map +1 -0
  116. package/dist/testing/index.js +4 -0
  117. package/dist/testing/index.js.map +1 -0
  118. package/dist/utils/casing.d.ts +5 -0
  119. package/dist/utils/casing.d.ts.map +1 -0
  120. package/dist/utils/casing.js +9 -0
  121. package/dist/utils/casing.js.map +1 -0
  122. package/dist/utils/dialectFromUrl.d.ts +10 -0
  123. package/dist/utils/dialectFromUrl.d.ts.map +1 -0
  124. package/dist/utils/dialectFromUrl.js +8 -0
  125. package/dist/utils/dialectFromUrl.js.map +1 -0
  126. package/dist/utils/identifier.d.ts +19 -0
  127. package/dist/utils/identifier.d.ts.map +1 -0
  128. package/dist/utils/identifier.js +27 -0
  129. package/dist/utils/identifier.js.map +1 -0
  130. package/dist/utils/safePath.d.ts +22 -0
  131. package/dist/utils/safePath.d.ts.map +1 -0
  132. package/dist/utils/safePath.js +46 -0
  133. package/dist/utils/safePath.js.map +1 -0
  134. package/dist/utils/transactionBrand.d.ts +5 -0
  135. package/dist/utils/transactionBrand.d.ts.map +1 -0
  136. package/dist/utils/transactionBrand.js +5 -0
  137. package/dist/utils/transactionBrand.js.map +1 -0
  138. package/index.darwin-arm64.node +0 -0
  139. package/index.darwin-x64.node +0 -0
  140. package/index.linux-arm64-gnu.node +0 -0
  141. package/index.linux-x64-gnu.node +0 -0
  142. package/index.win32-x64-msvc.node +0 -0
  143. package/package.json +1 -1
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Model Factory — Lucid-compatible factory surface for generating test data.
3
+ *
4
+ * Supports named states (variations), relations (nested `with`), many-to-many
5
+ * pivot attributes, stubbing (build without persisting), and ad-hoc merges.
6
+ *
7
+ * const UserFactory = factory(User, () => ({ email: `user-${Date.now()}@test.com`, name: 'Test' }))
8
+ * .state('admin', (u) => { u.role = 'admin' })
9
+ *
10
+ * const user = await UserFactory.create(db)
11
+ * const users = await UserFactory.apply('admin').createMany(5, db)
12
+ * const draft = UserFactory.merge({ name: 'Alice' }).makeStubbed()
13
+ *
14
+ * @implements MISS-18, Story 32.13
15
+ */
16
+ import type { BaseEntity } from "../BaseEntity.js";
17
+ import { type DatabaseConnection } from "../BaseRepository.js";
18
+ type EntityConstructor<T extends BaseEntity> = new () => T;
19
+ /** A named state — mutates an in-progress data object in place. */
20
+ type StateFn<D> = (data: D) => void;
21
+ export interface FactoryBuilder<T extends BaseEntity> {
22
+ /** Override specific fields for the next call (reset after consumption). */
23
+ merge(overrides: Partial<Record<string, unknown>>): FactoryBuilder<T>;
24
+ /**
25
+ * Declare a named variation of this factory. States are stored on the
26
+ * factory itself and don't mutate the caller — `apply()` returns a child
27
+ * builder with the state active.
28
+ */
29
+ state(name: string, fn: StateFn<Record<string, unknown>>): FactoryBuilder<T>;
30
+ /**
31
+ * Activate one or more declared states for the next call. Multiple applies
32
+ * compose (all applied states fire, in order).
33
+ */
34
+ apply(...stateNames: string[]): FactoryBuilder<T>;
35
+ /** Create and persist a single entity (fires lifecycle hooks via `repo.create`). */
36
+ create(db: DatabaseConnection): Promise<T>;
37
+ /** Create and persist multiple entities (fires hooks per row). */
38
+ createMany(count: number, db: DatabaseConnection): Promise<T[]>;
39
+ /** Build the data object without persisting and without instantiating an entity. */
40
+ make(): Record<string, unknown>;
41
+ /** Build multiple data objects without persisting. */
42
+ makeMany(count: number): Record<string, unknown>[];
43
+ /**
44
+ * Build an entity INSTANCE without persisting it (Lucid's `makeStubbed`).
45
+ * Useful when you need a `new User()` object but want to avoid the DB.
46
+ */
47
+ makeStubbed(): T;
48
+ }
49
+ /**
50
+ * Define a model factory.
51
+ *
52
+ * const UserFactory = factory(User, () => ({
53
+ * email: `user-${Date.now()}@test.com`,
54
+ * name: 'Test User',
55
+ * }))
56
+ */
57
+ export declare function factory<T extends BaseEntity>(entityClass: EntityConstructor<T>, defaults: () => Record<string, unknown>): FactoryBuilder<T>;
58
+ export {};
59
+ //# sourceMappingURL=Factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Factory.d.ts","sourceRoot":"","sources":["../../src/testing/Factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,KAAK,iBAAiB,CAAC,CAAC,SAAS,UAAU,IAAI,UAAU,CAAC,CAAC;AAE3D,mEAAmE;AACnE,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAEpC,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,UAAU;IACnD,4EAA4E;IAC5E,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAEtE;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAE7E;;;OAGG;IACH,KAAK,CAAC,GAAG,UAAU,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAElD,oFAAoF;IACpF,MAAM,CAAC,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAE3C,kEAAkE;IAClE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAEhE,oFAAoF;IACpF,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEhC,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAEnD;;;OAGG;IACH,WAAW,IAAI,CAAC,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,UAAU,EAC3C,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC,EACjC,QAAQ,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,cAAc,CAAC,CAAC,CAAC,CA4FnB"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Model Factory — Lucid-compatible factory surface for generating test data.
3
+ *
4
+ * Supports named states (variations), relations (nested `with`), many-to-many
5
+ * pivot attributes, stubbing (build without persisting), and ad-hoc merges.
6
+ *
7
+ * const UserFactory = factory(User, () => ({ email: `user-${Date.now()}@test.com`, name: 'Test' }))
8
+ * .state('admin', (u) => { u.role = 'admin' })
9
+ *
10
+ * const user = await UserFactory.create(db)
11
+ * const users = await UserFactory.apply('admin').createMany(5, db)
12
+ * const draft = UserFactory.merge({ name: 'Alice' }).makeStubbed()
13
+ *
14
+ * @implements MISS-18, Story 32.13
15
+ */
16
+ import { BaseRepository } from "../BaseRepository.js";
17
+ /**
18
+ * Define a model factory.
19
+ *
20
+ * const UserFactory = factory(User, () => ({
21
+ * email: `user-${Date.now()}@test.com`,
22
+ * name: 'Test User',
23
+ * }))
24
+ */
25
+ export function factory(entityClass, defaults) {
26
+ // Persistent state — lives across calls.
27
+ const states = new Map();
28
+ // Transient state — resets after every `make`/`create`.
29
+ let pendingOverrides = {};
30
+ let pendingStates = [];
31
+ const buildData = () => {
32
+ const data = {
33
+ ...defaults(),
34
+ ...pendingOverrides,
35
+ };
36
+ for (const name of pendingStates) {
37
+ const fn = states.get(name);
38
+ if (!fn)
39
+ throw new Error(`Factory state '${name}' is not defined on ${entityClass.name}Factory`);
40
+ fn(data);
41
+ }
42
+ return data;
43
+ };
44
+ const resetPending = () => {
45
+ pendingOverrides = {};
46
+ pendingStates = [];
47
+ };
48
+ const builder = {
49
+ merge(overrides) {
50
+ pendingOverrides = { ...pendingOverrides, ...overrides };
51
+ return builder;
52
+ },
53
+ state(name, fn) {
54
+ states.set(name, fn);
55
+ return builder;
56
+ },
57
+ apply(...names) {
58
+ pendingStates.push(...names);
59
+ return builder;
60
+ },
61
+ make() {
62
+ const data = buildData();
63
+ resetPending();
64
+ return data;
65
+ },
66
+ makeMany(count) {
67
+ // Re-evaluate defaults for each row so `Date.now()` / faker generate distinct values.
68
+ const rows = [];
69
+ const capturedOverrides = pendingOverrides;
70
+ const capturedStates = pendingStates;
71
+ for (let i = 0; i < count; i++) {
72
+ pendingOverrides = capturedOverrides;
73
+ pendingStates = capturedStates;
74
+ rows.push(buildData());
75
+ }
76
+ resetPending();
77
+ return rows;
78
+ },
79
+ makeStubbed() {
80
+ const data = buildData();
81
+ resetPending();
82
+ const entity = new entityClass();
83
+ for (const [key, value] of Object.entries(data)) {
84
+ entity.setProp(key, value);
85
+ }
86
+ return entity;
87
+ },
88
+ async create(db) {
89
+ const data = builder.make();
90
+ const repo = new BaseRepository(entityClass, db);
91
+ return repo.create(data);
92
+ },
93
+ async createMany(count, db) {
94
+ const rows = builder.makeMany(count);
95
+ const repo = new BaseRepository(entityClass, db);
96
+ const created = [];
97
+ for (const data of rows) {
98
+ created.push(await repo.create(data));
99
+ }
100
+ return created;
101
+ },
102
+ };
103
+ return builder;
104
+ }
105
+ //# sourceMappingURL=Factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Factory.js","sourceRoot":"","sources":["../../src/testing/Factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * TestDatabase — in-memory SQLite database for testing via the ream-db Rust driver.
3
+ */
4
+ import type { DatabaseAdapter } from "../schema/MigrationRunner.js";
5
+ /** Simple async database interface for tests. */
6
+ export declare class Database {
7
+ #private;
8
+ constructor(impl: DatabaseImpl);
9
+ /** Create an in-memory SQLite database backed by the Rust ream-db driver. */
10
+ static memory(): Promise<Database>;
11
+ query(sql: string): Promise<Record<string, unknown>[]>;
12
+ queryWithParams(sql: string, params: unknown[]): Promise<Record<string, unknown>[]>;
13
+ execute(sql: string, params?: unknown[]): Promise<void>;
14
+ close(): Promise<void>;
15
+ /** Get a DatabaseAdapter for MigrationRunner compatibility. */
16
+ asAdapter(): DatabaseAdapter;
17
+ }
18
+ interface DatabaseImpl {
19
+ query(sql: string): Promise<Record<string, unknown>[]>;
20
+ queryWithParams(sql: string, params: unknown[]): Promise<Record<string, unknown>[]>;
21
+ execute(sql: string, params?: unknown[]): Promise<void>;
22
+ close(): Promise<void>;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=TestDatabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestDatabase.d.ts","sourceRoot":"","sources":["../../src/testing/TestDatabase.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,iDAAiD;AACjD,qBAAa,QAAQ;;gBAGR,IAAI,EAAE,YAAY;IAI9B,6EAA6E;WAChE,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC;IAwBlC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAItD,eAAe,CACpB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,OAAO,EAAE,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAI/B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,+DAA+D;IAC/D,SAAS,IAAI,eAAe;CAW5B;AAED,UAAU,YAAY;IACrB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACvD,eAAe,CACd,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,OAAO,EAAE,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * TestDatabase — in-memory SQLite database for testing via the ream-db Rust driver.
3
+ */
4
+ /** Simple async database interface for tests. */
5
+ export class Database {
6
+ #impl;
7
+ constructor(impl) {
8
+ this.#impl = impl;
9
+ }
10
+ /** Create an in-memory SQLite database backed by the Rust ream-db driver. */
11
+ static async memory() {
12
+ const { createNapiConnection } = await import("../adapters/NapiDbAdapter.js");
13
+ const conn = await createNapiConnection("sqlite::memory:", 1, 1);
14
+ return new Database({
15
+ async query(sql) {
16
+ return conn.query(sql);
17
+ },
18
+ async queryWithParams(sql, params) {
19
+ return conn.query(sql, params);
20
+ },
21
+ async execute(sql, params) {
22
+ await conn.execute(sql, params);
23
+ },
24
+ async close() {
25
+ await conn.close();
26
+ },
27
+ });
28
+ }
29
+ async query(sql) {
30
+ return this.#impl.query(sql);
31
+ }
32
+ async queryWithParams(sql, params) {
33
+ return this.#impl.queryWithParams(sql, params);
34
+ }
35
+ async execute(sql, params) {
36
+ return this.#impl.execute(sql, params);
37
+ }
38
+ async close() {
39
+ return this.#impl.close();
40
+ }
41
+ /** Get a DatabaseAdapter for MigrationRunner compatibility. */
42
+ asAdapter() {
43
+ return {
44
+ execute: (sql, params) => this.#impl.execute(sql, params),
45
+ query: (sql, params) => params
46
+ ? this.#impl.queryWithParams(sql, params)
47
+ : this.#impl.query(sql),
48
+ close: () => this.#impl.close(),
49
+ };
50
+ }
51
+ }
52
+ //# sourceMappingURL=TestDatabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestDatabase.js","sourceRoot":"","sources":["../../src/testing/TestDatabase.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,iDAAiD;AACjD,MAAM,OAAO,QAAQ;IACpB,KAAK,CAAe;IAEpB,YAAY,IAAkB;QAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,6EAA6E;IAC7E,MAAM,CAAC,KAAK,CAAC,MAAM;QAClB,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAC5C,8BAA8B,CAC9B,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACjE,OAAO,IAAI,QAAQ,CAAC;YACnB,KAAK,CAAC,KAAK,CAAC,GAAW;gBACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;YACD,KAAK,CAAC,eAAe,CACpB,GAAW,EACX,MAAiB;gBAEjB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAChC,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,MAAkB;gBAC5C,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACjC,CAAC;YACD,KAAK,CAAC,KAAK;gBACV,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,CAAC;SACD,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,eAAe,CACpB,GAAW,EACX,MAAiB;QAEjB,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,MAAkB;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,KAAK;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,+DAA+D;IAC/D,SAAS;QACR,OAAO;YACN,OAAO,EAAE,CAAC,GAAW,EAAE,MAAkB,EAAE,EAAE,CAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC;YAChC,KAAK,EAAE,CAAI,GAAW,EAAE,MAAkB,EAAE,EAAE,CAC7C,MAAM;gBACL,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAkB;gBAC3D,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAkB;YAC3C,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;SAC/B,CAAC;IACH,CAAC;CACD"}
@@ -0,0 +1,4 @@
1
+ export { truncateAll, useTransaction } from "./DatabaseCleanup.js";
2
+ export { type FactoryBuilder, factory } from "./Factory.js";
3
+ export { Database } from "./TestDatabase.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,KAAK,cAAc,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { truncateAll, useTransaction } from "./DatabaseCleanup.js";
2
+ export { factory } from "./Factory.js";
3
+ export { Database } from "./TestDatabase.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAuB,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Convert snake_case to camelCase. */
2
+ export declare function snakeToCamel(s: string): string;
3
+ /** Convert camelCase or PascalCase to snake_case (no leading underscore). */
4
+ export declare function camelToSnake(s: string): string;
5
+ //# sourceMappingURL=casing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"casing.d.ts","sourceRoot":"","sources":["../../src/utils/casing.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI9C"}
@@ -0,0 +1,9 @@
1
+ /** Convert snake_case to camelCase. */
2
+ export function snakeToCamel(s) {
3
+ return s.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
4
+ }
5
+ /** Convert camelCase or PascalCase to snake_case (no leading underscore). */
6
+ export function camelToSnake(s) {
7
+ return s.replace(/[A-Z]/g, (c, i) => i === 0 ? c.toLowerCase() : `_${c.toLowerCase()}`);
8
+ }
9
+ //# sourceMappingURL=casing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"casing.js","sourceRoot":"","sources":["../../src/utils/casing.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,MAAM,UAAU,YAAY,CAAC,CAAS;IACrC,OAAO,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,YAAY,CAAC,CAAS;IACrC,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACnC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CACjD,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Single source of truth for dialect detection. Both `AtlasProvider` and
3
+ * `NapiDbAdapter` used to ship their own copy — if a new driver scheme was
4
+ * added (e.g. `cockroachdb://`), only one side would be updated and the two
5
+ * would silently drift. Extracted here so every call site resolves the same
6
+ * way.
7
+ */
8
+ import type { AtlasDialect } from "../query/native.js";
9
+ export declare function dialectFromUrl(url: string): AtlasDialect;
10
+ //# sourceMappingURL=dialectFromUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialectFromUrl.d.ts","sourceRoot":"","sources":["../../src/utils/dialectFromUrl.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAMxD"}
@@ -0,0 +1,8 @@
1
+ export function dialectFromUrl(url) {
2
+ if (url.startsWith("postgres://") || url.startsWith("postgresql://"))
3
+ return "postgres";
4
+ if (url.startsWith("mysql://") || url.startsWith("mariadb://"))
5
+ return "mysql";
6
+ return "sqlite";
7
+ }
8
+ //# sourceMappingURL=dialectFromUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialectFromUrl.js","sourceRoot":"","sources":["../../src/utils/dialectFromUrl.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,cAAc,CAAC,GAAW;IACzC,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC;QACnE,OAAO,UAAU,CAAC;IACnB,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;QAC7D,OAAO,OAAO,CAAC;IAChB,OAAO,QAAQ,CAAC;AACjB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * SQL identifier validation helpers — used by the TS-side fluent builders
3
+ * before a name is sent to the Rust compiler. Catches obvious garbage
4
+ * (empty / wrong chars / leading digit) early with a clear error site.
5
+ *
6
+ * The Rust compiler ALSO validates and quotes identifiers — these helpers
7
+ * are a defence-in-depth check, not the source of truth.
8
+ */
9
+ /** Returns true if `name` is a syntactically valid SQL identifier (table, column, alias, CTE name, …). */
10
+ export declare function isValidIdentifier(name: unknown): name is string;
11
+ /**
12
+ * Asserts that `name` is a valid identifier; throws a structured error otherwise.
13
+ *
14
+ * @param name the value to validate
15
+ * @param kind human-readable label used in the error message (e.g. "CTE name", "column name")
16
+ * @param errorFactory builds the error to throw — keeps this helper independent of any specific error class
17
+ */
18
+ export declare function assertValidIdentifier(name: unknown, kind: string, errorFactory: (message: string) => Error): asserts name is string;
19
+ //# sourceMappingURL=identifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifier.d.ts","sourceRoot":"","sources":["../../src/utils/identifier.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,0GAA0G;AAC1G,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAI/D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACpC,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,KAAK,GACtC,OAAO,CAAC,IAAI,IAAI,MAAM,CAIxB"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * SQL identifier validation helpers — used by the TS-side fluent builders
3
+ * before a name is sent to the Rust compiler. Catches obvious garbage
4
+ * (empty / wrong chars / leading digit) early with a clear error site.
5
+ *
6
+ * The Rust compiler ALSO validates and quotes identifiers — these helpers
7
+ * are a defence-in-depth check, not the source of truth.
8
+ */
9
+ /** Pattern: starts with letter or underscore, then letters/digits/underscore/dot. */
10
+ const IDENTIFIER_RE = /^[A-Za-z_][A-Za-z0-9_.]*$/;
11
+ /** Returns true if `name` is a syntactically valid SQL identifier (table, column, alias, CTE name, …). */
12
+ export function isValidIdentifier(name) {
13
+ return (typeof name === "string" && name.length > 0 && IDENTIFIER_RE.test(name));
14
+ }
15
+ /**
16
+ * Asserts that `name` is a valid identifier; throws a structured error otherwise.
17
+ *
18
+ * @param name the value to validate
19
+ * @param kind human-readable label used in the error message (e.g. "CTE name", "column name")
20
+ * @param errorFactory builds the error to throw — keeps this helper independent of any specific error class
21
+ */
22
+ export function assertValidIdentifier(name, kind, errorFactory) {
23
+ if (!isValidIdentifier(name)) {
24
+ throw errorFactory(`${kind} must be a valid identifier: '${String(name)}'`);
25
+ }
26
+ }
27
+ //# sourceMappingURL=identifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifier.js","sourceRoot":"","sources":["../../src/utils/identifier.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qFAAqF;AACrF,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAElD,0GAA0G;AAC1G,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC9C,OAAO,CACN,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CACvE,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACpC,IAAa,EACb,IAAY,EACZ,YAAwC;IAExC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,YAAY,CAAC,GAAG,IAAI,iCAAiC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7E,CAAC;AACF,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Path/filename validation helpers shared by MigrationRunner and Seeder.
3
+ *
4
+ * Centralised here so the "forbidden chars + no `..`" rules + "path must stay
5
+ * inside its base directory" check live in one place. Previously duplicated
6
+ * — the audit flagged this as a maintenance hazard.
7
+ */
8
+ /** Non-throwing async `fs.existsSync` equivalent. Returns false on ENOENT, propagates other errors. */
9
+ export declare function pathExists(p: string): Promise<boolean>;
10
+ /**
11
+ * Throw if `name` contains characters that could escape a filename context
12
+ * (path separators, quotes, backticks) or include a directory-walk sequence
13
+ * (`..`). Does NOT check extension or existence — that's the caller's job.
14
+ */
15
+ export declare function assertSafeName(name: string, errorCode: string, kind: string): void;
16
+ /**
17
+ * Resolve `fileName` inside `baseDir` and throw if the resulting path escapes
18
+ * the base — guards against symlink / `../` traversal attacks when loading
19
+ * migration or seeder files dynamically.
20
+ */
21
+ export declare function assertPathInsideBase(baseDir: string, fileName: string, errorCode: string, kind: string): string;
22
+ //# sourceMappingURL=safePath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safePath.d.ts","sourceRoot":"","sources":["../../src/utils/safePath.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,uGAAuG;AACvG,wBAAsB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ5D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC7B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACV,IAAI,CAIN;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACV,MAAM,CAUR"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Path/filename validation helpers shared by MigrationRunner and Seeder.
3
+ *
4
+ * Centralised here so the "forbidden chars + no `..`" rules + "path must stay
5
+ * inside its base directory" check live in one place. Previously duplicated
6
+ * — the audit flagged this as a maintenance hazard.
7
+ */
8
+ import * as fsp from "node:fs/promises";
9
+ import * as path from "node:path";
10
+ import { AtlasError } from "../errors.js";
11
+ /** Non-throwing async `fs.existsSync` equivalent. Returns false on ENOENT, propagates other errors. */
12
+ export async function pathExists(p) {
13
+ try {
14
+ await fsp.access(p);
15
+ return true;
16
+ }
17
+ catch (err) {
18
+ if (err.code === "ENOENT")
19
+ return false;
20
+ throw err;
21
+ }
22
+ }
23
+ /**
24
+ * Throw if `name` contains characters that could escape a filename context
25
+ * (path separators, quotes, backticks) or include a directory-walk sequence
26
+ * (`..`). Does NOT check extension or existence — that's the caller's job.
27
+ */
28
+ export function assertSafeName(name, errorCode, kind) {
29
+ if (/[/\\'";`]/.test(name) || name.includes("..")) {
30
+ throw new AtlasError(errorCode, `Invalid ${kind} name: ${name}`);
31
+ }
32
+ }
33
+ /**
34
+ * Resolve `fileName` inside `baseDir` and throw if the resulting path escapes
35
+ * the base — guards against symlink / `../` traversal attacks when loading
36
+ * migration or seeder files dynamically.
37
+ */
38
+ export function assertPathInsideBase(baseDir, fileName, errorCode, kind) {
39
+ const resolved = path.resolve(baseDir, fileName);
40
+ const base = path.resolve(baseDir);
41
+ if (!resolved.startsWith(base + path.sep) && resolved !== base) {
42
+ throw new AtlasError(errorCode, `${kind} path escapes directory: ${fileName}`);
43
+ }
44
+ return resolved;
45
+ }
46
+ //# sourceMappingURL=safePath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safePath.js","sourceRoot":"","sources":["../../src/utils/safePath.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,uGAAuG;AACvG,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,CAAS;IACzC,IAAI,CAAC;QACJ,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACnE,MAAM,GAAG,CAAC;IACX,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC7B,IAAY,EACZ,SAAiB,EACjB,IAAY;IAEZ,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,UAAU,CAAC,SAAS,EAAE,WAAW,IAAI,UAAU,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CACnC,OAAe,EACf,QAAgB,EAChB,SAAiB,EACjB,IAAY;IAEZ,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAChE,MAAM,IAAI,UAAU,CACnB,SAAS,EACT,GAAG,IAAI,4BAA4B,QAAQ,EAAE,CAC7C,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DatabaseConnection } from "../BaseRepository.js";
2
+ import type { TransactionClient } from "../Transaction.js";
3
+ export declare const TRANSACTION_BRAND: unique symbol;
4
+ export declare function isTransactionClient(db: DatabaseConnection): db is TransactionClient;
5
+ //# sourceMappingURL=transactionBrand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBrand.d.ts","sourceRoot":"","sources":["../../src/utils/transactionBrand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,eAAO,MAAM,iBAAiB,eAAkC,CAAC;AAEjE,wBAAgB,mBAAmB,CAClC,EAAE,EAAE,kBAAkB,GACpB,EAAE,IAAI,iBAAiB,CAEzB"}
@@ -0,0 +1,5 @@
1
+ export const TRANSACTION_BRAND = Symbol.for("atlas:transaction");
2
+ export function isTransactionClient(db) {
3
+ return TRANSACTION_BRAND in db;
4
+ }
5
+ //# sourceMappingURL=transactionBrand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBrand.js","sourceRoot":"","sources":["../../src/utils/transactionBrand.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAEjE,MAAM,UAAU,mBAAmB,CAClC,EAAsB;IAEtB,OAAO,iBAAiB,IAAI,EAAE,CAAC;AAChC,CAAC"}
Binary file
Binary file
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@c9up/atlas",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Atlas — Data Mapper ORM for the Ream framework",
5
5
  "license": "MIT",
6
6
  "type": "module",