exisjs 0.5.10 → 0.5.11

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 (157) hide show
  1. package/dist/auth/index.d.ts +3 -1
  2. package/dist/auth/index.d.ts.map +1 -1
  3. package/dist/auth/index.js +4 -1
  4. package/dist/auth/index.js.map +1 -1
  5. package/dist/auth/oauth/core.d.ts +96 -0
  6. package/dist/auth/oauth/core.d.ts.map +1 -0
  7. package/dist/auth/oauth/core.js +203 -0
  8. package/dist/auth/oauth/core.js.map +1 -0
  9. package/dist/auth/oauth/index.d.ts +45 -0
  10. package/dist/auth/oauth/index.d.ts.map +1 -0
  11. package/dist/auth/oauth/index.js +64 -0
  12. package/dist/auth/oauth/index.js.map +1 -0
  13. package/dist/auth/oauth/middleware.d.ts +63 -0
  14. package/dist/auth/oauth/middleware.d.ts.map +1 -0
  15. package/dist/auth/oauth/middleware.js +164 -0
  16. package/dist/auth/oauth/middleware.js.map +1 -0
  17. package/dist/auth/oauth/providers/custom.d.ts +41 -0
  18. package/dist/auth/oauth/providers/custom.d.ts.map +1 -0
  19. package/dist/auth/oauth/providers/custom.js +204 -0
  20. package/dist/auth/oauth/providers/custom.js.map +1 -0
  21. package/dist/auth/oauth/providers/discord.d.ts +23 -0
  22. package/dist/auth/oauth/providers/discord.d.ts.map +1 -0
  23. package/dist/auth/oauth/providers/discord.js +130 -0
  24. package/dist/auth/oauth/providers/discord.js.map +1 -0
  25. package/dist/auth/oauth/providers/facebook.d.ts +28 -0
  26. package/dist/auth/oauth/providers/facebook.d.ts.map +1 -0
  27. package/dist/auth/oauth/providers/facebook.js +124 -0
  28. package/dist/auth/oauth/providers/facebook.js.map +1 -0
  29. package/dist/auth/oauth/providers/github.d.ts +25 -0
  30. package/dist/auth/oauth/providers/github.d.ts.map +1 -0
  31. package/dist/auth/oauth/providers/github.js +132 -0
  32. package/dist/auth/oauth/providers/github.js.map +1 -0
  33. package/dist/auth/oauth/providers/google.d.ts +23 -0
  34. package/dist/auth/oauth/providers/google.d.ts.map +1 -0
  35. package/dist/auth/oauth/providers/google.js +134 -0
  36. package/dist/auth/oauth/providers/google.js.map +1 -0
  37. package/dist/auth/oauth/providers/microsoft.d.ts +28 -0
  38. package/dist/auth/oauth/providers/microsoft.d.ts.map +1 -0
  39. package/dist/auth/oauth/providers/microsoft.js +136 -0
  40. package/dist/auth/oauth/providers/microsoft.js.map +1 -0
  41. package/dist/auth/oauth/types.d.ts +158 -0
  42. package/dist/auth/oauth/types.d.ts.map +1 -0
  43. package/dist/auth/oauth/types.js +4 -0
  44. package/dist/auth/oauth/types.js.map +1 -0
  45. package/dist/cli/commands/dev.d.ts.map +1 -1
  46. package/dist/cli/commands/dev.js +0 -1
  47. package/dist/cli/commands/dev.js.map +1 -1
  48. package/dist/database/adapters/mongodb.d.ts +58 -0
  49. package/dist/database/adapters/mongodb.d.ts.map +1 -0
  50. package/dist/database/adapters/mongodb.js +264 -0
  51. package/dist/database/adapters/mongodb.js.map +1 -0
  52. package/dist/database/adapters/mysql.d.ts +27 -0
  53. package/dist/database/adapters/mysql.d.ts.map +1 -0
  54. package/dist/database/adapters/mysql.js +188 -0
  55. package/dist/database/adapters/mysql.js.map +1 -0
  56. package/dist/database/adapters/postgres.d.ts +28 -0
  57. package/dist/database/adapters/postgres.d.ts.map +1 -0
  58. package/dist/database/adapters/postgres.js +174 -0
  59. package/dist/database/adapters/postgres.js.map +1 -0
  60. package/dist/database/adapters/sqlite.d.ts +27 -0
  61. package/dist/database/adapters/sqlite.d.ts.map +1 -0
  62. package/dist/database/adapters/sqlite.js +149 -0
  63. package/dist/database/adapters/sqlite.js.map +1 -0
  64. package/dist/database/index.d.ts +42 -0
  65. package/dist/database/index.d.ts.map +1 -0
  66. package/dist/database/index.js +58 -0
  67. package/dist/database/index.js.map +1 -0
  68. package/dist/database/manager.d.ts +114 -0
  69. package/dist/database/manager.d.ts.map +1 -0
  70. package/dist/database/manager.js +269 -0
  71. package/dist/database/manager.js.map +1 -0
  72. package/dist/database/migration.d.ts +57 -0
  73. package/dist/database/migration.d.ts.map +1 -0
  74. package/dist/database/migration.js +329 -0
  75. package/dist/database/migration.js.map +1 -0
  76. package/dist/database/query-builder.d.ts +89 -0
  77. package/dist/database/query-builder.d.ts.map +1 -0
  78. package/dist/database/query-builder.js +353 -0
  79. package/dist/database/query-builder.js.map +1 -0
  80. package/dist/database/types.d.ts +184 -0
  81. package/dist/database/types.d.ts.map +1 -0
  82. package/dist/database/types.js +4 -0
  83. package/dist/database/types.js.map +1 -0
  84. package/dist/docs/ARCHITECTURE.md +349 -0
  85. package/dist/docs/BENCHMARKS.md +36 -0
  86. package/dist/docs/README.md +34 -0
  87. package/dist/docs/content/README.md +44 -0
  88. package/dist/docs/content/adapters.mdx +199 -0
  89. package/dist/docs/content/cache.mdx +239 -0
  90. package/dist/docs/content/circuit-breaker.mdx +130 -0
  91. package/dist/docs/content/cli/commands.mdx +214 -0
  92. package/dist/docs/content/cli/overview.mdx +92 -0
  93. package/dist/docs/content/cli/usage.mdx +61 -0
  94. package/dist/docs/content/config.mdx +214 -0
  95. package/dist/docs/content/controllers.mdx +241 -0
  96. package/dist/docs/content/cron.mdx +109 -0
  97. package/dist/docs/content/database.mdx +209 -0
  98. package/dist/docs/content/dataloader.mdx +170 -0
  99. package/dist/docs/content/decorators.mdx +204 -0
  100. package/dist/docs/content/errors.mdx +344 -0
  101. package/dist/docs/content/gateways.mdx +376 -0
  102. package/dist/docs/content/installation.mdx +210 -0
  103. package/dist/docs/content/introduction.mdx +96 -0
  104. package/dist/docs/content/middleware.mdx +441 -0
  105. package/dist/docs/content/modules.mdx +144 -0
  106. package/dist/docs/content/oauth.mdx +179 -0
  107. package/dist/docs/content/providers.mdx +147 -0
  108. package/dist/docs/content/queues.mdx +177 -0
  109. package/dist/docs/content/requests.mdx +293 -0
  110. package/dist/docs/content/responses.mdx +271 -0
  111. package/dist/docs/content/routing.mdx +541 -0
  112. package/dist/docs/content/rpc.mdx +146 -0
  113. package/dist/docs/content/security.mdx +294 -0
  114. package/dist/docs/content/sse.mdx +159 -0
  115. package/dist/docs/content/structure.mdx +116 -0
  116. package/dist/docs/content/testing.mdx +139 -0
  117. package/dist/docs/content/validation.mdx +249 -0
  118. package/dist/docs/content/websockets.mdx +289 -0
  119. package/dist/docs/integrations/README.md +23 -0
  120. package/dist/docs/integrations/jwt.mdx +151 -0
  121. package/dist/docs/integrations/mongo.mdx +183 -0
  122. package/dist/docs/integrations/observability.mdx +125 -0
  123. package/dist/docs/integrations/openai.mdx +108 -0
  124. package/dist/docs/integrations/postgres.mdx +190 -0
  125. package/dist/docs/integrations/posthog.mdx +122 -0
  126. package/dist/docs/integrations/redis.mdx +141 -0
  127. package/dist/docs/integrations/resend.mdx +117 -0
  128. package/dist/docs/integrations/s3.mdx +122 -0
  129. package/dist/docs/integrations/swagger.mdx +113 -0
  130. package/dist/docs/reference/README.md +3 -0
  131. package/dist/docs/reference/adapters.mdx +130 -0
  132. package/dist/docs/reference/auth.mdx +183 -0
  133. package/dist/docs/reference/cache.mdx +132 -0
  134. package/dist/docs/reference/circuit-breaker.mdx +71 -0
  135. package/dist/docs/reference/config.mdx +118 -0
  136. package/dist/docs/reference/context.mdx +168 -0
  137. package/dist/docs/reference/dataloader.mdx +91 -0
  138. package/dist/docs/reference/decorators.mdx +293 -0
  139. package/dist/docs/reference/di.mdx +123 -0
  140. package/dist/docs/reference/error.mdx +170 -0
  141. package/dist/docs/reference/exis.mdx +124 -0
  142. package/dist/docs/reference/middleware.mdx +304 -0
  143. package/dist/docs/reference/plugin.mdx +113 -0
  144. package/dist/docs/reference/queue.mdx +155 -0
  145. package/dist/docs/reference/router.mdx +248 -0
  146. package/dist/docs/reference/sanitize.mdx +130 -0
  147. package/dist/docs/reference/storage.mdx +116 -0
  148. package/dist/docs/reference/swagger.mdx +132 -0
  149. package/dist/docs/reference/testing.mdx +145 -0
  150. package/dist/docs/reference/validator.mdx +186 -0
  151. package/dist/index.d.ts +4 -0
  152. package/dist/index.d.ts.map +1 -1
  153. package/dist/index.js +10 -1
  154. package/dist/index.js.map +1 -1
  155. package/dist/server/bootstrapper.js +1 -1
  156. package/dist/server/bootstrapper.js.map +1 -1
  157. package/package.json +8 -1
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ /**
3
+ * ExisJS Database Layer
4
+ *
5
+ * A unified database abstraction providing connection pooling, query building,
6
+ * transactions, migrations, and multi-dialect support.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { createDatabase, db } from 'exisjs/database'
11
+ *
12
+ * const database = createDatabase({
13
+ * dialect: 'postgres',
14
+ * url: process.env.DATABASE_URL,
15
+ * })
16
+ * await database.connect()
17
+ *
18
+ * // Raw queries
19
+ * const users = await db.query<User>('SELECT * FROM users WHERE role = $1', ['admin'])
20
+ *
21
+ * // Query builder
22
+ * const admins = await db.table('users').where('role', '=', 'admin').rows()
23
+ *
24
+ * // Transactions
25
+ * await db.transaction(async (tx) => {
26
+ * await tx.execute('INSERT INTO orders ...', [...])
27
+ * await tx.execute('UPDATE inventory ...', [...])
28
+ * })
29
+ *
30
+ * // Migrations
31
+ * const migrator = db.getMigrator({ directory: './migrations' })
32
+ * await migrator.up()
33
+ * ```
34
+ */
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MongodbAdapter = exports.SqliteAdapter = exports.MysqlAdapter = exports.PostgresAdapter = exports.Migrator = exports.QueryBuilder = exports.setDefaultDatabase = exports.db = exports.createDatabase = exports.DatabaseManager = void 0;
37
+ // ─── Core ────────────────────────────────────────────────────────────────────
38
+ var manager_1 = require("./manager");
39
+ Object.defineProperty(exports, "DatabaseManager", { enumerable: true, get: function () { return manager_1.DatabaseManager; } });
40
+ Object.defineProperty(exports, "createDatabase", { enumerable: true, get: function () { return manager_1.createDatabase; } });
41
+ Object.defineProperty(exports, "db", { enumerable: true, get: function () { return manager_1.db; } });
42
+ Object.defineProperty(exports, "setDefaultDatabase", { enumerable: true, get: function () { return manager_1.setDefaultDatabase; } });
43
+ // ─── Query Builder ───────────────────────────────────────────────────────────
44
+ var query_builder_1 = require("./query-builder");
45
+ Object.defineProperty(exports, "QueryBuilder", { enumerable: true, get: function () { return query_builder_1.QueryBuilder; } });
46
+ // ─── Migration ───────────────────────────────────────────────────────────────
47
+ var migration_1 = require("./migration");
48
+ Object.defineProperty(exports, "Migrator", { enumerable: true, get: function () { return migration_1.Migrator; } });
49
+ // ─── Adapters ────────────────────────────────────────────────────────────────
50
+ var postgres_1 = require("./adapters/postgres");
51
+ Object.defineProperty(exports, "PostgresAdapter", { enumerable: true, get: function () { return postgres_1.PostgresAdapter; } });
52
+ var mysql_1 = require("./adapters/mysql");
53
+ Object.defineProperty(exports, "MysqlAdapter", { enumerable: true, get: function () { return mysql_1.MysqlAdapter; } });
54
+ var sqlite_1 = require("./adapters/sqlite");
55
+ Object.defineProperty(exports, "SqliteAdapter", { enumerable: true, get: function () { return sqlite_1.SqliteAdapter; } });
56
+ var mongodb_1 = require("./adapters/mongodb");
57
+ Object.defineProperty(exports, "MongodbAdapter", { enumerable: true, get: function () { return mongodb_1.MongodbAdapter; } });
58
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;;;AAEH,gFAAgF;AAChF,qCAKkB;AAJhB,0GAAA,eAAe,OAAA;AACf,yGAAA,cAAc,OAAA;AACd,6FAAA,EAAE,OAAA;AACF,6GAAA,kBAAkB,OAAA;AAGpB,gFAAgF;AAChF,iDAA8C;AAArC,6GAAA,YAAY,OAAA;AAErB,gFAAgF;AAChF,yCAAsC;AAA7B,qGAAA,QAAQ,OAAA;AAEjB,gFAAgF;AAChF,gDAAqD;AAA5C,2GAAA,eAAe,OAAA;AACxB,0CAA+C;AAAtC,qGAAA,YAAY,OAAA;AACrB,4CAAiD;AAAxC,uGAAA,aAAa,OAAA;AACtB,8CAAmD;AAA1C,yGAAA,cAAc,OAAA"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Database Manager.
3
+ *
4
+ * The central orchestrator for all database connections. Manages named connections,
5
+ * provides lifecycle integration with the ExisJS app (auto-disconnect on shutdown),
6
+ * and exposes the query builder, raw query execution, and migration system.
7
+ *
8
+ * Usage:
9
+ * import { db, createDatabase } from 'exisjs/database'
10
+ *
11
+ * // Quick setup
12
+ * const database = createDatabase({ dialect: 'postgres', url: process.env.DATABASE_URL })
13
+ * await database.connect()
14
+ *
15
+ * // Query
16
+ * const users = await database.query<User>('SELECT * FROM users')
17
+ * const admins = await database.table('users').where('role', '=', 'admin').rows()
18
+ */
19
+ import type { DatabaseAdapter, DatabaseConfig, DatabaseDialect, QueryResult, ExecuteResult, Transaction, MigrationConfig } from './types';
20
+ import { QueryBuilder } from './query-builder';
21
+ import { Migrator } from './migration';
22
+ export declare class DatabaseManager {
23
+ private connections;
24
+ private configs;
25
+ private defaultName;
26
+ private migrator;
27
+ /**
28
+ * Add a named database connection.
29
+ * The first connection added becomes the default.
30
+ */
31
+ addConnection(config: DatabaseConfig, name?: string): this;
32
+ /**
33
+ * Connect all registered connections (or a specific named connection).
34
+ */
35
+ connect(name?: string): Promise<void>;
36
+ /**
37
+ * Disconnect all connections (or a specific named connection).
38
+ */
39
+ disconnect(name?: string): Promise<void>;
40
+ /**
41
+ * Execute a SELECT query on the default (or named) connection.
42
+ */
43
+ query<T = Record<string, unknown>>(sql: string, params?: unknown[], connectionName?: string): Promise<QueryResult<T>>;
44
+ /**
45
+ * Execute an INSERT, UPDATE, or DELETE on the default (or named) connection.
46
+ */
47
+ execute(sql: string, params?: unknown[], connectionName?: string): Promise<ExecuteResult>;
48
+ /**
49
+ * Execute a series of operations within an atomic transaction.
50
+ */
51
+ transaction<T>(fn: (tx: Transaction) => Promise<T>, connectionName?: string): Promise<T>;
52
+ /**
53
+ * Start building a query for a table (chainable query builder).
54
+ */
55
+ table<T = Record<string, unknown>>(tableName: string, connectionName?: string): QueryBuilder<T>;
56
+ /**
57
+ * Check if a connection is healthy.
58
+ */
59
+ isHealthy(connectionName?: string): Promise<boolean>;
60
+ /**
61
+ * Check health of all connections.
62
+ */
63
+ healthCheck(): Promise<Record<string, boolean>>;
64
+ /**
65
+ * Get the raw adapter for a connection (for advanced use cases).
66
+ */
67
+ getAdapter(name?: string): DatabaseAdapter;
68
+ /**
69
+ * Get the raw underlying client for a connection.
70
+ */
71
+ getRawClient(name?: string): unknown;
72
+ /**
73
+ * Get the dialect of a connection.
74
+ */
75
+ getDialect(name?: string): DatabaseDialect;
76
+ /**
77
+ * Get the migration system for the default connection.
78
+ */
79
+ getMigrator(config?: MigrationConfig, connectionName?: string): Migrator;
80
+ private shutdownRegistered;
81
+ private registerShutdownHook;
82
+ }
83
+ /**
84
+ * Create a new DatabaseManager with the given configuration.
85
+ * This is the recommended way to set up a database connection.
86
+ *
87
+ * @example
88
+ * ```ts
89
+ * const db = createDatabase({
90
+ * dialect: 'postgres',
91
+ * url: process.env.DATABASE_URL,
92
+ * })
93
+ * await db.connect()
94
+ * ```
95
+ */
96
+ export declare function createDatabase(config: DatabaseConfig): DatabaseManager;
97
+ /**
98
+ * Lazy-initialized global database proxy.
99
+ * Forwards all calls to the default DatabaseManager.
100
+ *
101
+ * @example
102
+ * ```ts
103
+ * import { db } from 'exisjs/database'
104
+ *
105
+ * // After createDatabase() has been called elsewhere:
106
+ * const users = await db.query('SELECT * FROM users')
107
+ * ```
108
+ */
109
+ export declare const db: DatabaseManager;
110
+ /**
111
+ * Set or replace the default DatabaseManager.
112
+ */
113
+ export declare function setDefaultDatabase(manager: DatabaseManager): void;
114
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/database/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,eAAe,EACf,WAAW,EACX,aAAa,EACb,WAAW,EACX,eAAe,EAChB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAkCtC,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAqC;IACxD,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,WAAW,CAAY;IAC/B,OAAO,CAAC,QAAQ,CAAwB;IAExC;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAQ1D;;OAEG;IACG,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3C;;OAEG;IACG,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB9C;;OAEG;IACG,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,EAClB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAK1B;;OAEG;IACG,OAAO,CACX,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,EAClB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,aAAa,CAAC;IAKzB;;OAEG;IACG,WAAW,CAAC,CAAC,EACjB,EAAE,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EACnC,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,CAAC,CAAC;IAKb;;OAEG;IACH,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,MAAM,GACtB,YAAY,CAAC,CAAC,CAAC;IAKlB;;OAEG;IACG,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM1D;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAYrD;;OAEG;IACH,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,eAAe;IAW1C;;OAEG;IACH,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAIpC;;OAEG;IACH,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,eAAe;IAI1C;;OAEG;IACH,WAAW,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,QAAQ;IAUxE,OAAO,CAAC,kBAAkB,CAAQ;IAElC,OAAO,CAAC,oBAAoB;CAiB7B;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,eAAe,CAUtE;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,EAAE,EAAE,eAUf,CAAA;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAEjE"}
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ /**
3
+ * Database Manager.
4
+ *
5
+ * The central orchestrator for all database connections. Manages named connections,
6
+ * provides lifecycle integration with the ExisJS app (auto-disconnect on shutdown),
7
+ * and exposes the query builder, raw query execution, and migration system.
8
+ *
9
+ * Usage:
10
+ * import { db, createDatabase } from 'exisjs/database'
11
+ *
12
+ * // Quick setup
13
+ * const database = createDatabase({ dialect: 'postgres', url: process.env.DATABASE_URL })
14
+ * await database.connect()
15
+ *
16
+ * // Query
17
+ * const users = await database.query<User>('SELECT * FROM users')
18
+ * const admins = await database.table('users').where('role', '=', 'admin').rows()
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.db = exports.DatabaseManager = void 0;
22
+ exports.createDatabase = createDatabase;
23
+ exports.setDefaultDatabase = setDefaultDatabase;
24
+ const query_builder_1 = require("./query-builder");
25
+ const migration_1 = require("./migration");
26
+ /**
27
+ * Create a database adapter for the given dialect.
28
+ */
29
+ function createAdapter(config) {
30
+ switch (config.dialect) {
31
+ case 'postgres': {
32
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
33
+ const { PostgresAdapter } = require('./adapters/postgres');
34
+ return new PostgresAdapter(config);
35
+ }
36
+ case 'mysql': {
37
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
38
+ const { MysqlAdapter } = require('./adapters/mysql');
39
+ return new MysqlAdapter(config);
40
+ }
41
+ case 'sqlite': {
42
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
43
+ const { SqliteAdapter } = require('./adapters/sqlite');
44
+ return new SqliteAdapter(config);
45
+ }
46
+ case 'mongodb': {
47
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
48
+ const { MongodbAdapter } = require('./adapters/mongodb');
49
+ return new MongodbAdapter(config);
50
+ }
51
+ default:
52
+ throw new Error(`Unsupported database dialect: ${config.dialect}`);
53
+ }
54
+ }
55
+ class DatabaseManager {
56
+ constructor() {
57
+ this.connections = new Map();
58
+ this.configs = new Map();
59
+ this.defaultName = 'default';
60
+ this.migrator = null;
61
+ // ─── Private ───────────────────────────────────────────────────────────────
62
+ this.shutdownRegistered = false;
63
+ }
64
+ /**
65
+ * Add a named database connection.
66
+ * The first connection added becomes the default.
67
+ */
68
+ addConnection(config, name) {
69
+ const connName = name || this.defaultName;
70
+ const adapter = createAdapter(config);
71
+ this.connections.set(connName, adapter);
72
+ this.configs.set(connName, config);
73
+ return this;
74
+ }
75
+ /**
76
+ * Connect all registered connections (or a specific named connection).
77
+ */
78
+ async connect(name) {
79
+ if (name) {
80
+ const adapter = this.getAdapter(name);
81
+ await adapter.connect();
82
+ this.registerShutdownHook();
83
+ return;
84
+ }
85
+ const promises = [];
86
+ for (const [, adapter] of this.connections) {
87
+ promises.push(adapter.connect());
88
+ }
89
+ await Promise.all(promises);
90
+ this.registerShutdownHook();
91
+ }
92
+ /**
93
+ * Disconnect all connections (or a specific named connection).
94
+ */
95
+ async disconnect(name) {
96
+ if (name) {
97
+ const adapter = this.connections.get(name);
98
+ if (adapter) {
99
+ await adapter.disconnect();
100
+ this.connections.delete(name);
101
+ this.configs.delete(name);
102
+ }
103
+ return;
104
+ }
105
+ const promises = [];
106
+ for (const [, adapter] of this.connections) {
107
+ promises.push(adapter.disconnect());
108
+ }
109
+ await Promise.all(promises);
110
+ this.connections.clear();
111
+ this.configs.clear();
112
+ }
113
+ /**
114
+ * Execute a SELECT query on the default (or named) connection.
115
+ */
116
+ async query(sql, params, connectionName) {
117
+ const adapter = this.getAdapter(connectionName || this.defaultName);
118
+ return adapter.query(sql, params);
119
+ }
120
+ /**
121
+ * Execute an INSERT, UPDATE, or DELETE on the default (or named) connection.
122
+ */
123
+ async execute(sql, params, connectionName) {
124
+ const adapter = this.getAdapter(connectionName || this.defaultName);
125
+ return adapter.execute(sql, params);
126
+ }
127
+ /**
128
+ * Execute a series of operations within an atomic transaction.
129
+ */
130
+ async transaction(fn, connectionName) {
131
+ const adapter = this.getAdapter(connectionName || this.defaultName);
132
+ return adapter.transaction(fn);
133
+ }
134
+ /**
135
+ * Start building a query for a table (chainable query builder).
136
+ */
137
+ table(tableName, connectionName) {
138
+ const adapter = this.getAdapter(connectionName || this.defaultName);
139
+ return new query_builder_1.QueryBuilder(adapter, tableName);
140
+ }
141
+ /**
142
+ * Check if a connection is healthy.
143
+ */
144
+ async isHealthy(connectionName) {
145
+ const adapter = this.connections.get(connectionName || this.defaultName);
146
+ if (!adapter)
147
+ return false;
148
+ return adapter.isHealthy();
149
+ }
150
+ /**
151
+ * Check health of all connections.
152
+ */
153
+ async healthCheck() {
154
+ const results = {};
155
+ for (const [name, adapter] of this.connections) {
156
+ try {
157
+ results[name] = await adapter.isHealthy();
158
+ }
159
+ catch {
160
+ results[name] = false;
161
+ }
162
+ }
163
+ return results;
164
+ }
165
+ /**
166
+ * Get the raw adapter for a connection (for advanced use cases).
167
+ */
168
+ getAdapter(name) {
169
+ const connName = name || this.defaultName;
170
+ const adapter = this.connections.get(connName);
171
+ if (!adapter) {
172
+ throw new Error(`Database connection '${connName}' not found. Did you call addConnection() and connect()?`);
173
+ }
174
+ return adapter;
175
+ }
176
+ /**
177
+ * Get the raw underlying client for a connection.
178
+ */
179
+ getRawClient(name) {
180
+ return this.getAdapter(name).getRawClient();
181
+ }
182
+ /**
183
+ * Get the dialect of a connection.
184
+ */
185
+ getDialect(name) {
186
+ return this.getAdapter(name).dialect;
187
+ }
188
+ /**
189
+ * Get the migration system for the default connection.
190
+ */
191
+ getMigrator(config, connectionName) {
192
+ if (!this.migrator || connectionName) {
193
+ const adapter = this.getAdapter(connectionName || this.defaultName);
194
+ this.migrator = new migration_1.Migrator(adapter, config);
195
+ }
196
+ return this.migrator;
197
+ }
198
+ registerShutdownHook() {
199
+ if (this.shutdownRegistered)
200
+ return;
201
+ this.shutdownRegistered = true;
202
+ try {
203
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
204
+ const { getActiveApp } = require('../server/app');
205
+ const app = getActiveApp();
206
+ if (app && typeof app.onShutdown === 'function') {
207
+ app.onShutdown(async () => {
208
+ await this.disconnect();
209
+ });
210
+ }
211
+ }
212
+ catch {
213
+ // Not in an app context — user must disconnect manually
214
+ }
215
+ }
216
+ }
217
+ exports.DatabaseManager = DatabaseManager;
218
+ // ─── Factory & Singleton ─────────────────────────────────────────────────────
219
+ let defaultManager = null;
220
+ /**
221
+ * Create a new DatabaseManager with the given configuration.
222
+ * This is the recommended way to set up a database connection.
223
+ *
224
+ * @example
225
+ * ```ts
226
+ * const db = createDatabase({
227
+ * dialect: 'postgres',
228
+ * url: process.env.DATABASE_URL,
229
+ * })
230
+ * await db.connect()
231
+ * ```
232
+ */
233
+ function createDatabase(config) {
234
+ const manager = new DatabaseManager();
235
+ manager.addConnection(config);
236
+ // Set as the global default if none exists
237
+ if (!defaultManager) {
238
+ defaultManager = manager;
239
+ }
240
+ return manager;
241
+ }
242
+ /**
243
+ * Lazy-initialized global database proxy.
244
+ * Forwards all calls to the default DatabaseManager.
245
+ *
246
+ * @example
247
+ * ```ts
248
+ * import { db } from 'exisjs/database'
249
+ *
250
+ * // After createDatabase() has been called elsewhere:
251
+ * const users = await db.query('SELECT * FROM users')
252
+ * ```
253
+ */
254
+ exports.db = new Proxy({}, {
255
+ get(_target, prop) {
256
+ if (!defaultManager) {
257
+ throw new Error('No database has been configured. Call createDatabase() first.');
258
+ }
259
+ const value = defaultManager[prop];
260
+ return typeof value === 'function' ? value.bind(defaultManager) : value;
261
+ },
262
+ });
263
+ /**
264
+ * Set or replace the default DatabaseManager.
265
+ */
266
+ function setDefaultDatabase(manager) {
267
+ defaultManager = manager;
268
+ }
269
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/database/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Built-in Migration System.
3
+ *
4
+ * Tracks applied migrations in a `_exis_migrations` table and provides
5
+ * up/down/status operations. Migrations are ordered by filename and
6
+ * applied in batches for clean rollbacks.
7
+ *
8
+ * Usage:
9
+ * const migrator = new Migrator(adapter, { directory: './migrations' })
10
+ * await migrator.up() // Apply all pending migrations
11
+ * await migrator.down() // Rollback the last batch
12
+ * await migrator.status() // Get migration status
13
+ */
14
+ import type { DatabaseAdapter, MigrationConfig } from './types';
15
+ export declare class Migrator {
16
+ private adapter;
17
+ private config;
18
+ constructor(adapter: DatabaseAdapter, config?: MigrationConfig);
19
+ /**
20
+ * Ensure the migrations tracking table exists.
21
+ */
22
+ ensureTable(): Promise<void>;
23
+ /**
24
+ * Apply all pending migrations.
25
+ * @returns The names of the migrations that were applied.
26
+ */
27
+ up(): Promise<string[]>;
28
+ /**
29
+ * Rollback the last batch of migrations.
30
+ * @returns The names of the migrations that were rolled back.
31
+ */
32
+ down(): Promise<string[]>;
33
+ /**
34
+ * Rollback all migrations.
35
+ */
36
+ reset(): Promise<string[]>;
37
+ /**
38
+ * Get the status of all migrations.
39
+ */
40
+ status(): Promise<{
41
+ name: string;
42
+ applied: boolean;
43
+ batch?: number;
44
+ appliedAt?: Date;
45
+ }[]>;
46
+ /**
47
+ * Create a new migration file in the migrations directory.
48
+ */
49
+ create(name: string): Promise<string>;
50
+ private loadMigrations;
51
+ private getApplied;
52
+ private getAppliedRecords;
53
+ private getNextBatch;
54
+ private getLastBatch;
55
+ private getMigrationsInBatch;
56
+ }
57
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../src/database/migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EAGhB,MAAM,SAAS,CAAA;AAIhB,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAA2B;gBAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,eAAe;IAQ9D;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BlC;;;OAGG;IACG,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAwC7B;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA6C/B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAahC;;OAEG;IACG,MAAM,IAAI,OAAO,CACrB;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAA;KAAE,EAAE,CACvE;IAkBD;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAoC7B,cAAc;YA8Cd,UAAU;YAKV,iBAAiB;YAwBjB,YAAY;YAIZ,YAAY;YAmBZ,oBAAoB;CA0BnC"}