@somewhere-cloud/sdk 0.0.0-stage → 0.13.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 (149) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +191 -2
  3. package/dist/cjs/auth/client.js +1059 -0
  4. package/dist/cjs/auth/client.js.map +1 -0
  5. package/dist/cjs/auth/continuation.js +27 -0
  6. package/dist/cjs/auth/continuation.js.map +1 -0
  7. package/dist/cjs/auth/index.js +21 -0
  8. package/dist/cjs/auth/index.js.map +1 -0
  9. package/dist/cjs/auth/react.js +295 -0
  10. package/dist/cjs/auth/react.js.map +1 -0
  11. package/dist/cjs/auth/server.js +368 -0
  12. package/dist/cjs/auth/server.js.map +1 -0
  13. package/dist/cjs/client.js +392 -0
  14. package/dist/cjs/client.js.map +1 -0
  15. package/dist/cjs/errors.js +16 -0
  16. package/dist/cjs/errors.js.map +1 -0
  17. package/dist/cjs/index.cjs +215 -0
  18. package/dist/cjs/index.js.map +1 -0
  19. package/dist/cjs/package.json +1 -0
  20. package/dist/cjs/query-cache.js +91 -0
  21. package/dist/cjs/query-cache.js.map +1 -0
  22. package/dist/cjs/resources/auth.js +875 -0
  23. package/dist/cjs/resources/auth.js.map +1 -0
  24. package/dist/cjs/resources/calls.js +42 -0
  25. package/dist/cjs/resources/calls.js.map +1 -0
  26. package/dist/cjs/resources/chat.js +82 -0
  27. package/dist/cjs/resources/chat.js.map +1 -0
  28. package/dist/cjs/resources/db.js +124 -0
  29. package/dist/cjs/resources/db.js.map +1 -0
  30. package/dist/cjs/resources/emails.js +39 -0
  31. package/dist/cjs/resources/emails.js.map +1 -0
  32. package/dist/cjs/resources/fs.js +141 -0
  33. package/dist/cjs/resources/fs.js.map +1 -0
  34. package/dist/cjs/resources/functions.js +145 -0
  35. package/dist/cjs/resources/functions.js.map +1 -0
  36. package/dist/cjs/resources/inbox.js +76 -0
  37. package/dist/cjs/resources/inbox.js.map +1 -0
  38. package/dist/cjs/resources/payments.js +68 -0
  39. package/dist/cjs/resources/payments.js.map +1 -0
  40. package/dist/cjs/resources/postgrest.js +391 -0
  41. package/dist/cjs/resources/postgrest.js.map +1 -0
  42. package/dist/cjs/resources/projects.js +71 -0
  43. package/dist/cjs/resources/projects.js.map +1 -0
  44. package/dist/cjs/resources/storage.js +191 -0
  45. package/dist/cjs/resources/storage.js.map +1 -0
  46. package/dist/cjs/resources/tasks.js +99 -0
  47. package/dist/cjs/resources/tasks.js.map +1 -0
  48. package/dist/cjs/resources/video.js +50 -0
  49. package/dist/cjs/resources/video.js.map +1 -0
  50. package/dist/cjs/types.js +3 -0
  51. package/dist/cjs/types.js.map +1 -0
  52. package/dist/esm/auth/client.js +1054 -0
  53. package/dist/esm/auth/client.js.map +1 -0
  54. package/dist/esm/auth/continuation.js +22 -0
  55. package/dist/esm/auth/continuation.js.map +1 -0
  56. package/dist/esm/auth/index.js +5 -0
  57. package/dist/esm/auth/index.js.map +1 -0
  58. package/dist/esm/auth/react.js +279 -0
  59. package/dist/esm/auth/react.js.map +1 -0
  60. package/dist/esm/auth/server.js +365 -0
  61. package/dist/esm/auth/server.js.map +1 -0
  62. package/dist/esm/client.js +388 -0
  63. package/dist/esm/client.js.map +1 -0
  64. package/dist/esm/errors.js +12 -0
  65. package/dist/esm/errors.js.map +1 -0
  66. package/dist/esm/index.js +188 -0
  67. package/dist/esm/index.js.map +1 -0
  68. package/dist/esm/package.json +1 -0
  69. package/dist/esm/query-cache.js +87 -0
  70. package/dist/esm/query-cache.js.map +1 -0
  71. package/dist/esm/resources/auth.js +871 -0
  72. package/dist/esm/resources/auth.js.map +1 -0
  73. package/dist/esm/resources/calls.js +38 -0
  74. package/dist/esm/resources/calls.js.map +1 -0
  75. package/dist/esm/resources/chat.js +77 -0
  76. package/dist/esm/resources/chat.js.map +1 -0
  77. package/dist/esm/resources/db.js +120 -0
  78. package/dist/esm/resources/db.js.map +1 -0
  79. package/dist/esm/resources/emails.js +35 -0
  80. package/dist/esm/resources/emails.js.map +1 -0
  81. package/dist/esm/resources/fs.js +137 -0
  82. package/dist/esm/resources/fs.js.map +1 -0
  83. package/dist/esm/resources/functions.js +141 -0
  84. package/dist/esm/resources/functions.js.map +1 -0
  85. package/dist/esm/resources/inbox.js +70 -0
  86. package/dist/esm/resources/inbox.js.map +1 -0
  87. package/dist/esm/resources/payments.js +64 -0
  88. package/dist/esm/resources/payments.js.map +1 -0
  89. package/dist/esm/resources/postgrest.js +386 -0
  90. package/dist/esm/resources/postgrest.js.map +1 -0
  91. package/dist/esm/resources/projects.js +67 -0
  92. package/dist/esm/resources/projects.js.map +1 -0
  93. package/dist/esm/resources/storage.js +186 -0
  94. package/dist/esm/resources/storage.js.map +1 -0
  95. package/dist/esm/resources/tasks.js +95 -0
  96. package/dist/esm/resources/tasks.js.map +1 -0
  97. package/dist/esm/resources/video.js +46 -0
  98. package/dist/esm/resources/video.js.map +1 -0
  99. package/dist/esm/types.js +2 -0
  100. package/dist/esm/types.js.map +1 -0
  101. package/dist/types/auth/client.d.ts +272 -0
  102. package/dist/types/auth/client.d.ts.map +1 -0
  103. package/dist/types/auth/continuation.d.ts +10 -0
  104. package/dist/types/auth/continuation.d.ts.map +1 -0
  105. package/dist/types/auth/index.d.ts +2 -0
  106. package/dist/types/auth/index.d.ts.map +1 -0
  107. package/dist/types/auth/react.d.ts +140 -0
  108. package/dist/types/auth/react.d.ts.map +1 -0
  109. package/dist/types/auth/server.d.ts +124 -0
  110. package/dist/types/auth/server.d.ts.map +1 -0
  111. package/dist/types/client.d.ts +128 -0
  112. package/dist/types/client.d.ts.map +1 -0
  113. package/dist/types/errors.d.ts +17 -0
  114. package/dist/types/errors.d.ts.map +1 -0
  115. package/dist/types/index.d.ts +145 -0
  116. package/dist/types/index.d.ts.map +1 -0
  117. package/dist/types/query-cache.d.ts +59 -0
  118. package/dist/types/query-cache.d.ts.map +1 -0
  119. package/dist/types/resources/auth.d.ts +188 -0
  120. package/dist/types/resources/auth.d.ts.map +1 -0
  121. package/dist/types/resources/calls.d.ts +27 -0
  122. package/dist/types/resources/calls.d.ts.map +1 -0
  123. package/dist/types/resources/chat.d.ts +24 -0
  124. package/dist/types/resources/chat.d.ts.map +1 -0
  125. package/dist/types/resources/db.d.ts +81 -0
  126. package/dist/types/resources/db.d.ts.map +1 -0
  127. package/dist/types/resources/emails.d.ts +20 -0
  128. package/dist/types/resources/emails.d.ts.map +1 -0
  129. package/dist/types/resources/fs.d.ts +68 -0
  130. package/dist/types/resources/fs.d.ts.map +1 -0
  131. package/dist/types/resources/functions.d.ts +30 -0
  132. package/dist/types/resources/functions.d.ts.map +1 -0
  133. package/dist/types/resources/inbox.d.ts +52 -0
  134. package/dist/types/resources/inbox.d.ts.map +1 -0
  135. package/dist/types/resources/payments.d.ts +31 -0
  136. package/dist/types/resources/payments.d.ts.map +1 -0
  137. package/dist/types/resources/postgrest.d.ts +121 -0
  138. package/dist/types/resources/postgrest.d.ts.map +1 -0
  139. package/dist/types/resources/projects.d.ts +79 -0
  140. package/dist/types/resources/projects.d.ts.map +1 -0
  141. package/dist/types/resources/storage.d.ts +63 -0
  142. package/dist/types/resources/storage.d.ts.map +1 -0
  143. package/dist/types/resources/tasks.d.ts +87 -0
  144. package/dist/types/resources/tasks.d.ts.map +1 -0
  145. package/dist/types/resources/video.d.ts +30 -0
  146. package/dist/types/resources/video.d.ts.map +1 -0
  147. package/dist/types/types.d.ts +379 -0
  148. package/dist/types/types.d.ts.map +1 -0
  149. package/package.json +86 -4
