tinbase 0.1.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 (82) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +185 -0
  3. package/assets/logo.svg +18 -0
  4. package/dist/auth/handler.d.ts +43 -0
  5. package/dist/auth/handler.js +291 -0
  6. package/dist/auth/handler.js.map +1 -0
  7. package/dist/auth/password.d.ts +3 -0
  8. package/dist/auth/password.js +40 -0
  9. package/dist/auth/password.js.map +1 -0
  10. package/dist/cli.d.ts +2 -0
  11. package/dist/cli.js +181 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/db/bootstrap.d.ts +6 -0
  14. package/dist/db/bootstrap.js +213 -0
  15. package/dist/db/bootstrap.js.map +1 -0
  16. package/dist/db/database.d.ts +83 -0
  17. package/dist/db/database.js +270 -0
  18. package/dist/db/database.js.map +1 -0
  19. package/dist/db/engine.d.ts +30 -0
  20. package/dist/db/engine.js +28 -0
  21. package/dist/db/engine.js.map +1 -0
  22. package/dist/db/pglite-engine.d.ts +3 -0
  23. package/dist/db/pglite-engine.js +39 -0
  24. package/dist/db/pglite-engine.js.map +1 -0
  25. package/dist/index.d.ts +23 -0
  26. package/dist/index.js +145 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/jwt.d.ts +20 -0
  29. package/dist/jwt.js +72 -0
  30. package/dist/jwt.js.map +1 -0
  31. package/dist/node/bun-server.d.ts +8 -0
  32. package/dist/node/bun-server.js +41 -0
  33. package/dist/node/bun-server.js.map +1 -0
  34. package/dist/node/fs-driver.d.ts +11 -0
  35. package/dist/node/fs-driver.js +39 -0
  36. package/dist/node/fs-driver.js.map +1 -0
  37. package/dist/node/index.d.ts +7 -0
  38. package/dist/node/index.js +8 -0
  39. package/dist/node/index.js.map +1 -0
  40. package/dist/node/native/engine.d.ts +13 -0
  41. package/dist/node/native/engine.js +186 -0
  42. package/dist/node/native/engine.js.map +1 -0
  43. package/dist/node/native/wire.d.ts +38 -0
  44. package/dist/node/native/wire.js +345 -0
  45. package/dist/node/native/wire.js.map +1 -0
  46. package/dist/node/project.d.ts +6 -0
  47. package/dist/node/project.js +29 -0
  48. package/dist/node/project.js.map +1 -0
  49. package/dist/node/server-shared.d.ts +6 -0
  50. package/dist/node/server-shared.js +2 -0
  51. package/dist/node/server-shared.js.map +1 -0
  52. package/dist/node/server.d.ts +14 -0
  53. package/dist/node/server.js +83 -0
  54. package/dist/node/server.js.map +1 -0
  55. package/dist/node/ws.d.ts +8 -0
  56. package/dist/node/ws.js +165 -0
  57. package/dist/node/ws.js.map +1 -0
  58. package/dist/realtime/engine.d.ts +53 -0
  59. package/dist/realtime/engine.js +437 -0
  60. package/dist/realtime/engine.js.map +1 -0
  61. package/dist/rest/build.d.ts +53 -0
  62. package/dist/rest/build.js +505 -0
  63. package/dist/rest/build.js.map +1 -0
  64. package/dist/rest/errors.d.ts +2 -0
  65. package/dist/rest/errors.js +48 -0
  66. package/dist/rest/errors.js.map +1 -0
  67. package/dist/rest/handler.d.ts +11 -0
  68. package/dist/rest/handler.js +332 -0
  69. package/dist/rest/handler.js.map +1 -0
  70. package/dist/rest/parse.d.ts +69 -0
  71. package/dist/rest/parse.js +261 -0
  72. package/dist/rest/parse.js.map +1 -0
  73. package/dist/storage/driver.d.ts +9 -0
  74. package/dist/storage/driver.js +18 -0
  75. package/dist/storage/driver.js.map +1 -0
  76. package/dist/storage/handler.d.ts +49 -0
  77. package/dist/storage/handler.js +534 -0
  78. package/dist/storage/handler.js.map +1 -0
  79. package/dist/types.d.ts +51 -0
  80. package/dist/types.js +11 -0
  81. package/dist/types.js.map +1 -0
  82. package/package.json +59 -0
