@pawabase/client 0.0.0-stage → 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 (243) hide show
  1. package/README.md +313 -2
  2. package/dist/cjs/admin.d.ts +187 -0
  3. package/dist/cjs/admin.d.ts.map +1 -0
  4. package/dist/cjs/admin.js +235 -0
  5. package/dist/cjs/admin.js.map +1 -0
  6. package/dist/cjs/auth.d.ts +448 -0
  7. package/dist/cjs/auth.d.ts.map +1 -0
  8. package/dist/cjs/auth.js +1016 -0
  9. package/dist/cjs/auth.js.map +1 -0
  10. package/dist/cjs/client.d.ts +103 -0
  11. package/dist/cjs/client.d.ts.map +1 -0
  12. package/dist/cjs/client.js +144 -0
  13. package/dist/cjs/client.js.map +1 -0
  14. package/dist/cjs/data.d.ts +220 -0
  15. package/dist/cjs/data.d.ts.map +1 -0
  16. package/dist/cjs/data.js +490 -0
  17. package/dist/cjs/data.js.map +1 -0
  18. package/dist/cjs/errors.d.ts +167 -0
  19. package/dist/cjs/errors.d.ts.map +1 -0
  20. package/dist/cjs/errors.js +316 -0
  21. package/dist/cjs/errors.js.map +1 -0
  22. package/dist/cjs/files.d.ts +80 -0
  23. package/dist/cjs/files.d.ts.map +1 -0
  24. package/dist/cjs/files.js +167 -0
  25. package/dist/cjs/files.js.map +1 -0
  26. package/dist/cjs/functions.d.ts +66 -0
  27. package/dist/cjs/functions.d.ts.map +1 -0
  28. package/dist/cjs/functions.js +109 -0
  29. package/dist/cjs/functions.js.map +1 -0
  30. package/dist/cjs/http.d.ts +101 -0
  31. package/dist/cjs/http.d.ts.map +1 -0
  32. package/dist/cjs/http.js +249 -0
  33. package/dist/cjs/http.js.map +1 -0
  34. package/dist/cjs/index.d.ts +22 -0
  35. package/dist/cjs/index.d.ts.map +1 -0
  36. package/dist/cjs/index.js +45 -0
  37. package/dist/cjs/index.js.map +1 -0
  38. package/dist/cjs/manage/access.d.ts +136 -0
  39. package/dist/cjs/manage/access.d.ts.map +1 -0
  40. package/dist/cjs/manage/access.js +162 -0
  41. package/dist/cjs/manage/access.js.map +1 -0
  42. package/dist/cjs/manage/automation.d.ts +106 -0
  43. package/dist/cjs/manage/automation.d.ts.map +1 -0
  44. package/dist/cjs/manage/automation.js +144 -0
  45. package/dist/cjs/manage/automation.js.map +1 -0
  46. package/dist/cjs/manage/base.d.ts +52 -0
  47. package/dist/cjs/manage/base.d.ts.map +1 -0
  48. package/dist/cjs/manage/base.js +69 -0
  49. package/dist/cjs/manage/base.js.map +1 -0
  50. package/dist/cjs/manage/data.d.ts +100 -0
  51. package/dist/cjs/manage/data.d.ts.map +1 -0
  52. package/dist/cjs/manage/data.js +141 -0
  53. package/dist/cjs/manage/data.js.map +1 -0
  54. package/dist/cjs/manage/files.d.ts +45 -0
  55. package/dist/cjs/manage/files.d.ts.map +1 -0
  56. package/dist/cjs/manage/files.js +73 -0
  57. package/dist/cjs/manage/files.js.map +1 -0
  58. package/dist/cjs/manage/functions.d.ts +48 -0
  59. package/dist/cjs/manage/functions.d.ts.map +1 -0
  60. package/dist/cjs/manage/functions.js +61 -0
  61. package/dist/cjs/manage/functions.js.map +1 -0
  62. package/dist/cjs/manage/index.d.ts +76 -0
  63. package/dist/cjs/manage/index.d.ts.map +1 -0
  64. package/dist/cjs/manage/index.js +134 -0
  65. package/dist/cjs/manage/index.js.map +1 -0
  66. package/dist/cjs/manage/lifecycle.d.ts +128 -0
  67. package/dist/cjs/manage/lifecycle.d.ts.map +1 -0
  68. package/dist/cjs/manage/lifecycle.js +167 -0
  69. package/dist/cjs/manage/lifecycle.js.map +1 -0
  70. package/dist/cjs/manage/mail.d.ts +16 -0
  71. package/dist/cjs/manage/mail.d.ts.map +1 -0
  72. package/dist/cjs/manage/mail.js +24 -0
  73. package/dist/cjs/manage/mail.js.map +1 -0
  74. package/dist/cjs/manage/observe.d.ts +149 -0
  75. package/dist/cjs/manage/observe.d.ts.map +1 -0
  76. package/dist/cjs/manage/observe.js +168 -0
  77. package/dist/cjs/manage/observe.js.map +1 -0
  78. package/dist/cjs/manage/realtime.d.ts +52 -0
  79. package/dist/cjs/manage/realtime.d.ts.map +1 -0
  80. package/dist/cjs/manage/realtime.js +71 -0
  81. package/dist/cjs/manage/realtime.js.map +1 -0
  82. package/dist/cjs/package.json +1 -0
  83. package/dist/cjs/realtime.d.ts +207 -0
  84. package/dist/cjs/realtime.d.ts.map +1 -0
  85. package/dist/cjs/realtime.js +704 -0
  86. package/dist/cjs/realtime.js.map +1 -0
  87. package/dist/cjs/session-store.d.ts +16 -0
  88. package/dist/cjs/session-store.d.ts.map +1 -0
  89. package/dist/cjs/session-store.js +37 -0
  90. package/dist/cjs/session-store.js.map +1 -0
  91. package/dist/cjs/typegen.d.ts +26 -0
  92. package/dist/cjs/typegen.d.ts.map +1 -0
  93. package/dist/cjs/typegen.js +167 -0
  94. package/dist/cjs/typegen.js.map +1 -0
  95. package/dist/cjs/types.d.ts +178 -0
  96. package/dist/cjs/types.d.ts.map +1 -0
  97. package/dist/cjs/types.js +4 -0
  98. package/dist/cjs/types.js.map +1 -0
  99. package/dist/cjs/util.d.ts +27 -0
  100. package/dist/cjs/util.d.ts.map +1 -0
  101. package/dist/cjs/util.js +115 -0
  102. package/dist/cjs/util.js.map +1 -0
  103. package/dist/cjs/version.d.ts +2 -0
  104. package/dist/cjs/version.d.ts.map +1 -0
  105. package/dist/cjs/version.js +5 -0
  106. package/dist/cjs/version.js.map +1 -0
  107. package/dist/esm/admin.d.ts +187 -0
  108. package/dist/esm/admin.d.ts.map +1 -0
  109. package/dist/esm/admin.js +222 -0
  110. package/dist/esm/admin.js.map +1 -0
  111. package/dist/esm/auth.d.ts +448 -0
  112. package/dist/esm/auth.d.ts.map +1 -0
  113. package/dist/esm/auth.js +1012 -0
  114. package/dist/esm/auth.js.map +1 -0
  115. package/dist/esm/cli/gen-types.d.ts +2 -0
  116. package/dist/esm/cli/gen-types.d.ts.map +1 -0
  117. package/dist/esm/cli/gen-types.js +100 -0
  118. package/dist/esm/cli/gen-types.js.map +1 -0
  119. package/dist/esm/client.d.ts +103 -0
  120. package/dist/esm/client.d.ts.map +1 -0
  121. package/dist/esm/client.js +139 -0
  122. package/dist/esm/client.js.map +1 -0
  123. package/dist/esm/data.d.ts +220 -0
  124. package/dist/esm/data.d.ts.map +1 -0
  125. package/dist/esm/data.js +485 -0
  126. package/dist/esm/data.js.map +1 -0
  127. package/dist/esm/errors.d.ts +167 -0
  128. package/dist/esm/errors.d.ts.map +1 -0
  129. package/dist/esm/errors.js +293 -0
  130. package/dist/esm/errors.js.map +1 -0
  131. package/dist/esm/files.d.ts +80 -0
  132. package/dist/esm/files.d.ts.map +1 -0
  133. package/dist/esm/files.js +162 -0
  134. package/dist/esm/files.js.map +1 -0
  135. package/dist/esm/functions.d.ts +66 -0
  136. package/dist/esm/functions.d.ts.map +1 -0
  137. package/dist/esm/functions.js +103 -0
  138. package/dist/esm/functions.js.map +1 -0
  139. package/dist/esm/http.d.ts +101 -0
  140. package/dist/esm/http.d.ts.map +1 -0
  141. package/dist/esm/http.js +245 -0
  142. package/dist/esm/http.js.map +1 -0
  143. package/dist/esm/index.d.ts +22 -0
  144. package/dist/esm/index.d.ts.map +1 -0
  145. package/dist/esm/index.js +12 -0
  146. package/dist/esm/index.js.map +1 -0
  147. package/dist/esm/manage/access.d.ts +136 -0
  148. package/dist/esm/manage/access.d.ts.map +1 -0
  149. package/dist/esm/manage/access.js +155 -0
  150. package/dist/esm/manage/access.js.map +1 -0
  151. package/dist/esm/manage/automation.d.ts +106 -0
  152. package/dist/esm/manage/automation.d.ts.map +1 -0
  153. package/dist/esm/manage/automation.js +134 -0
  154. package/dist/esm/manage/automation.js.map +1 -0
  155. package/dist/esm/manage/base.d.ts +52 -0
  156. package/dist/esm/manage/base.d.ts.map +1 -0
  157. package/dist/esm/manage/base.js +63 -0
  158. package/dist/esm/manage/base.js.map +1 -0
  159. package/dist/esm/manage/data.d.ts +100 -0
  160. package/dist/esm/manage/data.d.ts.map +1 -0
  161. package/dist/esm/manage/data.js +130 -0
  162. package/dist/esm/manage/data.js.map +1 -0
  163. package/dist/esm/manage/files.d.ts +45 -0
  164. package/dist/esm/manage/files.d.ts.map +1 -0
  165. package/dist/esm/manage/files.js +68 -0
  166. package/dist/esm/manage/files.js.map +1 -0
  167. package/dist/esm/manage/functions.d.ts +48 -0
  168. package/dist/esm/manage/functions.d.ts.map +1 -0
  169. package/dist/esm/manage/functions.js +57 -0
  170. package/dist/esm/manage/functions.js.map +1 -0
  171. package/dist/esm/manage/index.d.ts +76 -0
  172. package/dist/esm/manage/index.d.ts.map +1 -0
  173. package/dist/esm/manage/index.js +115 -0
  174. package/dist/esm/manage/index.js.map +1 -0
  175. package/dist/esm/manage/lifecycle.d.ts +128 -0
  176. package/dist/esm/manage/lifecycle.d.ts.map +1 -0
  177. package/dist/esm/manage/lifecycle.js +161 -0
  178. package/dist/esm/manage/lifecycle.js.map +1 -0
  179. package/dist/esm/manage/mail.d.ts +16 -0
  180. package/dist/esm/manage/mail.d.ts.map +1 -0
  181. package/dist/esm/manage/mail.js +19 -0
  182. package/dist/esm/manage/mail.js.map +1 -0
  183. package/dist/esm/manage/observe.d.ts +149 -0
  184. package/dist/esm/manage/observe.d.ts.map +1 -0
  185. package/dist/esm/manage/observe.js +161 -0
  186. package/dist/esm/manage/observe.js.map +1 -0
  187. package/dist/esm/manage/realtime.d.ts +52 -0
  188. package/dist/esm/manage/realtime.d.ts.map +1 -0
  189. package/dist/esm/manage/realtime.js +66 -0
  190. package/dist/esm/manage/realtime.js.map +1 -0
  191. package/dist/esm/package.json +1 -0
  192. package/dist/esm/realtime.d.ts +207 -0
  193. package/dist/esm/realtime.d.ts.map +1 -0
  194. package/dist/esm/realtime.js +699 -0
  195. package/dist/esm/realtime.js.map +1 -0
  196. package/dist/esm/session-store.d.ts +16 -0
  197. package/dist/esm/session-store.d.ts.map +1 -0
  198. package/dist/esm/session-store.js +32 -0
  199. package/dist/esm/session-store.js.map +1 -0
  200. package/dist/esm/typegen.d.ts +26 -0
  201. package/dist/esm/typegen.d.ts.map +1 -0
  202. package/dist/esm/typegen.js +163 -0
  203. package/dist/esm/typegen.js.map +1 -0
  204. package/dist/esm/types.d.ts +178 -0
  205. package/dist/esm/types.d.ts.map +1 -0
  206. package/dist/esm/types.js +3 -0
  207. package/dist/esm/types.js.map +1 -0
  208. package/dist/esm/util.d.ts +27 -0
  209. package/dist/esm/util.d.ts.map +1 -0
  210. package/dist/esm/util.js +102 -0
  211. package/dist/esm/util.js.map +1 -0
  212. package/dist/esm/version.d.ts +2 -0
  213. package/dist/esm/version.d.ts.map +1 -0
  214. package/dist/esm/version.js +2 -0
  215. package/dist/esm/version.js.map +1 -0
  216. package/package.json +84 -4
  217. package/src/admin.ts +311 -0
  218. package/src/auth.ts +1180 -0
  219. package/src/cli/gen-types.ts +105 -0
  220. package/src/client.ts +189 -0
  221. package/src/data.ts +576 -0
  222. package/src/errors.ts +330 -0
  223. package/src/files.ts +208 -0
  224. package/src/functions.ts +131 -0
  225. package/src/http.ts +354 -0
  226. package/src/index.ts +56 -0
  227. package/src/manage/access.ts +206 -0
  228. package/src/manage/automation.ts +162 -0
  229. package/src/manage/base.ts +83 -0
  230. package/src/manage/data.ts +159 -0
  231. package/src/manage/files.ts +79 -0
  232. package/src/manage/functions.ts +69 -0
  233. package/src/manage/index.ts +132 -0
  234. package/src/manage/lifecycle.ts +208 -0
  235. package/src/manage/mail.ts +22 -0
  236. package/src/manage/observe.ts +226 -0
  237. package/src/manage/realtime.ts +95 -0
  238. package/src/realtime.ts +765 -0
  239. package/src/session-store.ts +36 -0
  240. package/src/typegen.ts +192 -0
  241. package/src/types.ts +195 -0
  242. package/src/util.ts +114 -0
  243. package/src/version.ts +1 -0