@@ -0,0 +1,391 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PostgrestFilterBuilder = exports.SomewhereQueryBuilder = void 0;
4
+ const errors_js_1 = require("../errors.js");
5
+ function invalidResult(err) {
6
+ return { data: null, error: err, count: null, status: err.statusCode };
7
+ }
8
+ /** Split on top-level commas only — commas inside `(...)` (an `in` list) stay. */
9
+ function splitTopLevel(s) {
10
+ const out = [];
11
+ let depth = 0;
12
+ let start = 0;
13
+ for (let i = 0; i < s.length; i++) {
14
+ const ch = s[i];
15
+ if (ch === '(')
16
+ depth++;
17
+ else if (ch === ')')
18
+ depth = Math.max(0, depth - 1);
19
+ else if (ch === ',' && depth === 0) {
20
+ out.push(s.slice(start, i));
21
+ start = i + 1;
22
+ }
23
+ }
24
+ out.push(s.slice(start));
25
+ return out;
26
+ }
27
+ /** Coerce an `.or()` string value to its JSON type (number / bool / null / string). */
28
+ function coerceFilterValue(raw) {
29
+ if (raw === 'null')
30
+ return null;
31
+ if (raw === 'true')
32
+ return true;
33
+ if (raw === 'false')
34
+ return false;
35
+ if (/^-?\d+$/.test(raw))
36
+ return Number.parseInt(raw, 10);
37
+ if (/^-?\d*\.\d+$/.test(raw))
38
+ return Number.parseFloat(raw);
39
+ return raw;
40
+ }
41
+ /** What `.from(...)` returns — pre-action chain. */
42
+ class SomewhereQueryBuilder {
43
+ constructor(client, table) {
44
+ this.client = client;
45
+ this.table = table;
46
+ }
47
+ /**
48
+ * Select rows. Pass embeds in the column string for foreign-key joins
49
+ * (`select('*, profile(*)')`), and `{ count, head }` for counts:
50
+ *
51
+ * // total rows matching the filters, alongside the page of data
52
+ * const { data, count } = await sw.from('todos')
53
+ * .select('*', { count: 'exact' }).eq('done', false).limit(20)
54
+ *
55
+ * // just the count, no rows fetched
56
+ * const { count } = await sw.from('todos')
57
+ * .select('*', { count: 'exact', head: true }).eq('done', false)
58
+ */
59
+ select(columns = '*', options = {}) {
60
+ return new PostgrestFilterBuilder(this.client, this.table, 'select', {
61
+ columns,
62
+ count: options.count,
63
+ head: options.head,
64
+ });
65
+ }
66
+ insert(values) {
67
+ return new PostgrestFilterBuilder(this.client, this.table, 'insert', {
68
+ insertValues: Array.isArray(values) ? values : [values],
69
+ });
70
+ }
71
+ upsert(values, options = {}) {
72
+ return new PostgrestFilterBuilder(this.client, this.table, 'upsert', {
73
+ insertValues: Array.isArray(values) ? values : [values],
74
+ conflictKey: options.onConflict ?? 'id',
75
+ });
76
+ }
77
+ update(values) {
78
+ return new PostgrestFilterBuilder(this.client, this.table, 'update', {
79
+ updateValues: values,
80
+ });
81
+ }
82
+ delete() {
83
+ return new PostgrestFilterBuilder(this.client, this.table, 'delete', {});
84
+ }
85
+ }
86
+ exports.SomewhereQueryBuilder = SomewhereQueryBuilder;
87
+ /**
88
+ * Fluent filter / modifier / resolver chain. Implements `then` so `await`
89
+ * on a builder executes the query.
90
+ */
91
+ class PostgrestFilterBuilder {
92
+ constructor(client, table, action, state) {
93
+ this.client = client;
94
+ this.table = table;
95
+ this.action = action;
96
+ this.state = state;
97
+ this.filters = [];
98
+ this.orderClause = null;
99
+ this.limitN = null;
100
+ this.offsetN = null;
101
+ this.resolveType = 'many';
102
+ /** When true, this read bypasses the client cache and always hits the network. */
103
+ this.freshOnly = false;
104
+ this.countMode = state.count ?? null;
105
+ this.headOnly = state.head ?? false;
106
+ }
107
+ /* ─── Filters ──────────────────────────────────────────────── */
108
+ eq(column, value) {
109
+ this.filters.push({ column, op: 'eq', value });
110
+ return this;
111
+ }
112
+ neq(column, value) {
113
+ this.filters.push({ column, op: 'neq', value });
114
+ return this;
115
+ }
116
+ gt(column, value) {
117
+ this.filters.push({ column, op: 'gt', value });
118
+ return this;
119
+ }
120
+ gte(column, value) {
121
+ this.filters.push({ column, op: 'gte', value });
122
+ return this;
123
+ }
124
+ lt(column, value) {
125
+ this.filters.push({ column, op: 'lt', value });
126
+ return this;
127
+ }
128
+ lte(column, value) {
129
+ this.filters.push({ column, op: 'lte', value });
130
+ return this;
131
+ }
132
+ /** Case-sensitive pattern match. Use `%` as the wildcard. */
133
+ like(column, pattern) {
134
+ this.filters.push({ column, op: 'like', value: pattern });
135
+ return this;
136
+ }
137
+ /** Case-insensitive pattern match. */
138
+ ilike(column, pattern) {
139
+ this.filters.push({ column, op: 'ilike', value: pattern });
140
+ return this;
141
+ }
142
+ in(column, values) {
143
+ this.filters.push({ column, op: 'in', value: values });
144
+ return this;
145
+ }
146
+ /** `.is('col', null)` → IS NULL. `.is('col', true/false)` for booleans. */
147
+ is(column, value) {
148
+ this.filters.push({ column, op: 'is', value });
149
+ return this;
150
+ }
151
+ /** Negate a filter: `.not('status', 'eq', 'archived')`. */
152
+ not(column, op, value) {
153
+ this.filters.push({ column, op: 'not', value: { op, value } });
154
+ return this;
155
+ }
156
+ /** Shorthand for stacking `.eq` filters from an object. */
157
+ match(criteria) {
158
+ for (const [k, v] of Object.entries(criteria)) {
159
+ this.eq(k, v);
160
+ }
161
+ return this;
162
+ }
163
+ /**
164
+ * OR a set of conditions (filter syntax). `.or('status.eq.active,age.gt.18')`
165
+ * → `(status = 'active' OR age > 18)`, AND-ed with any other filters.
166
+ * Each term is `column.operator.value`; `in` uses `col.in.(a,b,c)`. Numeric /
167
+ * `true` / `false` / `null` values are coerced to their JSON types.
168
+ */
169
+ or(filters) {
170
+ const subs = [];
171
+ for (const raw of splitTopLevel(filters)) {
172
+ const term = raw.trim();
173
+ if (!term)
174
+ continue;
175
+ // `in` values contain commas inside (...), so detect+consume them first.
176
+ const inMatch = /^([A-Za-z_][A-Za-z0-9_]*)\.in\.\((.*)\)$/.exec(term);
177
+ if (inMatch) {
178
+ subs.push({
179
+ column: inMatch[1],
180
+ op: 'in',
181
+ value: inMatch[2].split(',').map((v) => coerceFilterValue(v.trim())),
182
+ });
183
+ continue;
184
+ }
185
+ const firstDot = term.indexOf('.');
186
+ const secondDot = term.indexOf('.', firstDot + 1);
187
+ if (firstDot < 0 || secondDot < 0)
188
+ continue; // malformed term — skip
189
+ subs.push({
190
+ column: term.slice(0, firstDot),
191
+ op: term.slice(firstDot + 1, secondDot),
192
+ value: coerceFilterValue(term.slice(secondDot + 1)),
193
+ });
194
+ }
195
+ this.filters.push({ column: '', op: 'or', value: subs });
196
+ return this;
197
+ }
198
+ /* ─── Modifiers ────────────────────────────────────────────── */
199
+ order(column, options = {}) {
200
+ this.orderClause = { column, ascending: options.ascending ?? true };
201
+ return this;
202
+ }
203
+ limit(n) {
204
+ this.limitN = n;
205
+ return this;
206
+ }
207
+ /** `[from, to]` inclusive range — equivalent to `LIMIT to-from+1 OFFSET from`. */
208
+ range(from, to) {
209
+ this.offsetN = from;
210
+ this.limitN = to - from + 1;
211
+ return this;
212
+ }
213
+ /** Require exactly one row; error on 0 or >1. */
214
+ single() {
215
+ this.resolveType = 'single';
216
+ return this;
217
+ }
218
+ /** Allow 0 or 1 rows; 0 rows → `data: null`. */
219
+ maybeSingle() {
220
+ this.resolveType = 'maybeSingle';
221
+ return this;
222
+ }
223
+ /**
224
+ * Opt this read out of the client cache: always hit the network, ignoring
225
+ * any cached value (it still refreshes the cache for the next normal read).
226
+ * The per-query escape hatch for the rare always-fresh need;
227
+ * `createClient(url, key, { cache: false })` is the global one.
228
+ */
229
+ fresh() {
230
+ this.freshOnly = true;
231
+ return this;
232
+ }
233
+ /* ─── Execution ────────────────────────────────────────────── */
234
+ /**
235
+ * Thenable so `await builder` executes the query. This is the same
236
+ * thenable pattern — the chain doesn't hit the network until
237
+ * you `await` (or `.then()`) it.
238
+ */
239
+ then(onFulfilled, onRejected) {
240
+ return this.execute().then(onFulfilled, onRejected);
241
+ }
242
+ async execute() {
243
+ const projectId = this.client.resolveProjectId();
244
+ const cache = this.client.cache;
245
+ // Writes are never cached. On success they invalidate the table's cached
246
+ // reads so the next read is fresh (read-your-own-writes correctness).
247
+ if (this.action !== 'select') {
248
+ const result = await this.doFetch(projectId);
249
+ if (cache && result.error === null) {
250
+ cache.invalidate(this.table);
251
+ }
252
+ return result;
253
+ }
254
+ if (!cache)
255
+ return this.doFetch(projectId);
256
+ // Forced reads always fetch, but use the same generation fence as cached
257
+ // reads so an overlapping write/session change cannot warm stale data.
258
+ return cache.read(this.cacheKey(projectId), this.table, () => this.doFetch(projectId), this.freshOnly);
259
+ }
260
+ /** The actual network round-trip — no cache involvement. */
261
+ async doFetch(projectId) {
262
+ const body = this.buildBody(projectId);
263
+ try {
264
+ const result = await this.client.call('POST', '/db/query', { body });
265
+ const serverCount = typeof result?.count === 'number' ? result.count : null;
266
+ // head:true → the count only, no rows (count-only semantics).
267
+ if (this.headOnly) {
268
+ return { data: null, error: null, count: serverCount, status: 200 };
269
+ }
270
+ // Rows come back already shaped by the server, with any foreign-key
271
+ // embeds nested in place — we just apply the one-row/null resolution.
272
+ const rows = result?.data ?? [];
273
+ return this.shapeRows(rows, serverCount);
274
+ }
275
+ catch (err) {
276
+ if (err instanceof errors_js_1.SomewhereError) {
277
+ return invalidResult(err);
278
+ }
279
+ throw err;
280
+ }
281
+ }
282
+ /**
283
+ * Cache key for this select: every input that changes the result set —
284
+ * project + table + columns + filters + order + limit/offset + resolveType
285
+ * + count/head options, including inputs that change only the result shape.
286
+ */
287
+ cacheKey(projectId) {
288
+ return JSON.stringify({
289
+ p: projectId,
290
+ t: this.table,
291
+ c: this.state.columns ?? '*',
292
+ f: this.filters,
293
+ o: this.orderClause,
294
+ l: this.limitN,
295
+ x: this.offsetN,
296
+ r: this.resolveType,
297
+ count: this.countMode,
298
+ head: this.headOnly,
299
+ });
300
+ }
301
+ buildBody(projectId) {
302
+ const base = {
303
+ project_id: projectId,
304
+ table: this.table,
305
+ };
306
+ if (this.filters.length > 0) {
307
+ base.filters = this.filters;
308
+ }
309
+ switch (this.action) {
310
+ case 'select': {
311
+ // Send the select verbatim — including any `table(cols)` embeds,
312
+ // which the server resolves and returns nested (foreign-key joins).
313
+ base.select = this.state.columns ?? '*';
314
+ if (this.orderClause) {
315
+ base.order = this.orderClause;
316
+ }
317
+ if (this.limitN != null) {
318
+ base.limit = this.limitN;
319
+ }
320
+ if (this.offsetN != null) {
321
+ base.offset = this.offsetN;
322
+ }
323
+ if (this.countMode) {
324
+ base.count = this.countMode;
325
+ }
326
+ if (this.headOnly) {
327
+ base.head = true;
328
+ }
329
+ // single()/maybeSingle(): hint the server to cap the fetch (LIMIT 2)
330
+ // so it never pulls a full result set just to detect the >1 case.
331
+ // The final one-row / null / error shaping still happens here.
332
+ if (this.resolveType !== 'many') {
333
+ base.single = true;
334
+ }
335
+ break;
336
+ }
337
+ case 'insert': {
338
+ const rows = this.state.insertValues ?? [];
339
+ base.insert = rows.length === 1 ? rows[0] : rows;
340
+ break;
341
+ }
342
+ case 'upsert': {
343
+ const rows = this.state.insertValues ?? [];
344
+ base.upsert = rows.length === 1 ? rows[0] : rows;
345
+ base.onConflict = this.state.conflictKey ?? 'id';
346
+ break;
347
+ }
348
+ case 'update': {
349
+ base.update = this.state.updateValues ?? {};
350
+ break;
351
+ }
352
+ case 'delete': {
353
+ base.delete = true;
354
+ break;
355
+ }
356
+ }
357
+ return base;
358
+ }
359
+ shapeRows(rows, serverCount) {
360
+ if (this.resolveType === 'single') {
361
+ if (rows.length === 0) {
362
+ return invalidResult(new errors_js_1.SomewhereError({
363
+ code: 'PGRST116',
364
+ message: 'Single-row query returned 0 rows.',
365
+ statusCode: 406,
366
+ retry: false,
367
+ retryAfterMs: null,
368
+ }));
369
+ }
370
+ if (rows.length > 1) {
371
+ return invalidResult(new errors_js_1.SomewhereError({
372
+ code: 'PGRST116',
373
+ message: `Single-row query returned ${rows.length} rows.`,
374
+ statusCode: 406,
375
+ retry: false,
376
+ retryAfterMs: null,
377
+ }));
378
+ }
379
+ return { data: rows[0], error: null, count: serverCount ?? 1, status: 200 };
380
+ }
381
+ if (this.resolveType === 'maybeSingle') {
382
+ if (rows.length === 0) {
383
+ return { data: null, error: null, count: serverCount ?? 0, status: 200 };
384
+ }
385
+ return { data: rows[0], error: null, count: serverCount ?? 1, status: 200 };
386
+ }
387
+ return { data: rows, error: null, count: serverCount ?? rows.length, status: 200 };
388
+ }
389
+ }
390
+ exports.PostgrestFilterBuilder = PostgrestFilterBuilder;
391
+ //# sourceMappingURL=postgrest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgrest.js","sourceRoot":"","sources":["../../../src/resources/postgrest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProjectsClient = void 0;
4
+ const errors_js_1 = require("../errors.js");
5
+ class ProjectsClient {
6
+ constructor(client) {
7
+ this.client = client;
8
+ }
9
+ /** Update the optional analytics consent policy; the platform validates policy and editor access. */
10
+ async update(settings, projectId) {
11
+ const id = this.client.requireProjectId(projectId, 'projects.update');
12
+ try {
13
+ const result = await this.client.call('PATCH', `/projects/${encodeURIComponent(id)}`, { body: settings, auth: 'developer' });
14
+ return { data: result, error: null, status: 200 };
15
+ }
16
+ catch (err) {
17
+ return toResultError(err);
18
+ }
19
+ }
20
+ /** Inspect deployed homepage files and configured SEO defaults; live rendering and indexing remain unverified. */
21
+ async seoCheck(projectId) {
22
+ const id = this.client.requireProjectId(projectId, 'projects.seoCheck');
23
+ try {
24
+ const result = await this.client.call('GET', `/projects/${encodeURIComponent(id)}/seo`, { auth: 'developer' });
25
+ return { data: result, error: null, status: 200 };
26
+ }
27
+ catch (err) {
28
+ return toResultError(err);
29
+ }
30
+ }
31
+ /** Read a project's exact cross-origin allowlist (CORS allowed_origins). */
32
+ async getAllowedOrigins(projectId) {
33
+ const id = this.client.requireProjectId(projectId, 'projects.getAllowedOrigins');
34
+ try {
35
+ const result = await this.client.call('GET', `/projects/${encodeURIComponent(id)}/allowed-origins`, { auth: 'developer' });
36
+ return { data: result, error: null, status: 200 };
37
+ }
38
+ catch (err) {
39
+ return toResultError(err);
40
+ }
41
+ }
42
+ /**
43
+ * Replace a project's cross-origin allowlist with these exact origins.
44
+ * Owner-or-platform-admin only, and audited server-side. Each entry must be
45
+ * an exact origin (scheme + host + optional port, no path or wildcards); the
46
+ * platform validates and normalizes them — no client-side munging. Pass `[]`
47
+ * to clear the allowlist.
48
+ */
49
+ async setAllowedOrigins(allowedOrigins, projectId) {
50
+ const id = this.client.requireProjectId(projectId, 'projects.setAllowedOrigins');
51
+ try {
52
+ const result = await this.client.call('PUT', `/projects/${encodeURIComponent(id)}/allowed-origins`, { body: { allowed_origins: allowedOrigins }, auth: 'developer' });
53
+ return { data: result, error: null, status: 200 };
54
+ }
55
+ catch (err) {
56
+ return toResultError(err);
57
+ }
58
+ }
59
+ /** Remove all configured cross-origin origins (owner/admin only). */
60
+ clearAllowedOrigins(projectId) {
61
+ return this.setAllowedOrigins([], projectId);
62
+ }
63
+ }
64
+ exports.ProjectsClient = ProjectsClient;
65
+ function toResultError(err) {
66
+ if (err instanceof errors_js_1.SomewhereError) {
67
+ return { data: null, error: err, status: err.statusCode };
68
+ }
69
+ throw err;
70
+ }
71
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../../src/resources/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StorageFileApi = exports.StorageClient = void 0;
4
+ const errors_js_1 = require("../errors.js");
5
+ /**
6
+ * Prefix-oriented file API.
7
+ *
8
+ * Routes through `/v1/fs/*` (the platform's structured filesystem).
9
+ * "Buckets" are prefix directories under the project's file namespace:
10
+ * `sw.storage.from('avatars').upload('a.png', ...)` writes to
11
+ * `/v1/fs/{project_id}/avatars/a.png`.
12
+ *
13
+ * For browser uploads with per-user or per-team rules, declare a file
14
+ * collection in db/schema.ts and use the generated `somewhere:files` client
15
+ * instead: docs({ topic: 'declared-files' }).
16
+ */
17
+ class StorageClient {
18
+ constructor(client) {
19
+ this.client = client;
20
+ }
21
+ from(bucket) {
22
+ return new StorageFileApi(this.client, bucket);
23
+ }
24
+ }
25
+ exports.StorageClient = StorageClient;
26
+ class StorageFileApi {
27
+ constructor(client, bucket) {
28
+ this.client = client;
29
+ this.bucket = bucket;
30
+ }
31
+ async upload(path, fileBody, options = {}) {
32
+ const projectId = this.requireProjectId('upload');
33
+ const fullPath = this.fullKey(path);
34
+ try {
35
+ const result = await this.client.putBytes(`/fs/${enc(projectId)}/${encKey(fullPath)}`, fileBody, options.contentType ?? inferContentType(fileBody) ?? 'application/octet-stream');
36
+ return {
37
+ data: {
38
+ path,
39
+ fullPath: result.path ?? fullPath,
40
+ id: result.path ?? fullPath,
41
+ },
42
+ error: null,
43
+ status: 200,
44
+ };
45
+ }
46
+ catch (err) {
47
+ return toResultError(err);
48
+ }
49
+ }
50
+ async download(path) {
51
+ const projectId = this.requireProjectId('download');
52
+ const fullPath = this.fullKey(path);
53
+ try {
54
+ const result = await this.client.getBytes(`/fs/${enc(projectId)}/${encKey(fullPath)}`);
55
+ return { data: result, error: null, status: 200 };
56
+ }
57
+ catch (err) {
58
+ return toResultError(err);
59
+ }
60
+ }
61
+ /**
62
+ * List files in this bucket (or a sub-prefix).
63
+ * Routes to `GET /v1/fs/{pid}/{bucket}/{prefix}` which returns
64
+ * a directory listing when the path is a directory.
65
+ */
66
+ async list(prefix = '', _options = {}) {
67
+ const projectId = this.requireProjectId('list');
68
+ const dirPath = prefix ? this.fullKey(prefix) : this.bucket;
69
+ try {
70
+ const result = await this.client.getBytes(`/fs/${enc(projectId)}/${encKey(dirPath)}`);
71
+ if (result.contentType.includes('application/json')) {
72
+ const text = new TextDecoder().decode(result.body);
73
+ const parsed = JSON.parse(text);
74
+ const data = parsed?.ok ? parsed.data : parsed;
75
+ if (data?.type === 'directory' && Array.isArray(data.entries)) {
76
+ const objects = data.entries.map((e) => ({
77
+ name: e.name,
78
+ size: e.size_bytes ?? 0,
79
+ content_type: e.content_type,
80
+ updated_at: e.updated_at,
81
+ }));
82
+ return { data: objects, error: null, status: 200 };
83
+ }
84
+ }
85
+ return { data: [], error: null, status: 200 };
86
+ }
87
+ catch (err) {
88
+ return toResultError(err);
89
+ }
90
+ }
91
+ async remove(paths) {
92
+ const projectId = this.requireProjectId('remove');
93
+ const removed = [];
94
+ for (const p of paths) {
95
+ const fullPath = this.fullKey(p);
96
+ try {
97
+ await this.client.call('DELETE', `/fs/${enc(projectId)}/${encKey(fullPath)}`);
98
+ removed.push({ name: p, size: 0 });
99
+ }
100
+ catch (err) {
101
+ return toResultError(err);
102
+ }
103
+ }
104
+ return { data: removed, error: null, status: 200 };
105
+ }
106
+ getPublicUrl(path) {
107
+ const projectId = this.requireProjectId('getPublicUrl');
108
+ const fullPath = this.fullKey(path);
109
+ const publicUrl = `${this.client.baseUrl}/fs/${enc(projectId)}/${encKey(fullPath)}`;
110
+ return { data: { publicUrl } };
111
+ }
112
+ async signedUrl(path, options = {}) {
113
+ const projectId = this.requireProjectId('signedUrl');
114
+ const fullPath = this.fullKey(path);
115
+ try {
116
+ const body = { path: '/' + fullPath };
117
+ if (typeof options.expiresIn === 'number')
118
+ body.expires_in = options.expiresIn;
119
+ const res = await this.client.call('POST', `/fs/${enc(projectId)}/sign`, body);
120
+ return { data: res, error: null, status: 200 };
121
+ }
122
+ catch (err) {
123
+ return toResultError(err);
124
+ }
125
+ }
126
+ /**
127
+ * Alias of `signedUrl`. `createSignedUrl(path, expiresIn)` resolves to
128
+ * `{ data: { signedUrl, ...meta }, error }`.
129
+ */
130
+ async createSignedUrl(path, expiresIn) {
131
+ const res = await this.signedUrl(path, { expiresIn });
132
+ if (res.error || !res.data) {
133
+ return { data: null, error: res.error, status: res.status };
134
+ }
135
+ return {
136
+ data: { ...res.data, signedUrl: res.data.url },
137
+ error: null,
138
+ status: res.status,
139
+ };
140
+ }
141
+ async integrityCheck(options = {}) {
142
+ const projectId = this.requireProjectId('integrityCheck');
143
+ try {
144
+ const body = {};
145
+ if (options.autoClean === true)
146
+ body.auto_clean = true;
147
+ if (typeof options.limit === 'number')
148
+ body.limit = options.limit;
149
+ if (typeof options.cursor === 'string')
150
+ body.cursor = options.cursor;
151
+ const res = await this.client.call('POST', `/fs/${enc(projectId)}/integrity-check`, body);
152
+ return { data: res, error: null, status: 200 };
153
+ }
154
+ catch (err) {
155
+ return toResultError(err);
156
+ }
157
+ }
158
+ fullKey(path) {
159
+ const trimmed = path.startsWith('/') ? path.slice(1) : path;
160
+ return `${this.bucket}/${trimmed}`;
161
+ }
162
+ requireProjectId(method) {
163
+ return this.client.requireProjectId(undefined, `storage.from('${this.bucket}').${method}`);
164
+ }
165
+ }
166
+ exports.StorageFileApi = StorageFileApi;
167
+ function enc(s) {
168
+ return encodeURIComponent(s);
169
+ }
170
+ function encKey(key) {
171
+ return key
172
+ .split('/')
173
+ .map(encodeURIComponent)
174
+ .join('/');
175
+ }
176
+ function inferContentType(body) {
177
+ if (typeof Blob !== 'undefined' && body instanceof Blob && body.type) {
178
+ return body.type;
179
+ }
180
+ if (typeof body === 'string') {
181
+ return 'text/plain; charset=utf-8';
182
+ }
183
+ return null;
184
+ }
185
+ function toResultError(err) {
186
+ if (err instanceof errors_js_1.SomewhereError) {
187
+ return { data: null, error: err, status: err.statusCode };
188
+ }
189
+ throw err;
190
+ }
191
+ //# sourceMappingURL=storage.js.map