@@ -0,0 +1,48 @@
1
+ import { ApiError } from '../types.js';
2
+ import { ParseError } from './parse.js';
3
+ /** HTTP status for a Postgres SQLSTATE, following PostgREST's mapping. */
4
+ function statusForSqlState(code) {
5
+ switch (code) {
6
+ case '42501':
7
+ return 403;
8
+ case '23503':
9
+ case '23505':
10
+ return 409;
11
+ case '42P01': // undefined_table
12
+ case '42883': // undefined_function
13
+ return 404;
14
+ case '40P01': // deadlock
15
+ case '40001': // serialization_failure
16
+ return 409;
17
+ case '57014': // query_canceled
18
+ return 408;
19
+ default:
20
+ return 400;
21
+ }
22
+ }
23
+ export function errorToResponse(e) {
24
+ if (e instanceof ApiError) {
25
+ return jsonResponse(e.status, e.body);
26
+ }
27
+ if (e instanceof ParseError) {
28
+ return jsonResponse(400, { code: 'PGRST100', message: e.message, details: null, hint: null });
29
+ }
30
+ const pg = e;
31
+ if (pg && typeof pg.code === 'string' && /^[0-9A-Z]{5}$/.test(pg.code)) {
32
+ return jsonResponse(statusForSqlState(pg.code), {
33
+ code: pg.code,
34
+ message: pg.message,
35
+ details: pg.detail ?? null,
36
+ hint: pg.hint ?? null,
37
+ });
38
+ }
39
+ const message = e instanceof Error ? e.message : String(e);
40
+ return jsonResponse(500, { code: 'PGRST500', message, details: null, hint: null });
41
+ }
42
+ export function jsonResponse(status, body, headers = {}) {
43
+ return new Response(status === 204 ? null : JSON.stringify(body), {
44
+ status,
45
+ headers: { 'content-type': 'application/json; charset=utf-8', ...headers },
46
+ });
47
+ }
48
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/rest/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,0EAA0E;AAC1E,SAAS,iBAAiB,CAAC,IAAY;IACrC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,GAAG,CAAA;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACV,OAAO,GAAG,CAAA;QACZ,KAAK,OAAO,CAAC,CAAC,kBAAkB;QAChC,KAAK,OAAO,EAAE,qBAAqB;YACjC,OAAO,GAAG,CAAA;QACZ,KAAK,OAAO,CAAC,CAAC,WAAW;QACzB,KAAK,OAAO,EAAE,wBAAwB;YACpC,OAAO,GAAG,CAAA;QACZ,KAAK,OAAO,EAAE,iBAAiB;YAC7B,OAAO,GAAG,CAAA;QACZ;YACE,OAAO,GAAG,CAAA;IACd,CAAC;AACH,CAAC;AASD,MAAM,UAAU,eAAe,CAAC,CAAU;IACxC,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC;QAC1B,OAAO,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC;IACD,IAAI,CAAC,YAAY,UAAU,EAAE,CAAC;QAC5B,OAAO,YAAY,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/F,CAAC;IACD,MAAM,EAAE,GAAG,CAAY,CAAA;IACvB,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACvE,OAAO,YAAY,CAAC,iBAAiB,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;YAC9C,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,OAAO,EAAE,EAAE,CAAC,OAAO;YACnB,OAAO,EAAE,EAAE,CAAC,MAAM,IAAI,IAAI;YAC1B,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI;SACtB,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC1D,OAAO,YAAY,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;AACpF,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,MAAc,EACd,IAAa,EACb,UAAkC,EAAE;IAEpC,OAAO,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QAChE,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,iCAAiC,EAAE,GAAG,OAAO,EAAE;KAC3E,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type Database } from '../db/database.js';
2
+ import { type RequestContext } from '../types.js';
3
+ export declare class RestHandler {
4
+ private db;
5
+ constructor(db: Database);
6
+ handle(req: Request, ctx: RequestContext, url: URL): Promise<Response>;
7
+ private handleTable;
8
+ private runMutation;
9
+ private dataResponse;
10
+ private handleRpc;
11
+ }
@@ -0,0 +1,332 @@
1
+ import { quoteIdent, quoteLiteral } from '../db/database.js';
2
+ import { ApiError } from '../types.js';
3
+ import { QueryBuilder, pgArrayLiteral, renderColumnExpr } from './build.js';
4
+ import { errorToResponse, jsonResponse } from './errors.js';
5
+ import { ParseError, parseQuery } from './parse.js';
6
+ function parsePrefer(header) {
7
+ const prefer = {};
8
+ if (!header)
9
+ return prefer;
10
+ for (const token of header.split(',')) {
11
+ const [k, v] = token.trim().split('=');
12
+ if (k === 'return')
13
+ prefer.return = v;
14
+ else if (k === 'count')
15
+ prefer.count = v;
16
+ else if (k === 'resolution')
17
+ prefer.resolution = v;
18
+ else if (k === 'missing')
19
+ prefer.missing = v;
20
+ }
21
+ return prefer;
22
+ }
23
+ const OBJECT_MEDIA = 'application/vnd.pgrst.object+json';
24
+ export class RestHandler {
25
+ db;
26
+ constructor(db) {
27
+ this.db = db;
28
+ }
29
+ async handle(req, ctx, url) {
30
+ try {
31
+ const rest = url.pathname.replace(/^\/rest\/v1\/?/, '');
32
+ if (rest === '')
33
+ return jsonResponse(200, { info: { title: 'tinbase', version: '0.1.0' } });
34
+ const method = req.method.toUpperCase();
35
+ const schema = (method === 'GET' || method === 'HEAD'
36
+ ? req.headers.get('accept-profile')
37
+ : req.headers.get('content-profile')) ?? 'public';
38
+ if (rest.startsWith('rpc/')) {
39
+ return await this.handleRpc(req, ctx, url, schema, decodeURIComponent(rest.slice(4)));
40
+ }
41
+ return await this.handleTable(req, ctx, url, schema, decodeURIComponent(rest));
42
+ }
43
+ catch (e) {
44
+ return errorToResponse(e);
45
+ }
46
+ }
47
+ // ── tables ────────────────────────────────────────────────────────────
48
+ async handleTable(req, ctx, url, schema, table) {
49
+ const method = req.method.toUpperCase();
50
+ const prefer = parsePrefer(req.headers.get('prefer'));
51
+ const wantsObject = (req.headers.get('accept') ?? '').includes(OBJECT_MEDIA);
52
+ const q = parseQuery(url.searchParams);
53
+ const info = await this.db.getSchemaInfo(schema);
54
+ const builder = new QueryBuilder(schema, info, q);
55
+ switch (method) {
56
+ case 'GET':
57
+ case 'HEAD': {
58
+ const built = builder.buildSelect(table, { count: prefer.count !== undefined });
59
+ const { rows, count } = await this.db.withContext(ctx, async (query) => {
60
+ const res = await query(built.sql, built.params);
61
+ let count = null;
62
+ if (built.countSql) {
63
+ const c = await query(built.countSql, []);
64
+ count = c.rows[0].count;
65
+ }
66
+ return { rows: res.rows[0].body, count };
67
+ });
68
+ return this.dataResponse(rows, {
69
+ status: 200,
70
+ count,
71
+ offset: q.offsets.get('') ?? 0,
72
+ wantsObject,
73
+ head: method === 'HEAD',
74
+ });
75
+ }
76
+ case 'POST': {
77
+ const body = await readJsonBody(req);
78
+ const rows = Array.isArray(body) ? body : [body];
79
+ const returning = prefer.return === 'representation' || wantsObject;
80
+ const built = builder.buildInsert(table, rows, {
81
+ upsert: prefer.resolution,
82
+ missingDefault: prefer.missing === 'default',
83
+ returning,
84
+ });
85
+ return this.runMutation(ctx, built, { status: 201, returning, wantsObject, prefer });
86
+ }
87
+ case 'PATCH': {
88
+ const body = await readJsonBody(req);
89
+ if (Array.isArray(body)) {
90
+ throw new ApiError(400, {
91
+ code: 'PGRST102',
92
+ message: 'JSON object expected for UPDATE',
93
+ details: null,
94
+ hint: null,
95
+ });
96
+ }
97
+ const returning = prefer.return === 'representation' || wantsObject;
98
+ const built = builder.buildUpdate(table, body, { returning });
99
+ return this.runMutation(ctx, built, { status: 200, returning, wantsObject, prefer });
100
+ }
101
+ case 'DELETE': {
102
+ const returning = prefer.return === 'representation' || wantsObject;
103
+ const built = builder.buildDelete(table, { returning });
104
+ return this.runMutation(ctx, built, { status: 200, returning, wantsObject, prefer });
105
+ }
106
+ default:
107
+ return jsonResponse(405, { code: 'PGRST105', message: `Method ${method} not allowed`, details: null, hint: null });
108
+ }
109
+ }
110
+ async runMutation(ctx, built, opts) {
111
+ const { rows, affected } = await this.db.withContext(ctx, async (query) => {
112
+ const res = await query(built.sql, built.params);
113
+ if (opts.returning) {
114
+ return { rows: res.rows[0].body, affected: null };
115
+ }
116
+ return { rows: null, affected: res.affectedRows ?? 0 };
117
+ });
118
+ const countHeader = opts.prefer.count !== undefined
119
+ ? { 'content-range': `*/${rows ? rows.length : (affected ?? 0)}` }
120
+ : {};
121
+ if (!opts.returning) {
122
+ return new Response(null, { status: opts.status === 201 ? 201 : 204, headers: countHeader });
123
+ }
124
+ return this.dataResponse(rows, {
125
+ status: opts.status,
126
+ count: opts.prefer.count !== undefined ? rows.length : null,
127
+ offset: 0,
128
+ wantsObject: opts.wantsObject,
129
+ head: false,
130
+ });
131
+ }
132
+ dataResponse(rows, opts) {
133
+ const total = opts.count !== null ? String(opts.count) : '*';
134
+ const rangePart = rows.length > 0 ? `${opts.offset}-${opts.offset + rows.length - 1}` : '*';
135
+ const headers = {
136
+ 'content-range': `${rangePart}/${total}`,
137
+ };
138
+ if (opts.wantsObject) {
139
+ if (rows.length !== 1) {
140
+ return jsonResponse(406, {
141
+ code: 'PGRST116',
142
+ message: 'JSON object requested, multiple (or no) rows returned',
143
+ details: `The result contains ${rows.length} rows`,
144
+ hint: null,
145
+ });
146
+ }
147
+ headers['content-type'] = `${OBJECT_MEDIA}; charset=utf-8`;
148
+ return new Response(opts.head ? null : JSON.stringify(rows[0]), {
149
+ status: opts.status,
150
+ headers,
151
+ });
152
+ }
153
+ headers['content-type'] = 'application/json; charset=utf-8';
154
+ return new Response(opts.head ? null : JSON.stringify(rows), { status: opts.status, headers });
155
+ }
156
+ // ── rpc ───────────────────────────────────────────────────────────────
157
+ async handleRpc(req, ctx, url, schema, fnName) {
158
+ const method = req.method.toUpperCase();
159
+ if (!['GET', 'POST', 'HEAD'].includes(method)) {
160
+ return jsonResponse(405, { code: 'PGRST105', message: `Method ${method} not allowed`, details: null, hint: null });
161
+ }
162
+ const prefer = parsePrefer(req.headers.get('prefer'));
163
+ const wantsObject = (req.headers.get('accept') ?? '').includes(OBJECT_MEDIA);
164
+ const fns = await this.db.getFunctions(schema, fnName);
165
+ if (fns.length === 0) {
166
+ throw new ApiError(404, {
167
+ code: 'PGRST202',
168
+ message: `Could not find the function ${schema}.${fnName} in the schema cache`,
169
+ details: null,
170
+ hint: null,
171
+ });
172
+ }
173
+ // collect args: POST body, or query params matching arg names on GET/HEAD
174
+ let args = {};
175
+ const searchParams = new URLSearchParams(url.searchParams);
176
+ if (method === 'POST') {
177
+ const raw = await req.text();
178
+ if (raw.trim() !== '') {
179
+ try {
180
+ const parsed = JSON.parse(raw);
181
+ if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {
182
+ args = parsed;
183
+ }
184
+ else {
185
+ throw new ApiError(400, { code: 'PGRST102', message: 'RPC arguments must be a JSON object', details: null, hint: null });
186
+ }
187
+ }
188
+ catch (e) {
189
+ if (e instanceof ApiError)
190
+ throw e;
191
+ throw new ApiError(400, { code: 'PGRST102', message: 'Empty or invalid json', details: null, hint: null });
192
+ }
193
+ }
194
+ }
195
+ else {
196
+ const allArgNames = new Set(fns.flatMap((f) => f.args.map((a) => a.name)));
197
+ for (const [k, v] of url.searchParams.entries()) {
198
+ if (allArgNames.has(k)) {
199
+ args[k] = v;
200
+ searchParams.delete(k);
201
+ }
202
+ }
203
+ }
204
+ const fn = pickOverload(fns, Object.keys(args));
205
+ const call = renderCall(schema, fn, args);
206
+ const q = parseQuery(searchParams);
207
+ // void
208
+ if (fn.returnType === 'void' && !fn.returnsSet) {
209
+ await this.db.withContext(ctx, (query) => query(`select ${call}`, []));
210
+ return new Response(null, { status: 204 });
211
+ }
212
+ // scalar (non-set base/domain/enum type)
213
+ if (!fn.returnsSet && ['b', 'd', 'e'].includes(fn.returnTypType)) {
214
+ const res = await this.db.withContext(ctx, (query) => query(`select to_json(${call}) as result`, []));
215
+ const value = res.rows[0].result;
216
+ return jsonResponse(200, value);
217
+ }
218
+ // set-returning scalar
219
+ if (fn.returnsSet && ['b', 'd', 'e'].includes(fn.returnTypType)) {
220
+ const res = await this.db.withContext(ctx, (query) => query(`select coalesce(json_agg(_v), '[]'::json) as body from ${call} as _t(_v)`, []));
221
+ return jsonResponse(200, res.rows[0].body);
222
+ }
223
+ // table/composite results: apply select/filters/order/pagination
224
+ const alias = '_f';
225
+ const exprs = [];
226
+ for (const item of q.select) {
227
+ if (item.kind === 'embed') {
228
+ throw new ParseError('embedded resources are not supported on RPC results');
229
+ }
230
+ if (item.name === '*') {
231
+ exprs.push(`${quoteIdent(alias)}.*`);
232
+ }
233
+ else {
234
+ const out = item.alias ?? item.name.split(/->>|->/).pop().trim();
235
+ const cast = item.cast ? `::${item.cast}` : '';
236
+ exprs.push(`${renderColumnExpr(alias, item.name)}${cast} as ${quoteIdent(out)}`);
237
+ }
238
+ }
239
+ const info = await this.db.getSchemaInfo(schema);
240
+ const builder = new QueryBuilder(schema, info, q);
241
+ const conds = q.conditions.map((c) => builder.renderCond(c, alias));
242
+ const where = conds.length > 0 ? ` where ${conds.join(' and ')}` : '';
243
+ const order = builder.renderOrder([], alias);
244
+ const limitOffset = builder.renderLimitOffset('');
245
+ const core = `select ${exprs.join(', ')} from ${call} as ${quoteIdent(alias)}${where}${order}${limitOffset}`;
246
+ const sql = `select coalesce(json_agg(row_to_json(_r)), '[]'::json) as body from (${core}) _r`;
247
+ const countSql = prefer.count !== undefined
248
+ ? `select count(*)::int as count from ${call} as ${quoteIdent(alias)}${where}`
249
+ : undefined;
250
+ const { rows, count } = await this.db.withContext(ctx, async (query) => {
251
+ const res = await query(sql, []);
252
+ let count = null;
253
+ if (countSql) {
254
+ const c = await query(countSql, []);
255
+ count = c.rows[0].count;
256
+ }
257
+ return { rows: res.rows[0].body, count };
258
+ });
259
+ return this.dataResponse(rows, {
260
+ status: 200,
261
+ count,
262
+ offset: q.offsets.get('') ?? 0,
263
+ wantsObject,
264
+ head: method === 'HEAD',
265
+ });
266
+ }
267
+ }
268
+ function pickOverload(fns, providedNames) {
269
+ const provided = new Set(providedNames);
270
+ let best = null;
271
+ for (const fn of fns) {
272
+ const names = new Set(fn.args.map((a) => a.name));
273
+ const allProvidedKnown = [...provided].every((p) => names.has(p));
274
+ if (!allProvidedKnown)
275
+ continue;
276
+ if (fn.args.length === provided.size)
277
+ return fn;
278
+ if (!best)
279
+ best = fn;
280
+ }
281
+ return best ?? fns[0];
282
+ }
283
+ function renderCall(schema, fn, args) {
284
+ const parts = [];
285
+ for (const [name, value] of Object.entries(args)) {
286
+ const arg = fn.args.find((a) => a.name === name);
287
+ if (!arg) {
288
+ throw new ApiError(404, {
289
+ code: 'PGRST202',
290
+ message: `Could not find the function ${schema}.${fn.name}(${Object.keys(args).sort().join(', ')}) in the schema cache`,
291
+ details: null,
292
+ hint: `Perhaps you meant to call the function ${schema}.${fn.name}(${fn.args.map((a) => a.name).join(', ')})`,
293
+ });
294
+ }
295
+ parts.push(`${quoteIdent(name)} := ${renderArgLiteral(arg.type, value)}`);
296
+ }
297
+ return `${quoteIdent(schema)}.${quoteIdent(fn.name)}(${parts.join(', ')})`;
298
+ }
299
+ function renderArgLiteral(type, value) {
300
+ if (!/^[a-zA-Z_][a-zA-Z0-9_ .,()\[\]]*$/.test(type)) {
301
+ throw new ApiError(400, { code: 'PGRST100', message: `unsupported argument type: ${type}`, details: null, hint: null });
302
+ }
303
+ if (value === null || value === undefined)
304
+ return `null::${type}`;
305
+ if (type.endsWith('[]') && Array.isArray(value)) {
306
+ return `${quoteLiteral(pgArrayLiteral(value))}::${type}`;
307
+ }
308
+ if (typeof value === 'object')
309
+ return `${quoteLiteral(JSON.stringify(value))}::${type}`;
310
+ if (typeof value === 'number' || typeof value === 'boolean')
311
+ return `${quoteLiteral(String(value))}::${type}`;
312
+ return `${quoteLiteral(String(value))}::${type}`;
313
+ }
314
+ async function readJsonBody(req) {
315
+ const contentType = req.headers.get('content-type') ?? '';
316
+ if (contentType && !contentType.includes('application/json')) {
317
+ throw new ApiError(415, {
318
+ code: 'PGRST107',
319
+ message: `Content-Type not acceptable: ${contentType}`,
320
+ details: null,
321
+ hint: null,
322
+ });
323
+ }
324
+ const raw = await req.text();
325
+ try {
326
+ return JSON.parse(raw);
327
+ }
328
+ catch {
329
+ throw new ApiError(400, { code: 'PGRST102', message: 'Empty or invalid json', details: null, hint: null });
330
+ }
331
+ }
332
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/rest/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Parser for the PostgREST query grammar as emitted by supabase-js
3
+ * (postgrest-js): select trees with embedded resources, filter operators,
4
+ * and/or logic trees, ordering, and pagination.
5
+ */
6
+ export interface SelectColumn {
7
+ kind: 'column';
8
+ /** raw column expression, may contain json arrows: data->>key */
9
+ name: string;
10
+ alias?: string;
11
+ cast?: string;
12
+ }
13
+ export interface SelectEmbed {
14
+ kind: 'embed';
15
+ /** relation (table) name or fk hint target */
16
+ name: string;
17
+ alias?: string;
18
+ /** disambiguation hint: fk constraint name, column name, or junction table */
19
+ hint?: string;
20
+ inner: boolean;
21
+ children: SelectItem[];
22
+ spread: boolean;
23
+ }
24
+ export type SelectItem = SelectColumn | SelectEmbed;
25
+ export interface FilterCond {
26
+ kind: 'filter';
27
+ /** embed path, [] = base table */
28
+ path: string[];
29
+ column: string;
30
+ negated: boolean;
31
+ op: string;
32
+ value: string;
33
+ /** text-search config, e.g. fts(english).query */
34
+ ftsConfig?: string;
35
+ }
36
+ export interface LogicCond {
37
+ kind: 'logic';
38
+ path: string[];
39
+ op: 'and' | 'or';
40
+ negated: boolean;
41
+ conditions: Cond[];
42
+ }
43
+ export type Cond = FilterCond | LogicCond;
44
+ export interface OrderTerm {
45
+ path: string[];
46
+ column: string;
47
+ asc: boolean;
48
+ nullsFirst?: boolean;
49
+ }
50
+ export interface ParsedQuery {
51
+ select: SelectItem[];
52
+ conditions: Cond[];
53
+ order: OrderTerm[];
54
+ limits: Map<string, number>;
55
+ offsets: Map<string, number>;
56
+ onConflict?: string[];
57
+ columns?: string[];
58
+ }
59
+ export declare class ParseError extends Error {
60
+ }
61
+ export declare const FILTER_OPS: Record<string, string>;
62
+ export declare function parseQuery(searchParams: URLSearchParams): ParsedQuery;
63
+ /** Split on a delimiter, ignoring delimiters inside parens and double quotes. */
64
+ export declare function splitTopLevel(str: string, delim: string): string[];
65
+ export declare function unquote(s: string): string;
66
+ /**
67
+ * select=a,b:c,d::text,rel!hint!inner(x,nested(y)),...spread(a)
68
+ */
69
+ export declare function parseSelect(value: string): SelectItem[];