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.
- package/LICENSE +21 -0
- package/README.md +185 -0
- package/assets/logo.svg +18 -0
- package/dist/auth/handler.d.ts +43 -0
- package/dist/auth/handler.js +291 -0
- package/dist/auth/handler.js.map +1 -0
- package/dist/auth/password.d.ts +3 -0
- package/dist/auth/password.js +40 -0
- package/dist/auth/password.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +181 -0
- package/dist/cli.js.map +1 -0
- package/dist/db/bootstrap.d.ts +6 -0
- package/dist/db/bootstrap.js +213 -0
- package/dist/db/bootstrap.js.map +1 -0
- package/dist/db/database.d.ts +83 -0
- package/dist/db/database.js +270 -0
- package/dist/db/database.js.map +1 -0
- package/dist/db/engine.d.ts +30 -0
- package/dist/db/engine.js +28 -0
- package/dist/db/engine.js.map +1 -0
- package/dist/db/pglite-engine.d.ts +3 -0
- package/dist/db/pglite-engine.js +39 -0
- package/dist/db/pglite-engine.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +145 -0
- package/dist/index.js.map +1 -0
- package/dist/jwt.d.ts +20 -0
- package/dist/jwt.js +72 -0
- package/dist/jwt.js.map +1 -0
- package/dist/node/bun-server.d.ts +8 -0
- package/dist/node/bun-server.js +41 -0
- package/dist/node/bun-server.js.map +1 -0
- package/dist/node/fs-driver.d.ts +11 -0
- package/dist/node/fs-driver.js +39 -0
- package/dist/node/fs-driver.js.map +1 -0
- package/dist/node/index.d.ts +7 -0
- package/dist/node/index.js +8 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/native/engine.d.ts +13 -0
- package/dist/node/native/engine.js +186 -0
- package/dist/node/native/engine.js.map +1 -0
- package/dist/node/native/wire.d.ts +38 -0
- package/dist/node/native/wire.js +345 -0
- package/dist/node/native/wire.js.map +1 -0
- package/dist/node/project.d.ts +6 -0
- package/dist/node/project.js +29 -0
- package/dist/node/project.js.map +1 -0
- package/dist/node/server-shared.d.ts +6 -0
- package/dist/node/server-shared.js +2 -0
- package/dist/node/server-shared.js.map +1 -0
- package/dist/node/server.d.ts +14 -0
- package/dist/node/server.js +83 -0
- package/dist/node/server.js.map +1 -0
- package/dist/node/ws.d.ts +8 -0
- package/dist/node/ws.js +165 -0
- package/dist/node/ws.js.map +1 -0
- package/dist/realtime/engine.d.ts +53 -0
- package/dist/realtime/engine.js +437 -0
- package/dist/realtime/engine.js.map +1 -0
- package/dist/rest/build.d.ts +53 -0
- package/dist/rest/build.js +505 -0
- package/dist/rest/build.js.map +1 -0
- package/dist/rest/errors.d.ts +2 -0
- package/dist/rest/errors.js +48 -0
- package/dist/rest/errors.js.map +1 -0
- package/dist/rest/handler.d.ts +11 -0
- package/dist/rest/handler.js +332 -0
- package/dist/rest/handler.js.map +1 -0
- package/dist/rest/parse.d.ts +69 -0
- package/dist/rest/parse.js +261 -0
- package/dist/rest/parse.js.map +1 -0
- package/dist/storage/driver.d.ts +9 -0
- package/dist/storage/driver.js +18 -0
- package/dist/storage/driver.js.map +1 -0
- package/dist/storage/handler.d.ts +49 -0
- package/dist/storage/handler.js +534 -0
- package/dist/storage/handler.js.map +1 -0
- package/dist/types.d.ts +51 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,261 @@
|
|
|
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 class ParseError extends Error {
|
|
7
|
+
}
|
|
8
|
+
const RESERVED = new Set(['select', 'order', 'limit', 'offset', 'on_conflict', 'columns']);
|
|
9
|
+
export const FILTER_OPS = {
|
|
10
|
+
eq: '=', neq: '<>', gt: '>', gte: '>=', lt: '<', lte: '<=',
|
|
11
|
+
like: 'like', ilike: 'ilike', match: '~', imatch: '~*',
|
|
12
|
+
is: 'is', in: 'in',
|
|
13
|
+
cs: '@>', cd: '<@', ov: '&&',
|
|
14
|
+
sl: '<<', sr: '>>', nxr: '&<', nxl: '&>', adj: '-|-',
|
|
15
|
+
fts: '@@', plfts: '@@', phfts: '@@', wfts: '@@',
|
|
16
|
+
isdistinct: 'is distinct from',
|
|
17
|
+
};
|
|
18
|
+
export function parseQuery(searchParams) {
|
|
19
|
+
const q = {
|
|
20
|
+
select: [{ kind: 'column', name: '*' }],
|
|
21
|
+
conditions: [],
|
|
22
|
+
order: [],
|
|
23
|
+
limits: new Map(),
|
|
24
|
+
offsets: new Map(),
|
|
25
|
+
};
|
|
26
|
+
for (const [key, value] of searchParams.entries()) {
|
|
27
|
+
if (key === 'select') {
|
|
28
|
+
if (value.trim())
|
|
29
|
+
q.select = parseSelect(value);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (key === 'on_conflict') {
|
|
33
|
+
q.onConflict = value.split(',').map((s) => s.trim()).filter(Boolean);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (key === 'columns') {
|
|
37
|
+
q.columns = splitTopLevel(value, ',').map((s) => unquote(s.trim()));
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const segments = key.split('.');
|
|
41
|
+
const last = segments[segments.length - 1];
|
|
42
|
+
if (last === 'order') {
|
|
43
|
+
const path = segments.slice(0, -1);
|
|
44
|
+
for (const term of splitTopLevel(value, ',')) {
|
|
45
|
+
q.order.push(parseOrderTerm(term.trim(), path));
|
|
46
|
+
}
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (last === 'limit' || last === 'offset') {
|
|
50
|
+
const path = segments.slice(0, -1).join('.');
|
|
51
|
+
const n = parseInt(value, 10);
|
|
52
|
+
if (Number.isNaN(n) || n < 0)
|
|
53
|
+
throw new ParseError(`invalid ${last}: ${value}`);
|
|
54
|
+
(last === 'limit' ? q.limits : q.offsets).set(path, n);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (last === 'or' || last === 'and') {
|
|
58
|
+
const negated = segments[segments.length - 2] === 'not';
|
|
59
|
+
const path = segments.slice(0, negated ? -2 : -1);
|
|
60
|
+
q.conditions.push(parseLogicTree(last, value, path, negated));
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (RESERVED.has(key))
|
|
64
|
+
continue;
|
|
65
|
+
if (key === 'apikey')
|
|
66
|
+
continue;
|
|
67
|
+
// plain filter: <path...>.<column>=<[not.]op.value>
|
|
68
|
+
const path = segments.slice(0, -1);
|
|
69
|
+
const column = segments[segments.length - 1];
|
|
70
|
+
q.conditions.push(parseFilterValue(column, value, path));
|
|
71
|
+
}
|
|
72
|
+
return q;
|
|
73
|
+
}
|
|
74
|
+
function parseFilterValue(column, raw, path) {
|
|
75
|
+
let negated = false;
|
|
76
|
+
let rest = raw;
|
|
77
|
+
if (rest.startsWith('not.')) {
|
|
78
|
+
negated = true;
|
|
79
|
+
rest = rest.slice(4);
|
|
80
|
+
}
|
|
81
|
+
const dot = rest.indexOf('.');
|
|
82
|
+
let op, value;
|
|
83
|
+
if (dot === -1) {
|
|
84
|
+
op = rest;
|
|
85
|
+
value = '';
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
op = rest.slice(0, dot);
|
|
89
|
+
value = rest.slice(dot + 1);
|
|
90
|
+
}
|
|
91
|
+
// fts ops may carry a config: fts(english).value
|
|
92
|
+
const ftsMatch = op.match(/^(fts|plfts|phfts|wfts)\((.+)\)$/);
|
|
93
|
+
if (ftsMatch) {
|
|
94
|
+
return { kind: 'filter', path, column, negated, op: ftsMatch[1], value, ftsConfig: ftsMatch[2] };
|
|
95
|
+
}
|
|
96
|
+
if (!(op in FILTER_OPS))
|
|
97
|
+
throw new ParseError(`unknown filter operator: ${op}`);
|
|
98
|
+
return { kind: 'filter', path, column, negated, op, value };
|
|
99
|
+
}
|
|
100
|
+
/** or=(age.gte.18,and(a.eq.1,b.eq.2),name.not.like.*x*) */
|
|
101
|
+
function parseLogicTree(op, raw, path, negated) {
|
|
102
|
+
const trimmed = raw.trim();
|
|
103
|
+
if (!trimmed.startsWith('(') || !trimmed.endsWith(')')) {
|
|
104
|
+
throw new ParseError(`malformed logic tree: ${raw}`);
|
|
105
|
+
}
|
|
106
|
+
const inner = trimmed.slice(1, -1);
|
|
107
|
+
const conditions = [];
|
|
108
|
+
for (const part of splitTopLevel(inner, ',')) {
|
|
109
|
+
const p = part.trim();
|
|
110
|
+
const nested = p.match(/^(not\.)?(and|or)(\(.*\))$/s);
|
|
111
|
+
if (nested) {
|
|
112
|
+
conditions.push(parseLogicTree(nested[2], nested[3], path, !!nested[1]));
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
// column.[not.]op.value - column may contain -> arrows but no dots
|
|
116
|
+
const dot = p.indexOf('.');
|
|
117
|
+
if (dot === -1)
|
|
118
|
+
throw new ParseError(`malformed condition: ${p}`);
|
|
119
|
+
const column = p.slice(0, dot);
|
|
120
|
+
conditions.push(parseFilterValue(unquote(column), p.slice(dot + 1), path));
|
|
121
|
+
}
|
|
122
|
+
return { kind: 'logic', path, op, negated, conditions };
|
|
123
|
+
}
|
|
124
|
+
function parseOrderTerm(term, path) {
|
|
125
|
+
const parts = term.split('.');
|
|
126
|
+
const column = unquote(parts[0]);
|
|
127
|
+
let asc = true;
|
|
128
|
+
let nullsFirst;
|
|
129
|
+
for (const p of parts.slice(1)) {
|
|
130
|
+
if (p === 'asc')
|
|
131
|
+
asc = true;
|
|
132
|
+
else if (p === 'desc')
|
|
133
|
+
asc = false;
|
|
134
|
+
else if (p === 'nullsfirst')
|
|
135
|
+
nullsFirst = true;
|
|
136
|
+
else if (p === 'nullslast')
|
|
137
|
+
nullsFirst = false;
|
|
138
|
+
else
|
|
139
|
+
throw new ParseError(`invalid order term: ${term}`);
|
|
140
|
+
}
|
|
141
|
+
return { path, column, asc, nullsFirst };
|
|
142
|
+
}
|
|
143
|
+
/** Split on a delimiter, ignoring delimiters inside parens and double quotes. */
|
|
144
|
+
export function splitTopLevel(str, delim) {
|
|
145
|
+
const out = [];
|
|
146
|
+
let depth = 0;
|
|
147
|
+
let inQuote = false;
|
|
148
|
+
let current = '';
|
|
149
|
+
for (let i = 0; i < str.length; i++) {
|
|
150
|
+
const ch = str[i];
|
|
151
|
+
if (inQuote) {
|
|
152
|
+
current += ch;
|
|
153
|
+
if (ch === '"')
|
|
154
|
+
inQuote = false;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (ch === '"') {
|
|
158
|
+
inQuote = true;
|
|
159
|
+
current += ch;
|
|
160
|
+
}
|
|
161
|
+
else if (ch === '(') {
|
|
162
|
+
depth++;
|
|
163
|
+
current += ch;
|
|
164
|
+
}
|
|
165
|
+
else if (ch === ')') {
|
|
166
|
+
depth--;
|
|
167
|
+
current += ch;
|
|
168
|
+
}
|
|
169
|
+
else if (ch === delim && depth === 0) {
|
|
170
|
+
out.push(current);
|
|
171
|
+
current = '';
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
current += ch;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (current !== '')
|
|
178
|
+
out.push(current);
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
export function unquote(s) {
|
|
182
|
+
if (s.length >= 2 && s.startsWith('"') && s.endsWith('"')) {
|
|
183
|
+
return s.slice(1, -1).replaceAll('\\"', '"');
|
|
184
|
+
}
|
|
185
|
+
return s;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* select=a,b:c,d::text,rel!hint!inner(x,nested(y)),...spread(a)
|
|
189
|
+
*/
|
|
190
|
+
export function parseSelect(value) {
|
|
191
|
+
return splitTopLevel(value, ',').map((item) => parseSelectItem(item.trim()));
|
|
192
|
+
}
|
|
193
|
+
function parseSelectItem(item) {
|
|
194
|
+
if (item === '')
|
|
195
|
+
throw new ParseError('empty select item');
|
|
196
|
+
let spread = false;
|
|
197
|
+
if (item.startsWith('...')) {
|
|
198
|
+
spread = true;
|
|
199
|
+
item = item.slice(3);
|
|
200
|
+
}
|
|
201
|
+
// alias:rest - a ':' not part of '::'
|
|
202
|
+
let alias;
|
|
203
|
+
const aliasIdx = findAliasColon(item);
|
|
204
|
+
if (aliasIdx !== -1) {
|
|
205
|
+
alias = unquote(item.slice(0, aliasIdx));
|
|
206
|
+
item = item.slice(aliasIdx + 1);
|
|
207
|
+
}
|
|
208
|
+
const parenIdx = item.indexOf('(');
|
|
209
|
+
if (parenIdx !== -1 && item.endsWith(')')) {
|
|
210
|
+
// embed: name[!hint][!inner](children)
|
|
211
|
+
const head = item.slice(0, parenIdx);
|
|
212
|
+
const body = item.slice(parenIdx + 1, -1);
|
|
213
|
+
const headParts = head.split('!');
|
|
214
|
+
const name = unquote(headParts[0]);
|
|
215
|
+
let hint;
|
|
216
|
+
let inner = false;
|
|
217
|
+
for (const part of headParts.slice(1)) {
|
|
218
|
+
if (part === 'inner')
|
|
219
|
+
inner = true;
|
|
220
|
+
else if (part === 'left') { /* left is the default */ }
|
|
221
|
+
else
|
|
222
|
+
hint = unquote(part);
|
|
223
|
+
}
|
|
224
|
+
const children = body.trim() === '' ? [] : parseSelect(body);
|
|
225
|
+
return { kind: 'embed', name, alias, hint, inner, children, spread };
|
|
226
|
+
}
|
|
227
|
+
if (spread)
|
|
228
|
+
throw new ParseError(`spread requires an embed: ...${item}`);
|
|
229
|
+
// column: name[::cast], name may be quoted or contain -> arrows
|
|
230
|
+
let cast;
|
|
231
|
+
const castIdx = item.lastIndexOf('::');
|
|
232
|
+
if (castIdx !== -1) {
|
|
233
|
+
cast = item.slice(castIdx + 2);
|
|
234
|
+
if (!/^[a-zA-Z_][a-zA-Z0-9_ \[\]]*$/.test(cast))
|
|
235
|
+
throw new ParseError(`invalid cast: ${cast}`);
|
|
236
|
+
item = item.slice(0, castIdx);
|
|
237
|
+
}
|
|
238
|
+
return { kind: 'column', name: unquote(item), alias, cast };
|
|
239
|
+
}
|
|
240
|
+
/** Index of an alias ':' (not '::'), outside quotes/parens; -1 when absent. */
|
|
241
|
+
function findAliasColon(item) {
|
|
242
|
+
let inQuote = false;
|
|
243
|
+
for (let i = 0; i < item.length; i++) {
|
|
244
|
+
const ch = item[i];
|
|
245
|
+
if (ch === '"')
|
|
246
|
+
inQuote = !inQuote;
|
|
247
|
+
if (inQuote)
|
|
248
|
+
continue;
|
|
249
|
+
if (ch === '(')
|
|
250
|
+
return -1;
|
|
251
|
+
if (ch === ':') {
|
|
252
|
+
if (item[i + 1] === ':') {
|
|
253
|
+
i++;
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
return i;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return -1;
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/rest/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { StorageDriver } from '../types.js';
|
|
2
|
+
/** Default driver — keeps object bytes in memory (browser-safe). */
|
|
3
|
+
export declare class MemoryStorageDriver implements StorageDriver {
|
|
4
|
+
private files;
|
|
5
|
+
put(key: string, data: Uint8Array): Promise<void>;
|
|
6
|
+
get(key: string): Promise<Uint8Array | null>;
|
|
7
|
+
delete(key: string): Promise<void>;
|
|
8
|
+
deleteMany(keys: string[]): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Default driver — keeps object bytes in memory (browser-safe). */
|
|
2
|
+
export class MemoryStorageDriver {
|
|
3
|
+
files = new Map();
|
|
4
|
+
async put(key, data) {
|
|
5
|
+
this.files.set(key, data);
|
|
6
|
+
}
|
|
7
|
+
async get(key) {
|
|
8
|
+
return this.files.get(key) ?? null;
|
|
9
|
+
}
|
|
10
|
+
async delete(key) {
|
|
11
|
+
this.files.delete(key);
|
|
12
|
+
}
|
|
13
|
+
async deleteMany(keys) {
|
|
14
|
+
for (const k of keys)
|
|
15
|
+
this.files.delete(k);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/storage/driver.ts"],"names":[],"mappings":"AAEA,oEAAoE;AACpE,MAAM,OAAO,mBAAmB;IACtB,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAA;IAE7C,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,IAAgB;QACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAC3B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAc;QAC7B,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC;CACF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* storage-api-compatible endpoints (/storage/v1/*) for supabase-js's
|
|
3
|
+
* StorageClient. Object metadata lives in storage.objects (RLS enforced
|
|
4
|
+
* through the request role); bytes live behind a StorageDriver.
|
|
5
|
+
*/
|
|
6
|
+
import type { Database } from '../db/database.js';
|
|
7
|
+
import type { RequestContext, StorageDriver } from '../types.js';
|
|
8
|
+
export interface StorageConfig {
|
|
9
|
+
jwtSecret: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class StorageHandler {
|
|
12
|
+
private db;
|
|
13
|
+
private driver;
|
|
14
|
+
private config;
|
|
15
|
+
constructor(db: Database, driver: StorageDriver, config: StorageConfig);
|
|
16
|
+
handle(req: Request, ctx: RequestContext, url: URL): Promise<Response>;
|
|
17
|
+
private requireService;
|
|
18
|
+
private createBucket;
|
|
19
|
+
private listBuckets;
|
|
20
|
+
private getBucket;
|
|
21
|
+
private updateBucket;
|
|
22
|
+
private deleteBucket;
|
|
23
|
+
private emptyBucket;
|
|
24
|
+
private loadBucket;
|
|
25
|
+
private upload;
|
|
26
|
+
private download;
|
|
27
|
+
private downloadPublic;
|
|
28
|
+
private serveObject;
|
|
29
|
+
private removeObjects;
|
|
30
|
+
private removeOne;
|
|
31
|
+
private moveOrCopy;
|
|
32
|
+
private listObjects;
|
|
33
|
+
private objectInfo;
|
|
34
|
+
private signUrl;
|
|
35
|
+
private signUrls;
|
|
36
|
+
private redeemSignedUrl;
|
|
37
|
+
private signUploadUrl;
|
|
38
|
+
private redeemSignedUpload;
|
|
39
|
+
private makeSignToken;
|
|
40
|
+
}
|
|
41
|
+
interface MultipartPart {
|
|
42
|
+
name: string;
|
|
43
|
+
filename?: string;
|
|
44
|
+
contentType?: string;
|
|
45
|
+
data: Uint8Array;
|
|
46
|
+
}
|
|
47
|
+
/** Minimal byte-safe multipart/form-data parser (works identically on Node, Bun, browsers). */
|
|
48
|
+
export declare function parseMultipart(bytes: Uint8Array, boundary: string): MultipartPart[];
|
|
49
|
+
export {};
|