clefbase 2.0.1 → 2.0.2
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 +6 -26
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +10 -28
- package/dist/app.js.map +1 -1
- package/dist/auth/index.d.ts +63 -114
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +97 -176
- package/dist/auth/index.js.map +1 -1
- package/dist/cli-src/cli/commands/init.js +28 -1
- package/dist/cli.js +29 -2
- package/dist/index.d.ts +14 -60
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -65
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/app.d.ts
CHANGED
|
@@ -44,10 +44,10 @@ export declare class ClefbaseApp {
|
|
|
44
44
|
*
|
|
45
45
|
* @example
|
|
46
46
|
* const app = initClefbase({
|
|
47
|
-
* serverUrl:
|
|
48
|
-
* projectId:
|
|
49
|
-
* apiKey:
|
|
50
|
-
*
|
|
47
|
+
* serverUrl: "https://api.cleforyx.com",
|
|
48
|
+
* projectId: "swoove-md3",
|
|
49
|
+
* apiKey: "cfx_...",
|
|
50
|
+
* // gatewayUrl defaults to "https://auth.cleforyx.com"
|
|
51
51
|
* });
|
|
52
52
|
*/
|
|
53
53
|
export declare function initClefbase(config: ClefbaseConfig, name?: string): ClefbaseApp;
|
|
@@ -67,7 +67,7 @@ export declare function getHosting(app?: ClefbaseApp): ClefbaseHosting;
|
|
|
67
67
|
* @example
|
|
68
68
|
* import { initClefbase, getFunctions, httpsCallable } from "clefbase";
|
|
69
69
|
*
|
|
70
|
-
* const app = initClefbase({ serverUrl, projectId, apiKey
|
|
70
|
+
* const app = initClefbase({ serverUrl, projectId, apiKey });
|
|
71
71
|
* const fns = getFunctions(app);
|
|
72
72
|
*
|
|
73
73
|
* const greet = httpsCallable<{ name: string }, { message: string }>(fns, "greetUser");
|
|
@@ -80,33 +80,13 @@ export declare function getFunctions(app?: ClefbaseApp): ClefbaseFunctions;
|
|
|
80
80
|
* @example
|
|
81
81
|
* import { initClefbase, getAI } from "clefbase";
|
|
82
82
|
*
|
|
83
|
-
* const app = initClefbase({ serverUrl, projectId, apiKey
|
|
83
|
+
* const app = initClefbase({ serverUrl, projectId, apiKey });
|
|
84
84
|
* const ai = getAI(app);
|
|
85
85
|
*
|
|
86
|
-
* // Text generation
|
|
87
86
|
* const { content } = await ai.text({
|
|
88
87
|
* model: "claude-sonnet-4-5",
|
|
89
88
|
* prompt: "Explain closures in JavaScript",
|
|
90
89
|
* });
|
|
91
|
-
*
|
|
92
|
-
* // Image generation — saved to project Storage automatically
|
|
93
|
-
* const { files } = await ai.image({
|
|
94
|
-
* model: "imagen-3.0-generate-002",
|
|
95
|
-
* prompt: "A futuristic cityscape at sunset",
|
|
96
|
-
* });
|
|
97
|
-
*
|
|
98
|
-
* // Video generation
|
|
99
|
-
* const { status, files: videoFiles } = await ai.video({
|
|
100
|
-
* model: "veo-2.0-generate-001",
|
|
101
|
-
* prompt: "A dog running on a beach",
|
|
102
|
-
* durationSeconds: 5,
|
|
103
|
-
* });
|
|
104
|
-
*
|
|
105
|
-
* // Embeddings
|
|
106
|
-
* const { embeddings } = await ai.embedding({
|
|
107
|
-
* model: "text-embedding-004",
|
|
108
|
-
* input: ["Hello", "World"],
|
|
109
|
-
* });
|
|
110
90
|
*/
|
|
111
91
|
export declare function getAI(app?: ClefbaseApp): ClefbaseAI;
|
|
112
92
|
//# sourceMappingURL=app.d.ts.map
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAM9C;;;GAGG;AACH,qBAAa,WAAW;IACtB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAEhC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAS,UAAU,CAAC;IACrD,gBAAgB,CAAC,QAAQ,CAAC,SAAS,EAAO,UAAU,CAAC;IACrD,gBAAgB,CAAC,QAAQ,CAAC,YAAY,EAAI,UAAU,CAAC;IACrD,gBAAgB,CAAC,QAAQ,CAAC,YAAY,EAAI,UAAU,CAAC;IACrD,gBAAgB,CAAC,QAAQ,CAAC,cAAc,EAAE,UAAU,CAAC;IACrD,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAS,UAAU,CAAC;IAErD,OAAO,CAAC,GAAG,CAAuC;IAClD,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,GAAG,CAAuC;gBAEtC,MAAM,EAAE,cAAc;IAalC,gBAAgB;IAChB,MAAM,IAAI,QAAQ;IAKlB,gBAAgB;IAChB,QAAQ,IAAI,IAAI;IAWhB,gBAAgB;IAChB,WAAW,IAAI,eAAe;IAU9B,gBAAgB;IAChB,WAAW,IAAI,eAAe;IAM9B,gBAAgB;IAChB,aAAa,IAAI,iBAAiB;IAMlC,gBAAgB;IAChB,MAAM,IAAI,UAAU;CAKrB;AAOD;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,cAAc,EACtB,IAAI,GAAE,MAAgB,GACrB,WAAW,CAKb;AAED,wEAAwE;AACxE,wBAAgB,MAAM,CAAC,IAAI,GAAE,MAAgB,GAAG,WAAW,CAQ1D;AAID,gCAAgC;AAChC,wBAAgB,WAAW,CAAC,GAAG,CAAC,EAAE,WAAW,GAAG,QAAQ,CAEvD;AAED,4BAA4B;AAC5B,wBAAgB,OAAO,CAAC,GAAG,CAAC,EAAE,WAAW,GAAG,IAAI,CAE/C;AAED,+BAA+B;AAC/B,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,WAAW,GAAG,eAAe,CAE7D;AAED,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,WAAW,GAAG,eAAe,CAE7D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,WAAW,GAAG,iBAAiB,CAEjE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,KAAK,CAAC,GAAG,CAAC,EAAE,WAAW,GAAG,UAAU,CAEnD"}
|
package/dist/app.js
CHANGED
|
@@ -17,6 +17,7 @@ const hosting_1 = require("./hosting");
|
|
|
17
17
|
const functions_1 = require("./functions");
|
|
18
18
|
const ai_1 = require("./ai");
|
|
19
19
|
// ─── App ──────────────────────────────────────────────────────────────────────
|
|
20
|
+
const DEFAULT_GATEWAY_URL = "https://auth.cleforyx.com";
|
|
20
21
|
/**
|
|
21
22
|
* A Clefbase application instance.
|
|
22
23
|
* Created by `initClefbase()` — pass it to `getDatabase()`, `getAuth()`, etc.
|
|
@@ -41,8 +42,9 @@ class ClefbaseApp {
|
|
|
41
42
|
}
|
|
42
43
|
/** @internal */
|
|
43
44
|
_getAuth() {
|
|
44
|
-
if (!this._auth)
|
|
45
|
-
this._auth = new auth_1.Auth(this._authHttp);
|
|
45
|
+
if (!this._auth) {
|
|
46
|
+
this._auth = new auth_1.Auth(this._authHttp, DEFAULT_GATEWAY_URL, this.config.projectId);
|
|
47
|
+
}
|
|
46
48
|
return this._auth;
|
|
47
49
|
}
|
|
48
50
|
/** @internal */
|
|
@@ -80,10 +82,10 @@ const registry = new Map();
|
|
|
80
82
|
*
|
|
81
83
|
* @example
|
|
82
84
|
* const app = initClefbase({
|
|
83
|
-
* serverUrl:
|
|
84
|
-
* projectId:
|
|
85
|
-
* apiKey:
|
|
86
|
-
*
|
|
85
|
+
* serverUrl: "https://api.cleforyx.com",
|
|
86
|
+
* projectId: "swoove-md3",
|
|
87
|
+
* apiKey: "cfx_...",
|
|
88
|
+
* // gatewayUrl defaults to "https://auth.cleforyx.com"
|
|
87
89
|
* });
|
|
88
90
|
*/
|
|
89
91
|
function initClefbase(config, name = DEFAULT) {
|
|
@@ -124,7 +126,7 @@ function getHosting(app) {
|
|
|
124
126
|
* @example
|
|
125
127
|
* import { initClefbase, getFunctions, httpsCallable } from "clefbase";
|
|
126
128
|
*
|
|
127
|
-
* const app = initClefbase({ serverUrl, projectId, apiKey
|
|
129
|
+
* const app = initClefbase({ serverUrl, projectId, apiKey });
|
|
128
130
|
* const fns = getFunctions(app);
|
|
129
131
|
*
|
|
130
132
|
* const greet = httpsCallable<{ name: string }, { message: string }>(fns, "greetUser");
|
|
@@ -139,33 +141,13 @@ function getFunctions(app) {
|
|
|
139
141
|
* @example
|
|
140
142
|
* import { initClefbase, getAI } from "clefbase";
|
|
141
143
|
*
|
|
142
|
-
* const app = initClefbase({ serverUrl, projectId, apiKey
|
|
144
|
+
* const app = initClefbase({ serverUrl, projectId, apiKey });
|
|
143
145
|
* const ai = getAI(app);
|
|
144
146
|
*
|
|
145
|
-
* // Text generation
|
|
146
147
|
* const { content } = await ai.text({
|
|
147
148
|
* model: "claude-sonnet-4-5",
|
|
148
149
|
* prompt: "Explain closures in JavaScript",
|
|
149
150
|
* });
|
|
150
|
-
*
|
|
151
|
-
* // Image generation — saved to project Storage automatically
|
|
152
|
-
* const { files } = await ai.image({
|
|
153
|
-
* model: "imagen-3.0-generate-002",
|
|
154
|
-
* prompt: "A futuristic cityscape at sunset",
|
|
155
|
-
* });
|
|
156
|
-
*
|
|
157
|
-
* // Video generation
|
|
158
|
-
* const { status, files: videoFiles } = await ai.video({
|
|
159
|
-
* model: "veo-2.0-generate-001",
|
|
160
|
-
* prompt: "A dog running on a beach",
|
|
161
|
-
* durationSeconds: 5,
|
|
162
|
-
* });
|
|
163
|
-
*
|
|
164
|
-
* // Embeddings
|
|
165
|
-
* const { embeddings } = await ai.embedding({
|
|
166
|
-
* model: "text-embedding-004",
|
|
167
|
-
* input: ["Hello", "World"],
|
|
168
|
-
* });
|
|
169
151
|
*/
|
|
170
152
|
function getAI(app) {
|
|
171
153
|
return (app ?? getApp())._getAI();
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":";;;AAmHA,oCAQC;AAGD,wBAQC;AAKD,kCAEC;AAGD,0BAEC;AAGD,gCAEC;AAGD,gCAEC;AAcD,oCAEC;AAgBD,sBAEC;AA9LD,iCAAoC;AACpC,6BAAgC;AAChC,iCAA8B;AAC9B,uCAA4C;AAC5C,uCAA4C;AAC5C,2CAAgD;AAChD,6BAAkC;AAGlC,iFAAiF;AAEjF,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AAExD;;;GAGG;AACH,MAAa,WAAW;IAiBtB,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,MAAM,IAAI,GAAK,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QAE9C,IAAI,CAAC,OAAO,GAAU,IAAI,iBAAU,CAAC,GAAG,IAAI,KAAK,EAAS,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,SAAS,GAAQ,IAAI,iBAAU,CAAC,GAAG,IAAI,OAAO,EAAO,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,YAAY,GAAK,IAAI,iBAAU,CAAC,GAAG,IAAI,UAAU,EAAI,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,YAAY,GAAK,IAAI,iBAAU,CAAC,GAAG,IAAI,UAAU,EAAI,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,cAAc,GAAG,IAAI,iBAAU,CAAC,GAAG,IAAI,YAAY,EAAE,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,GAAU,IAAI,iBAAU,CAAC,GAAG,IAAI,KAAK,EAAS,MAAM,CAAC,CAAC;IACpE,CAAC;IAED,gBAAgB;IAChB,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,IAAI,CAAC,GAAG,GAAG,IAAI,aAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,gBAAgB;IAChB,QAAQ;QACN,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,GAAG,IAAI,WAAI,CACnB,IAAI,CAAC,SAAS,EACd,mBAAmB,EACnB,IAAI,CAAC,MAAM,CAAC,SAAS,CACtB,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,gBAAgB;IAChB,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,QAAQ;YAChB,IAAI,CAAC,QAAQ,GAAG,IAAI,yBAAe,CACjC,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,MAAM,CAAC,SAAS,EACrB,IAAI,CAAC,QAAQ,EAAE,CAChB,CAAC;QACJ,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,gBAAgB;IAChB,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,QAAQ;YAChB,IAAI,CAAC,QAAQ,GAAG,IAAI,yBAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,gBAAgB;IAChB,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,UAAU;YAClB,IAAI,CAAC,UAAU,GAAG,IAAI,6BAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,gBAAgB;IAChB,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,GAAG;YACX,IAAI,CAAC,GAAG,GAAG,IAAI,eAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;CACF;AA/ED,kCA+EC;AAED,iFAAiF;AAEjF,MAAM,OAAO,GAAG,WAAW,CAAC;AAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;AAEhD;;;;;;;;;;;GAWG;AACH,SAAgB,YAAY,CAC1B,MAAsB,EACtB,OAAe,OAAO;IAEtB,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,wEAAwE;AACxE,SAAgB,MAAM,CAAC,OAAe,OAAO;IAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,iBAAiB,IAAI,wDAAwD,CAC9E,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iFAAiF;AAEjF,gCAAgC;AAChC,SAAgB,WAAW,CAAC,GAAiB;IAC3C,OAAO,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AACpC,CAAC;AAED,4BAA4B;AAC5B,SAAgB,OAAO,CAAC,GAAiB;IACvC,OAAO,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtC,CAAC;AAED,+BAA+B;AAC/B,SAAgB,UAAU,CAAC,GAAiB;IAC1C,OAAO,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACzC,CAAC;AAED,iEAAiE;AACjE,SAAgB,UAAU,CAAC,GAAiB;IAC1C,OAAO,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACzC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,YAAY,CAAC,GAAiB;IAC5C,OAAO,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAgB,KAAK,CAAC,GAAiB;IACrC,OAAO,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AACpC,CAAC"}
|
package/dist/auth/index.d.ts
CHANGED
|
@@ -1,59 +1,15 @@
|
|
|
1
1
|
import { HttpClient } from "../http";
|
|
2
2
|
import type { AuthUser, AuthResult } from "../types";
|
|
3
|
-
interface GisNotification {
|
|
4
|
-
isNotDisplayed(): boolean;
|
|
5
|
-
isSkippedMoment(): boolean;
|
|
6
|
-
isDismissedMoment(): boolean;
|
|
7
|
-
getNotDisplayedReason(): string;
|
|
8
|
-
getSkippedReason(): string;
|
|
9
|
-
getDismissedReason(): string;
|
|
10
|
-
}
|
|
11
|
-
interface GoogleAccountsId {
|
|
12
|
-
initialize(config: {
|
|
13
|
-
client_id: string;
|
|
14
|
-
callback: (response: {
|
|
15
|
-
credential: string;
|
|
16
|
-
}) => void;
|
|
17
|
-
auto_select?: boolean;
|
|
18
|
-
cancel_on_tap_outside?: boolean;
|
|
19
|
-
}): void;
|
|
20
|
-
prompt(momentListener?: (n: GisNotification) => void): void;
|
|
21
|
-
renderButton(parent: HTMLElement, options: {
|
|
22
|
-
type?: "standard" | "icon";
|
|
23
|
-
theme?: "outline" | "filled_blue" | "filled_black";
|
|
24
|
-
size?: "large" | "medium" | "small";
|
|
25
|
-
text?: "signin_with" | "signup_with" | "continue_with" | "signin";
|
|
26
|
-
shape?: "rectangular" | "pill" | "circle" | "square";
|
|
27
|
-
logo_alignment?: "left" | "center";
|
|
28
|
-
width?: number;
|
|
29
|
-
locale?: string;
|
|
30
|
-
}): void;
|
|
31
|
-
disableAutoSelect(): void;
|
|
32
|
-
revoke(hint: string, done: () => void): void;
|
|
33
|
-
}
|
|
34
|
-
declare global {
|
|
35
|
-
interface Window {
|
|
36
|
-
google?: {
|
|
37
|
-
accounts: {
|
|
38
|
-
id: GoogleAccountsId;
|
|
39
|
-
};
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
3
|
/**
|
|
44
|
-
* Options for
|
|
45
|
-
* Pass to `auth.signInWithGoogle()` to show a button instead of One Tap.
|
|
4
|
+
* Options for `auth.signInWithGateway()`.
|
|
46
5
|
*/
|
|
47
|
-
export interface
|
|
48
|
-
/**
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
/** Pixel width of the button (min 200, max 400). */
|
|
55
|
-
width?: number;
|
|
56
|
-
locale?: string;
|
|
6
|
+
export interface GatewaySignInOptions {
|
|
7
|
+
/**
|
|
8
|
+
* The URL the gateway should redirect back to after authentication.
|
|
9
|
+
* Defaults to `window.location.origin` (your app's root).
|
|
10
|
+
* Must be registered as an allowed redirect for your project in the gateway.
|
|
11
|
+
*/
|
|
12
|
+
redirectUrl?: string;
|
|
57
13
|
}
|
|
58
14
|
type AuthStateCallback = (user: AuthUser | null) => void;
|
|
59
15
|
/**
|
|
@@ -61,20 +17,28 @@ type AuthStateCallback = (user: AuthUser | null) => void;
|
|
|
61
17
|
*
|
|
62
18
|
* @example
|
|
63
19
|
* const auth = getAuth(app);
|
|
20
|
+
*
|
|
21
|
+
* // Email / password
|
|
64
22
|
* const { user } = await auth.signIn("alice@example.com", "pass");
|
|
65
|
-
*
|
|
66
|
-
*
|
|
23
|
+
*
|
|
24
|
+
* // Google — redirect to gateway, come back signed in
|
|
25
|
+
* await auth.signInWithGateway("google");
|
|
26
|
+
*
|
|
27
|
+
* // On every page load, handle the gateway callback:
|
|
28
|
+
* const result = await auth.handleGatewayCallback();
|
|
29
|
+
* if (result) console.log("Signed in via gateway:", result.user.email);
|
|
67
30
|
*/
|
|
68
31
|
export declare class Auth {
|
|
69
32
|
private readonly http;
|
|
70
33
|
private readonly store;
|
|
71
34
|
private listeners;
|
|
72
|
-
/**
|
|
73
|
-
private
|
|
74
|
-
|
|
35
|
+
/** The base URL of the Cleforyx auth gateway (e.g. https://auth.cleforyx.com) */
|
|
36
|
+
private readonly gatewayUrl;
|
|
37
|
+
/** The project ID — used as the `?project=` param when redirecting to the gateway */
|
|
38
|
+
private readonly projectId;
|
|
39
|
+
constructor(http: HttpClient, gatewayUrl: string, projectId: string);
|
|
75
40
|
private notify;
|
|
76
41
|
private handleResult;
|
|
77
|
-
private resolveGoogleClientId;
|
|
78
42
|
/** @internal — used by Storage to attach the bearer token to upload requests */
|
|
79
43
|
getAuthHeaders(): Record<string, string>;
|
|
80
44
|
/** The currently signed-in user, or null. */
|
|
@@ -82,7 +46,7 @@ export declare class Auth {
|
|
|
82
46
|
/** The raw bearer token for the active session, or null. */
|
|
83
47
|
get currentToken(): string | null;
|
|
84
48
|
/**
|
|
85
|
-
* Create a new account.
|
|
49
|
+
* Create a new account with email + password.
|
|
86
50
|
*
|
|
87
51
|
* @example
|
|
88
52
|
* const { user } = await auth.signUp("alice@example.com", "pass123", {
|
|
@@ -103,75 +67,60 @@ export declare class Auth {
|
|
|
103
67
|
*/
|
|
104
68
|
signIn(email: string, password: string): Promise<AuthResult>;
|
|
105
69
|
/**
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
* Browser-only. The GIS script (`accounts.google.com/gsi/client`) is loaded
|
|
109
|
-
* automatically — no manual `<script>` tag needed.
|
|
70
|
+
* Redirect the user to the Cleforyx auth gateway to sign in with an
|
|
71
|
+
* OAuth provider (currently `"google"`).
|
|
110
72
|
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
73
|
+
* The gateway handles the OAuth flow and redirects back to your app with
|
|
74
|
+
* `?cfx_token=<token>&cfx_project=<projectId>` in the URL.
|
|
75
|
+
* Call `auth.handleGatewayCallback()` on page load to complete sign-in.
|
|
114
76
|
*
|
|
115
|
-
*
|
|
116
|
-
* seen before, a new user record is created server-side.
|
|
117
|
-
*
|
|
118
|
-
* @throws `ClefbaseError` with code `GOOGLE_NOT_CONFIGURED` if no Client ID
|
|
119
|
-
* has been set in the project's auth settings.
|
|
120
|
-
* @throws `ClefbaseError` with code `GOOGLE_PROMPT_SUPPRESSED` if One Tap
|
|
121
|
-
* could not be displayed (switch to button mode in that case).
|
|
122
|
-
* @throws `ClefbaseError` with code `GOOGLE_SIGN_IN_CANCELLED` if the user
|
|
123
|
-
* dismissed the popup.
|
|
77
|
+
* **This method never returns** — it calls `window.location.href`.
|
|
124
78
|
*
|
|
125
79
|
* @example
|
|
126
|
-
* //
|
|
127
|
-
*
|
|
80
|
+
* // On button click:
|
|
81
|
+
* await auth.signInWithGateway("google");
|
|
128
82
|
*
|
|
129
|
-
* //
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
* theme: "filled_blue",
|
|
133
|
-
* size: "large",
|
|
134
|
-
* text: "continue_with",
|
|
83
|
+
* // With a custom return URL:
|
|
84
|
+
* await auth.signInWithGateway("google", {
|
|
85
|
+
* redirectUrl: "https://myapp.cleforyx.com/dashboard",
|
|
135
86
|
* });
|
|
136
|
-
*
|
|
137
|
-
* // React example
|
|
138
|
-
* const btnRef = useRef<HTMLDivElement>(null);
|
|
139
|
-
* await auth.signInWithGoogle({ container: btnRef.current! });
|
|
140
87
|
*/
|
|
141
|
-
|
|
88
|
+
signInWithGateway(provider: "google", options?: GatewaySignInOptions): Promise<never>;
|
|
142
89
|
/**
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
* for example with a custom button implementation, React Native Google
|
|
147
|
-
* Sign-In, or any other flow that gives you an ID token directly.
|
|
148
|
-
*
|
|
149
|
-
* Works in both browser and Node.js environments.
|
|
90
|
+
* Check if the current URL contains a gateway callback (`?cfx_token=`).
|
|
91
|
+
* Useful for rendering a "Finishing sign-in…" loading state before calling
|
|
92
|
+
* `handleGatewayCallback()`.
|
|
150
93
|
*
|
|
151
94
|
* @example
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
* callback: async ({ credential }) => {
|
|
156
|
-
* const { user } = await auth.signInWithGoogleToken(credential);
|
|
157
|
-
* },
|
|
158
|
-
* });
|
|
159
|
-
*
|
|
160
|
-
* // React Native
|
|
161
|
-
* const { idToken } = await GoogleSignin.signIn();
|
|
162
|
-
* const { user } = await auth.signInWithGoogleToken(idToken);
|
|
95
|
+
* if (auth.isGatewayCallbackPending()) {
|
|
96
|
+
* showLoadingSpinner();
|
|
97
|
+
* }
|
|
163
98
|
*/
|
|
164
|
-
|
|
99
|
+
isGatewayCallbackPending(): boolean;
|
|
165
100
|
/**
|
|
166
|
-
*
|
|
167
|
-
*
|
|
101
|
+
* Call this on every page load (ideally before rendering your app).
|
|
102
|
+
* If the URL contains `?cfx_token=`, the token is validated against
|
|
103
|
+
* the server, the session is saved, and the signed-in `AuthResult` is
|
|
104
|
+
* returned. The query params are cleaned from the URL automatically.
|
|
105
|
+
*
|
|
106
|
+
* Returns `null` if there is no pending callback.
|
|
168
107
|
*
|
|
169
108
|
* @example
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
109
|
+
* // In your app's root component or entry point:
|
|
110
|
+
* useEffect(() => {
|
|
111
|
+
* auth.handleGatewayCallback().then(result => {
|
|
112
|
+
* if (result) {
|
|
113
|
+
* console.log("Signed in:", result.user.email);
|
|
114
|
+
* navigate("/dashboard");
|
|
115
|
+
* }
|
|
116
|
+
* });
|
|
117
|
+
* }, []);
|
|
118
|
+
*
|
|
119
|
+
* // Or outside React:
|
|
120
|
+
* const result = await auth.handleGatewayCallback();
|
|
121
|
+
* if (result) showDashboard(result.user);
|
|
173
122
|
*/
|
|
174
|
-
|
|
123
|
+
handleGatewayCallback(): Promise<AuthResult | null>;
|
|
175
124
|
/** Sign out and clear the local session. */
|
|
176
125
|
signOut(): Promise<void>;
|
|
177
126
|
/** Re-fetch the current user's profile from the server and update the cache. */
|
|
@@ -199,7 +148,7 @@ export declare class Auth {
|
|
|
199
148
|
verifyEmail(code: string): Promise<AuthUser>;
|
|
200
149
|
/**
|
|
201
150
|
* Subscribe to auth state changes.
|
|
202
|
-
* Fires immediately with the current user, then on every
|
|
151
|
+
* Fires immediately with the current user, then on every sign-in or sign-out.
|
|
203
152
|
* Returns an unsubscribe function.
|
|
204
153
|
*
|
|
205
154
|
* @example
|
package/dist/auth/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/index.js
CHANGED
|
@@ -47,60 +47,29 @@ class SessionStore {
|
|
|
47
47
|
catch { /* ignore */ }
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
-
// ─── GIS script loader ────────────────────────────────────────────────────────
|
|
51
|
-
const GIS_SCRIPT_URL = "https://accounts.google.com/gsi/client";
|
|
52
|
-
let _gisLoading = null;
|
|
53
|
-
function loadGisScript() {
|
|
54
|
-
if (typeof window === "undefined") {
|
|
55
|
-
return Promise.reject(new types_1.ClefbaseError("signInWithGoogle() requires a browser environment. " +
|
|
56
|
-
"Use signInWithGoogleToken(idToken) for server/Node.js contexts.", "UNSUPPORTED_ENVIRONMENT"));
|
|
57
|
-
}
|
|
58
|
-
if (window.google?.accounts?.id)
|
|
59
|
-
return Promise.resolve();
|
|
60
|
-
if (_gisLoading)
|
|
61
|
-
return _gisLoading;
|
|
62
|
-
_gisLoading = new Promise((resolve, reject) => {
|
|
63
|
-
if (window.google?.accounts?.id) {
|
|
64
|
-
resolve();
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
const existing = document.querySelector(`script[src="${GIS_SCRIPT_URL}"]`);
|
|
68
|
-
const onLoad = () => resolve();
|
|
69
|
-
const onError = () => {
|
|
70
|
-
_gisLoading = null;
|
|
71
|
-
reject(new types_1.ClefbaseError("Failed to load the Google Identity Services script. Check your internet connection and Content Security Policy.", "GOOGLE_SCRIPT_LOAD_ERROR"));
|
|
72
|
-
};
|
|
73
|
-
if (existing) {
|
|
74
|
-
existing.addEventListener("load", onLoad, { once: true });
|
|
75
|
-
existing.addEventListener("error", onError, { once: true });
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
const script = document.createElement("script");
|
|
79
|
-
script.src = GIS_SCRIPT_URL;
|
|
80
|
-
script.async = true;
|
|
81
|
-
script.defer = true;
|
|
82
|
-
script.addEventListener("load", onLoad, { once: true });
|
|
83
|
-
script.addEventListener("error", onError, { once: true });
|
|
84
|
-
document.head.appendChild(script);
|
|
85
|
-
});
|
|
86
|
-
return _gisLoading;
|
|
87
|
-
}
|
|
88
50
|
/**
|
|
89
51
|
* Authentication service. Obtain via `getAuth(app)`.
|
|
90
52
|
*
|
|
91
53
|
* @example
|
|
92
54
|
* const auth = getAuth(app);
|
|
55
|
+
*
|
|
56
|
+
* // Email / password
|
|
93
57
|
* const { user } = await auth.signIn("alice@example.com", "pass");
|
|
94
|
-
*
|
|
95
|
-
*
|
|
58
|
+
*
|
|
59
|
+
* // Google — redirect to gateway, come back signed in
|
|
60
|
+
* await auth.signInWithGateway("google");
|
|
61
|
+
*
|
|
62
|
+
* // On every page load, handle the gateway callback:
|
|
63
|
+
* const result = await auth.handleGatewayCallback();
|
|
64
|
+
* if (result) console.log("Signed in via gateway:", result.user.email);
|
|
96
65
|
*/
|
|
97
66
|
class Auth {
|
|
98
|
-
constructor(http) {
|
|
67
|
+
constructor(http, gatewayUrl, projectId) {
|
|
99
68
|
this.http = http;
|
|
100
69
|
this.store = new SessionStore();
|
|
101
70
|
this.listeners = [];
|
|
102
|
-
|
|
103
|
-
this.
|
|
71
|
+
this.gatewayUrl = gatewayUrl.replace(/\/+$/, "");
|
|
72
|
+
this.projectId = projectId;
|
|
104
73
|
this.store.load();
|
|
105
74
|
}
|
|
106
75
|
// ── Internals ─────────────────────────────────────────────────────────────
|
|
@@ -121,23 +90,6 @@ class Auth {
|
|
|
121
90
|
this.notify(result.user);
|
|
122
91
|
return result;
|
|
123
92
|
}
|
|
124
|
-
async resolveGoogleClientId() {
|
|
125
|
-
if (this._googleClientId !== undefined) {
|
|
126
|
-
if (!this._googleClientId) {
|
|
127
|
-
throw new types_1.ClefbaseError("Google Sign-In is not enabled for this project. " +
|
|
128
|
-
"Add a Google Client ID in your Clefbase auth settings.", "GOOGLE_NOT_CONFIGURED");
|
|
129
|
-
}
|
|
130
|
-
return this._googleClientId;
|
|
131
|
-
}
|
|
132
|
-
const cfg = await this.http.get("/google/config");
|
|
133
|
-
if (!cfg.enabled || !cfg.clientId) {
|
|
134
|
-
this._googleClientId = null;
|
|
135
|
-
throw new types_1.ClefbaseError("Google Sign-In is not enabled for this project. " +
|
|
136
|
-
"Add a Google Client ID in your Clefbase auth settings.", "GOOGLE_NOT_CONFIGURED");
|
|
137
|
-
}
|
|
138
|
-
this._googleClientId = cfg.clientId;
|
|
139
|
-
return this._googleClientId;
|
|
140
|
-
}
|
|
141
93
|
/** @internal — used by Storage to attach the bearer token to upload requests */
|
|
142
94
|
getAuthHeaders() {
|
|
143
95
|
const s = this.store.load();
|
|
@@ -148,8 +100,9 @@ class Auth {
|
|
|
148
100
|
get currentUser() { return this.store.load()?.user ?? null; }
|
|
149
101
|
/** The raw bearer token for the active session, or null. */
|
|
150
102
|
get currentToken() { return this.store.load()?.token ?? null; }
|
|
103
|
+
// ── Email / password ──────────────────────────────────────────────────────
|
|
151
104
|
/**
|
|
152
|
-
* Create a new account.
|
|
105
|
+
* Create a new account with email + password.
|
|
153
106
|
*
|
|
154
107
|
* @example
|
|
155
108
|
* const { user } = await auth.signUp("alice@example.com", "pass123", {
|
|
@@ -158,9 +111,7 @@ class Auth {
|
|
|
158
111
|
* });
|
|
159
112
|
*/
|
|
160
113
|
async signUp(email, password, profile) {
|
|
161
|
-
const result = await this.http.post("/signup", {
|
|
162
|
-
email, password, ...profile,
|
|
163
|
-
});
|
|
114
|
+
const result = await this.http.post("/signup", { email, password, ...profile });
|
|
164
115
|
return this.handleResult(result);
|
|
165
116
|
}
|
|
166
117
|
/**
|
|
@@ -173,133 +124,110 @@ class Auth {
|
|
|
173
124
|
const result = await this.http.post("/signin", { email, password });
|
|
174
125
|
return this.handleResult(result);
|
|
175
126
|
}
|
|
127
|
+
// ── Gateway OAuth (redirect flow) ─────────────────────────────────────────
|
|
176
128
|
/**
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
* Browser-only. The GIS script (`accounts.google.com/gsi/client`) is loaded
|
|
180
|
-
* automatically — no manual `<script>` tag needed.
|
|
181
|
-
*
|
|
182
|
-
* Without `buttonOptions`, the Google One Tap prompt is shown.
|
|
183
|
-
* Pass `{ container }` to render a fully styled Google button instead —
|
|
184
|
-
* which is more reliable since One Tap can be suppressed by the browser.
|
|
129
|
+
* Redirect the user to the Cleforyx auth gateway to sign in with an
|
|
130
|
+
* OAuth provider (currently `"google"`).
|
|
185
131
|
*
|
|
186
|
-
*
|
|
187
|
-
*
|
|
132
|
+
* The gateway handles the OAuth flow and redirects back to your app with
|
|
133
|
+
* `?cfx_token=<token>&cfx_project=<projectId>` in the URL.
|
|
134
|
+
* Call `auth.handleGatewayCallback()` on page load to complete sign-in.
|
|
188
135
|
*
|
|
189
|
-
*
|
|
190
|
-
* has been set in the project's auth settings.
|
|
191
|
-
* @throws `ClefbaseError` with code `GOOGLE_PROMPT_SUPPRESSED` if One Tap
|
|
192
|
-
* could not be displayed (switch to button mode in that case).
|
|
193
|
-
* @throws `ClefbaseError` with code `GOOGLE_SIGN_IN_CANCELLED` if the user
|
|
194
|
-
* dismissed the popup.
|
|
136
|
+
* **This method never returns** — it calls `window.location.href`.
|
|
195
137
|
*
|
|
196
138
|
* @example
|
|
197
|
-
* //
|
|
198
|
-
*
|
|
139
|
+
* // On button click:
|
|
140
|
+
* await auth.signInWithGateway("google");
|
|
199
141
|
*
|
|
200
|
-
* //
|
|
201
|
-
*
|
|
202
|
-
*
|
|
203
|
-
* theme: "filled_blue",
|
|
204
|
-
* size: "large",
|
|
205
|
-
* text: "continue_with",
|
|
142
|
+
* // With a custom return URL:
|
|
143
|
+
* await auth.signInWithGateway("google", {
|
|
144
|
+
* redirectUrl: "https://myapp.cleforyx.com/dashboard",
|
|
206
145
|
* });
|
|
207
|
-
*
|
|
208
|
-
* // React example
|
|
209
|
-
* const btnRef = useRef<HTMLDivElement>(null);
|
|
210
|
-
* await auth.signInWithGoogle({ container: btnRef.current! });
|
|
211
146
|
*/
|
|
212
|
-
async
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
cancel_on_tap_outside: true,
|
|
221
|
-
callback: async ({ credential }) => {
|
|
222
|
-
try {
|
|
223
|
-
resolve(await this.signInWithGoogleToken(credential));
|
|
224
|
-
}
|
|
225
|
-
catch (err) {
|
|
226
|
-
reject(err);
|
|
227
|
-
}
|
|
228
|
-
},
|
|
229
|
-
});
|
|
230
|
-
if (buttonOptions?.container) {
|
|
231
|
-
const { container, theme, size, text, shape, width, locale } = buttonOptions;
|
|
232
|
-
gis.renderButton(container, {
|
|
233
|
-
type: "standard",
|
|
234
|
-
theme: theme ?? "outline",
|
|
235
|
-
size: size ?? "large",
|
|
236
|
-
text: text ?? "signin_with",
|
|
237
|
-
shape: shape ?? "rectangular",
|
|
238
|
-
logo_alignment: "left",
|
|
239
|
-
width,
|
|
240
|
-
locale,
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
|
-
else {
|
|
244
|
-
gis.prompt((n) => {
|
|
245
|
-
if (n.isNotDisplayed()) {
|
|
246
|
-
reject(new types_1.ClefbaseError(`Google One Tap could not be displayed (${n.getNotDisplayedReason()}). ` +
|
|
247
|
-
"Pass a { container } element to render a sign-in button instead.", "GOOGLE_PROMPT_SUPPRESSED"));
|
|
248
|
-
}
|
|
249
|
-
else if (n.isSkippedMoment() || n.isDismissedMoment()) {
|
|
250
|
-
reject(new types_1.ClefbaseError("Google Sign-In was cancelled by the user.", "GOOGLE_SIGN_IN_CANCELLED"));
|
|
251
|
-
}
|
|
252
|
-
});
|
|
253
|
-
}
|
|
147
|
+
async signInWithGateway(provider, options) {
|
|
148
|
+
if (typeof window === "undefined") {
|
|
149
|
+
throw new types_1.ClefbaseError("signInWithGateway() requires a browser environment.", "UNSUPPORTED_ENVIRONMENT");
|
|
150
|
+
}
|
|
151
|
+
const redirectUrl = options?.redirectUrl ?? window.location.origin;
|
|
152
|
+
const params = new URLSearchParams({
|
|
153
|
+
project: this.projectId,
|
|
154
|
+
redirect: redirectUrl,
|
|
254
155
|
});
|
|
156
|
+
window.location.href = `${this.gatewayUrl}/${provider}?${params.toString()}`;
|
|
157
|
+
// This line is unreachable but TypeScript needs it for `never` return type
|
|
158
|
+
return new Promise(() => { });
|
|
255
159
|
}
|
|
256
160
|
/**
|
|
257
|
-
*
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
* for example with a custom button implementation, React Native Google
|
|
261
|
-
* Sign-In, or any other flow that gives you an ID token directly.
|
|
262
|
-
*
|
|
263
|
-
* Works in both browser and Node.js environments.
|
|
161
|
+
* Check if the current URL contains a gateway callback (`?cfx_token=`).
|
|
162
|
+
* Useful for rendering a "Finishing sign-in…" loading state before calling
|
|
163
|
+
* `handleGatewayCallback()`.
|
|
264
164
|
*
|
|
265
165
|
* @example
|
|
266
|
-
*
|
|
267
|
-
*
|
|
268
|
-
*
|
|
269
|
-
* callback: async ({ credential }) => {
|
|
270
|
-
* const { user } = await auth.signInWithGoogleToken(credential);
|
|
271
|
-
* },
|
|
272
|
-
* });
|
|
273
|
-
*
|
|
274
|
-
* // React Native
|
|
275
|
-
* const { idToken } = await GoogleSignin.signIn();
|
|
276
|
-
* const { user } = await auth.signInWithGoogleToken(idToken);
|
|
166
|
+
* if (auth.isGatewayCallbackPending()) {
|
|
167
|
+
* showLoadingSpinner();
|
|
168
|
+
* }
|
|
277
169
|
*/
|
|
278
|
-
|
|
279
|
-
if (
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
const result = await this.http.post("/google", { idToken });
|
|
283
|
-
return this.handleResult(result);
|
|
170
|
+
isGatewayCallbackPending() {
|
|
171
|
+
if (typeof window === "undefined")
|
|
172
|
+
return false;
|
|
173
|
+
return new URLSearchParams(window.location.search).has("cfx_token");
|
|
284
174
|
}
|
|
285
175
|
/**
|
|
286
|
-
*
|
|
287
|
-
*
|
|
176
|
+
* Call this on every page load (ideally before rendering your app).
|
|
177
|
+
* If the URL contains `?cfx_token=`, the token is validated against
|
|
178
|
+
* the server, the session is saved, and the signed-in `AuthResult` is
|
|
179
|
+
* returned. The query params are cleaned from the URL automatically.
|
|
180
|
+
*
|
|
181
|
+
* Returns `null` if there is no pending callback.
|
|
288
182
|
*
|
|
289
183
|
* @example
|
|
290
|
-
*
|
|
291
|
-
*
|
|
292
|
-
*
|
|
184
|
+
* // In your app's root component or entry point:
|
|
185
|
+
* useEffect(() => {
|
|
186
|
+
* auth.handleGatewayCallback().then(result => {
|
|
187
|
+
* if (result) {
|
|
188
|
+
* console.log("Signed in:", result.user.email);
|
|
189
|
+
* navigate("/dashboard");
|
|
190
|
+
* }
|
|
191
|
+
* });
|
|
192
|
+
* }, []);
|
|
193
|
+
*
|
|
194
|
+
* // Or outside React:
|
|
195
|
+
* const result = await auth.handleGatewayCallback();
|
|
196
|
+
* if (result) showDashboard(result.user);
|
|
293
197
|
*/
|
|
294
|
-
async
|
|
198
|
+
async handleGatewayCallback() {
|
|
199
|
+
if (typeof window === "undefined")
|
|
200
|
+
return null;
|
|
201
|
+
const params = new URLSearchParams(window.location.search);
|
|
202
|
+
const token = params.get("cfx_token");
|
|
203
|
+
if (!token)
|
|
204
|
+
return null;
|
|
205
|
+
// Clean the token + project params from the URL immediately so they
|
|
206
|
+
// aren't reprocessed on refresh or shared in links
|
|
207
|
+
params.delete("cfx_token");
|
|
208
|
+
params.delete("cfx_project");
|
|
209
|
+
const cleanSearch = params.toString();
|
|
210
|
+
const cleanUrl = window.location.pathname + (cleanSearch ? `?${cleanSearch}` : "");
|
|
211
|
+
window.history.replaceState({}, "", cleanUrl);
|
|
212
|
+
// Validate the token against the server and fetch the full user object
|
|
295
213
|
try {
|
|
296
|
-
const
|
|
297
|
-
|
|
214
|
+
const user = await this.http.get("/me", { Authorization: `Bearer ${token}` });
|
|
215
|
+
// We don't have an expiresAt from the URL — fetch it from /me is enough
|
|
216
|
+
// for the session; use a generous 30-day default matching server config
|
|
217
|
+
const expiresAt = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString();
|
|
218
|
+
const result = {
|
|
219
|
+
user,
|
|
220
|
+
token,
|
|
221
|
+
session: { token, expiresAt },
|
|
222
|
+
};
|
|
223
|
+
return this.handleResult(result);
|
|
298
224
|
}
|
|
299
|
-
catch {
|
|
300
|
-
|
|
225
|
+
catch (err) {
|
|
226
|
+
// Token was invalid or expired — don't sign in
|
|
227
|
+
throw new types_1.ClefbaseError(`Gateway callback failed: ${err.message}`, "GATEWAY_CALLBACK_ERROR");
|
|
301
228
|
}
|
|
302
229
|
}
|
|
230
|
+
// ── Session management ────────────────────────────────────────────────────
|
|
303
231
|
/** Sign out and clear the local session. */
|
|
304
232
|
async signOut() {
|
|
305
233
|
const token = this.currentToken;
|
|
@@ -311,13 +239,6 @@ class Auth {
|
|
|
311
239
|
}
|
|
312
240
|
this.store.clear();
|
|
313
241
|
this.notify(null);
|
|
314
|
-
// Tell GIS to disable auto-select so the user isn't silently re-signed in
|
|
315
|
-
if (typeof window !== "undefined" && window.google?.accounts?.id) {
|
|
316
|
-
try {
|
|
317
|
-
window.google.accounts.id.disableAutoSelect();
|
|
318
|
-
}
|
|
319
|
-
catch { /* ignore */ }
|
|
320
|
-
}
|
|
321
242
|
}
|
|
322
243
|
/** Re-fetch the current user's profile from the server and update the cache. */
|
|
323
244
|
async refreshCurrentUser() {
|
|
@@ -383,7 +304,7 @@ class Auth {
|
|
|
383
304
|
}
|
|
384
305
|
/**
|
|
385
306
|
* Subscribe to auth state changes.
|
|
386
|
-
* Fires immediately with the current user, then on every
|
|
307
|
+
* Fires immediately with the current user, then on every sign-in or sign-out.
|
|
387
308
|
* Returns an unsubscribe function.
|
|
388
309
|
*
|
|
389
310
|
* @example
|
package/dist/auth/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":";;;AAEA,oCAAyC;AAUzC,MAAM,YAAY;IAAlB;QACU,YAAO,GAA4B,IAAI,CAAC;QAC/B,QAAG,GAAG,aAAa,CAAC;IAiCvC,CAAC;IA/BC,IAAY,EAAE;QACZ,IAAI,CAAC;YAAC,OAAO,OAAO,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QAAC,CAAC;QACzE,MAAM,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;IACxB,CAAC;IAED,IAAI,CAAC,CAAmB;QACtB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC;YAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACtD,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;IACtC,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;gBACnD,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;oBAC5C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;oBACtB,OAAO,IAAI,CAAC,OAAO,CAAC;gBACtB,CAAC;gBACD,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC/D,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -764,7 +764,18 @@ function buildLibTs(cfg) {
|
|
|
764
764
|
` *`,
|
|
765
765
|
` * Usage:`,
|
|
766
766
|
...(database ? [` * import { db } from "@lib/clefBase";`] : []),
|
|
767
|
-
...(auth ? [
|
|
767
|
+
...(auth ? [
|
|
768
|
+
` * import { auth } from "@lib/clefBase";`,
|
|
769
|
+
` *`,
|
|
770
|
+
` * // Email / password`,
|
|
771
|
+
` * const { user } = await auth.signIn("alice@example.com", "pass");`,
|
|
772
|
+
` *`,
|
|
773
|
+
` * // Google sign-in — add this to your root component / entry point:`,
|
|
774
|
+
` * await auth.handleGatewayCallback(); // handles ?cfx_token= on return`,
|
|
775
|
+
` *`,
|
|
776
|
+
` * // On sign-in button click:`,
|
|
777
|
+
` * await auth.signInWithGateway("google");`,
|
|
778
|
+
] : []),
|
|
768
779
|
...(storage ? [` * import { storage } from "@lib/clefBase";`] : []),
|
|
769
780
|
...(fns ? [
|
|
770
781
|
` * import { fns, httpsCallable } from "@lib/clefBase";`,
|
|
@@ -804,6 +815,20 @@ function buildLibTs(cfg) {
|
|
|
804
815
|
lines.push(`/** Clefbase Auth — sign up, sign in, manage sessions. */`);
|
|
805
816
|
lines.push(`export const auth: Auth = getAuth(app);`);
|
|
806
817
|
lines.push("");
|
|
818
|
+
lines.push(`/**`);
|
|
819
|
+
lines.push(` * Call this once on every page load (before rendering your UI).`);
|
|
820
|
+
lines.push(` * Detects the ?cfx_token= param the gateway appends after OAuth,`);
|
|
821
|
+
lines.push(` * saves the session, and cleans the URL.`);
|
|
822
|
+
lines.push(` *`);
|
|
823
|
+
lines.push(` * @example`);
|
|
824
|
+
lines.push(` * // React / Next.js — in your root layout or _app.tsx:`);
|
|
825
|
+
lines.push(` * useEffect(() => { auth.handleGatewayCallback(); }, []);`);
|
|
826
|
+
lines.push(` *`);
|
|
827
|
+
lines.push(` * // Vanilla JS — at the top of your entry point:`);
|
|
828
|
+
lines.push(` * await auth.handleGatewayCallback();`);
|
|
829
|
+
lines.push(` */`);
|
|
830
|
+
lines.push(`export { auth };`);
|
|
831
|
+
lines.push("");
|
|
807
832
|
}
|
|
808
833
|
if (storage) {
|
|
809
834
|
lines.push(`/** Clefbase Storage — upload and manage files. */`);
|
|
@@ -941,6 +966,8 @@ function printUsageHint(cfg) {
|
|
|
941
966
|
if (cfg.services.auth) {
|
|
942
967
|
console.log();
|
|
943
968
|
console.log(chalk_1.default.cyan(` const { user } = await auth.signIn("email", "pass");`));
|
|
969
|
+
console.log(chalk_1.default.cyan(` await auth.signInWithGateway("google"); // redirects to auth.cleforyx.com`));
|
|
970
|
+
console.log(chalk_1.default.cyan(` await auth.handleGatewayCallback(); // call on every page load`));
|
|
944
971
|
}
|
|
945
972
|
if (cfg.services.storage) {
|
|
946
973
|
console.log();
|
package/dist/cli.js
CHANGED
|
@@ -34575,7 +34575,18 @@ function buildLibTs(cfg) {
|
|
|
34575
34575
|
` *`,
|
|
34576
34576
|
` * Usage:`,
|
|
34577
34577
|
...database ? [` * import { db } from "@lib/clefBase";`] : [],
|
|
34578
|
-
...auth ? [
|
|
34578
|
+
...auth ? [
|
|
34579
|
+
` * import { auth } from "@lib/clefBase";`,
|
|
34580
|
+
` *`,
|
|
34581
|
+
` * // Email / password`,
|
|
34582
|
+
` * const { user } = await auth.signIn("alice@example.com", "pass");`,
|
|
34583
|
+
` *`,
|
|
34584
|
+
` * // Google sign-in \u2014 add this to your root component / entry point:`,
|
|
34585
|
+
` * await auth.handleGatewayCallback(); // handles ?cfx_token= on return`,
|
|
34586
|
+
` *`,
|
|
34587
|
+
` * // On sign-in button click:`,
|
|
34588
|
+
` * await auth.signInWithGateway("google");`
|
|
34589
|
+
] : [],
|
|
34579
34590
|
...storage ? [` * import { storage } from "@lib/clefBase";`] : [],
|
|
34580
34591
|
...fns ? [
|
|
34581
34592
|
` * import { fns, httpsCallable } from "@lib/clefBase";`,
|
|
@@ -34612,6 +34623,20 @@ function buildLibTs(cfg) {
|
|
|
34612
34623
|
lines.push(`/** Clefbase Auth \u2014 sign up, sign in, manage sessions. */`);
|
|
34613
34624
|
lines.push(`export const auth: Auth = getAuth(app);`);
|
|
34614
34625
|
lines.push("");
|
|
34626
|
+
lines.push(`/**`);
|
|
34627
|
+
lines.push(` * Call this once on every page load (before rendering your UI).`);
|
|
34628
|
+
lines.push(` * Detects the ?cfx_token= param the gateway appends after OAuth,`);
|
|
34629
|
+
lines.push(` * saves the session, and cleans the URL.`);
|
|
34630
|
+
lines.push(` *`);
|
|
34631
|
+
lines.push(` * @example`);
|
|
34632
|
+
lines.push(` * // React / Next.js \u2014 in your root layout or _app.tsx:`);
|
|
34633
|
+
lines.push(` * useEffect(() => { auth.handleGatewayCallback(); }, []);`);
|
|
34634
|
+
lines.push(` *`);
|
|
34635
|
+
lines.push(` * // Vanilla JS \u2014 at the top of your entry point:`);
|
|
34636
|
+
lines.push(` * await auth.handleGatewayCallback();`);
|
|
34637
|
+
lines.push(` */`);
|
|
34638
|
+
lines.push(`export { auth };`);
|
|
34639
|
+
lines.push("");
|
|
34615
34640
|
}
|
|
34616
34641
|
if (storage) {
|
|
34617
34642
|
lines.push(`/** Clefbase Storage \u2014 upload and manage files. */`);
|
|
@@ -34744,6 +34769,8 @@ function printUsageHint(cfg) {
|
|
|
34744
34769
|
if (cfg.services.auth) {
|
|
34745
34770
|
console.log();
|
|
34746
34771
|
console.log(source_default.cyan(` const { user } = await auth.signIn("email", "pass");`));
|
|
34772
|
+
console.log(source_default.cyan(` await auth.signInWithGateway("google"); // redirects to auth.cleforyx.com`));
|
|
34773
|
+
console.log(source_default.cyan(` await auth.handleGatewayCallback(); // call on every page load`));
|
|
34747
34774
|
}
|
|
34748
34775
|
if (cfg.services.storage) {
|
|
34749
34776
|
console.log();
|
|
@@ -35522,7 +35549,7 @@ async function promptRequired(message) {
|
|
|
35522
35549
|
}
|
|
35523
35550
|
|
|
35524
35551
|
// package.json
|
|
35525
|
-
var version = "2.0.
|
|
35552
|
+
var version = "2.0.2";
|
|
35526
35553
|
|
|
35527
35554
|
// src/cli/index.ts
|
|
35528
35555
|
var program2 = new Command();
|
package/dist/index.d.ts
CHANGED
|
@@ -10,12 +10,21 @@
|
|
|
10
10
|
* setAuthToken, FunctionsError, AIError, FieldValue,
|
|
11
11
|
* } from "clefbase";
|
|
12
12
|
*
|
|
13
|
-
* const app = initClefbase({ serverUrl, projectId, apiKey
|
|
13
|
+
* const app = initClefbase({ serverUrl, projectId, apiKey });
|
|
14
14
|
*
|
|
15
|
-
* // ── Auth
|
|
15
|
+
* // ── Auth — email / password ───────────────────────────────────────────────
|
|
16
16
|
* const auth = getAuth(app);
|
|
17
17
|
* const { token } = await auth.signIn("alice@example.com", "password123");
|
|
18
18
|
*
|
|
19
|
+
* // ── Auth — Google via gateway (redirect flow) ─────────────────────────────
|
|
20
|
+
* // 1. On sign-in button click:
|
|
21
|
+
* await auth.signInWithGateway("google");
|
|
22
|
+
* // ^ redirects to auth.cleforyx.com, then back to your app with ?cfx_token=
|
|
23
|
+
*
|
|
24
|
+
* // 2. On every page load (before rendering):
|
|
25
|
+
* const result = await auth.handleGatewayCallback();
|
|
26
|
+
* if (result) console.log("Signed in:", result.user.email);
|
|
27
|
+
*
|
|
19
28
|
* // ── Database ──────────────────────────────────────────────────────────────
|
|
20
29
|
* const db = getDatabase(app);
|
|
21
30
|
* await db.collection("posts").doc("p1").update({
|
|
@@ -32,69 +41,14 @@
|
|
|
32
41
|
* const greet = httpsCallable<{ name: string }, { message: string }>(fns, "greetUser");
|
|
33
42
|
* const { data } = await greet({ name: "Alice" });
|
|
34
43
|
*
|
|
35
|
-
* // ── AI
|
|
44
|
+
* // ── AI ────────────────────────────────────────────────────────────────────
|
|
36
45
|
* const ai = getAI(app);
|
|
37
|
-
*
|
|
38
|
-
* const { content } = await ai.text({
|
|
39
|
-
* model: "claude-sonnet-4-5",
|
|
40
|
-
* prompt: "Explain async/await in JavaScript",
|
|
41
|
-
* });
|
|
42
|
-
*
|
|
43
|
-
* // Multi-turn chat
|
|
44
|
-
* const reply = await ai.text({
|
|
45
|
-
* model: "gemini-2.5-flash",
|
|
46
|
-
* prompt: "Give me a harder example",
|
|
47
|
-
* systemPrompt: "You are a JavaScript tutor.",
|
|
48
|
-
* history: [{ role: "user", content: "Explain closures" }, { role: "assistant", content: "..." }],
|
|
49
|
-
* });
|
|
50
|
-
*
|
|
51
|
-
* // ── AI — image generation (auto-saved to Storage) ─────────────────────────
|
|
52
|
-
* const { files } = await ai.image({
|
|
53
|
-
* model: "imagen-4.0-generate-001",
|
|
54
|
-
* prompt: "A serene mountain lake at dawn, photorealistic",
|
|
55
|
-
* aspectRatio: "16:9",
|
|
56
|
-
* numberOfImages: 2,
|
|
57
|
-
* outputFolder: "landscapes",
|
|
58
|
-
* });
|
|
59
|
-
* // files[].fullPath → path in project Storage
|
|
60
|
-
* // files[].storageFileId → use with storage.ref() to get the download URL
|
|
61
|
-
*
|
|
62
|
-
* // ── AI — video generation (auto-saved to Storage) ─────────────────────────
|
|
63
|
-
* const { status, files: clips } = await ai.video({
|
|
64
|
-
* model: "veo-3.1-generate-preview",
|
|
65
|
-
* prompt: "A slow-motion waterfall in a rainforest",
|
|
66
|
-
* durationSeconds: 8,
|
|
67
|
-
* aspectRatio: "16:9",
|
|
68
|
-
* });
|
|
69
|
-
*
|
|
70
|
-
* // ── AI — embeddings ───────────────────────────────────────────────────────
|
|
71
|
-
* const { embeddings } = await ai.embedding({
|
|
72
|
-
* model: "gemini-embedding-001",
|
|
73
|
-
* input: ["Hello world", "Semantic search"],
|
|
74
|
-
* });
|
|
75
|
-
*
|
|
76
|
-
* // ── AI — browse models ────────────────────────────────────────────────────
|
|
77
|
-
* const imageModels = await ai.listModels({ category: "image" });
|
|
78
|
-
* const allModels = await ai.listModels();
|
|
79
|
-
*
|
|
80
|
-
* // ── AI — usage stats ──────────────────────────────────────────────────────
|
|
81
|
-
* const stats = await ai.getStats();
|
|
82
|
-
* const history = await ai.getUsage({ limit: 20 });
|
|
83
|
-
*
|
|
84
|
-
* // ── AI — convenience top-level functions ──────────────────────────────────
|
|
85
|
-
* const { content: code } = await generateText(ai, {
|
|
86
|
-
* model: "claude-sonnet-4-5",
|
|
87
|
-
* prompt: "Write a merge sort in TypeScript",
|
|
88
|
-
* });
|
|
89
|
-
* const { files: imgs } = await generateImage(ai, {
|
|
90
|
-
* model: "imagen-4.0-fast-generate-001",
|
|
91
|
-
* prompt: "A cute cartoon robot",
|
|
92
|
-
* });
|
|
46
|
+
* const { content } = await ai.text({ model: "claude-sonnet-4-5", prompt: "Hi" });
|
|
93
47
|
*/
|
|
94
48
|
export { ClefbaseApp, initClefbase, getApp, getDatabase, getAuth, getStorage, getHosting, getFunctions, getAI, } from "./app";
|
|
95
49
|
export { Database, CollectionReference, CollectionGroup, DocumentReference, Query, WriteBatch, Transaction, runTransaction, } from "./db";
|
|
96
50
|
export { Auth } from "./auth";
|
|
97
|
-
export type {
|
|
51
|
+
export type { GatewaySignInOptions } from "./auth";
|
|
98
52
|
export { ClefbaseStorage, StorageReference, BucketReference } from "./storage";
|
|
99
53
|
export type { StorageFile } from "./storage";
|
|
100
54
|
export type { StorageImageStatus } from "./react/StorageImage";
|
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,EACZ,KAAK,GACN,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,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAGnD,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,EACL,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,cAAc,EACd,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,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,EACL,UAAU,EACV,OAAO,EACP,YAAY,EACZ,aAAa,EACb,aAAa,EACb,iBAAiB,GAClB,MAAM,MAAM,CAAC;AAEd,YAAY,EACV,OAAO,EACP,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,aAAa,EACb,YAAY,GACb,MAAM,MAAM,CAAC;AAGd,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
|
@@ -11,12 +11,21 @@
|
|
|
11
11
|
* setAuthToken, FunctionsError, AIError, FieldValue,
|
|
12
12
|
* } from "clefbase";
|
|
13
13
|
*
|
|
14
|
-
* const app = initClefbase({ serverUrl, projectId, apiKey
|
|
14
|
+
* const app = initClefbase({ serverUrl, projectId, apiKey });
|
|
15
15
|
*
|
|
16
|
-
* // ── Auth
|
|
16
|
+
* // ── Auth — email / password ───────────────────────────────────────────────
|
|
17
17
|
* const auth = getAuth(app);
|
|
18
18
|
* const { token } = await auth.signIn("alice@example.com", "password123");
|
|
19
19
|
*
|
|
20
|
+
* // ── Auth — Google via gateway (redirect flow) ─────────────────────────────
|
|
21
|
+
* // 1. On sign-in button click:
|
|
22
|
+
* await auth.signInWithGateway("google");
|
|
23
|
+
* // ^ redirects to auth.cleforyx.com, then back to your app with ?cfx_token=
|
|
24
|
+
*
|
|
25
|
+
* // 2. On every page load (before rendering):
|
|
26
|
+
* const result = await auth.handleGatewayCallback();
|
|
27
|
+
* if (result) console.log("Signed in:", result.user.email);
|
|
28
|
+
*
|
|
20
29
|
* // ── Database ──────────────────────────────────────────────────────────────
|
|
21
30
|
* const db = getDatabase(app);
|
|
22
31
|
* await db.collection("posts").doc("p1").update({
|
|
@@ -33,64 +42,9 @@
|
|
|
33
42
|
* const greet = httpsCallable<{ name: string }, { message: string }>(fns, "greetUser");
|
|
34
43
|
* const { data } = await greet({ name: "Alice" });
|
|
35
44
|
*
|
|
36
|
-
* // ── AI
|
|
45
|
+
* // ── AI ────────────────────────────────────────────────────────────────────
|
|
37
46
|
* const ai = getAI(app);
|
|
38
|
-
*
|
|
39
|
-
* const { content } = await ai.text({
|
|
40
|
-
* model: "claude-sonnet-4-5",
|
|
41
|
-
* prompt: "Explain async/await in JavaScript",
|
|
42
|
-
* });
|
|
43
|
-
*
|
|
44
|
-
* // Multi-turn chat
|
|
45
|
-
* const reply = await ai.text({
|
|
46
|
-
* model: "gemini-2.5-flash",
|
|
47
|
-
* prompt: "Give me a harder example",
|
|
48
|
-
* systemPrompt: "You are a JavaScript tutor.",
|
|
49
|
-
* history: [{ role: "user", content: "Explain closures" }, { role: "assistant", content: "..." }],
|
|
50
|
-
* });
|
|
51
|
-
*
|
|
52
|
-
* // ── AI — image generation (auto-saved to Storage) ─────────────────────────
|
|
53
|
-
* const { files } = await ai.image({
|
|
54
|
-
* model: "imagen-4.0-generate-001",
|
|
55
|
-
* prompt: "A serene mountain lake at dawn, photorealistic",
|
|
56
|
-
* aspectRatio: "16:9",
|
|
57
|
-
* numberOfImages: 2,
|
|
58
|
-
* outputFolder: "landscapes",
|
|
59
|
-
* });
|
|
60
|
-
* // files[].fullPath → path in project Storage
|
|
61
|
-
* // files[].storageFileId → use with storage.ref() to get the download URL
|
|
62
|
-
*
|
|
63
|
-
* // ── AI — video generation (auto-saved to Storage) ─────────────────────────
|
|
64
|
-
* const { status, files: clips } = await ai.video({
|
|
65
|
-
* model: "veo-3.1-generate-preview",
|
|
66
|
-
* prompt: "A slow-motion waterfall in a rainforest",
|
|
67
|
-
* durationSeconds: 8,
|
|
68
|
-
* aspectRatio: "16:9",
|
|
69
|
-
* });
|
|
70
|
-
*
|
|
71
|
-
* // ── AI — embeddings ───────────────────────────────────────────────────────
|
|
72
|
-
* const { embeddings } = await ai.embedding({
|
|
73
|
-
* model: "gemini-embedding-001",
|
|
74
|
-
* input: ["Hello world", "Semantic search"],
|
|
75
|
-
* });
|
|
76
|
-
*
|
|
77
|
-
* // ── AI — browse models ────────────────────────────────────────────────────
|
|
78
|
-
* const imageModels = await ai.listModels({ category: "image" });
|
|
79
|
-
* const allModels = await ai.listModels();
|
|
80
|
-
*
|
|
81
|
-
* // ── AI — usage stats ──────────────────────────────────────────────────────
|
|
82
|
-
* const stats = await ai.getStats();
|
|
83
|
-
* const history = await ai.getUsage({ limit: 20 });
|
|
84
|
-
*
|
|
85
|
-
* // ── AI — convenience top-level functions ──────────────────────────────────
|
|
86
|
-
* const { content: code } = await generateText(ai, {
|
|
87
|
-
* model: "claude-sonnet-4-5",
|
|
88
|
-
* prompt: "Write a merge sort in TypeScript",
|
|
89
|
-
* });
|
|
90
|
-
* const { files: imgs } = await generateImage(ai, {
|
|
91
|
-
* model: "imagen-4.0-fast-generate-001",
|
|
92
|
-
* prompt: "A cute cartoon robot",
|
|
93
|
-
* });
|
|
47
|
+
* const { content } = await ai.text({ model: "claude-sonnet-4-5", prompt: "Hi" });
|
|
94
48
|
*/
|
|
95
49
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
96
50
|
exports.ClefbaseError = exports.FieldValueSentinel = exports.FieldValue = exports.generateEmbedding = exports.generateVideo = exports.generateImage = exports.generateText = exports.AIError = exports.ClefbaseAI = exports.deployFromFile = exports.setAuthToken = exports.getFunctionExecutions = exports.listFunctions = exports.deleteFunction = exports.deployFunction = exports.callFunction = exports.httpsCallable = exports.FunctionsError = 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.getAI = exports.getFunctions = exports.getHosting = exports.getStorage = exports.getAuth = exports.getDatabase = exports.getApp = exports.initClefbase = exports.ClefbaseApp = void 0;
|
|
@@ -132,11 +86,8 @@ Object.defineProperty(exports, "ClefbaseHosting", { enumerable: true, get: funct
|
|
|
132
86
|
Object.defineProperty(exports, "SiteReference", { enumerable: true, get: function () { return hosting_1.SiteReference; } });
|
|
133
87
|
// ─── Functions ────────────────────────────────────────────────────────────────
|
|
134
88
|
var functions_1 = require("./functions");
|
|
135
|
-
// Class
|
|
136
89
|
Object.defineProperty(exports, "ClefbaseFunctions", { enumerable: true, get: function () { return functions_1.ClefbaseFunctions; } });
|
|
137
|
-
// Error
|
|
138
90
|
Object.defineProperty(exports, "FunctionsError", { enumerable: true, get: function () { return functions_1.FunctionsError; } });
|
|
139
|
-
// Top-level factory / convenience
|
|
140
91
|
Object.defineProperty(exports, "httpsCallable", { enumerable: true, get: function () { return functions_1.httpsCallable; } });
|
|
141
92
|
Object.defineProperty(exports, "callFunction", { enumerable: true, get: function () { return functions_1.callFunction; } });
|
|
142
93
|
Object.defineProperty(exports, "deployFunction", { enumerable: true, get: function () { return functions_1.deployFunction; } });
|
|
@@ -147,11 +98,8 @@ Object.defineProperty(exports, "setAuthToken", { enumerable: true, get: function
|
|
|
147
98
|
Object.defineProperty(exports, "deployFromFile", { enumerable: true, get: function () { return functions_1.deployFromFile; } });
|
|
148
99
|
// ─── AI ───────────────────────────────────────────────────────────────────────
|
|
149
100
|
var ai_1 = require("./ai");
|
|
150
|
-
// Class
|
|
151
101
|
Object.defineProperty(exports, "ClefbaseAI", { enumerable: true, get: function () { return ai_1.ClefbaseAI; } });
|
|
152
|
-
// Error
|
|
153
102
|
Object.defineProperty(exports, "AIError", { enumerable: true, get: function () { return ai_1.AIError; } });
|
|
154
|
-
// Top-level convenience functions
|
|
155
103
|
Object.defineProperty(exports, "generateText", { enumerable: true, get: function () { return ai_1.generateText; } });
|
|
156
104
|
Object.defineProperty(exports, "generateImage", { enumerable: true, get: function () { return ai_1.generateImage; } });
|
|
157
105
|
Object.defineProperty(exports, "generateVideo", { enumerable: true, get: function () { return ai_1.generateVideo; } });
|
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,6BAUe;AATb,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;AACZ,4FAAA,KAAK,OAAA;AAGP,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,yCAWqB;AAVnB,8GAAA,iBAAiB,OAAA;AACjB,2GAAA,cAAc,OAAA;AACd,0GAAA,aAAa,OAAA;AACb,yGAAA,YAAY,OAAA;AACZ,2GAAA,cAAc,OAAA;AACd,2GAAA,cAAc,OAAA;AACd,0GAAA,aAAa,OAAA;AACb,kHAAA,qBAAqB,OAAA;AACrB,yGAAA,YAAY,OAAA;AACZ,2GAAA,cAAc,OAAA;AAehB,iFAAiF;AACjF,2BAOc;AANZ,gGAAA,UAAU,OAAA;AACV,6FAAA,OAAO,OAAA;AACP,kGAAA,YAAY,OAAA;AACZ,mGAAA,aAAa,OAAA;AACb,mGAAA,aAAa,OAAA;AACb,uGAAA,iBAAiB,OAAA;AAoBnB,iFAAiF;AACjF,6CAA+D;AAAtD,yGAAA,UAAU,OAAA;AAAE,iHAAA,kBAAkB,OAAA;AAiBvC,iCAAwC;AAA/B,sGAAA,aAAa,OAAA"}
|