@anodb/core 0.7.1 → 0.8.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.
@@ -0,0 +1,13 @@
1
+ import type { KyselyPlugin, PluginTransformQueryArgs, PluginTransformResultArgs, QueryResult, RootOperationNode, UnknownRow } from 'kysely';
2
+ import type { SchemaDefinition } from './types.js';
3
+ type Converter = (row: Record<string, unknown>) => Record<string, unknown>;
4
+ /** Builds the row converter for one query, or null when nothing needs converting. */
5
+ export declare function resultConverter(schema: SchemaDefinition, node: RootOperationNode): Converter | null;
6
+ export declare class TypedResultsPlugin implements KyselyPlugin {
7
+ #private;
8
+ readonly schema: SchemaDefinition;
9
+ constructor(schema: SchemaDefinition);
10
+ transformQuery(args: PluginTransformQueryArgs): RootOperationNode;
11
+ transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>>;
12
+ }
13
+ export {};
@@ -0,0 +1,157 @@
1
+ const name = (n) => {
2
+ const node = n;
3
+ if (!node)
4
+ return undefined;
5
+ if (node.kind === 'IdentifierNode')
6
+ return node.name;
7
+ if (node.kind === 'SchemableIdentifierNode')
8
+ return name(node.identifier);
9
+ if (node.kind === 'TableNode')
10
+ return name(node.table);
11
+ if (node.kind === 'ColumnNode')
12
+ return name(node.column);
13
+ return undefined;
14
+ };
15
+ /** alias (or table name) → schema table, from FROM / JOIN / INTO / UPDATE targets. */
16
+ function sources(schema, nodes) {
17
+ const out = new Map();
18
+ for (const raw of nodes) {
19
+ const n = raw;
20
+ if (!n)
21
+ continue;
22
+ if (n.kind === 'TableNode') {
23
+ const t = name(n);
24
+ if (t && t in schema)
25
+ out.set(t, t);
26
+ }
27
+ else if (n.kind === 'AliasNode' && n.node.kind === 'TableNode') {
28
+ const t = name(n.node);
29
+ const alias = name(n.alias);
30
+ if (t && alias && t in schema)
31
+ out.set(alias, t);
32
+ }
33
+ }
34
+ return out;
35
+ }
36
+ function columnTypes(schema, src, selections) {
37
+ const out = new Map();
38
+ const typeOf = (column, table) => {
39
+ if (table !== undefined) {
40
+ const t = src.get(table);
41
+ return t ? schema[t][column] : undefined;
42
+ }
43
+ const found = new Set();
44
+ for (const t of src.values()) {
45
+ const c = schema[t][column];
46
+ if (c)
47
+ found.add(c);
48
+ }
49
+ return found.size === 1 ? [...found][0] : undefined;
50
+ };
51
+ const allOf = (table) => {
52
+ const tables = table !== undefined ? [src.get(table)].filter((t) => !!t) : [...src.values()];
53
+ for (const t of tables)
54
+ for (const [c, type] of Object.entries(schema[t]))
55
+ out.set(c, type);
56
+ };
57
+ const ref = (n, as) => {
58
+ if (n.kind === 'ColumnNode') {
59
+ const c = name(n);
60
+ const type = typeOf(c);
61
+ if (type)
62
+ out.set(as ?? c, type);
63
+ }
64
+ else if (n.kind === 'ReferenceNode') {
65
+ const table = n.table ? name(n.table) : undefined;
66
+ const col = n.column;
67
+ if (col.kind === 'SelectAllNode') {
68
+ if (!as)
69
+ allOf(table);
70
+ return;
71
+ }
72
+ const c = name(col);
73
+ const type = typeOf(c, table);
74
+ if (type)
75
+ out.set(as ?? c, type);
76
+ }
77
+ else if (n.kind === 'SelectAllNode' && !as) {
78
+ allOf();
79
+ }
80
+ };
81
+ for (const s of selections ?? []) {
82
+ const sel = (s.selection ?? s);
83
+ if (sel.kind === 'AliasNode') {
84
+ const inner = sel.node;
85
+ // Only plain column references keep their type through an alias.
86
+ out.delete(name(sel.alias));
87
+ ref(inner, name(sel.alias));
88
+ }
89
+ else
90
+ ref(sel);
91
+ }
92
+ return out;
93
+ }
94
+ /** Builds the row converter for one query, or null when nothing needs converting. */
95
+ export function resultConverter(schema, node) {
96
+ const n = node;
97
+ let types;
98
+ if (n.kind === 'SelectQueryNode') {
99
+ const froms = n.from?.froms ?? [];
100
+ const joins = (n.joins ?? []).map((j) => j.table);
101
+ types = columnTypes(schema, sources(schema, [...froms, ...joins]), n.selections);
102
+ }
103
+ else if (n.kind === 'InsertQueryNode' || n.kind === 'UpdateQueryNode' || n.kind === 'DeleteQueryNode') {
104
+ const returning = n.returning;
105
+ if (!returning)
106
+ return null;
107
+ const targets = n.kind === 'InsertQueryNode' ? [n.into] : n.kind === 'UpdateQueryNode' ? [n.table] : (n.from?.froms ?? []);
108
+ types = columnTypes(schema, sources(schema, targets), returning.selections);
109
+ }
110
+ else
111
+ return null;
112
+ const convert = [...types].filter(([, t]) => t === 'boolean' || t === 'json');
113
+ if (convert.length === 0)
114
+ return null;
115
+ return (row) => {
116
+ const out = { ...row };
117
+ for (const [col, type] of convert) {
118
+ if (!(col in out))
119
+ continue;
120
+ const v = out[col];
121
+ if (type === 'boolean') {
122
+ if (typeof v === 'number')
123
+ out[col] = v !== 0;
124
+ }
125
+ else if (typeof v === 'string') {
126
+ try {
127
+ out[col] = JSON.parse(v);
128
+ }
129
+ catch {
130
+ // leave non-JSON text as is
131
+ }
132
+ }
133
+ }
134
+ return out;
135
+ };
136
+ }
137
+ export class TypedResultsPlugin {
138
+ schema;
139
+ #pending = new WeakMap();
140
+ constructor(schema) {
141
+ this.schema = schema;
142
+ }
143
+ transformQuery(args) {
144
+ const conv = resultConverter(this.schema, args.node);
145
+ if (conv)
146
+ this.#pending.set(args.queryId, conv);
147
+ return args.node;
148
+ }
149
+ async transformResult(args) {
150
+ const conv = this.#pending.get(args.queryId);
151
+ if (!conv)
152
+ return args.result;
153
+ this.#pending.delete(args.queryId);
154
+ return { ...args.result, rows: args.result.rows.map((r) => conv(r)) };
155
+ }
156
+ }
157
+ //# sourceMappingURL=result-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-types.js","sourceRoot":"","sources":["../src/result-types.ts"],"names":[],"mappings":"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"}
package/dist/schema.d.ts CHANGED
@@ -1,8 +1,14 @@
1
- import type { ColumnType, SchemaDefinition, SqlValue, TableDefinition } from './types.js';
1
+ import type { ColumnType, JsonColumn, SchemaDefinition, SqlValue, TableDefinition } from './types.js';
2
2
  export declare const RESERVED_COLUMNS: Set<string>;
