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,188 @@
1
+ "use strict";
2
+ /**
3
+ * MySQL Database Adapter.
4
+ *
5
+ * Uses the `mysql2` npm package for high-performance prepared statements,
6
+ * connection pooling, and transaction support.
7
+ *
8
+ * Peer Dependencies required:
9
+ * npm install mysql2
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.MysqlAdapter = void 0;
13
+ class MysqlAdapter {
14
+ constructor(config) {
15
+ this.dialect = 'mysql';
16
+ this.pool = null;
17
+ this.config = config;
18
+ }
19
+ async connect() {
20
+ let mysql;
21
+ try {
22
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
23
+ mysql = require('mysql2/promise');
24
+ }
25
+ catch {
26
+ throw new Error('Missing dependency. Please run: npm install mysql2');
27
+ }
28
+ const poolConfig = this.config.pool || {};
29
+ if (this.config.url) {
30
+ this.pool = mysql.createPool({
31
+ uri: this.config.url,
32
+ waitForConnections: true,
33
+ connectionLimit: poolConfig.max ?? 10,
34
+ idleTimeout: poolConfig.idleTimeoutMs ?? 30000,
35
+ connectTimeout: this.config.connectTimeoutMs ?? 5000,
36
+ ssl: this.config.ssl === true
37
+ ? {}
38
+ : typeof this.config.ssl === 'object'
39
+ ? this.config.ssl
40
+ : undefined,
41
+ });
42
+ }
43
+ else {
44
+ this.pool = mysql.createPool({
45
+ host: this.config.host || 'localhost',
46
+ port: this.config.port || 3306,
47
+ database: this.config.database,
48
+ user: this.config.username,
49
+ password: this.config.password,
50
+ waitForConnections: true,
51
+ connectionLimit: poolConfig.max ?? 10,
52
+ idleTimeout: poolConfig.idleTimeoutMs ?? 30000,
53
+ connectTimeout: this.config.connectTimeoutMs ?? 5000,
54
+ ssl: this.config.ssl === true
55
+ ? {}
56
+ : typeof this.config.ssl === 'object'
57
+ ? this.config.ssl
58
+ : undefined,
59
+ });
60
+ }
61
+ // Test the connection
62
+ const conn = await this.pool.getConnection();
63
+ conn.release();
64
+ this.log('MySQL connection pool established');
65
+ }
66
+ async disconnect() {
67
+ if (this.pool) {
68
+ await this.pool.end();
69
+ this.pool = null;
70
+ this.log('MySQL connection pool closed');
71
+ }
72
+ }
73
+ async query(sql, params = []) {
74
+ this.ensureConnected();
75
+ this.logQuery(sql, params);
76
+ const [rows, columns] = await this.pool.execute(sql, params);
77
+ const fields = Array.isArray(columns)
78
+ ? columns.map((col) => ({
79
+ name: col.name,
80
+ dataType: col.type?.toString(),
81
+ tableId: col.table?.length ? undefined : undefined,
82
+ }))
83
+ : [];
84
+ return {
85
+ rows: rows,
86
+ rowCount: Array.isArray(rows) ? rows.length : 0,
87
+ fields,
88
+ };
89
+ }
90
+ async execute(sql, params = []) {
91
+ this.ensureConnected();
92
+ this.logQuery(sql, params);
93
+ const [result] = await this.pool.execute(sql, params);
94
+ return {
95
+ affectedRows: result.affectedRows ?? 0,
96
+ insertId: result.insertId ?? undefined,
97
+ };
98
+ }
99
+ async transaction(fn) {
100
+ this.ensureConnected();
101
+ const conn = await this.pool.getConnection();
102
+ try {
103
+ await conn.beginTransaction();
104
+ const tx = {
105
+ query: async (queryStr, params = []) => {
106
+ this.logQuery(queryStr, params);
107
+ const [rows, columns] = await conn.execute(queryStr, params);
108
+ const fields = Array.isArray(columns)
109
+ ? columns.map((col) => ({
110
+ name: col.name,
111
+ dataType: col.type?.toString(),
112
+ }))
113
+ : [];
114
+ return {
115
+ rows: rows,
116
+ rowCount: Array.isArray(rows) ? rows.length : 0,
117
+ fields,
118
+ };
119
+ },
120
+ execute: async (queryStr, params = []) => {
121
+ this.logQuery(queryStr, params);
122
+ const [result] = await conn.execute(queryStr, params);
123
+ return {
124
+ affectedRows: result.affectedRows ?? 0,
125
+ insertId: result.insertId ?? undefined,
126
+ };
127
+ },
128
+ savepoint: async (name) => {
129
+ await conn.execute(`SAVEPOINT ${name}`);
130
+ },
131
+ rollbackTo: async (name) => {
132
+ await conn.execute(`ROLLBACK TO SAVEPOINT ${name}`);
133
+ },
134
+ commit: async () => {
135
+ await conn.commit();
136
+ },
137
+ rollback: async () => {
138
+ await conn.rollback();
139
+ },
140
+ };
141
+ const result = await fn(tx);
142
+ await conn.commit();
143
+ return result;
144
+ }
145
+ catch (err) {
146
+ await conn.rollback();
147
+ throw err;
148
+ }
149
+ finally {
150
+ conn.release();
151
+ }
152
+ }
153
+ async isHealthy() {
154
+ try {
155
+ this.ensureConnected();
156
+ await this.pool.execute('SELECT 1');
157
+ return true;
158
+ }
159
+ catch {
160
+ return false;
161
+ }
162
+ }
163
+ getRawClient() {
164
+ return this.pool;
165
+ }
166
+ // ─── Private Helpers ───────────────────────────────────────────────────────
167
+ ensureConnected() {
168
+ if (!this.pool) {
169
+ throw new Error('MySQL adapter is not connected. Call connect() first.');
170
+ }
171
+ }
172
+ logQuery(sql, params) {
173
+ if (!this.config.logging)
174
+ return;
175
+ if (typeof this.config.logging === 'function') {
176
+ this.config.logging(sql, params);
177
+ }
178
+ }
179
+ log(message) {
180
+ if (!this.config.logging)
181
+ return;
182
+ if (typeof this.config.logging === 'function') {
183
+ this.config.logging(message);
184
+ }
185
+ }
186
+ }
187
+ exports.MysqlAdapter = MysqlAdapter;
188
+ //# sourceMappingURL=mysql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../src/database/adapters/mysql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * PostgreSQL Database Adapter.
3
+ *
4
+ * Uses the `postgres` (postgres.js) npm package for high-performance connection pooling,
5
+ * parameterized queries, and transaction support.
6
+ *
7
+ * Peer Dependencies required:
8
+ * npm install postgres
9
+ */
10
+ import type { DatabaseAdapter, DatabaseConfig, QueryResult, ExecuteResult, Transaction } from '../types';
11
+ export declare class PostgresAdapter implements DatabaseAdapter {
12
+ readonly dialect: "postgres";
13
+ private client;
14
+ private config;
15
+ constructor(config: DatabaseConfig);
16
+ connect(): Promise<void>;
17
+ disconnect(): Promise<void>;
18
+ query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<QueryResult<T>>;
19
+ execute(sql: string, params?: unknown[]): Promise<ExecuteResult>;
20
+ transaction<T>(fn: (tx: Transaction) => Promise<T>): Promise<T>;
21
+ isHealthy(): Promise<boolean>;
22
+ getRawClient(): unknown;
23
+ private ensureConnected;
24
+ private buildConnectionUrl;
25
+ private logQuery;
26
+ private log;
27
+ }
28
+ //# sourceMappingURL=postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../../src/database/adapters/postgres.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,WAAW,EACX,aAAa,EACb,WAAW,EAEZ,MAAM,UAAU,CAAA;AAEjB,qBAAa,eAAgB,YAAW,eAAe;IACrD,QAAQ,CAAC,OAAO,EAAG,UAAU,CAAS;IAEtC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,cAAc;IAI5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqCxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,OAAO,EAAO,GACrB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAqBpB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAYpE,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA0D/D,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAUnC,YAAY,IAAI,OAAO;IAMvB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,GAAG;CAMZ"}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ /**
3
+ * PostgreSQL Database Adapter.
4
+ *
5
+ * Uses the `postgres` (postgres.js) npm package for high-performance connection pooling,
6
+ * parameterized queries, and transaction support.
7
+ *
8
+ * Peer Dependencies required:
9
+ * npm install postgres
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PostgresAdapter = void 0;
13
+ class PostgresAdapter {
14
+ constructor(config) {
15
+ this.dialect = 'postgres';
16
+ this.client = null;
17
+ this.config = config;
18
+ }
19
+ async connect() {
20
+ let postgres;
21
+ try {
22
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
23
+ postgres = require('postgres');
24
+ }
25
+ catch {
26
+ throw new Error('Missing dependency. Please run: npm install postgres');
27
+ }
28
+ const url = this.config.url || this.buildConnectionUrl();
29
+ const poolConfig = this.config.pool || {};
30
+ this.client = postgres(url, {
31
+ max: poolConfig.max ?? 10,
32
+ idle_timeout: poolConfig.idleTimeoutMs
33
+ ? poolConfig.idleTimeoutMs / 1000
34
+ : 30,
35
+ connect_timeout: this.config.connectTimeoutMs
36
+ ? this.config.connectTimeoutMs / 1000
37
+ : 5,
38
+ ssl: this.config.ssl === true
39
+ ? { rejectUnauthorized: process.env.NODE_ENV === 'production' }
40
+ : typeof this.config.ssl === 'object'
41
+ ? this.config.ssl
42
+ : undefined,
43
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
44
+ onnotice: () => { }, // Suppress notices
45
+ });
46
+ // Test the connection
47
+ await this.client `SELECT 1`;
48
+ this.log('PostgreSQL connection established');
49
+ }
50
+ async disconnect() {
51
+ if (this.client) {
52
+ await this.client.end();
53
+ this.client = null;
54
+ this.log('PostgreSQL connection closed');
55
+ }
56
+ }
57
+ async query(sql, params = []) {
58
+ this.ensureConnected();
59
+ this.logQuery(sql, params);
60
+ const result = await this.client.unsafe(sql, params);
61
+ const fields = result.columns
62
+ ? result.columns.map((col) => ({
63
+ name: col.name,
64
+ dataType: col.type?.toString(),
65
+ tableId: col.table,
66
+ }))
67
+ : [];
68
+ return {
69
+ rows: Array.from(result),
70
+ rowCount: result.length,
71
+ fields,
72
+ };
73
+ }
74
+ async execute(sql, params = []) {
75
+ this.ensureConnected();
76
+ this.logQuery(sql, params);
77
+ const result = await this.client.unsafe(sql, params);
78
+ return {
79
+ affectedRows: result.count ?? 0,
80
+ insertId: result[0]?.id,
81
+ };
82
+ }
83
+ async transaction(fn) {
84
+ this.ensureConnected();
85
+ return this.client.begin(async (sql) => {
86
+ const tx = {
87
+ query: async (queryStr, params = []) => {
88
+ this.logQuery(queryStr, params);
89
+ const result = await sql.unsafe(queryStr, params);
90
+ const fields = result.columns
91
+ ? result.columns.map((col) => ({
92
+ name: col.name,
93
+ dataType: col.type?.toString(),
94
+ tableId: col.table,
95
+ }))
96
+ : [];
97
+ return {
98
+ rows: Array.from(result),
99
+ rowCount: result.length,
100
+ fields,
101
+ };
102
+ },
103
+ execute: async (queryStr, params = []) => {
104
+ this.logQuery(queryStr, params);
105
+ const result = await sql.unsafe(queryStr, params);
106
+ return {
107
+ affectedRows: result.count ?? 0,
108
+ insertId: result[0]?.id,
109
+ };
110
+ },
111
+ savepoint: async (name) => {
112
+ await sql.unsafe(`SAVEPOINT ${name}`);
113
+ },
114
+ rollbackTo: async (name) => {
115
+ await sql.unsafe(`ROLLBACK TO SAVEPOINT ${name}`);
116
+ },
117
+ commit: async () => {
118
+ // postgres.js handles commit automatically when the callback resolves
119
+ },
120
+ rollback: async () => {
121
+ throw new Error('ROLLBACK');
122
+ },
123
+ };
124
+ return fn(tx);
125
+ });
126
+ }
127
+ async isHealthy() {
128
+ try {
129
+ this.ensureConnected();
130
+ await this.client `SELECT 1`;
131
+ return true;
132
+ }
133
+ catch {
134
+ return false;
135
+ }
136
+ }
137
+ getRawClient() {
138
+ return this.client;
139
+ }
140
+ // ─── Private Helpers ───────────────────────────────────────────────────────
141
+ ensureConnected() {
142
+ if (!this.client) {
143
+ throw new Error('PostgreSQL adapter is not connected. Call connect() first.');
144
+ }
145
+ }
146
+ buildConnectionUrl() {
147
+ const { host, port, database, username, password } = this.config;
148
+ if (!host || !database) {
149
+ throw new Error('PostgreSQL requires either a `url` or `host` + `database` in the config.');
150
+ }
151
+ const auth = username
152
+ ? password
153
+ ? `${encodeURIComponent(username)}:${encodeURIComponent(password)}@`
154
+ : `${encodeURIComponent(username)}@`
155
+ : '';
156
+ return `postgres://${auth}${host}:${port || 5432}/${database}`;
157
+ }
158
+ logQuery(sql, params) {
159
+ if (!this.config.logging)
160
+ return;
161
+ if (typeof this.config.logging === 'function') {
162
+ this.config.logging(sql, params);
163
+ }
164
+ }
165
+ log(message) {
166
+ if (!this.config.logging)
167
+ return;
168
+ if (typeof this.config.logging === 'function') {
169
+ this.config.logging(message);
170
+ }
171
+ }
172
+ }
173
+ exports.PostgresAdapter = PostgresAdapter;
174
+ //# sourceMappingURL=postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../../src/database/adapters/postgres.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * SQLite Database Adapter.
3
+ *
4
+ * Uses the `better-sqlite3` npm package for high-performance synchronous
5
+ * SQLite operations, wrapped in an async interface for consistency.
6
+ *
7
+ * Peer Dependencies required:
8
+ * npm install better-sqlite3
9
+ */
10
+ import type { DatabaseAdapter, DatabaseConfig, QueryResult, ExecuteResult, Transaction } from '../types';
11
+ export declare class SqliteAdapter implements DatabaseAdapter {
12
+ readonly dialect: "sqlite";
13
+ private db;
14
+ private config;
15
+ constructor(config: DatabaseConfig);
16
+ connect(): Promise<void>;
17
+ disconnect(): Promise<void>;
18
+ query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<QueryResult<T>>;
19
+ execute(sql: string, params?: unknown[]): Promise<ExecuteResult>;
20
+ transaction<T>(fn: (tx: Transaction) => Promise<T>): Promise<T>;
21
+ isHealthy(): Promise<boolean>;
22
+ getRawClient(): unknown;
23
+ private ensureConnected;
24
+ private logQuery;
25
+ private log;
26
+ }
27
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../src/database/adapters/sqlite.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,WAAW,EACX,aAAa,EACb,WAAW,EAEZ,MAAM,UAAU,CAAA;AAEjB,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,OAAO,EAAG,QAAQ,CAAS;IAEpC,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,cAAc;IAI5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,OAAO,EAAO,GACrB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAqBpB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAepE,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAoD/D,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAUnC,YAAY,IAAI,OAAO;IAMvB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,GAAG;CAMZ"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ /**
3
+ * SQLite Database Adapter.
4
+ *
5
+ * Uses the `better-sqlite3` npm package for high-performance synchronous
6
+ * SQLite operations, wrapped in an async interface for consistency.
7
+ *
8
+ * Peer Dependencies required:
9
+ * npm install better-sqlite3
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SqliteAdapter = void 0;
13
+ class SqliteAdapter {
14
+ constructor(config) {
15
+ this.dialect = 'sqlite';
16
+ this.db = null;
17
+ this.config = config;
18
+ }
19
+ async connect() {
20
+ let Database;
21
+ try {
22
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
23
+ Database = require('better-sqlite3');
24
+ }
25
+ catch {
26
+ throw new Error('Missing dependency. Please run: npm install better-sqlite3');
27
+ }
28
+ const filename = this.config.filename || this.config.database || ':memory:';
29
+ this.db = new Database(filename, {
30
+ timeout: this.config.connectTimeoutMs ?? 5000,
31
+ });
32
+ // Enable WAL mode for better concurrency
33
+ this.db.pragma('journal_mode = WAL');
34
+ // Enable foreign keys
35
+ this.db.pragma('foreign_keys = ON');
36
+ this.log(`SQLite connection established (${filename})`);
37
+ }
38
+ async disconnect() {
39
+ if (this.db) {
40
+ this.db.close();
41
+ this.db = null;
42
+ this.log('SQLite connection closed');
43
+ }
44
+ }
45
+ async query(sql, params = []) {
46
+ this.ensureConnected();
47
+ this.logQuery(sql, params);
48
+ const stmt = this.db.prepare(sql);
49
+ const rows = stmt.all(...params);
50
+ const fields = stmt.columns
51
+ ? stmt.columns().map((col) => ({
52
+ name: col.name,
53
+ dataType: col.type || undefined,
54
+ }))
55
+ : [];
56
+ return {
57
+ rows,
58
+ rowCount: rows.length,
59
+ fields,
60
+ };
61
+ }
62
+ async execute(sql, params = []) {
63
+ this.ensureConnected();
64
+ this.logQuery(sql, params);
65
+ const stmt = this.db.prepare(sql);
66
+ const result = stmt.run(...params);
67
+ return {
68
+ affectedRows: result.changes,
69
+ insertId: result.lastInsertRowid
70
+ ? Number(result.lastInsertRowid)
71
+ : undefined,
72
+ };
73
+ }
74
+ async transaction(fn) {
75
+ this.ensureConnected();
76
+ // better-sqlite3 has synchronous transactions, but we wrap for async consistency
77
+ const tx = {
78
+ query: async (queryStr, params = []) => {
79
+ return this.query(queryStr, params);
80
+ },
81
+ execute: async (queryStr, params = []) => {
82
+ return this.execute(queryStr, params);
83
+ },
84
+ savepoint: async (name) => {
85
+ this.db.exec(`SAVEPOINT ${name}`);
86
+ },
87
+ rollbackTo: async (name) => {
88
+ this.db.exec(`ROLLBACK TO SAVEPOINT ${name}`);
89
+ },
90
+ commit: async () => {
91
+ // Handled by the wrapping transaction
92
+ },
93
+ rollback: async () => {
94
+ throw new Error('ROLLBACK');
95
+ },
96
+ };
97
+ // Use better-sqlite3's transaction wrapper for atomic execution
98
+ try {
99
+ this.db.exec('BEGIN');
100
+ const result = await fn(tx);
101
+ this.db.exec('COMMIT');
102
+ return result;
103
+ }
104
+ catch (err) {
105
+ try {
106
+ this.db.exec('ROLLBACK');
107
+ }
108
+ catch {
109
+ // Already rolled back
110
+ }
111
+ throw err;
112
+ }
113
+ }
114
+ async isHealthy() {
115
+ try {
116
+ this.ensureConnected();
117
+ this.db.prepare('SELECT 1').get();
118
+ return true;
119
+ }
120
+ catch {
121
+ return false;
122
+ }
123
+ }
124
+ getRawClient() {
125
+ return this.db;
126
+ }
127
+ // ─── Private Helpers ───────────────────────────────────────────────────────
128
+ ensureConnected() {
129
+ if (!this.db) {
130
+ throw new Error('SQLite adapter is not connected. Call connect() first.');
131
+ }
132
+ }
133
+ logQuery(sql, params) {
134
+ if (!this.config.logging)
135
+ return;
136
+ if (typeof this.config.logging === 'function') {
137
+ this.config.logging(sql, params);
138
+ }
139
+ }
140
+ log(message) {
141
+ if (!this.config.logging)
142
+ return;
143
+ if (typeof this.config.logging === 'function') {
144
+ this.config.logging(message);
145
+ }
146
+ }
147
+ }
148
+ exports.SqliteAdapter = SqliteAdapter;
149
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../src/database/adapters/sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * ExisJS Database Layer
3
+ *
4
+ * A unified database abstraction providing connection pooling, query building,
5
+ * transactions, migrations, and multi-dialect support.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { createDatabase, db } from 'exisjs/database'
10
+ *
11
+ * const database = createDatabase({
12
+ * dialect: 'postgres',
13
+ * url: process.env.DATABASE_URL,
14
+ * })
15
+ * await database.connect()
16
+ *
17
+ * // Raw queries
18
+ * const users = await db.query<User>('SELECT * FROM users WHERE role = $1', ['admin'])
19
+ *
20
+ * // Query builder
21
+ * const admins = await db.table('users').where('role', '=', 'admin').rows()
22
+ *
23
+ * // Transactions
24
+ * await db.transaction(async (tx) => {
25
+ * await tx.execute('INSERT INTO orders ...', [...])
26
+ * await tx.execute('UPDATE inventory ...', [...])
27
+ * })
28
+ *
29
+ * // Migrations
30
+ * const migrator = db.getMigrator({ directory: './migrations' })
31
+ * await migrator.up()
32
+ * ```
33
+ */
34
+ export { DatabaseManager, createDatabase, db, setDefaultDatabase, } from './manager';
35
+ export { QueryBuilder } from './query-builder';
36
+ export { Migrator } from './migration';
37
+ export { PostgresAdapter } from './adapters/postgres';
38
+ export { MysqlAdapter } from './adapters/mysql';
39
+ export { SqliteAdapter } from './adapters/sqlite';
40
+ export { MongodbAdapter } from './adapters/mongodb';
41
+ export type { DatabaseDialect, DatabaseConfig, DatabaseAdapter, DatabaseSslConfig, PoolConfig, QueryResult, ExecuteResult, Transaction, FieldInfo, Migration, MigrationConfig, MigrationRecord, WhereOperator, OrderDirection, JoinType, } from './types';
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAGH,OAAO,EACL,eAAe,EACf,cAAc,EACd,EAAE,EACF,kBAAkB,GACnB,MAAM,WAAW,CAAA;AAGlB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAG9C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAGtC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGnD,YAAY,EACV,eAAe,EACf,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACX,SAAS,EACT,SAAS,EACT,eAAe,EACf,eAAe,EACf,aAAa,EACb,cAAc,EACd,QAAQ,GACT,MAAM,SAAS,CAAA"}