@akirilyuk/supabase-in-memory-server 1.0.0

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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +240 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +28 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/index.d.ts +39 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +63 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/lib/auth-memory.d.ts +40 -0
  12. package/dist/lib/auth-memory.d.ts.map +1 -0
  13. package/dist/lib/auth-memory.js +167 -0
  14. package/dist/lib/auth-memory.js.map +1 -0
  15. package/dist/lib/http-headers.d.ts +6 -0
  16. package/dist/lib/http-headers.d.ts.map +1 -0
  17. package/dist/lib/http-headers.js +14 -0
  18. package/dist/lib/http-headers.js.map +1 -0
  19. package/dist/lib/jwt.d.ts +14 -0
  20. package/dist/lib/jwt.d.ts.map +1 -0
  21. package/dist/lib/jwt.js +41 -0
  22. package/dist/lib/jwt.js.map +1 -0
  23. package/dist/lib/memory-store.d.ts +18 -0
  24. package/dist/lib/memory-store.d.ts.map +1 -0
  25. package/dist/lib/memory-store.js +34 -0
  26. package/dist/lib/memory-store.js.map +1 -0
  27. package/dist/lib/postgrest.d.ts +9 -0
  28. package/dist/lib/postgrest.d.ts.map +1 -0
  29. package/dist/lib/postgrest.js +169 -0
  30. package/dist/lib/postgrest.js.map +1 -0
  31. package/dist/lib/server-logger.d.ts +10 -0
  32. package/dist/lib/server-logger.d.ts.map +1 -0
  33. package/dist/lib/server-logger.js +36 -0
  34. package/dist/lib/server-logger.js.map +1 -0
  35. package/dist/lib/server-options.d.ts +52 -0
  36. package/dist/lib/server-options.d.ts.map +1 -0
  37. package/dist/lib/server-options.js +82 -0
  38. package/dist/lib/server-options.js.map +1 -0
  39. package/dist/lib/types.d.ts +3 -0
  40. package/dist/lib/types.d.ts.map +1 -0
  41. package/dist/lib/types.js +3 -0
  42. package/dist/lib/types.js.map +1 -0
  43. package/dist/memory-server/MemorySupabaseHttpServer.d.ts +24 -0
  44. package/dist/memory-server/MemorySupabaseHttpServer.d.ts.map +1 -0
  45. package/dist/memory-server/MemorySupabaseHttpServer.js +91 -0
  46. package/dist/memory-server/MemorySupabaseHttpServer.js.map +1 -0
  47. package/dist/memory-server/auth-routes.d.ts +3 -0
  48. package/dist/memory-server/auth-routes.d.ts.map +1 -0
  49. package/dist/memory-server/auth-routes.js +217 -0
  50. package/dist/memory-server/auth-routes.js.map +1 -0
  51. package/dist/memory-server/handler-context.d.ts +19 -0
  52. package/dist/memory-server/handler-context.d.ts.map +1 -0
  53. package/dist/memory-server/handler-context.js +3 -0
  54. package/dist/memory-server/handler-context.js.map +1 -0
  55. package/dist/memory-server/http-utils.d.ts +19 -0
  56. package/dist/memory-server/http-utils.d.ts.map +1 -0
  57. package/dist/memory-server/http-utils.js +109 -0
  58. package/dist/memory-server/http-utils.js.map +1 -0
  59. package/dist/memory-server/index.d.ts +4 -0
  60. package/dist/memory-server/index.d.ts.map +1 -0
  61. package/dist/memory-server/index.js +8 -0
  62. package/dist/memory-server/index.js.map +1 -0
  63. package/dist/memory-server/log-meta.d.ts +12 -0
  64. package/dist/memory-server/log-meta.d.ts.map +1 -0
  65. package/dist/memory-server/log-meta.js +58 -0
  66. package/dist/memory-server/log-meta.js.map +1 -0
  67. package/dist/memory-server/rest-routes.d.ts +3 -0
  68. package/dist/memory-server/rest-routes.d.ts.map +1 -0
  69. package/dist/memory-server/rest-routes.js +235 -0
  70. package/dist/memory-server/rest-routes.js.map +1 -0
  71. package/dist/memory-server/server-lifecycle.d.ts +19 -0
  72. package/dist/memory-server/server-lifecycle.d.ts.map +1 -0
  73. package/dist/memory-server/server-lifecycle.js +75 -0
  74. package/dist/memory-server/server-lifecycle.js.map +1 -0
  75. package/dist/memory-server/types.d.ts +33 -0
  76. package/dist/memory-server/types.d.ts.map +1 -0
  77. package/dist/memory-server/types.js +3 -0
  78. package/dist/memory-server/types.js.map +1 -0
  79. package/package.json +97 -0
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dispatchRestRoutes = dispatchRestRoutes;
4
+ const postgrest_js_1 = require("../lib/postgrest.js");
5
+ const http_utils_js_1 = require("./http-utils.js");
6
+ const log_meta_js_1 = require("./log-meta.js");
7
+ const REST_TABLE_PATH = /^\/rest\/v1\/([^/]+)$/;
8
+ async function dispatchRestRoutes(ctx, path, method, url) {
9
+ const match = REST_TABLE_PATH.exec(path);
10
+ if (!match?.[1])
11
+ return false;
12
+ const table = match[1];
13
+ const { store } = ctx;
14
+ const rows = store.getTable(table);
15
+ const params = url.searchParams;
16
+ const select = params.get('select');
17
+ if (method === 'GET' || method === 'HEAD') {
18
+ handleRestGetOrHead(ctx, table, method, rows, params, select);
19
+ return true;
20
+ }
21
+ if (method === 'POST') {
22
+ await handleRestPost(ctx, table, rows, params, select);
23
+ return true;
24
+ }
25
+ if (method === 'PATCH') {
26
+ await handleRestPatch(ctx, table, rows, params, select);
27
+ return true;
28
+ }
29
+ if (method === 'DELETE') {
30
+ handleRestDelete(ctx, table, rows, params, select);
31
+ return true;
32
+ }
33
+ return false;
34
+ }
35
+ function pickMatchingRow(all, incoming, onConflict) {
36
+ const keys = (onConflict ?? 'id')
37
+ .split(',')
38
+ .map((k) => k.trim())
39
+ .filter(Boolean);
40
+ const present = keys.filter((k) => k in incoming);
41
+ if (present.length === 0)
42
+ return undefined;
43
+ return all.find((r) => present.every((k) => r[k] === incoming[k]));
44
+ }
45
+ function handleRestGetOrHead(ctx, table, method, rows, params, select) {
46
+ const { req, res } = ctx;
47
+ let data = (0, postgrest_js_1.filterRows)(rows, params);
48
+ const order = params.get('order');
49
+ data = (0, postgrest_js_1.orderRows)(data, order);
50
+ const total = data.length;
51
+ data = (0, postgrest_js_1.limitOffset)(data, params);
52
+ const projected = (0, postgrest_js_1.projectRows)(data, select);
53
+ if (method === 'HEAD') {
54
+ const wantCount = (0, http_utils_js_1.preferCount)(req);
55
+ (0, http_utils_js_1.setCors)(res);
56
+ if (wantCount) {
57
+ res.setHeader('content-range', `0-${String(Math.max(projected.length - 1, 0))}/${String(total)}`);
58
+ }
59
+ res.writeHead(200);
60
+ res.end();
61
+ ctx.logger.debug('REST HEAD completed', {
62
+ table,
63
+ select,
64
+ order,
65
+ afterFilterRowCount: total,
66
+ returnedRowCount: projected.length,
67
+ preferCount: wantCount,
68
+ });
69
+ return;
70
+ }
71
+ if ((0, http_utils_js_1.isObjectAccept)(req)) {
72
+ if (projected.length === 0 || projected.length > 1) {
73
+ ctx.logger.debug('REST GET: object+json accept returned no single row', {
74
+ table,
75
+ select,
76
+ order,
77
+ afterFilterRowCount: total,
78
+ returnedRowCount: projected.length,
79
+ responseData: (0, log_meta_js_1.restRowsForLog)(projected),
80
+ });
81
+ (0, http_utils_js_1.sendJson)(res, 406, {
82
+ code: 'PGRST116',
83
+ message: 'JSON object requested, multiple (or no) rows returned',
84
+ });
85
+ return;
86
+ }
87
+ const wantCountObj = (0, http_utils_js_1.preferCount)(req);
88
+ (0, http_utils_js_1.setCors)(res);
89
+ if (wantCountObj) {
90
+ res.setHeader('content-range', `0-0/${String(total)}`);
91
+ }
92
+ res.setHeader('Content-Type', 'application/json');
93
+ res.writeHead(200);
94
+ res.end(JSON.stringify(projected[0]));
95
+ ctx.logger.debug('REST GET single-object response', {
96
+ table,
97
+ select,
98
+ order,
99
+ afterFilterRowCount: total,
100
+ responseData: projected[0],
101
+ });
102
+ return;
103
+ }
104
+ const wantCount = (0, http_utils_js_1.preferCount)(req);
105
+ (0, http_utils_js_1.setCors)(res);
106
+ if (wantCount) {
107
+ const last = projected.length > 0 ? projected.length - 1 : 0;
108
+ res.setHeader('content-range', `0-${String(last)}/${String(total)}`);
109
+ }
110
+ res.setHeader('Content-Type', 'application/json');
111
+ res.writeHead(200);
112
+ res.end(JSON.stringify(projected));
113
+ ctx.logger.debug('REST GET collection response', {
114
+ table,
115
+ select,
116
+ order,
117
+ afterFilterRowCount: total,
118
+ returnedRowCount: projected.length,
119
+ responseData: (0, log_meta_js_1.restRowsForLog)(projected),
120
+ preferCount: wantCount,
121
+ });
122
+ }
123
+ async function handleRestPost(ctx, table, rows, params, select) {
124
+ const { req, res, logger } = ctx;
125
+ const raw = await (0, http_utils_js_1.readBody)(req);
126
+ const body = (0, http_utils_js_1.parseJsonBody)(raw);
127
+ const list = Array.isArray(body)
128
+ ? body
129
+ : body && typeof body === 'object'
130
+ ? [body]
131
+ : [];
132
+ const onConflict = params.get('on_conflict');
133
+ const upsert = (0, http_utils_js_1.isUpsertRequest)(req);
134
+ let resultRows;
135
+ if (upsert) {
136
+ const ignore = (0, http_utils_js_1.preferResolution)(req) === 'ignore';
137
+ const merged = (0, postgrest_js_1.upsertRows)(rows, list, onConflict, ignore);
138
+ rows.length = 0;
139
+ rows.push(...merged);
140
+ resultRows = list
141
+ .map((incoming) => pickMatchingRow(rows, incoming, onConflict))
142
+ .filter((r) => r !== undefined);
143
+ if (resultRows.length === 0)
144
+ resultRows = [...list];
145
+ }
146
+ else {
147
+ const start = rows.length;
148
+ for (const item of list) {
149
+ rows.push({ ...item });
150
+ }
151
+ resultRows = rows.slice(start);
152
+ }
153
+ const out = (0, postgrest_js_1.projectRows)(resultRows, select);
154
+ const returnRep = (0, http_utils_js_1.preferReturnRepresentation)(req);
155
+ logger.debug('REST POST completed', {
156
+ table,
157
+ select,
158
+ onConflict,
159
+ requestPayload: (0, log_meta_js_1.restRowsForLog)(list),
160
+ upsert,
161
+ preferResolution: upsert ? (0, http_utils_js_1.preferResolution)(req) : undefined,
162
+ insertedOrUpserted: resultRows.length,
163
+ tableRowCountAfter: rows.length,
164
+ responseProjection: returnRep ? (0, log_meta_js_1.restRowsForLog)(out) : undefined,
165
+ returnRepresentation: returnRep,
166
+ });
167
+ if (returnRep) {
168
+ (0, http_utils_js_1.sendJson)(res, 201, out.length === 1 && !Array.isArray(body) ? out[0] : out);
169
+ }
170
+ else {
171
+ (0, http_utils_js_1.sendEmpty)(res, 201);
172
+ }
173
+ }
174
+ async function handleRestPatch(ctx, table, rows, params, select) {
175
+ const { req, res, logger } = ctx;
176
+ const raw = await (0, http_utils_js_1.readBody)(req);
177
+ const patch = (0, http_utils_js_1.parseJsonBody)(raw);
178
+ const matches = (0, postgrest_js_1.filterRows)(rows, params);
179
+ const matchSet = new Set(matches);
180
+ const updated = [];
181
+ for (let i = 0; i < rows.length; i++) {
182
+ const row = rows[i];
183
+ if (row !== undefined && matchSet.has(row)) {
184
+ const merged = { ...row, ...patch };
185
+ rows[i] = merged;
186
+ // New object identity: cannot find updated rows with matchSet after the loop.
187
+ updated.push(merged);
188
+ }
189
+ }
190
+ const out = (0, postgrest_js_1.projectRows)(updated, select);
191
+ const returnRep = (0, http_utils_js_1.preferReturnRepresentation)(req);
192
+ logger.debug('REST PATCH completed', {
193
+ table,
194
+ select,
195
+ requestPatch: patch,
196
+ matchedRowCount: matches.length,
197
+ updatedCount: updated.length,
198
+ updatedRows: (0, log_meta_js_1.restRowsForLog)(updated),
199
+ responseProjection: returnRep ? (0, log_meta_js_1.restRowsForLog)(out) : undefined,
200
+ returnRepresentation: returnRep,
201
+ });
202
+ if (returnRep) {
203
+ (0, http_utils_js_1.sendJson)(res, 200, out.length === 1 ? out[0] : out);
204
+ }
205
+ else {
206
+ (0, http_utils_js_1.sendEmpty)(res, 204);
207
+ }
208
+ }
209
+ function handleRestDelete(ctx, table, rows, params, select) {
210
+ const { req, res, logger } = ctx;
211
+ const matches = (0, postgrest_js_1.filterRows)(rows, params);
212
+ const matchSet = new Set(matches);
213
+ const deletedSnapshot = [...matches];
214
+ const out = (0, postgrest_js_1.projectRows)(deletedSnapshot, select);
215
+ const next = rows.filter((r) => !matchSet.has(r));
216
+ rows.length = 0;
217
+ rows.push(...next);
218
+ const returnRep = (0, http_utils_js_1.preferReturnRepresentation)(req);
219
+ logger.debug('REST DELETE completed', {
220
+ table,
221
+ select,
222
+ matchedRowCount: matches.length,
223
+ deletedRows: (0, log_meta_js_1.restRowsForLog)(deletedSnapshot),
224
+ tableRowCountAfter: rows.length,
225
+ returnRepresentation: returnRep,
226
+ responseProjection: returnRep ? (0, log_meta_js_1.restRowsForLog)(out) : undefined,
227
+ });
228
+ if (returnRep) {
229
+ (0, http_utils_js_1.sendJson)(res, 200, out);
230
+ }
231
+ else {
232
+ (0, http_utils_js_1.sendEmpty)(res, 204);
233
+ }
234
+ }
235
+ //# sourceMappingURL=rest-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-routes.js","sourceRoot":"","sources":["../../src/memory-server/rest-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { MemorySupabaseServer, MemorySupabaseServerOptions } from './types.js';
2
+ /**
3
+ * Starts a local HTTP server that mimics Supabase REST and Auth endpoints.
4
+ *
5
+ * Merges `readMemorySupabaseServerEnv()` into options when `useEnv` is not `false`.
6
+ * All requests must send header `apikey` equal to {@link MemorySupabaseServer.anonKey} or {@link MemorySupabaseServer.serviceRoleKey}.
7
+ *
8
+ * @param options - Listen address, keys, and whether to read `process.env` (`MemorySupabaseServerInputOptions`).
9
+ * @returns A handle with `url`, keys, `store`, `auth`, and `close()`.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const srv = await createMemorySupabaseServer({ useEnv: false });
14
+ * const client = createClient(srv.url, srv.anonKey);
15
+ * await srv.close();
16
+ * ```
17
+ */
18
+ export declare function createMemorySupabaseServer(options?: MemorySupabaseServerOptions): Promise<MemorySupabaseServer>;
19
+ //# sourceMappingURL=server-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-lifecycle.d.ts","sourceRoot":"","sources":["../../src/memory-server/server-lifecycle.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAEpF;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,oBAAoB,CAAC,CAuD/B"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMemorySupabaseServer = createMemorySupabaseServer;
4
+ const node_http_1 = require("node:http");
5
+ const server_logger_js_1 = require("../lib/server-logger.js");
6
+ const server_options_js_1 = require("../lib/server-options.js");
7
+ const MemorySupabaseHttpServer_js_1 = require("./MemorySupabaseHttpServer.js");
8
+ /**
9
+ * Starts a local HTTP server that mimics Supabase REST and Auth endpoints.
10
+ *
11
+ * Merges `readMemorySupabaseServerEnv()` into options when `useEnv` is not `false`.
12
+ * All requests must send header `apikey` equal to {@link MemorySupabaseServer.anonKey} or {@link MemorySupabaseServer.serviceRoleKey}.
13
+ *
14
+ * @param options - Listen address, keys, and whether to read `process.env` (`MemorySupabaseServerInputOptions`).
15
+ * @returns A handle with `url`, keys, `store`, `auth`, and `close()`.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * const srv = await createMemorySupabaseServer({ useEnv: false });
20
+ * const client = createClient(srv.url, srv.anonKey);
21
+ * await srv.close();
22
+ * ```
23
+ */
24
+ async function createMemorySupabaseServer(options = {}) {
25
+ const resolved = (0, server_options_js_1.resolveMemorySupabaseServerOptions)(options);
26
+ const { host, port, anonKey, serviceRoleKey, debug } = resolved;
27
+ const logger = (0, server_logger_js_1.createMemorySupabaseLogger)(debug);
28
+ const app = new MemorySupabaseHttpServer_js_1.MemorySupabaseHttpServer(anonKey, serviceRoleKey, logger);
29
+ const server = (0, node_http_1.createServer)(app.createNodeListener());
30
+ await new Promise((resolve, reject) => {
31
+ server.listen(port, host, () => {
32
+ resolve();
33
+ });
34
+ server.on('error', (err) => {
35
+ logger.error('HTTP server failed to listen', { message: err.message });
36
+ reject(err);
37
+ });
38
+ });
39
+ const addr = server.address();
40
+ if (!addr || typeof addr === 'string') {
41
+ throw new Error('Server address unavailable');
42
+ }
43
+ const publicHost = host === '0.0.0.0' ? '127.0.0.1' : host;
44
+ const url = `http://${publicHost}:${String(addr.port)}`;
45
+ logger.info('In-memory Supabase HTTP server listening', {
46
+ url,
47
+ bindHost: host,
48
+ port: addr.port,
49
+ debug,
50
+ });
51
+ return {
52
+ url,
53
+ anonKey,
54
+ serviceRoleKey,
55
+ supabaseKey: anonKey,
56
+ store: app.store,
57
+ auth: app.auth,
58
+ server,
59
+ logger,
60
+ close: () => new Promise((resolve, reject) => {
61
+ logger.info('In-memory Supabase HTTP server closing');
62
+ app.auth.clear();
63
+ server.close((e) => {
64
+ if (e) {
65
+ logger.error('Error while closing HTTP server', { message: e.message });
66
+ reject(e);
67
+ }
68
+ else {
69
+ resolve();
70
+ }
71
+ });
72
+ }),
73
+ };
74
+ }
75
+ //# sourceMappingURL=server-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-lifecycle.js","sourceRoot":"","sources":["../../src/memory-server/server-lifecycle.ts"],"names":[],"mappings":";;AAuBA,gEAyDC;AAhFD,yCAAyC;AAEzC,8DAAqE;AACrE,gEAA8E;AAC9E,+EAAyE;AAGzE;;;;;;;;;;;;;;;GAeG;AACI,KAAK,UAAU,0BAA0B,CAC9C,UAAuC,EAAE;IAEzC,MAAM,QAAQ,GAAG,IAAA,sDAAkC,EAAC,OAAO,CAAC,CAAC;IAC7D,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;IAEhE,MAAM,MAAM,GAAG,IAAA,6CAA0B,EAAC,KAAK,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,sDAAwB,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,IAAA,wBAAY,EAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAEtD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvE,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,MAAM,GAAG,GAAG,UAAU,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAExD,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE;QACtD,GAAG;QACH,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK;KACN,CAAC,CAAC;IAEH,OAAO;QACL,GAAG;QACH,OAAO;QACP,cAAc;QACd,WAAW,EAAE,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM;QACN,MAAM;QACN,KAAK,EAAE,GAAG,EAAE,CACV,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpC,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACtD,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBACjB,IAAI,CAAC,EAAE,CAAC;oBACN,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;oBACxE,MAAM,CAAC,CAAC,CAAC,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;KACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { Server } from 'node:http';
2
+ import type { Logger } from 'winston';
3
+ import type { AuthMemory } from '../lib/auth-memory.js';
4
+ import type { MemoryStore } from '../lib/memory-store.js';
5
+ import type { MemorySupabaseServerInputOptions } from '../lib/server-options.js';
6
+ export type MemorySupabaseServerOptions = MemorySupabaseServerInputOptions;
7
+ /** Handle returned after the in-memory server starts listening. */
8
+ export interface MemorySupabaseServer {
9
+ /** Public REST/Auth base URL, e.g. `http://127.0.0.1:54321`. */
10
+ url: string;
11
+ /** Anon key — use with `createClient(url, anonKey)` (same as `SUPABASE_ANON_KEY`). */
12
+ anonKey: string;
13
+ /** Service role key — use with `createClient(url, serviceRoleKey)` for `auth.admin` (same as `SUPABASE_SERVICE_ROLE_KEY`). */
14
+ serviceRoleKey: string;
15
+ /**
16
+ * @deprecated Use {@link anonKey}. Kept for backward compatibility.
17
+ */
18
+ supabaseKey: string;
19
+ /** Shared in-memory tables for PostgREST routes. */
20
+ store: MemoryStore;
21
+ /** In-memory auth users, passwords, and refresh tokens (GoTrue-shaped API). */
22
+ auth: AuthMemory;
23
+ /** Underlying Node HTTP server. */
24
+ server: Server;
25
+ /**
26
+ * Winston logger for this server instance (lifecycle + request logging).
27
+ * Set `logger.silent = true` to suppress output (e.g. in noisy tests).
28
+ */
29
+ logger: Logger;
30
+ /** Stop listening and clear auth state (store is not cleared unless you call `store.clearAll()`). */
31
+ close: () => Promise<void>;
32
+ }
33
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory-server/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,0BAA0B,CAAC;AAEjF,MAAM,MAAM,2BAA2B,GAAG,gCAAgC,CAAC;AAE3E,mEAAmE;AACnE,MAAM,WAAW,oBAAoB;IACnC,gEAAgE;IAChE,GAAG,EAAE,MAAM,CAAC;IACZ,sFAAsF;IACtF,OAAO,EAAE,MAAM,CAAC;IAChB,8HAA8H;IAC9H,cAAc,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,KAAK,EAAE,WAAW,CAAC;IACnB,+EAA+E;IAC/E,IAAI,EAAE,UAAU,CAAC;IACjB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,qGAAqG;IACrG,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory-server/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,97 @@
1
+ {
2
+ "name": "@akirilyuk/supabase-in-memory-server",
3
+ "version": "1.0.0",
4
+ "description": "In-memory HTTP server mimicking Supabase REST (PostgREST) and Auth (GoTrue) for supabase-js: local testing, e2e, anon/service-role keys, optional CLI, Winston logs",
5
+ "type": "commonjs",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "supabase-in-memory-server": "./dist/cli.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "default": "./dist/index.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "LICENSE"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc -p tsconfig.build.json",
23
+ "clean": "rimraf dist",
24
+ "typecheck": "tsc --noEmit",
25
+ "lint": "eslint .",
26
+ "lint:fix": "eslint . --fix",
27
+ "format": "prettier --write .",
28
+ "format:check": "prettier --check .",
29
+ "prepack": "npm run build",
30
+ "test": "tsx --test tests/integration.test.ts tests/e2e/supabase-client.e2e.test.ts"
31
+ },
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/akirilyuk/supabase-in-memory-server.git"
35
+ },
36
+ "keywords": [
37
+ "supabase",
38
+ "supabase-js",
39
+ "supabase-mock",
40
+ "supabase-local",
41
+ "supabase-client-js",
42
+ "postgrest",
43
+ "postgrest-mock",
44
+ "gotrue",
45
+ "gotrue-mock",
46
+ "in-memory",
47
+ "in-memory-database",
48
+ "http-server",
49
+ "mock-server",
50
+ "fake-server",
51
+ "integration-testing",
52
+ "e2e-testing",
53
+ "testing",
54
+ "typescript",
55
+ "node",
56
+ "nodejs",
57
+ "cli",
58
+ "rest-api",
59
+ "auth",
60
+ "anon-key",
61
+ "service-role",
62
+ "winston",
63
+ "local-development",
64
+ "dev-server"
65
+ ],
66
+ "author": {
67
+ "name": "akirilyuk",
68
+ "url": "https://github.com/akirilyuk"
69
+ },
70
+ "license": "MIT",
71
+ "engines": {
72
+ "node": "^20.9.0 || >=22"
73
+ },
74
+ "bugs": {
75
+ "url": "https://github.com/akirilyuk/supabase-in-memory-server/issues"
76
+ },
77
+ "homepage": "https://github.com/akirilyuk/supabase-in-memory-server#readme",
78
+ "peerDependencies": {
79
+ "@supabase/supabase-js": "^2.0.0"
80
+ },
81
+ "devDependencies": {
82
+ "@eslint/js": "^10.0.1",
83
+ "@supabase/supabase-js": "^2.103.0",
84
+ "@types/node": "^25.6.0",
85
+ "eslint": "^10.2.0",
86
+ "eslint-config-prettier": "^10.1.8",
87
+ "eslint-plugin-simple-import-sort": "^13.0.0",
88
+ "prettier": "^3.8.2",
89
+ "rimraf": "^6.1.3",
90
+ "tsx": "^4.21.0",
91
+ "typescript": "^6.0.2",
92
+ "typescript-eslint": "^8.58.1"
93
+ },
94
+ "dependencies": {
95
+ "winston": "^3.19.0"
96
+ }
97
+ }