3
3
  /** System cells. They travel in the change log like user cells. */
4
4
  export declare const SYS_DELETED = "$deleted";
5
5
  export declare const SYS_CREATED = "$createdAt";
6
+ /**
7
+ * A `json` column with a TypeScript type for its value (reads return the parsed value):
8
+ *
9
+ * defineSchema({ note: { meta: json<{ tags: string[] }>() } })
10
+ */
11
+ export declare function json<T = unknown>(): JsonColumn<T>;
6
12
  /** Identity function that validates the schema and keeps literal types for inference. */
7
13
  export declare function defineSchema<const S extends SchemaDefinition>(schema: S): S;
8
14
  export declare function validateSchema(schema: SchemaDefinition): void;
package/dist/schema.js CHANGED
@@ -4,6 +4,14 @@ const COLUMN_TYPES = new Set(['text', 'integer', 'real', 'boolean', 'json']);
4
4
  /** System cells. They travel in the change log like user cells. */
5
5
  export const SYS_DELETED = '$deleted';
6
6
  export const SYS_CREATED = '$createdAt';
7
+ /**
8
+ * A `json` column with a TypeScript type for its value (reads return the parsed value):
9
+ *
10
+ * defineSchema({ note: { meta: json<{ tags: string[] }>() } })
11
+ */
12
+ export function json() {
13
+ return 'json';
14
+ }
7
15
  /** Identity function that validates the schema and keeps literal types for inference. */