@@ -0,0 +1,102 @@
1
+ import { AbortError } from "./errors.js";
2
+ export function isRecord(value) {
3
+ return typeof value === "object" && value !== null && !Array.isArray(value);
4
+ }
5
+ /** Sleep for `ms`, rejecting early with {@link AbortError} when `signal` fires. */
6
+ export function sleep(ms, signal) {
7
+ return new Promise((resolve, reject) => {
8
+ if (signal?.aborted)
9
+ return reject(new AbortError(undefined, { cause: signal.reason }));
10
+ const timer = setTimeout(() => {
11
+ signal?.removeEventListener("abort", onAbort);
12
+ resolve();
13
+ }, ms);
14
+ const onAbort = () => {
15
+ clearTimeout(timer);
16
+ reject(new AbortError(undefined, { cause: signal?.reason }));
17
+ };
18
+ signal?.addEventListener("abort", onAbort, { once: true });
19
+ });
20
+ }
21
+ /** Exponential backoff with full jitter: a random delay in `[0, min(max, base * factor^attempt)]`. */
22
+ export function backoff(attempt, options, random = Math.random) {
23
+ const ceiling = Math.min(options.maxDelayMs, options.baseDelayMs * (options.factor ?? 2) ** attempt);
24
+ return Math.floor(random() * ceiling);
25
+ }
26
+ /** One signal that fires when any of `signals` fires. Uses the platform's `AbortSignal.any` when present. */
27
+ export function anySignal(signals) {
28
+ const real = signals.filter((s) => !!s);
29
+ if (real.length === 0)
30
+ return undefined;
31
+ if (real.length === 1)
32
+ return real[0];
33
+ const native = AbortSignal.any;
34
+ if (native)
35
+ return native(real);
36
+ const controller = new AbortController();
37
+ for (const signal of real) {
38
+ if (signal.aborted) {
39
+ controller.abort(signal.reason);
40
+ break;
41
+ }
42
+ signal.addEventListener("abort", () => controller.abort(signal.reason), { once: true });
43
+ }
44
+ return controller.signal;
45
+ }
46
+ /** `a/b c/d` to `a/b%20c/d`: encode each path segment, keep the slashes. */
47
+ export function encodePath(path) {
48
+ return path
49
+ .split("/")
50
+ .map((segment) => encodeURIComponent(segment))
51
+ .join("/");
52
+ }
53
+ /** A query string from a flat record. Drops `undefined`/`null`; arrays repeat the key. */
54
+ export function queryString(params) {
55
+ if (!params)
56
+ return "";
57
+ const search = new URLSearchParams();
58
+ for (const [key, value] of Object.entries(params)) {
59
+ const items = Array.isArray(value) ? value : [value];
60
+ for (const item of items) {
61
+ if (item === undefined || item === null)
62
+ continue;
63
+ search.append(key, item instanceof Date ? item.toISOString() : String(item));
64
+ }
65
+ }
66
+ const text = search.toString();
67
+ return text ? `?${text}` : "";
68
+ }
69
+ export function trimSlash(url) {
70
+ return url.replace(/\/+$/, "");
71
+ }
72
+ export function randomId() {
73
+ const c = globalThis.crypto;
74
+ if (c?.randomUUID)
75
+ return c.randomUUID();
76
+ return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
77
+ }
78
+ export function nowSeconds() {
79
+ return Math.floor(Date.now() / 1000);
80
+ }
81
+ /** Decode a JWT payload without verifying it (the server verifies). Returns `null` for malformed tokens. */
82
+ export function decodeJwt(token) {
83
+ const part = token.split(".")[1];
84
+ if (!part)
85
+ return null;
86
+ try {
87
+ const base64 = part.replace(/-/g, "+").replace(/_/g, "/").padEnd(Math.ceil(part.length / 4) * 4, "=");
88
+ const text = typeof atob === "function"
89
+ ? decodeURIComponent(Array.from(atob(base64), (ch) => "%" + ch.charCodeAt(0).toString(16).padStart(2, "0")).join(""))
90
+ : globalThis.Buffer.from(base64, "base64").toString("utf8");
91
+ const value = JSON.parse(text);
92
+ return isRecord(value) ? value : null;
93
+ }
94
+ catch {
95
+ return null;
96
+ }
97
+ }
98
+ /** Whether a key is a secret key (`pb_sk_…`, or `sk_…` in older docs). */
99
+ export function isSecretKey(apiKey) {
100
+ return /^(pb_)?sk_/.test(apiKey);
101
+ }
102
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION = "0.1.0";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const VERSION = "0.1.0";
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,86 @@
1
1
  {
2
2
  "name": "@pawabase/client",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "Official TypeScript client for Pawabase: data, auth, storage, functions, flows and realtime.",
5
+ "type": "module",
6
+ "main": "./dist/cjs/index.js",
7
+ "module": "./dist/esm/index.js",
8
+ "types": "./dist/esm/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/esm/index.d.ts",
13
+ "default": "./dist/esm/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/cjs/index.d.ts",
17
+ "default": "./dist/cjs/index.js"
18
+ }
19
+ },
20
+ "./manage": {
21
+ "import": {
22
+ "types": "./dist/esm/manage/index.d.ts",
23
+ "default": "./dist/esm/manage/index.js"
24
+ },
25
+ "require": {
26
+ "types": "./dist/cjs/manage/index.d.ts",
27
+ "default": "./dist/cjs/manage/index.js"
28
+ }
29
+ },
30
+ "./admin": {
31
+ "import": {
32
+ "types": "./dist/esm/admin.d.ts",
33
+ "default": "./dist/esm/admin.js"
34
+ },
35
+ "require": {
36
+ "types": "./dist/cjs/admin.d.ts",
37
+ "default": "./dist/cjs/admin.js"
38
+ }
39
+ },
40
+ "./package.json": "./package.json"
41
+ },
42
+ "bin": {
43
+ "pawabase-types": "./dist/esm/cli/gen-types.js"
44
+ },
45
+ "files": [
46
+ "dist",
47
+ "src",
48
+ "README.md"
49
+ ],
50
+ "sideEffects": false,
51
+ "engines": {
52
+ "node": ">=20"
53
+ },
54
+ "scripts": {
55
+ "build": "rm -rf dist && tsc -p tsconfig.json && tsc -p tsconfig.cjs.json && node scripts/finish-build.mjs",
56
+ "typecheck": "tsc -p tsconfig.json --noEmit",
57
+ "test": "rm -rf dist-test && tsc -p tsconfig.test.json && node --test --test-concurrency=1 $(find dist-test/test -name \"*.test.js\")",
58
+ "prepare": "npm run build",
59
+ "prepublishOnly": "npm run build && npm test"
60
+ },
61
+ "keywords": [
62
+ "pawabase",
63
+ "backend",
64
+ "sdk",
65
+ "realtime",
66
+ "auth",
67
+ "storage"
68
+ ],
69
+ "license": "Apache-2.0",
70
+ "devDependencies": {
71
+ "@types/node": "^22.0.0",
72
+ "@types/ws": "^8.18.2",
73
+ "typescript": "^5.6.0",
74
+ "ws": "^8.22.0"
75
+ },
76
+ "typesVersions": {
77
+ "*": {
78
+ "manage": [
79
+ "./dist/esm/manage/index.d.ts"
80
+ ],
81
+ "admin": [
82
+ "./dist/esm/admin.d.ts"
83
+ ]
84
+ }
85
+ }
86
+ }
package/src/admin.ts ADDED
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Administer the environment's users, organizations and roles, with the environment's secret key (`pb_sk_…`).
3
+ *
4
+ * These are the people who sign in to *your* application, not the project's own team. Every call is scoped to one environment;
5
+ * a user of one environment is never visible in another.
6
+ *
7
+ * ```ts
8
+ * import { createClient } from "@pawabase/client";
9
+ * import { admin } from "@pawabase/client/admin";
10
+ *
11
+ * const a = admin(createClient({ url, apiKey: "pb_sk_…", environment: "production" }));
12
+ * await a.users.create({ email: "ada@example.com", password: "…", roles: ["editor"] });
13
+ * await a.users.update(userId, { disabled: true });
14
+ * await a.orgs.addMember("acme", { email: "ada@example.com", role: "admin" });
15
+ * ```
16
+ */
17
+ import type { PawabaseClient } from "./client.js";
18
+ import { ConfigError } from "./errors.js";
19
+ import type { HttpClient } from "./http.js";
20
+ import { Service, seg, type Api, type Body } from "./manage/base.js";
21
+ import { isSecretKey } from "./util.js";
22
+
23
+ class AdminService extends Service {
24
+ protected override path(suffix = ""): string {
25
+ return `/platform/v1/envs/${encodeURIComponent(this.environment)}/auth${suffix}`;
26
+ }
27
+ }
28
+
29
+ export interface NewUser {
30
+ email: string;
31
+ password?: string;
32
+ username?: string;
33
+ name?: string;
34
+ /** Default `true`: an operator vouches for the address. */
35
+ emailVerified?: boolean;
36
+ /** Visible to the user and editable by them. */
37
+ userMetadata?: Body;
38
+ /** Visible to your server only. */
39
+ appMetadata?: Body;
40
+ roles?: string[];
41
+ }
42
+
43
+ export interface UserChanges {
44
+ name?: string;
45
+ emailVerified?: boolean;
46
+ /** Blocks sign-in and ends the user's sessions. */
47
+ disabled?: boolean;
48
+ password?: string;
49
+ userMetadata?: Body;
50
+ appMetadata?: Body;
51
+ /** Replaces the user's roles. */
52
+ roles?: string[];
53
+ /** Clears a lockout after failed sign-ins. */
54
+ unlock?: boolean;
55
+ }
56
+
57
+ export class Users extends AdminService {
58
+ /** `search` matches email, username and name. `status`: `disabled`, `unverified`, `locked`, `mfa`, `no_mfa`. */
59
+ search(options: { search?: string; status?: string; limit?: number; offset?: number } = {}): Promise<Api> {
60
+ return this.get("/users", { limit: 50, offset: 0, ...options });
61
+ }
62
+
63
+ getUser(userId: string): Promise<Api> {
64
+ return this.get(seg("users", userId));
65
+ }
66
+
67
+ /** Create an account without the sign-up restrictions (allow-lists; the password policy still applies). */
68
+ create(user: NewUser): Promise<Api> {
69
+ return this.post("/users", {
70
+ email: user.email,
71
+ password: user.password,
72
+ username: user.username,
73
+ name: user.name ?? "",
74
+ email_verified: user.emailVerified ?? true,
75
+ user_metadata: user.userMetadata ?? {},
76
+ app_metadata: user.appMetadata ?? {},
77
+ roles: user.roles ?? [],
78
+ });
79
+ }
80
+
81
+ update(userId: string, changes: UserChanges): Promise<Api> {
82
+ return this.patch(seg("users", userId), {
83
+ name: changes.name,
84
+ email_verified: changes.emailVerified,
85
+ disabled: changes.disabled,
86
+ password: changes.password,
87
+ user_metadata: changes.userMetadata,
88
+ app_metadata: changes.appMetadata,
89
+ roles: changes.roles,
90
+ unlock: changes.unlock,
91
+ });
92
+ }
93
+
94
+ deleteUser(userId: string): Promise<Api> {
95
+ return this.del(seg("users", userId));
96
+ }
97
+
98
+ /** The user's recent sign-ins and security events. */
99
+ history(userId: string): Promise<Api> {
100
+ return this.get(seg("users", userId, "history"));
101
+ }
102
+
103
+ /** Remove the user's second factors, so they can sign in with a password alone and enrol again. */
104
+ resetMfa(userId: string): Promise<Api> {
105
+ return this.post(seg("users", userId, "mfa", "reset"));
106
+ }
107
+
108
+ /** Give the user permissions directly, beyond their roles' (`posts:write`, `billing:*`). */
109
+ grant(userId: string, permissions: string[]): Promise<Api> {
110
+ return this.post(seg("users", userId, "permissions"), { permissions });
111
+ }
112
+
113
+ revoke(userId: string, permissions: string[]): Promise<Api> {
114
+ return this.del(seg("users", userId, "permissions"), undefined, { permissions });
115
+ }
116
+
117
+ /** Sign the user out everywhere. */
118
+ revokeSessions(userId: string): Promise<Api> {
119
+ return this.post(seg("users", userId, "sessions", "revoke"));
120
+ }
121
+
122
+ revokeSession(userId: string, sessionId: string): Promise<Api> {
123
+ return this.del(seg("users", userId, "sessions", sessionId));
124
+ }
125
+
126
+ devices(userId: string): Promise<Api> {
127
+ return this.get(seg("users", userId, "devices"));
128
+ }
129
+
130
+ forgetDevice(userId: string, deviceId: string): Promise<Api> {
131
+ return this.del(seg("users", userId, "devices", deviceId));
132
+ }
133
+
134
+ /** The user's own API keys (never the secrets). */
135
+ apiKeys(userId: string): Promise<Api> {
136
+ return this.get(seg("users", userId, "api-keys"));
137
+ }
138
+ }
139
+
140
+ export class Roles extends AdminService {
141
+ /** Roles with their permissions. */
142
+ list(): Promise<Api> {
143
+ return this.get("/roles");
144
+ }
145
+
146
+ /** Create or replace a role. Names are lowercase (`editor`, `org:billing`); permissions are `resource:action` patterns with `*` wildcards. */
147
+ define(name: string, permissions: string[], options: { description?: string } = {}): Promise<Api> {
148
+ return this.put("/roles", { name, description: options.description ?? "", permissions });
149
+ }
150
+
151
+ remove(name: string): Promise<Api> {
152
+ return this.del(seg("roles", name));
153
+ }
154
+ }
155
+
156
+ /** Organizations (tenants) and their members. A member's role is `owner`, `admin` or `member`. */
157
+ export class Orgs extends AdminService {
158
+ list(): Promise<Api> {
159
+ return this.get("/orgs");
160
+ }
161
+
162
+ getOrg(slug: string): Promise<Api> {
163
+ return this.get(seg("orgs", slug));
164
+ }
165
+
166
+ create(slug: string, name: string, options: { ownerEmail?: string; metadata?: Body } = {}): Promise<Api> {
167
+ return this.post("/orgs", { slug, name, owner_email: options.ownerEmail, metadata: options.metadata ?? {} });
168
+ }
169
+
170
+ update(slug: string, changes: { name?: string; metadata?: Body }): Promise<Api> {
171
+ return this.patch(seg("orgs", slug), changes);
172
+ }
173
+
174
+ remove(slug: string): Promise<Api> {
175
+ return this.del(seg("orgs", slug));
176
+ }
177
+
178
+ /** Add an existing user straight in. */
179
+ addMember(slug: string, member: { email: string; role?: string }): Promise<Api> {
180
+ return this.post(seg("orgs", slug, "members"), { email: member.email, role: member.role ?? "member" });
181
+ }
182
+
183
+ setMemberRole(slug: string, userId: string, role: string): Promise<Api> {
184
+ return this.patch(seg("orgs", slug, "members", userId), { role });
185
+ }
186
+
187
+ removeMember(slug: string, userId: string): Promise<Api> {
188
+ return this.del(seg("orgs", slug, "members", userId));
189
+ }
190
+
191
+ /** Mail an invitation; `redirectTo` must be one of the environment's allowed redirect URLs. */
192
+ invite(slug: string, invitation: { email: string; role?: string; redirectTo?: string }): Promise<Api> {
193
+ return this.post(seg("orgs", slug, "invitations"), { email: invitation.email, role: invitation.role ?? "member", redirect_to: invitation.redirectTo });
194
+ }
195
+ }
196
+
197
+ export class Invitations extends AdminService {
198
+ /** Pending and past invitations across organizations. */
199
+ list(): Promise<Api> {
200
+ return this.get("/invitations");
201
+ }
202
+
203
+ resend(invitationId: string, options: { redirectTo?: string } = {}): Promise<Api> {
204
+ return this.post(seg("invitations", invitationId, "resend"), options.redirectTo ? { redirect_to: options.redirectTo } : {});
205
+ }
206
+
207
+ revoke(invitationId: string): Promise<Api> {
208
+ return this.del(seg("invitations", invitationId));
209
+ }
210
+ }
211
+
212
+ export class Sessions extends AdminService {
213
+ /** Active sessions across users. */
214
+ list(options: { limit?: number } = {}): Promise<Api> {
215
+ return this.get("/sessions", options);
216
+ }
217
+
218
+ /** End one session (all its refresh tokens). */
219
+ revoke(family: string): Promise<Api> {
220
+ return this.del(seg("sessions", family));
221
+ }
222
+ }
223
+
224
+ /** API keys users made for themselves. */
225
+ export class ApiKeys extends AdminService {
226
+ list(options: { limit?: number } = {}): Promise<Api> {
227
+ return this.get("/api-keys", options);
228
+ }
229
+
230
+ revoke(keyId: string): Promise<Api> {
231
+ return this.del(seg("api-keys", keyId));
232
+ }
233
+ }
234
+
235
+ export class Devices extends AdminService {
236
+ /** Recent devices people signed in from. */
237
+ list(options: { limit?: number } = {}): Promise<Api> {
238
+ return this.get("/devices", options);
239
+ }
240
+ }
241
+
242
+ /** Events, statistics, identity backup and the hosted pages. */
243
+ export class Insight extends AdminService {
244
+ /** Authentication events (sign-ins, sign-ups, resets, MFA…). `failed` for failures only. */
245
+ events(options: { kind?: string; failed?: boolean; limit?: number } = {}): Promise<Api> {
246
+ return this.get("/events", { kind: options.kind, failed: options.failed ? "true" : undefined, limit: options.limit ?? 100 });
247
+ }
248
+
249
+ /** Counts of users, sign-ins, MFA use and failures. */
250
+ stats(): Promise<Api> {
251
+ return this.get("/stats");
252
+ }
253
+
254
+ /** Every identity (users, organizations, roles, factors) as a document. */
255
+ backup(): Promise<Api> {
256
+ return this.get("/backup");
257
+ }
258
+
259
+ /** Apply the `identities` of a backup. `dryRun` reports what would change. */
260
+ restore(identities: Body, options: { replace?: boolean; dryRun?: boolean } = {}): Promise<Api> {
261
+ return this.post("/restore", { identities, replace: options.replace ?? false, dry_run: options.dryRun ?? false });
262
+ }
263
+
264
+ /** The HTML a hosted sign-in page is served as for the branding being edited (the saved branding when omitted). */
265
+ /** The claims a token profile would put in a token for this user (and organization), without issuing one. */
266
+ previewTokenProfile(profile: Body, userId: string, options: { org?: string } = {}): Promise<Api> {
267
+ return this.post("/token-profiles/preview", { profile, user_id: userId, ...(options.org ? { org: options.org } : {}) });
268
+ }
269
+
270
+ hostedSource(page: string, options: { branding?: Body; form?: Body } = {}): Promise<Api> {
271
+ return this.post("/hosted-source", { page, branding: options.branding, form: options.form });
272
+ }
273
+ }
274
+
275
+ export class Admin {
276
+ readonly users: Users;
277
+ readonly roles: Roles;
278
+ readonly orgs: Orgs;
279
+ readonly invitations: Invitations;
280
+ readonly sessions: Sessions;
281
+ readonly apiKeys: ApiKeys;
282
+ readonly devices: Devices;
283
+ readonly insight: Insight;
284
+
285
+ constructor(
286
+ private readonly http: HttpClient,
287
+ readonly environment: string,
288
+ ) {
289
+ this.users = new Users(http, environment);
290
+ this.roles = new Roles(http, environment);
291
+ this.orgs = new Orgs(http, environment);
292
+ this.invitations = new Invitations(http, environment);
293
+ this.sessions = new Sessions(http, environment);
294
+ this.apiKeys = new ApiKeys(http, environment);
295
+ this.devices = new Devices(http, environment);
296
+ this.insight = new Insight(http, environment);
297
+ }
298
+
299
+ /** The same services for another environment the key may manage. */
300
+ withEnvironment(name: string): Admin {
301
+ return new Admin(this.http, name);
302
+ }
303
+ }
304
+
305
+ /** User administration for the client's environment (or `environment`). Needs a secret key. */
306
+ export function admin(client: PawabaseClient<any>, environment?: string): Admin {
307
+ if (!isSecretKey(client.options.apiKey)) {
308
+ throw new ConfigError("User administration needs a secret key (pb_sk_…).");
309
+ }
310
+ return new Admin(client.http, environment ?? client.options.environment ?? "development");
311
+ }