clefbase 1.4.0 → 1.5.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/dist/app.d.ts +19 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +25 -1
- package/dist/app.js.map +1 -1
- package/dist/cli-src/cli/api.js +33 -11
- package/dist/cli-src/cli/commands/functions.js +331 -0
- package/dist/cli-src/cli/commands/init.js +53 -16
- package/dist/cli-src/cli/config.js +7 -2
- package/dist/cli-src/cli/index.js +102 -11
- package/dist/cli.js +469 -66
- package/dist/functions.d.ts +94 -0
- package/dist/functions.d.ts.map +1 -0
- package/dist/functions.js +116 -0
- package/dist/functions.js.map +1 -0
- package/dist/index.d.ts +28 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -19
- package/dist/index.js.map +1 -1
- package/dist/react/EmailVerificationCard.d.ts +10 -4
- package/dist/react/EmailVerificationCard.d.ts.map +1 -1
- package/dist/react/EmailVerificationCard.js +5 -5
- package/dist/react/EmailVerificationCard.js.map +1 -1
- package/dist/types.d.ts +164 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { HttpClient } from "./http";
|
|
2
|
+
import type { FunctionRuntime, FunctionTrigger, FunctionTriggerType, FunctionDef, FunctionExecution, FunctionsConfig, FunctionStats, DeployFunctionOptions, HttpsCallableResult } from "./types";
|
|
3
|
+
export type { FunctionRuntime, FunctionTrigger, FunctionTriggerType, FunctionDef, FunctionExecution, FunctionsConfig, FunctionStats, DeployFunctionOptions, HttpsCallableResult, };
|
|
4
|
+
/**
|
|
5
|
+
* Create a strongly-typed callable reference to an HTTP-triggered function.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const add = httpsCallable<{ a: number; b: number }, { sum: number }>(fns, "addNumbers");
|
|
9
|
+
* const { data } = await add({ a: 3, b: 4 });
|
|
10
|
+
* console.log(data.sum); // 7
|
|
11
|
+
*/
|
|
12
|
+
export declare function httpsCallable<TInput = unknown, TOutput = unknown>(fns: ClefbaseFunctions, name: string): (data?: TInput) => Promise<HttpsCallableResult<TOutput>>;
|
|
13
|
+
/**
|
|
14
|
+
* Clefbase Functions service.
|
|
15
|
+
*
|
|
16
|
+
* Obtained via `getFunctions(app)`.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* import { initClefbase, getFunctions, httpsCallable } from "clefbase";
|
|
20
|
+
*
|
|
21
|
+
* const app = initClefbase({ serverUrl, projectId, apiKey, adminSecret: "" });
|
|
22
|
+
* const fns = getFunctions(app);
|
|
23
|
+
*
|
|
24
|
+
* // Call an HTTP function
|
|
25
|
+
* const greet = httpsCallable<{ name: string }, { message: string }>(fns, "greetUser");
|
|
26
|
+
* const { data } = await greet({ name: "Alice" });
|
|
27
|
+
*
|
|
28
|
+
* // Deploy from source
|
|
29
|
+
* await fns.deploy({
|
|
30
|
+
* name: "greetUser",
|
|
31
|
+
* runtime: "node",
|
|
32
|
+
* trigger: { type: "http" },
|
|
33
|
+
* source: `export async function handler(ctx) { return { message: "Hi " + ctx.data.name }; }`,
|
|
34
|
+
* });
|
|
35
|
+
*/
|
|
36
|
+
export declare class ClefbaseFunctions {
|
|
37
|
+
private readonly _http;
|
|
38
|
+
/** @internal */
|
|
39
|
+
constructor(_http: HttpClient);
|
|
40
|
+
/**
|
|
41
|
+
* Initialise Functions for the project if not already done.
|
|
42
|
+
* Safe to call multiple times — returns the existing config if found.
|
|
43
|
+
* Called automatically by `deploy()` so you rarely need this directly.
|
|
44
|
+
*/
|
|
45
|
+
initProject(opts?: {
|
|
46
|
+
maxConcurrentExecutions?: number;
|
|
47
|
+
defaultTimeoutMs?: number;
|
|
48
|
+
}): Promise<FunctionsConfig>;
|
|
49
|
+
/**
|
|
50
|
+
* Deploy (or redeploy) a function from source code.
|
|
51
|
+
* Calling this a second time with the same `name` updates the function in-place.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* await fns.deploy({
|
|
55
|
+
* name: "sendWelcome",
|
|
56
|
+
* runtime: "node",
|
|
57
|
+
* trigger: { type: "onUserCreate" },
|
|
58
|
+
* source: `
|
|
59
|
+
* export async function handler(ctx) {
|
|
60
|
+
* console.log("New user:", ctx.data.email);
|
|
61
|
+
* }
|
|
62
|
+
* `,
|
|
63
|
+
* });
|
|
64
|
+
*/
|
|
65
|
+
deploy(options: DeployFunctionOptions): Promise<FunctionDef>;
|
|
66
|
+
/**
|
|
67
|
+
* List all functions deployed to this project.
|
|
68
|
+
* Returns a lightweight summary (no source code).
|
|
69
|
+
*/
|
|
70
|
+
list(): Promise<FunctionDef[]>;
|
|
71
|
+
/**
|
|
72
|
+
* Delete a deployed function by name.
|
|
73
|
+
*/
|
|
74
|
+
delete(name: string): Promise<{
|
|
75
|
+
deleted: boolean;
|
|
76
|
+
name: string;
|
|
77
|
+
}>;
|
|
78
|
+
/**
|
|
79
|
+
* Call an HTTP-triggered function and return its result.
|
|
80
|
+
* Throws a `ClefbaseError` if the function errors or times out.
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* const { data, durationMs } = await fns.call("processOrder", { orderId: "abc" });
|
|
84
|
+
*/
|
|
85
|
+
call<TInput = unknown, TOutput = unknown>(name: string, data?: TInput): Promise<HttpsCallableResult<TOutput>>;
|
|
86
|
+
/**
|
|
87
|
+
* Fetch the execution history for a specific function.
|
|
88
|
+
*
|
|
89
|
+
* @param name Function name
|
|
90
|
+
* @param limit Max results to return (default: 20, max: 100)
|
|
91
|
+
*/
|
|
92
|
+
executions(name: string, limit?: number): Promise<FunctionExecution[]>;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=functions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functions.d.ts","sourceRoot":"","sources":["../src/functions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,mBAAmB,GACpB,CAAC;AAIF;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC/D,GAAG,EAAE,iBAAiB,EACtB,IAAI,EAAE,MAAM,GACX,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAE1D;AAID;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,iBAAiB;IAEhB,OAAO,CAAC,QAAQ,CAAC,KAAK;IADlC,gBAAgB;gBACa,KAAK,EAAE,UAAU;IAI9C;;;;OAIG;IACG,WAAW,CAAC,IAAI,CAAC,EAAE;QAAE,uBAAuB,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IAQnH;;;;;;;;;;;;;;;OAeG;IACG,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC;IAMlE;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAMpC;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAMvE;;;;;;OAMG;IACG,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC5C,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IASxC;;;;;OAKG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAMzE"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ClefbaseFunctions = void 0;
|
|
4
|
+
exports.httpsCallable = httpsCallable;
|
|
5
|
+
// ─── HttpsCallable ────────────────────────────────────────────────────────────
|
|
6
|
+
/**
|
|
7
|
+
* Create a strongly-typed callable reference to an HTTP-triggered function.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* const add = httpsCallable<{ a: number; b: number }, { sum: number }>(fns, "addNumbers");
|
|
11
|
+
* const { data } = await add({ a: 3, b: 4 });
|
|
12
|
+
* console.log(data.sum); // 7
|
|
13
|
+
*/
|
|
14
|
+
function httpsCallable(fns, name) {
|
|
15
|
+
return (data) => fns.call(name, data);
|
|
16
|
+
}
|
|
17
|
+
// ─── ClefbaseFunctions ────────────────────────────────────────────────────────
|
|
18
|
+
/**
|
|
19
|
+
* Clefbase Functions service.
|
|
20
|
+
*
|
|
21
|
+
* Obtained via `getFunctions(app)`.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* import { initClefbase, getFunctions, httpsCallable } from "clefbase";
|
|
25
|
+
*
|
|
26
|
+
* const app = initClefbase({ serverUrl, projectId, apiKey, adminSecret: "" });
|
|
27
|
+
* const fns = getFunctions(app);
|
|
28
|
+
*
|
|
29
|
+
* // Call an HTTP function
|
|
30
|
+
* const greet = httpsCallable<{ name: string }, { message: string }>(fns, "greetUser");
|
|
31
|
+
* const { data } = await greet({ name: "Alice" });
|
|
32
|
+
*
|
|
33
|
+
* // Deploy from source
|
|
34
|
+
* await fns.deploy({
|
|
35
|
+
* name: "greetUser",
|
|
36
|
+
* runtime: "node",
|
|
37
|
+
* trigger: { type: "http" },
|
|
38
|
+
* source: `export async function handler(ctx) { return { message: "Hi " + ctx.data.name }; }`,
|
|
39
|
+
* });
|
|
40
|
+
*/
|
|
41
|
+
class ClefbaseFunctions {
|
|
42
|
+
/** @internal */
|
|
43
|
+
constructor(_http) {
|
|
44
|
+
this._http = _http;
|
|
45
|
+
}
|
|
46
|
+
// ─── Config ────────────────────────────────────────────────────────────────
|
|
47
|
+
/**
|
|
48
|
+
* Initialise Functions for the project if not already done.
|
|
49
|
+
* Safe to call multiple times — returns the existing config if found.
|
|
50
|
+
* Called automatically by `deploy()` so you rarely need this directly.
|
|
51
|
+
*/
|
|
52
|
+
async initProject(opts) {
|
|
53
|
+
// The external SDK router auto-initialises on deploy, but expose this
|
|
54
|
+
// for explicit setup or config updates.
|
|
55
|
+
return this._http.post("/", opts ?? {});
|
|
56
|
+
}
|
|
57
|
+
// ─── Deploy ────────────────────────────────────────────────────────────────
|
|
58
|
+
/**
|
|
59
|
+
* Deploy (or redeploy) a function from source code.
|
|
60
|
+
* Calling this a second time with the same `name` updates the function in-place.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* await fns.deploy({
|
|
64
|
+
* name: "sendWelcome",
|
|
65
|
+
* runtime: "node",
|
|
66
|
+
* trigger: { type: "onUserCreate" },
|
|
67
|
+
* source: `
|
|
68
|
+
* export async function handler(ctx) {
|
|
69
|
+
* console.log("New user:", ctx.data.email);
|
|
70
|
+
* }
|
|
71
|
+
* `,
|
|
72
|
+
* });
|
|
73
|
+
*/
|
|
74
|
+
async deploy(options) {
|
|
75
|
+
return this._http.post("/deploy", options);
|
|
76
|
+
}
|
|
77
|
+
// ─── List ──────────────────────────────────────────────────────────────────
|
|
78
|
+
/**
|
|
79
|
+
* List all functions deployed to this project.
|
|
80
|
+
* Returns a lightweight summary (no source code).
|
|
81
|
+
*/
|
|
82
|
+
async list() {
|
|
83
|
+
return this._http.get("/");
|
|
84
|
+
}
|
|
85
|
+
// ─── Delete ────────────────────────────────────────────────────────────────
|
|
86
|
+
/**
|
|
87
|
+
* Delete a deployed function by name.
|
|
88
|
+
*/
|
|
89
|
+
async delete(name) {
|
|
90
|
+
return this._http.delete(`/${encodeURIComponent(name)}`);
|
|
91
|
+
}
|
|
92
|
+
// ─── Call ──────────────────────────────────────────────────────────────────
|
|
93
|
+
/**
|
|
94
|
+
* Call an HTTP-triggered function and return its result.
|
|
95
|
+
* Throws a `ClefbaseError` if the function errors or times out.
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* const { data, durationMs } = await fns.call("processOrder", { orderId: "abc" });
|
|
99
|
+
*/
|
|
100
|
+
async call(name, data) {
|
|
101
|
+
return this._http.post(`/call/${encodeURIComponent(name)}`, { data: data ?? null });
|
|
102
|
+
}
|
|
103
|
+
// ─── Executions ────────────────────────────────────────────────────────────
|
|
104
|
+
/**
|
|
105
|
+
* Fetch the execution history for a specific function.
|
|
106
|
+
*
|
|
107
|
+
* @param name Function name
|
|
108
|
+
* @param limit Max results to return (default: 20, max: 100)
|
|
109
|
+
*/
|
|
110
|
+
async executions(name, limit = 20) {
|
|
111
|
+
const l = Math.min(limit, 100);
|
|
112
|
+
return this._http.get(`/${encodeURIComponent(name)}/executions?limit=${l}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.ClefbaseFunctions = ClefbaseFunctions;
|
|
116
|
+
//# sourceMappingURL=functions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functions.js","sourceRoot":"","sources":["../src/functions.ts"],"names":[],"mappings":";;;AAmCA,sCAKC;AAfD,iFAAiF;AAEjF;;;;;;;GAOG;AACH,SAAgB,aAAa,CAC3B,GAAsB,EACtB,IAAY;IAEZ,OAAO,CAAC,IAAa,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAkB,IAAI,EAAE,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,iFAAiF;AAEjF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAa,iBAAiB;IAC5B,gBAAgB;IAChB,YAA6B,KAAiB;QAAjB,UAAK,GAAL,KAAK,CAAY;IAAG,CAAC;IAElD,8EAA8E;IAE9E;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,IAAsE;QACtF,sEAAsE;QACtE,wCAAwC;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,8EAA8E;IAE9E;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,MAAM,CAAC,OAA8B;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,8EAA8E;IAE9E;;;OAGG;IACH,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,8EAA8E;IAE9E;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAqC,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,8EAA8E;IAE9E;;;;;;OAMG;IACH,KAAK,CAAC,IAAI,CACR,IAAY,EACZ,IAAa;QAEb,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CACpB,SAAS,kBAAkB,CAAC,IAAI,CAAC,EAAE,EACnC,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CACvB,CAAC;IACJ,CAAC;IAED,8EAA8E;IAE9E;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,KAAK,GAAG,EAAE;QACvC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CACnB,IAAI,kBAAkB,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,CACrD,CAAC;IACJ,CAAC;CACF;AA3FD,8CA2FC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,43 +2,50 @@
|
|
|
2
2
|
* clefbase — Firebase-style SDK for Clefbase / Cleforyx
|
|
3
3
|
*
|
|
4
4
|
* @example
|
|
5
|
-
* import { initClefbase, getDatabase, getAuth, getStorage, getHosting, FieldValue } from "clefbase";
|
|
5
|
+
* import { initClefbase, getDatabase, getAuth, getStorage, getHosting, getFunctions, httpsCallable, FieldValue } from "clefbase";
|
|
6
6
|
*
|
|
7
7
|
* const app = initClefbase({
|
|
8
8
|
* serverUrl: "https://api.cleforyx.com",
|
|
9
9
|
* projectId: "my_project_abc",
|
|
10
10
|
* apiKey: "cfx_...",
|
|
11
|
-
* adminSecret: "
|
|
11
|
+
* adminSecret: "", // only needed for hosting
|
|
12
12
|
* });
|
|
13
13
|
*
|
|
14
|
+
* // ── Functions ──────────────────────────────────────────────────────────────
|
|
15
|
+
* const fns = getFunctions(app);
|
|
16
|
+
*
|
|
17
|
+
* // Deploy a function
|
|
18
|
+
* await fns.deploy({
|
|
19
|
+
* name: "greetUser",
|
|
20
|
+
* runtime: "node",
|
|
21
|
+
* trigger: { type: "http" },
|
|
22
|
+
* source: `
|
|
23
|
+
* export async function handler(ctx) {
|
|
24
|
+
* return { message: "Hello, " + ctx.data.name + "!" };
|
|
25
|
+
* }
|
|
26
|
+
* `,
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* // Create a typed callable
|
|
30
|
+
* const greet = httpsCallable<{ name: string }, { message: string }>(fns, "greetUser");
|
|
31
|
+
* const { data } = await greet({ name: "Alice" });
|
|
32
|
+
*
|
|
33
|
+
* // Or call directly
|
|
34
|
+
* const { data } = await fns.call("greetUser", { name: "Alice" });
|
|
35
|
+
*
|
|
36
|
+
* // ── Database ────────────────────────────────────────────────────────────────
|
|
14
37
|
* const db = getDatabase(app);
|
|
15
38
|
*
|
|
16
|
-
* // FieldValue sentinels
|
|
17
39
|
* await db.collection("posts").doc("p1").update({
|
|
18
40
|
* views: FieldValue.increment(1),
|
|
19
|
-
* score: FieldValue.decrement(0.5),
|
|
20
41
|
* publishedAt: FieldValue.serverTimestamp(),
|
|
21
|
-
* draft: FieldValue.deleteField(),
|
|
22
|
-
* tags: FieldValue.arrayUnion("featured"),
|
|
23
|
-
* oldTags: FieldValue.arrayRemove("wip"),
|
|
24
42
|
* });
|
|
25
43
|
*
|
|
26
|
-
* // Batch writes
|
|
27
44
|
* const batch = db.batch();
|
|
28
45
|
* batch.update(db.collection("counters").doc("hits"), { n: FieldValue.increment(1) });
|
|
29
|
-
* batch.delete(db.collection("sessions").doc("expired"));
|
|
30
46
|
* await batch.commit();
|
|
31
|
-
*
|
|
32
|
-
* // Transactions
|
|
33
|
-
* await db.runTransaction(async (tx) => {
|
|
34
|
-
* const wallet = await tx.get(db.collection("wallets").doc(uid));
|
|
35
|
-
* tx.update(db.collection("wallets").doc(uid), { balance: (wallet?.balance as number ?? 0) + 10 });
|
|
36
|
-
* });
|
|
37
|
-
*
|
|
38
|
-
* // Collection-group queries
|
|
39
|
-
* const allComments = await db.collectionGroup("comments").where({ approved: true }).getDocs();
|
|
40
47
|
*/
|
|
41
|
-
export { ClefbaseApp, initClefbase, getApp, getDatabase, getAuth, getStorage, getHosting, } from "./app";
|
|
48
|
+
export { ClefbaseApp, initClefbase, getApp, getDatabase, getAuth, getStorage, getHosting, getFunctions, } from "./app";
|
|
42
49
|
export { Database, CollectionReference, CollectionGroup, DocumentReference, Query, WriteBatch, Transaction, runTransaction, } from "./db";
|
|
43
50
|
export { Auth } from "./auth";
|
|
44
51
|
export type { GoogleButtonOptions } from "./auth";
|
|
@@ -48,6 +55,8 @@ export type { StorageImageStatus } from "./react/StorageImage";
|
|
|
48
55
|
export { EmailVerificationCard } from "./react/EmailVerificationCard";
|
|
49
56
|
export { ClefbaseHosting, SiteReference } from "./hosting";
|
|
50
57
|
export type { HostingSite, HostingDeploy, HostingFile, DeployResult, DeployOptions, HostingStatus, DeployStatus, } from "./hosting";
|
|
58
|
+
export { ClefbaseFunctions, httpsCallable } from "./functions";
|
|
59
|
+
export type { FunctionRuntime, FunctionTrigger, FunctionTriggerType, FunctionDef, FunctionExecution, FunctionsConfig, FunctionStats, DeployFunctionOptions, HttpsCallableResult, } from "./functions";
|
|
51
60
|
export { FieldValue, FieldValueSentinel } from "./field_value";
|
|
52
61
|
export type { FieldValueType } from "./field_value";
|
|
53
62
|
export type { ClefbaseConfig, ClefbaseDocument, QueryOptions, QueryResult, FilterOperator, WhereClause, WhereValue, AuthUser, AuthSession, AuthResult, } from "./types";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAGH,OAAO,EACL,WAAW,EACX,YAAY,EACZ,MAAM,EACN,WAAW,EACX,OAAO,EACP,UAAU,EACV,UAAU,EACV,YAAY,GACb,MAAM,OAAO,CAAC;AAGf,OAAO,EACL,QAAQ,EACR,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,KAAK,EACL,UAAU,EACV,WAAW,EACX,cAAc,GACf,MAAM,MAAM,CAAC;AAGd,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAGlD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC/E,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC3D,YAAY,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACX,YAAY,EACZ,aAAa,EACb,aAAa,EACb,YAAY,GACb,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,YAAY,EACV,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,WAAW,EACX,UAAU,EACV,QAAQ,EACR,WAAW,EACX,UAAU,GACX,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,44 +3,51 @@
|
|
|
3
3
|
* clefbase — Firebase-style SDK for Clefbase / Cleforyx
|
|
4
4
|
*
|
|
5
5
|
* @example
|
|
6
|
-
* import { initClefbase, getDatabase, getAuth, getStorage, getHosting, FieldValue } from "clefbase";
|
|
6
|
+
* import { initClefbase, getDatabase, getAuth, getStorage, getHosting, getFunctions, httpsCallable, FieldValue } from "clefbase";
|
|
7
7
|
*
|
|
8
8
|
* const app = initClefbase({
|
|
9
9
|
* serverUrl: "https://api.cleforyx.com",
|
|
10
10
|
* projectId: "my_project_abc",
|
|
11
11
|
* apiKey: "cfx_...",
|
|
12
|
-
* adminSecret: "
|
|
12
|
+
* adminSecret: "", // only needed for hosting
|
|
13
13
|
* });
|
|
14
14
|
*
|
|
15
|
+
* // ── Functions ──────────────────────────────────────────────────────────────
|
|
16
|
+
* const fns = getFunctions(app);
|
|
17
|
+
*
|
|
18
|
+
* // Deploy a function
|
|
19
|
+
* await fns.deploy({
|
|
20
|
+
* name: "greetUser",
|
|
21
|
+
* runtime: "node",
|
|
22
|
+
* trigger: { type: "http" },
|
|
23
|
+
* source: `
|
|
24
|
+
* export async function handler(ctx) {
|
|
25
|
+
* return { message: "Hello, " + ctx.data.name + "!" };
|
|
26
|
+
* }
|
|
27
|
+
* `,
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* // Create a typed callable
|
|
31
|
+
* const greet = httpsCallable<{ name: string }, { message: string }>(fns, "greetUser");
|
|
32
|
+
* const { data } = await greet({ name: "Alice" });
|
|
33
|
+
*
|
|
34
|
+
* // Or call directly
|
|
35
|
+
* const { data } = await fns.call("greetUser", { name: "Alice" });
|
|
36
|
+
*
|
|
37
|
+
* // ── Database ────────────────────────────────────────────────────────────────
|
|
15
38
|
* const db = getDatabase(app);
|
|
16
39
|
*
|
|
17
|
-
* // FieldValue sentinels
|
|
18
40
|
* await db.collection("posts").doc("p1").update({
|
|
19
41
|
* views: FieldValue.increment(1),
|
|
20
|
-
* score: FieldValue.decrement(0.5),
|
|
21
42
|
* publishedAt: FieldValue.serverTimestamp(),
|
|
22
|
-
* draft: FieldValue.deleteField(),
|
|
23
|
-
* tags: FieldValue.arrayUnion("featured"),
|
|
24
|
-
* oldTags: FieldValue.arrayRemove("wip"),
|
|
25
43
|
* });
|
|
26
44
|
*
|
|
27
|
-
* // Batch writes
|
|
28
45
|
* const batch = db.batch();
|
|
29
46
|
* batch.update(db.collection("counters").doc("hits"), { n: FieldValue.increment(1) });
|
|
30
|
-
* batch.delete(db.collection("sessions").doc("expired"));
|
|
31
47
|
* await batch.commit();
|
|
32
|
-
*
|
|
33
|
-
* // Transactions
|
|
34
|
-
* await db.runTransaction(async (tx) => {
|
|
35
|
-
* const wallet = await tx.get(db.collection("wallets").doc(uid));
|
|
36
|
-
* tx.update(db.collection("wallets").doc(uid), { balance: (wallet?.balance as number ?? 0) + 10 });
|
|
37
|
-
* });
|
|
38
|
-
*
|
|
39
|
-
* // Collection-group queries
|
|
40
|
-
* const allComments = await db.collectionGroup("comments").where({ approved: true }).getDocs();
|
|
41
48
|
*/
|
|
42
49
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
-
exports.ClefbaseError = exports.FieldValueSentinel = exports.FieldValue = exports.SiteReference = exports.ClefbaseHosting = exports.EmailVerificationCard = exports.BucketReference = exports.StorageReference = exports.ClefbaseStorage = exports.Auth = exports.runTransaction = exports.Transaction = exports.WriteBatch = exports.Query = exports.DocumentReference = exports.CollectionGroup = exports.CollectionReference = exports.Database = exports.getHosting = exports.getStorage = exports.getAuth = exports.getDatabase = exports.getApp = exports.initClefbase = exports.ClefbaseApp = void 0;
|
|
50
|
+
exports.ClefbaseError = exports.FieldValueSentinel = exports.FieldValue = exports.httpsCallable = exports.ClefbaseFunctions = exports.SiteReference = exports.ClefbaseHosting = exports.EmailVerificationCard = exports.BucketReference = exports.StorageReference = exports.ClefbaseStorage = exports.Auth = exports.runTransaction = exports.Transaction = exports.WriteBatch = exports.Query = exports.DocumentReference = exports.CollectionGroup = exports.CollectionReference = exports.Database = exports.getFunctions = exports.getHosting = exports.getStorage = exports.getAuth = exports.getDatabase = exports.getApp = exports.initClefbase = exports.ClefbaseApp = void 0;
|
|
44
51
|
// ─── App ──────────────────────────────────────────────────────────────────────
|
|
45
52
|
var app_1 = require("./app");
|
|
46
53
|
Object.defineProperty(exports, "ClefbaseApp", { enumerable: true, get: function () { return app_1.ClefbaseApp; } });
|
|
@@ -50,6 +57,7 @@ Object.defineProperty(exports, "getDatabase", { enumerable: true, get: function
|
|
|
50
57
|
Object.defineProperty(exports, "getAuth", { enumerable: true, get: function () { return app_1.getAuth; } });
|
|
51
58
|
Object.defineProperty(exports, "getStorage", { enumerable: true, get: function () { return app_1.getStorage; } });
|
|
52
59
|
Object.defineProperty(exports, "getHosting", { enumerable: true, get: function () { return app_1.getHosting; } });
|
|
60
|
+
Object.defineProperty(exports, "getFunctions", { enumerable: true, get: function () { return app_1.getFunctions; } });
|
|
53
61
|
// ─── Database ─────────────────────────────────────────────────────────────────
|
|
54
62
|
var db_1 = require("./db");
|
|
55
63
|
Object.defineProperty(exports, "Database", { enumerable: true, get: function () { return db_1.Database; } });
|
|
@@ -75,6 +83,10 @@ Object.defineProperty(exports, "EmailVerificationCard", { enumerable: true, get:
|
|
|
75
83
|
var hosting_1 = require("./hosting");
|
|
76
84
|
Object.defineProperty(exports, "ClefbaseHosting", { enumerable: true, get: function () { return hosting_1.ClefbaseHosting; } });
|
|
77
85
|
Object.defineProperty(exports, "SiteReference", { enumerable: true, get: function () { return hosting_1.SiteReference; } });
|
|
86
|
+
// ─── Functions ────────────────────────────────────────────────────────────────
|
|
87
|
+
var functions_1 = require("./functions");
|
|
88
|
+
Object.defineProperty(exports, "ClefbaseFunctions", { enumerable: true, get: function () { return functions_1.ClefbaseFunctions; } });
|
|
89
|
+
Object.defineProperty(exports, "httpsCallable", { enumerable: true, get: function () { return functions_1.httpsCallable; } });
|
|
78
90
|
// ─── FieldValue ───────────────────────────────────────────────────────────────
|
|
79
91
|
var field_value_1 = require("./field_value");
|
|
80
92
|
Object.defineProperty(exports, "FieldValue", { enumerable: true, get: function () { return field_value_1.FieldValue; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;;;AAEH,iFAAiF;AACjF,6BASe;AARb,kGAAA,WAAW,OAAA;AACX,mGAAA,YAAY,OAAA;AACZ,6FAAA,MAAM,OAAA;AACN,kGAAA,WAAW,OAAA;AACX,8FAAA,OAAO,OAAA;AACP,iGAAA,UAAU,OAAA;AACV,iGAAA,UAAU,OAAA;AACV,mGAAA,YAAY,OAAA;AAGd,iFAAiF;AACjF,2BASc;AARZ,8FAAA,QAAQ,OAAA;AACR,yGAAA,mBAAmB,OAAA;AACnB,qGAAA,eAAe,OAAA;AACf,uGAAA,iBAAiB,OAAA;AACjB,2FAAA,KAAK,OAAA;AACL,gGAAA,UAAU,OAAA;AACV,iGAAA,WAAW,OAAA;AACX,oGAAA,cAAc,OAAA;AAGhB,iFAAiF;AACjF,+BAA8B;AAArB,4FAAA,IAAI,OAAA;AAGb,iFAAiF;AACjF,qCAA+E;AAAtE,0GAAA,eAAe,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAAE,0GAAA,eAAe,OAAA;AAM3D,iFAAiF;AACjF,uEAAsE;AAA7D,8HAAA,qBAAqB,OAAA;AAE9B,iFAAiF;AACjF,qCAA2D;AAAlD,0GAAA,eAAe,OAAA;AAAE,wGAAA,aAAa,OAAA;AAWvC,iFAAiF;AACjF,yCAA+D;AAAtD,8GAAA,iBAAiB,OAAA;AAAE,0GAAA,aAAa,OAAA;AAazC,iFAAiF;AACjF,6CAA+D;AAAtD,yGAAA,UAAU,OAAA;AAAE,iHAAA,kBAAkB,OAAA;AAiBvC,iCAAwC;AAA/B,sGAAA,aAAa,OAAA"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
export interface User {
|
|
2
|
+
emailVerified?: boolean;
|
|
3
|
+
}
|
|
2
4
|
export interface EmailVerificationCardProps {
|
|
3
|
-
/**
|
|
4
|
-
|
|
5
|
+
/** Current user object. */
|
|
6
|
+
user: User | null;
|
|
7
|
+
/** Function to send email verification. */
|
|
8
|
+
sendEmailVerification: () => Promise<void>;
|
|
9
|
+
/** Function to listen for auth state changes. */
|
|
10
|
+
onAuthStateChanged: (callback: (user: User | null) => void) => () => void;
|
|
5
11
|
/** Optional callback after a successful verification check. */
|
|
6
12
|
onVerified?: () => void;
|
|
7
13
|
/** Optional callback when the verification email is successfully sent. */
|
|
@@ -14,5 +20,5 @@ export interface EmailVerificationCardProps {
|
|
|
14
20
|
buttonText?: string;
|
|
15
21
|
resendText?: string;
|
|
16
22
|
}
|
|
17
|
-
export declare function EmailVerificationCard({
|
|
23
|
+
export declare function EmailVerificationCard({ user: initialUser, sendEmailVerification, onAuthStateChanged, onVerified, onSent, onError, title, description, buttonText, resendText, }: EmailVerificationCardProps): import("react/jsx-runtime").JSX.Element | null;
|
|
18
24
|
//# sourceMappingURL=EmailVerificationCard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailVerificationCard.d.ts","sourceRoot":"","sources":["../../src/react/EmailVerificationCard.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EmailVerificationCard.d.ts","sourceRoot":"","sources":["../../src/react/EmailVerificationCard.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,IAAI;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CAEzB;AAED,MAAM,WAAW,0BAA0B;IACzC,2BAA2B;IAC3B,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,2CAA2C;IAC3C,qBAAqB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,iDAAiD;IACjD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAC1E,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,qBAAqB,CAAC,EACpC,IAAI,EAAE,WAAW,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,UAAU,EACV,MAAM,EACN,OAAO,EACP,KAA2B,EAC3B,WAA2E,EAC3E,UAAwC,EACxC,UAAsF,GACvF,EAAE,0BAA0B,kDAwE5B"}
|
|
@@ -3,19 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.EmailVerificationCard = EmailVerificationCard;
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
5
|
const react_1 = require("react");
|
|
6
|
-
function EmailVerificationCard({
|
|
7
|
-
const [user, setUser] = (0, react_1.useState)(
|
|
6
|
+
function EmailVerificationCard({ user: initialUser, sendEmailVerification, onAuthStateChanged, onVerified, onSent, onError, title = "Verify your email", description = "Please verify your email address to continue using the app.", buttonText = "Resend verification email", resendText = "If you already verified, click the button again to refresh your status.", }) {
|
|
7
|
+
const [user, setUser] = (0, react_1.useState)(initialUser);
|
|
8
8
|
const [status, setStatus] = (0, react_1.useState)("idle");
|
|
9
9
|
const [error, setError] = (0, react_1.useState)(null);
|
|
10
10
|
(0, react_1.useEffect)(() => {
|
|
11
|
-
const unsub =
|
|
11
|
+
const unsub = onAuthStateChanged((u) => {
|
|
12
12
|
setUser(u);
|
|
13
13
|
if (u && u.emailVerified) {
|
|
14
14
|
onVerified?.();
|
|
15
15
|
}
|
|
16
16
|
});
|
|
17
17
|
return unsub;
|
|
18
|
-
}, [
|
|
18
|
+
}, [onAuthStateChanged, onVerified]);
|
|
19
19
|
const disabled = (0, react_1.useMemo)(() => status === "sending" || !user, [status, user]);
|
|
20
20
|
if (!user || user.emailVerified)
|
|
21
21
|
return null;
|
|
@@ -23,7 +23,7 @@ function EmailVerificationCard({ auth, onVerified, onSent, onError, title = "Ver
|
|
|
23
23
|
setStatus("sending");
|
|
24
24
|
setError(null);
|
|
25
25
|
try {
|
|
26
|
-
await
|
|
26
|
+
await sendEmailVerification();
|
|
27
27
|
setStatus("sent");
|
|
28
28
|
onSent?.();
|
|
29
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailVerificationCard.js","sourceRoot":"","sources":["../../src/react/EmailVerificationCard.tsx"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"EmailVerificationCard.js","sourceRoot":"","sources":["../../src/react/EmailVerificationCard.tsx"],"names":[],"mappings":"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"}
|