8
16
  export function defineSchema(schema) {
9
17
  validateSchema(schema);
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAEA,MAAM,KAAK,GAAG,yBAAyB,CAAA;AACvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAA;AAC/F,MAAM,YAAY,GAAG,IAAI,GAAG,CAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;AAExF,mEAAmE;AACnE,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAA;AACrC,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAA;AAEvC,yFAAyF;AACzF,MAAM,UAAU,YAAY,CAAmC,MAAS;IACtE,cAAc,CAAC,MAAM,CAAC,CAAA;IACtB,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAwB;IACrD,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,GAAG,CAAC,CAAA;QAC/E,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,eAAe,CAAC,CAAA;QACxG,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,IAAI,MAAM,GAAG,CAAC,CAAA;YAC3F,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,IAAI,MAAM,eAAe,CAAC,CAAA;YACxG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,SAAS,KAAK,IAAI,MAAM,EAAE,CAAC,CAAA;QAC7G,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAA;AAC1C,CAAC;AAED,MAAM,QAAQ,GAA+B;IAC3C,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;CACb,CAAA;AAED,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,GAAoB,EAAE,YAAoB;IACtF,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACnF,MAAM,KAAK,GAAG,gCAAgC,YAAY,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAA;IACnF,MAAM,EAAE,GAAG,uDAAuD,CAAA;IAClE,OAAO,gBAAgB,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,qBAAqB,EAAE,wCAAwC,EAAE,yBAAyB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA;AAC7K,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,gBAAgB,CAAC,GAAoB;IACnD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACjF,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,MAAc,EAAE,IAAgB,EAAE,KAAc;IACxF,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACtD,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,SAAS,CAAC,UAAU,KAAK,IAAI,MAAM,YAAY,IAAI,SAAS,OAAO,KAAK,EAAE,CAAC,CAAA;IACjG,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,MAAM,GAAG,EAAE,CAAA;YAC1C,OAAO,KAAK,CAAA;QACd,KAAK,SAAS;YACZ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;gBAAE,MAAM,GAAG,EAAE,CAAA;YAC1E,OAAO,KAAK,CAAA;QACd,KAAK,MAAM;YACT,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,MAAM,GAAG,EAAE,CAAA;YACrE,OAAO,KAAK,CAAA;QACd,KAAK,SAAS;YACZ,IAAI,OAAO,KAAK,KAAK,SAAS;gBAAE,MAAM,GAAG,EAAE,CAAA;YAC3C,OAAO,KAAK,CAAA;QACd,KAAK,MAAM;YACT,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;YACrB,OAAO,KAAK,CAAA;IAChB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,KAAK,CAAC,IAAgB,EAAE,KAAc;IACpD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACtD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;QACjD,KAAK,SAAS;YACZ,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;QAChF,KAAK,MAAM;YACT,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;QAC3E,KAAK,SAAS;YACZ,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAC5D,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAgB,EAAE,KAAe;IACvD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAC/B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,KAAK,KAAK,CAAC,CAAA;QACpB,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,KAAK,CAAC,KAAe,CAAC,CAAA;QACpC;YACE,OAAO,KAAK,CAAA;IAChB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -15,6 +15,11 @@ export interface SqliteDriver {
15
15
  close(): void;
16
16
  }
17
17
  export type ColumnType = 'text' | 'integer' | 'real' | 'boolean' | 'json';
18
+ declare const JSON_TYPE: unique symbol;
19
+ /** A `json` column with a TypeScript type for its value: `json<{ tags: string[] }>()`. */
20
+ export type JsonColumn<T> = 'json' & {
21
+ readonly [JSON_TYPE]?: T;
22
+ };
18
23
  export type TableDefinition = Readonly<Record<string, ColumnType>>;
19
24
  export type SchemaDefinition = Readonly<Record<string, TableDefinition>>;
20
25
  /** Overall sync state reported by `db.status`. */
@@ -43,3 +48,4 @@ export interface EventTemplate {
43
48
  }
44
49
  /** Freshness of data fetched from the network. */
45
50
  export type FetchStatus = 'synced' | 'stale' | 'unavailable';
51
+ export {};
package/dist/ui.d.ts ADDED
@@ -0,0 +1,161 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { Role } from './membership.js';
3
+ import type { Device, Invitation, JoinRequest, Member } from './sharing.js';
4
+ import type { SpaceInfo } from './db.js';
5
+ /** The parts of AnoDB these components use. */
6
+ export interface SharingDB {
7
+ readonly appId: string;
8
+ readonly pubkey: string;
9
+ onChange(fn: () => void): () => void;
10
+ spaces(): SpaceInfo[];
11
+ members(space: string): Member[];
12
+ roleIn(space: string): Role | undefined;
13
+ setRole(space: string, who: string, role: Exclude<Role, 'owner'>): Promise<void>;
14
+ removeMember(space: string, who: string): Promise<void>;
15
+ createInviteLink(space: string, opts?: {
16
+ role?: Exclude<Role, 'owner'>;
17
+ expiresInMs?: number;
18
+ }): Promise<string>;
19
+ requestJoin(link: string, name?: string): Promise<void>;
20
+ joinRequests(): JoinRequest[];
21
+ approveJoinRequest(id: string): Promise<void>;
22
+ rejectJoinRequest(id: string): void;
23
+ invitations(): Invitation[];
24
+ acceptInvitation(space: string): Promise<void>;
25
+ declineInvitation(space: string): void;
26
+ devices(): Device[];
27
+ startPairing(): Promise<{
28
+ uri: string;
29
+ code: string;
30
+ done: Promise<void>;
31
+ }>;
32
+ parsePairing(uri: string): {
33
+ device: string;
34
+ code: string;
35
+ approve(name?: string): Promise<void>;
36
+ };
37
+ revokeDevice(device: string): Promise<void>;
38
+ close(): Promise<void>;
39
+ }
40
+ export type Lang = 'en' | 'ja';
41
+ declare const en: {
42
+ addDevice: string;
43
+ addDeviceHint: string;
44
+ pairingLink: string;
45
+ check: string;
46
+ compare: string;
47
+ deviceName: string;
48
+ approve: string;
49
+ cancel: string;
50
+ approved: string;
51
+ newDevice: string;
52
+ newDeviceHint: string;
53
+ showQr: string;
54
+ scanWithOther: string;
55
+ waiting: string;
56
+ copy: string;
57
+ copied: string;
58
+ devices: string;
59
+ thisDevice: string;
60
+ revoked: string;
61
+ revoke: string;
62
+ confirmRevoke: string;
63
+ invite: string;
64
+ role: string;
65
+ createLink: string;
66
+ linkHint: string;
67
+ requests: string;
68
+ none: string;
69
+ approveRequest: string;
70
+ reject: string;
71
+ cannotInvite: string;
72
+ join: string;
73
+ inviteLink: string;
74
+ yourName: string;
75
+ requestJoin: string;
76
+ requested: string;
77
+ joined: string;
78
+ invitations: string;
79
+ accept: string;
80
+ decline: string;
81
+ members: string;
82
+ you: string;
83
+ remove: string;
84
+ confirmRemove: string;
85
+ invalidLink: string;
86
+ };
87
+ export type Labels = typeof en;
88
+ interface CommonProps {
89
+ /** UI language; defaults to the browser's language (Japanese or English). */
90
+ lang?: Lang;
91
+ /** Override any text. */
92
+ labels?: Partial<Labels>;
93
+ className?: string;
94
+ }
95
+ /**
96
+ * Re-read state that has no change event of its own (members, requests, devices…): on every
97
+ * database change and once a second. Re-renders only when the value changes.
98
+ */
99
+ export declare function useLive<T>(read: (db: SharingDB) => T, deps?: readonly unknown[]): T;
100
+ /** Wrap an `anodb://` link into an https URL of this app, so phones open it from a QR code. */
101
+ export declare function toAppLink(uri: string, base?: string): string;
102
+ /** Accepts an `anodb://…` link or an app link (`…#anodb=…`) and returns the `anodb://` link. */
103
+ export declare function parseAppLink(text: string): string | null;
104
+ /** An `anodb://<kind>` link this page was opened with (`#anodb=…`), and a way to clear it. */
105
+ export declare function useIncomingLink(kind: 'pair' | 'join'): [string | null, () => void];
106
+ /** QR code as SVG (dark modules use `currentColor`). */
107
+ export declare function QRCode(props: {
108
+ value: string;
109
+ size?: number;
110
+ className?: string;
111
+ title?: string;
112
+ }): import("react").JSX.Element;
113
+ export interface PairDeviceProps extends CommonProps {
114
+ /** Which parts to show. Default both. */
115
+ mode?: 'both' | 'approve' | 'new-device';
116
+ /** After this device was added to another identity. Default: close the database and reload the page. */
117
+ onPaired?: () => void;
118
+ /** Base URL for links and QR codes (default: this page). */
119
+ linkBase?: string;
120
+ }
121
+ /**
122
+ * Add a device to your identity. On the existing device: scan or paste the new device's link,
123
+ * compare the code, approve. On the new device: show the QR code and wait.
124
+ */
125
+ export declare function PairDevice(props: PairDeviceProps): import("react").JSX.Element;
126
+ /** Your devices, with a revoke button for each other device. */
127
+ export declare function DeviceList(props: CommonProps): import("react").JSX.Element;
128
+ export interface InviteLinkProps extends CommonProps {
129
+ space: string;
130
+ /** Link lifetime. Default 24 h. */
131
+ expiresInMs?: number;
132
+ /** Show join requests below the link. Default true. */
133
+ showRequests?: boolean;
134
+ linkBase?: string;
135
+ }
136
+ /** One-time invite link (with QR code) for a space, and the join requests waiting for approval. */
137
+ export declare function InviteLink(props: InviteLinkProps): import("react").JSX.Element;
138
+ /** Join requests for one space (or all spaces) with approve / reject. */
139
+ export declare function JoinRequests(props: CommonProps & {
140
+ space?: string;
141
+ }): import("react").JSX.Element;
142
+ export interface JoinSpaceProps extends CommonProps {
143
+ /** Called with the space id once you are a member. */
144
+ onJoined?: (space: string) => void;
145
+ /** Pre-filled name shown to the admin. */
146
+ defaultName?: string;
147
+ }
148
+ /** Join with an invite link (pasted or opened via QR), and accept invitations sent to your npub. */
149
+ export declare function JoinSpace(props: JoinSpaceProps): import("react").JSX.Element;
150
+ /** Invitations sent to your npub (`db.invite(space, npub, role)`), with accept / decline. */
151
+ export declare function Invitations(props: CommonProps & {
152
+ onJoined?: (space: string) => void;
153
+ }): import("react").JSX.Element | null;
154
+ export interface MembersProps extends CommonProps {
155
+ space: string;
156
+ /** Display name for a member (default: shortened npub, or "you"). */
157
+ nameOf?: (member: Member) => ReactNode;
158
+ }
159
+ /** Members of a space. Owners and admins can change roles and remove members. */
160
+ export declare function Members(props: MembersProps): import("react").JSX.Element;
161
+ export {};