@codefire/firebase-react 1.0.1

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/README.md ADDED
@@ -0,0 +1,111 @@
1
+ # @codefire/firebase-react
2
+
3
+ Plug-and-play Firebase utilities for Firestore and Storage in React and other frontend projects.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @codefire/firebase-react firebase
9
+ ```
10
+
11
+ `firebase` is a peer dependency; your project controls the version.
12
+
13
+ ## Setup
14
+
15
+ Initialize Firebase once (e.g. in your app entry or root layout):
16
+
17
+ ```ts
18
+ import { initFirebase } from "@codefire/firebase-react";
19
+
20
+ initFirebase({
21
+ apiKey: "your-api-key",
22
+ authDomain: "your-project.firebaseapp.com",
23
+ projectId: "your-project-id",
24
+ storageBucket: "your-project.appspot.com",
25
+ messagingSenderId: "...",
26
+ appId: "...",
27
+ });
28
+ ```
29
+
30
+ ## Firestore
31
+
32
+ Import from the main package or the firestore subpath:
33
+
34
+ ```ts
35
+ import {
36
+ addDocument,
37
+ getDocument,
38
+ setDocument,
39
+ updateDocument,
40
+ deleteDocument,
41
+ queryCollection,
42
+ getDb,
43
+ serverTimestamp,
44
+ where,
45
+ orderBy,
46
+ limit,
47
+ } from "@codefire/firebase-react/firestore";
48
+ ```
49
+
50
+ ### API
51
+
52
+ | Function | Description |
53
+ |----------|-------------|
54
+ | `getDb()` | Returns the Firestore instance (call after `initFirebase`). |
55
+ | `addDocument(collectionName, data)` | Creates a document with auto-generated ID. Adds `createdAt`. Returns document ID. |
56
+ | `setDocument(collectionName, docId, data)` | Creates or overwrites a document with the given ID. Sets `updatedAt`. |
57
+ | `updateDocument(collectionName, docId, data)` | Updates existing document fields. Sets `updatedAt`. |
58
+ | `deleteDocument(collectionName, docId)` | Deletes a document. |
59
+ | `getDocument(collectionName, docId)` | Fetches a document by ID. Returns `null` if not found. Result includes `id`. |
60
+ | `queryCollection(collectionName, constraints?)` | Fetches documents with optional `where`, `orderBy`, `limit`. Results include `id`. |
61
+
62
+ Helpers `serverTimestamp`, `where`, `orderBy`, `limit` are re-exported from Firebase for building queries.
63
+
64
+ ### Example
65
+
66
+ ```ts
67
+ const id = await addDocument("waitlist", { email: "a@b.com", city: "Santiago" });
68
+
69
+ const items = await queryCollection("services", [
70
+ where("active", "==", true),
71
+ orderBy("order", "asc"),
72
+ limit(10),
73
+ ]);
74
+ ```
75
+
76
+ ## Storage
77
+
78
+ ```ts
79
+ import { uploadFile, deleteFile, getFileUrl } from "@codefire/firebase-react/storage";
80
+ ```
81
+
82
+ ### API
83
+
84
+ | Function | Description |
85
+ |----------|-------------|
86
+ | `uploadFile(file, options?)` | Uploads a file. Options: `folder`, `fileName`, `onProgress(percent)`. Returns `{ url, path }`. |
87
+ | `deleteFile(path)` | Deletes a file by path. |
88
+ | `getFileUrl(path)` | Returns the public download URL for a path. |
89
+
90
+ ### Example
91
+
92
+ ```ts
93
+ const { url, path } = await uploadFile(file, {
94
+ folder: "profiles",
95
+ onProgress: (p) => console.log(`${p}%`),
96
+ });
97
+ ```
98
+
99
+ ## Subpath imports
100
+
101
+ To avoid pulling in unused code:
102
+
103
+ - `@codefire/firebase-react` — core + firestore + storage
104
+ - `@codefire/firebase-react/firestore` — Firestore only
105
+ - `@codefire/firebase-react/storage` — Storage only
106
+
107
+ You still need to call `initFirebase()` from the main package once before using Firestore or Storage.
108
+
109
+ ## License
110
+
111
+ MIT
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/firestore/index.ts
21
+ var firestore_exports = {};
22
+ __export(firestore_exports, {
23
+ addDocument: () => addDocument,
24
+ deleteDocument: () => deleteDocument,
25
+ getDb: () => getDb,
26
+ getDocument: () => getDocument,
27
+ limit: () => import_firestore.limit,
28
+ orderBy: () => import_firestore.orderBy,
29
+ queryCollection: () => queryCollection,
30
+ serverTimestamp: () => import_firestore.serverTimestamp,
31
+ setDocument: () => setDocument,
32
+ updateDocument: () => updateDocument,
33
+ where: () => import_firestore.where
34
+ });
35
+ module.exports = __toCommonJS(firestore_exports);
36
+ var import_firestore = require("firebase/firestore");
37
+
38
+ // src/core.ts
39
+ var import_app = require("firebase/app");
40
+ var app = null;
41
+ function getFirebaseApp() {
42
+ if (!app) {
43
+ throw new Error(
44
+ "@codefire/firebase-react: Firebase has not been initialized. Call initFirebase(config) before using Firestore or Storage."
45
+ );
46
+ }
47
+ return app;
48
+ }
49
+
50
+ // src/firestore/index.ts
51
+ function getDb() {
52
+ return (0, import_firestore.getFirestore)(getFirebaseApp());
53
+ }
54
+ async function addDocument(collectionName, data) {
55
+ const app2 = getFirebaseApp();
56
+ const firestore = (0, import_firestore.getFirestore)(app2);
57
+ const ref = await (0, import_firestore.addDoc)((0, import_firestore.collection)(firestore, collectionName), {
58
+ ...data,
59
+ createdAt: (0, import_firestore.serverTimestamp)()
60
+ });
61
+ return ref.id;
62
+ }
63
+ async function setDocument(collectionName, docId, data) {
64
+ const app2 = getFirebaseApp();
65
+ const firestore = (0, import_firestore.getFirestore)(app2);
66
+ await (0, import_firestore.setDoc)((0, import_firestore.doc)(firestore, collectionName, docId), {
67
+ ...data,
68
+ updatedAt: (0, import_firestore.serverTimestamp)()
69
+ });
70
+ }
71
+ async function updateDocument(collectionName, docId, data) {
72
+ const app2 = getFirebaseApp();
73
+ const firestore = (0, import_firestore.getFirestore)(app2);
74
+ await (0, import_firestore.updateDoc)((0, import_firestore.doc)(firestore, collectionName, docId), {
75
+ ...data,
76
+ updatedAt: (0, import_firestore.serverTimestamp)()
77
+ });
78
+ }
79
+ async function deleteDocument(collectionName, docId) {
80
+ const app2 = getFirebaseApp();
81
+ const firestore = (0, import_firestore.getFirestore)(app2);
82
+ await (0, import_firestore.deleteDoc)((0, import_firestore.doc)(firestore, collectionName, docId));
83
+ }
84
+ async function getDocument(collectionName, docId) {
85
+ const app2 = getFirebaseApp();
86
+ const firestore = (0, import_firestore.getFirestore)(app2);
87
+ const snap = await (0, import_firestore.getDoc)((0, import_firestore.doc)(firestore, collectionName, docId));
88
+ if (!snap.exists()) return null;
89
+ return { id: snap.id, ...snap.data() };
90
+ }
91
+ async function queryCollection(collectionName, constraints = []) {
92
+ const app2 = getFirebaseApp();
93
+ const firestore = (0, import_firestore.getFirestore)(app2);
94
+ const q = (0, import_firestore.query)((0, import_firestore.collection)(firestore, collectionName), ...constraints);
95
+ const snap = await (0, import_firestore.getDocs)(q);
96
+ return snap.docs.map((d) => ({ id: d.id, ...d.data() }));
97
+ }
98
+ // Annotate the CommonJS export names for ESM import in node:
99
+ 0 && (module.exports = {
100
+ addDocument,
101
+ deleteDocument,
102
+ getDb,
103
+ getDocument,
104
+ limit,
105
+ orderBy,
106
+ queryCollection,
107
+ serverTimestamp,
108
+ setDocument,
109
+ updateDocument,
110
+ where
111
+ });
112
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/firestore/index.ts","../../src/core.ts"],"sourcesContent":["import {\n getFirestore,\n collection,\n doc,\n addDoc,\n setDoc,\n updateDoc,\n deleteDoc,\n getDoc,\n getDocs,\n query,\n where,\n orderBy,\n limit,\n serverTimestamp,\n type DocumentData,\n type QueryConstraint,\n type WithFieldValue,\n type UpdateData,\n type Firestore,\n} from \"firebase/firestore\";\nimport { getFirebaseApp } from \"../core\";\n\nexport function getDb(): Firestore {\n return getFirestore(getFirebaseApp());\n}\n\nexport { serverTimestamp, where, orderBy, limit };\n\nexport async function addDocument<T extends WithFieldValue<DocumentData>>(\n collectionName: string,\n data: T\n): Promise<string> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n const ref = await addDoc(collection(firestore, collectionName), {\n ...data,\n createdAt: serverTimestamp(),\n });\n return ref.id;\n}\n\nexport async function setDocument<T extends WithFieldValue<DocumentData>>(\n collectionName: string,\n docId: string,\n data: T\n): Promise<void> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n await setDoc(doc(firestore, collectionName, docId), {\n ...data,\n updatedAt: serverTimestamp(),\n });\n}\n\nexport async function updateDocument<T extends DocumentData>(\n collectionName: string,\n docId: string,\n data: UpdateData<T>\n): Promise<void> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n await updateDoc(doc(firestore, collectionName, docId), {\n ...data,\n updatedAt: serverTimestamp(),\n });\n}\n\nexport async function deleteDocument(\n collectionName: string,\n docId: string\n): Promise<void> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n await deleteDoc(doc(firestore, collectionName, docId));\n}\n\nexport async function getDocument<T = DocumentData>(\n collectionName: string,\n docId: string\n): Promise<(T & { id: string }) | null> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n const snap = await getDoc(doc(firestore, collectionName, docId));\n if (!snap.exists()) return null;\n return { id: snap.id, ...(snap.data() as T) };\n}\n\nexport async function queryCollection<T = DocumentData>(\n collectionName: string,\n constraints: QueryConstraint[] = []\n): Promise<(T & { id: string })[]> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n const q = query(collection(firestore, collectionName), ...constraints);\n const snap = await getDocs(q);\n return snap.docs.map((d) => ({ id: d.id, ...(d.data() as T) }));\n}\n","import {\n initializeApp,\n getApps,\n getApp,\n type FirebaseApp,\n type FirebaseOptions,\n} from \"firebase/app\";\n\nlet app: FirebaseApp | null = null;\n\nexport function initFirebase(config: FirebaseOptions): FirebaseApp {\n if (getApps().length > 0) {\n app = getApp();\n return app;\n }\n app = initializeApp(config);\n return app;\n}\n\nexport function getFirebaseApp(): FirebaseApp {\n if (!app) {\n throw new Error(\n \"@codefire/firebase-react: Firebase has not been initialized. Call initFirebase(config) before using Firestore or Storage.\"\n );\n }\n return app;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAoBO;;;ACpBP,iBAMO;AAEP,IAAI,MAA0B;AAWvB,SAAS,iBAA8B;AAC5C,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;ADHO,SAAS,QAAmB;AACjC,aAAO,+BAAa,eAAe,CAAC;AACtC;AAIA,eAAsB,YACpB,gBACA,MACiB;AACjB,QAAMA,OAAM,eAAe;AAC3B,QAAM,gBAAY,+BAAaA,IAAG;AAClC,QAAM,MAAM,UAAM,6BAAO,6BAAW,WAAW,cAAc,GAAG;AAAA,IAC9D,GAAG;AAAA,IACH,eAAW,kCAAgB;AAAA,EAC7B,CAAC;AACD,SAAO,IAAI;AACb;AAEA,eAAsB,YACpB,gBACA,OACA,MACe;AACf,QAAMA,OAAM,eAAe;AAC3B,QAAM,gBAAY,+BAAaA,IAAG;AAClC,YAAM,6BAAO,sBAAI,WAAW,gBAAgB,KAAK,GAAG;AAAA,IAClD,GAAG;AAAA,IACH,eAAW,kCAAgB;AAAA,EAC7B,CAAC;AACH;AAEA,eAAsB,eACpB,gBACA,OACA,MACe;AACf,QAAMA,OAAM,eAAe;AAC3B,QAAM,gBAAY,+BAAaA,IAAG;AAClC,YAAM,gCAAU,sBAAI,WAAW,gBAAgB,KAAK,GAAG;AAAA,IACrD,GAAG;AAAA,IACH,eAAW,kCAAgB;AAAA,EAC7B,CAAC;AACH;AAEA,eAAsB,eACpB,gBACA,OACe;AACf,QAAMA,OAAM,eAAe;AAC3B,QAAM,gBAAY,+BAAaA,IAAG;AAClC,YAAM,gCAAU,sBAAI,WAAW,gBAAgB,KAAK,CAAC;AACvD;AAEA,eAAsB,YACpB,gBACA,OACsC;AACtC,QAAMA,OAAM,eAAe;AAC3B,QAAM,gBAAY,+BAAaA,IAAG;AAClC,QAAM,OAAO,UAAM,6BAAO,sBAAI,WAAW,gBAAgB,KAAK,CAAC;AAC/D,MAAI,CAAC,KAAK,OAAO,EAAG,QAAO;AAC3B,SAAO,EAAE,IAAI,KAAK,IAAI,GAAI,KAAK,KAAK,EAAQ;AAC9C;AAEA,eAAsB,gBACpB,gBACA,cAAiC,CAAC,GACD;AACjC,QAAMA,OAAM,eAAe;AAC3B,QAAM,gBAAY,+BAAaA,IAAG;AAClC,QAAM,QAAI,4BAAM,6BAAW,WAAW,cAAc,GAAG,GAAG,WAAW;AACrE,QAAM,OAAO,UAAM,0BAAQ,CAAC;AAC5B,SAAO,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,GAAI,EAAE,KAAK,EAAQ,EAAE;AAChE;","names":["app"]}
@@ -0,0 +1,17 @@
1
+ import { WithFieldValue, DocumentData, Firestore, QueryConstraint, UpdateData } from 'firebase/firestore';
2
+ export { limit, orderBy, serverTimestamp, where } from 'firebase/firestore';
3
+
4
+ declare function getDb(): Firestore;
5
+
6
+ declare function addDocument<T extends WithFieldValue<DocumentData>>(collectionName: string, data: T): Promise<string>;
7
+ declare function setDocument<T extends WithFieldValue<DocumentData>>(collectionName: string, docId: string, data: T): Promise<void>;
8
+ declare function updateDocument<T extends DocumentData>(collectionName: string, docId: string, data: UpdateData<T>): Promise<void>;
9
+ declare function deleteDocument(collectionName: string, docId: string): Promise<void>;
10
+ declare function getDocument<T = DocumentData>(collectionName: string, docId: string): Promise<(T & {
11
+ id: string;
12
+ }) | null>;
13
+ declare function queryCollection<T = DocumentData>(collectionName: string, constraints?: QueryConstraint[]): Promise<(T & {
14
+ id: string;
15
+ })[]>;
16
+
17
+ export { addDocument, deleteDocument, getDb, getDocument, queryCollection, setDocument, updateDocument };
@@ -0,0 +1,17 @@
1
+ import { WithFieldValue, DocumentData, Firestore, QueryConstraint, UpdateData } from 'firebase/firestore';
2
+ export { limit, orderBy, serverTimestamp, where } from 'firebase/firestore';
3
+
4
+ declare function getDb(): Firestore;
5
+
6
+ declare function addDocument<T extends WithFieldValue<DocumentData>>(collectionName: string, data: T): Promise<string>;
7
+ declare function setDocument<T extends WithFieldValue<DocumentData>>(collectionName: string, docId: string, data: T): Promise<void>;
8
+ declare function updateDocument<T extends DocumentData>(collectionName: string, docId: string, data: UpdateData<T>): Promise<void>;
9
+ declare function deleteDocument(collectionName: string, docId: string): Promise<void>;
10
+ declare function getDocument<T = DocumentData>(collectionName: string, docId: string): Promise<(T & {
11
+ id: string;
12
+ }) | null>;
13
+ declare function queryCollection<T = DocumentData>(collectionName: string, constraints?: QueryConstraint[]): Promise<(T & {
14
+ id: string;
15
+ })[]>;
16
+
17
+ export { addDocument, deleteDocument, getDb, getDocument, queryCollection, setDocument, updateDocument };
@@ -0,0 +1,96 @@
1
+ // src/firestore/index.ts
2
+ import {
3
+ getFirestore,
4
+ collection,
5
+ doc,
6
+ addDoc,
7
+ setDoc,
8
+ updateDoc,
9
+ deleteDoc,
10
+ getDoc,
11
+ getDocs,
12
+ query,
13
+ where,
14
+ orderBy,
15
+ limit,
16
+ serverTimestamp
17
+ } from "firebase/firestore";
18
+
19
+ // src/core.ts
20
+ import {
21
+ initializeApp,
22
+ getApps,
23
+ getApp
24
+ } from "firebase/app";
25
+ var app = null;
26
+ function getFirebaseApp() {
27
+ if (!app) {
28
+ throw new Error(
29
+ "@codefire/firebase-react: Firebase has not been initialized. Call initFirebase(config) before using Firestore or Storage."
30
+ );
31
+ }
32
+ return app;
33
+ }
34
+
35
+ // src/firestore/index.ts
36
+ function getDb() {
37
+ return getFirestore(getFirebaseApp());
38
+ }
39
+ async function addDocument(collectionName, data) {
40
+ const app2 = getFirebaseApp();
41
+ const firestore = getFirestore(app2);
42
+ const ref = await addDoc(collection(firestore, collectionName), {
43
+ ...data,
44
+ createdAt: serverTimestamp()
45
+ });
46
+ return ref.id;
47
+ }
48
+ async function setDocument(collectionName, docId, data) {
49
+ const app2 = getFirebaseApp();
50
+ const firestore = getFirestore(app2);
51
+ await setDoc(doc(firestore, collectionName, docId), {
52
+ ...data,
53
+ updatedAt: serverTimestamp()
54
+ });
55
+ }
56
+ async function updateDocument(collectionName, docId, data) {
57
+ const app2 = getFirebaseApp();
58
+ const firestore = getFirestore(app2);
59
+ await updateDoc(doc(firestore, collectionName, docId), {
60
+ ...data,
61
+ updatedAt: serverTimestamp()
62
+ });
63
+ }
64
+ async function deleteDocument(collectionName, docId) {
65
+ const app2 = getFirebaseApp();
66
+ const firestore = getFirestore(app2);
67
+ await deleteDoc(doc(firestore, collectionName, docId));
68
+ }
69
+ async function getDocument(collectionName, docId) {
70
+ const app2 = getFirebaseApp();
71
+ const firestore = getFirestore(app2);
72
+ const snap = await getDoc(doc(firestore, collectionName, docId));
73
+ if (!snap.exists()) return null;
74
+ return { id: snap.id, ...snap.data() };
75
+ }
76
+ async function queryCollection(collectionName, constraints = []) {
77
+ const app2 = getFirebaseApp();
78
+ const firestore = getFirestore(app2);
79
+ const q = query(collection(firestore, collectionName), ...constraints);
80
+ const snap = await getDocs(q);
81
+ return snap.docs.map((d) => ({ id: d.id, ...d.data() }));
82
+ }
83
+ export {
84
+ addDocument,
85
+ deleteDocument,
86
+ getDb,
87
+ getDocument,
88
+ limit,
89
+ orderBy,
90
+ queryCollection,
91
+ serverTimestamp,
92
+ setDocument,
93
+ updateDocument,
94
+ where
95
+ };
96
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/firestore/index.ts","../../src/core.ts"],"sourcesContent":["import {\n getFirestore,\n collection,\n doc,\n addDoc,\n setDoc,\n updateDoc,\n deleteDoc,\n getDoc,\n getDocs,\n query,\n where,\n orderBy,\n limit,\n serverTimestamp,\n type DocumentData,\n type QueryConstraint,\n type WithFieldValue,\n type UpdateData,\n type Firestore,\n} from \"firebase/firestore\";\nimport { getFirebaseApp } from \"../core\";\n\nexport function getDb(): Firestore {\n return getFirestore(getFirebaseApp());\n}\n\nexport { serverTimestamp, where, orderBy, limit };\n\nexport async function addDocument<T extends WithFieldValue<DocumentData>>(\n collectionName: string,\n data: T\n): Promise<string> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n const ref = await addDoc(collection(firestore, collectionName), {\n ...data,\n createdAt: serverTimestamp(),\n });\n return ref.id;\n}\n\nexport async function setDocument<T extends WithFieldValue<DocumentData>>(\n collectionName: string,\n docId: string,\n data: T\n): Promise<void> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n await setDoc(doc(firestore, collectionName, docId), {\n ...data,\n updatedAt: serverTimestamp(),\n });\n}\n\nexport async function updateDocument<T extends DocumentData>(\n collectionName: string,\n docId: string,\n data: UpdateData<T>\n): Promise<void> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n await updateDoc(doc(firestore, collectionName, docId), {\n ...data,\n updatedAt: serverTimestamp(),\n });\n}\n\nexport async function deleteDocument(\n collectionName: string,\n docId: string\n): Promise<void> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n await deleteDoc(doc(firestore, collectionName, docId));\n}\n\nexport async function getDocument<T = DocumentData>(\n collectionName: string,\n docId: string\n): Promise<(T & { id: string }) | null> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n const snap = await getDoc(doc(firestore, collectionName, docId));\n if (!snap.exists()) return null;\n return { id: snap.id, ...(snap.data() as T) };\n}\n\nexport async function queryCollection<T = DocumentData>(\n collectionName: string,\n constraints: QueryConstraint[] = []\n): Promise<(T & { id: string })[]> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n const q = query(collection(firestore, collectionName), ...constraints);\n const snap = await getDocs(q);\n return snap.docs.map((d) => ({ id: d.id, ...(d.data() as T) }));\n}\n","import {\n initializeApp,\n getApps,\n getApp,\n type FirebaseApp,\n type FirebaseOptions,\n} from \"firebase/app\";\n\nlet app: FirebaseApp | null = null;\n\nexport function initFirebase(config: FirebaseOptions): FirebaseApp {\n if (getApps().length > 0) {\n app = getApp();\n return app;\n }\n app = initializeApp(config);\n return app;\n}\n\nexport function getFirebaseApp(): FirebaseApp {\n if (!app) {\n throw new Error(\n \"@codefire/firebase-react: Firebase has not been initialized. Call initFirebase(config) before using Firestore or Storage.\"\n );\n }\n return app;\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAMK;;;ACpBP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAEP,IAAI,MAA0B;AAWvB,SAAS,iBAA8B;AAC5C,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;ADHO,SAAS,QAAmB;AACjC,SAAO,aAAa,eAAe,CAAC;AACtC;AAIA,eAAsB,YACpB,gBACA,MACiB;AACjB,QAAMA,OAAM,eAAe;AAC3B,QAAM,YAAY,aAAaA,IAAG;AAClC,QAAM,MAAM,MAAM,OAAO,WAAW,WAAW,cAAc,GAAG;AAAA,IAC9D,GAAG;AAAA,IACH,WAAW,gBAAgB;AAAA,EAC7B,CAAC;AACD,SAAO,IAAI;AACb;AAEA,eAAsB,YACpB,gBACA,OACA,MACe;AACf,QAAMA,OAAM,eAAe;AAC3B,QAAM,YAAY,aAAaA,IAAG;AAClC,QAAM,OAAO,IAAI,WAAW,gBAAgB,KAAK,GAAG;AAAA,IAClD,GAAG;AAAA,IACH,WAAW,gBAAgB;AAAA,EAC7B,CAAC;AACH;AAEA,eAAsB,eACpB,gBACA,OACA,MACe;AACf,QAAMA,OAAM,eAAe;AAC3B,QAAM,YAAY,aAAaA,IAAG;AAClC,QAAM,UAAU,IAAI,WAAW,gBAAgB,KAAK,GAAG;AAAA,IACrD,GAAG;AAAA,IACH,WAAW,gBAAgB;AAAA,EAC7B,CAAC;AACH;AAEA,eAAsB,eACpB,gBACA,OACe;AACf,QAAMA,OAAM,eAAe;AAC3B,QAAM,YAAY,aAAaA,IAAG;AAClC,QAAM,UAAU,IAAI,WAAW,gBAAgB,KAAK,CAAC;AACvD;AAEA,eAAsB,YACpB,gBACA,OACsC;AACtC,QAAMA,OAAM,eAAe;AAC3B,QAAM,YAAY,aAAaA,IAAG;AAClC,QAAM,OAAO,MAAM,OAAO,IAAI,WAAW,gBAAgB,KAAK,CAAC;AAC/D,MAAI,CAAC,KAAK,OAAO,EAAG,QAAO;AAC3B,SAAO,EAAE,IAAI,KAAK,IAAI,GAAI,KAAK,KAAK,EAAQ;AAC9C;AAEA,eAAsB,gBACpB,gBACA,cAAiC,CAAC,GACD;AACjC,QAAMA,OAAM,eAAe;AAC3B,QAAM,YAAY,aAAaA,IAAG;AAClC,QAAM,IAAI,MAAM,WAAW,WAAW,cAAc,GAAG,GAAG,WAAW;AACrE,QAAM,OAAO,MAAM,QAAQ,CAAC;AAC5B,SAAO,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,GAAI,EAAE,KAAK,EAAQ,EAAE;AAChE;","names":["app"]}
package/dist/index.cjs ADDED
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ addDocument: () => addDocument,
24
+ deleteDocument: () => deleteDocument,
25
+ deleteFile: () => deleteFile,
26
+ getDb: () => getDb,
27
+ getDocument: () => getDocument,
28
+ getFileUrl: () => getFileUrl,
29
+ getFirebaseApp: () => getFirebaseApp,
30
+ getStorageInstance: () => getStorageInstance,
31
+ initFirebase: () => initFirebase,
32
+ limit: () => import_firestore.limit,
33
+ orderBy: () => import_firestore.orderBy,
34
+ queryCollection: () => queryCollection,
35
+ serverTimestamp: () => import_firestore.serverTimestamp,
36
+ setDocument: () => setDocument,
37
+ updateDocument: () => updateDocument,
38
+ uploadFile: () => uploadFile,
39
+ where: () => import_firestore.where
40
+ });
41
+ module.exports = __toCommonJS(src_exports);
42
+
43
+ // src/core.ts
44
+ var import_app = require("firebase/app");
45
+ var app = null;
46
+ function initFirebase(config) {
47
+ if ((0, import_app.getApps)().length > 0) {
48
+ app = (0, import_app.getApp)();
49
+ return app;
50
+ }
51
+ app = (0, import_app.initializeApp)(config);
52
+ return app;
53
+ }
54
+ function getFirebaseApp() {
55
+ if (!app) {
56
+ throw new Error(
57
+ "@codefire/firebase-react: Firebase has not been initialized. Call initFirebase(config) before using Firestore or Storage."
58
+ );
59
+ }
60
+ return app;
61
+ }
62
+
63
+ // src/firestore/index.ts
64
+ var import_firestore = require("firebase/firestore");
65
+ function getDb() {
66
+ return (0, import_firestore.getFirestore)(getFirebaseApp());
67
+ }
68
+ async function addDocument(collectionName, data) {
69
+ const app2 = getFirebaseApp();
70
+ const firestore = (0, import_firestore.getFirestore)(app2);
71
+ const ref2 = await (0, import_firestore.addDoc)((0, import_firestore.collection)(firestore, collectionName), {
72
+ ...data,
73
+ createdAt: (0, import_firestore.serverTimestamp)()
74
+ });
75
+ return ref2.id;
76
+ }
77
+ async function setDocument(collectionName, docId, data) {
78
+ const app2 = getFirebaseApp();
79
+ const firestore = (0, import_firestore.getFirestore)(app2);
80
+ await (0, import_firestore.setDoc)((0, import_firestore.doc)(firestore, collectionName, docId), {
81
+ ...data,
82
+ updatedAt: (0, import_firestore.serverTimestamp)()
83
+ });
84
+ }
85
+ async function updateDocument(collectionName, docId, data) {
86
+ const app2 = getFirebaseApp();
87
+ const firestore = (0, import_firestore.getFirestore)(app2);
88
+ await (0, import_firestore.updateDoc)((0, import_firestore.doc)(firestore, collectionName, docId), {
89
+ ...data,
90
+ updatedAt: (0, import_firestore.serverTimestamp)()
91
+ });
92
+ }
93
+ async function deleteDocument(collectionName, docId) {
94
+ const app2 = getFirebaseApp();
95
+ const firestore = (0, import_firestore.getFirestore)(app2);
96
+ await (0, import_firestore.deleteDoc)((0, import_firestore.doc)(firestore, collectionName, docId));
97
+ }
98
+ async function getDocument(collectionName, docId) {
99
+ const app2 = getFirebaseApp();
100
+ const firestore = (0, import_firestore.getFirestore)(app2);
101
+ const snap = await (0, import_firestore.getDoc)((0, import_firestore.doc)(firestore, collectionName, docId));
102
+ if (!snap.exists()) return null;
103
+ return { id: snap.id, ...snap.data() };
104
+ }
105
+ async function queryCollection(collectionName, constraints = []) {
106
+ const app2 = getFirebaseApp();
107
+ const firestore = (0, import_firestore.getFirestore)(app2);
108
+ const q = (0, import_firestore.query)((0, import_firestore.collection)(firestore, collectionName), ...constraints);
109
+ const snap = await (0, import_firestore.getDocs)(q);
110
+ return snap.docs.map((d) => ({ id: d.id, ...d.data() }));
111
+ }
112
+
113
+ // src/storage/index.ts
114
+ var import_storage = require("firebase/storage");
115
+ function getStorageInstance() {
116
+ return (0, import_storage.getStorage)(getFirebaseApp());
117
+ }
118
+ function buildPath(file, options) {
119
+ const ext = file.name.split(".").pop() ?? "";
120
+ const name = options.fileName ? `${options.fileName}.${ext}` : `${crypto.randomUUID()}.${ext}`;
121
+ return options.folder ? `${options.folder}/${name}` : name;
122
+ }
123
+ function uploadFile(file, options = {}) {
124
+ const storage = getStorageInstance();
125
+ return new Promise((resolve, reject) => {
126
+ const path = buildPath(file, options);
127
+ const storageRef = (0, import_storage.ref)(storage, path);
128
+ const task = (0, import_storage.uploadBytesResumable)(storageRef, file);
129
+ task.on(
130
+ "state_changed",
131
+ (snapshot) => {
132
+ if (options.onProgress) {
133
+ const percent = Math.round(
134
+ snapshot.bytesTransferred / snapshot.totalBytes * 100
135
+ );
136
+ options.onProgress(percent);
137
+ }
138
+ },
139
+ (error) => reject(error),
140
+ async () => {
141
+ const url = await (0, import_storage.getDownloadURL)(task.snapshot.ref);
142
+ resolve({ url, path });
143
+ }
144
+ );
145
+ });
146
+ }
147
+ async function deleteFile(path) {
148
+ const storage = getStorageInstance();
149
+ await (0, import_storage.deleteObject)((0, import_storage.ref)(storage, path));
150
+ }
151
+ async function getFileUrl(path) {
152
+ const storage = getStorageInstance();
153
+ return (0, import_storage.getDownloadURL)((0, import_storage.ref)(storage, path));
154
+ }
155
+ // Annotate the CommonJS export names for ESM import in node:
156
+ 0 && (module.exports = {
157
+ addDocument,
158
+ deleteDocument,
159
+ deleteFile,
160
+ getDb,
161
+ getDocument,
162
+ getFileUrl,
163
+ getFirebaseApp,
164
+ getStorageInstance,
165
+ initFirebase,
166
+ limit,
167
+ orderBy,
168
+ queryCollection,
169
+ serverTimestamp,
170
+ setDocument,
171
+ updateDocument,
172
+ uploadFile,
173
+ where
174
+ });
175
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/core.ts","../src/firestore/index.ts","../src/storage/index.ts"],"sourcesContent":["export { initFirebase, getFirebaseApp } from \"./core\";\nexport {\n getDb,\n addDocument,\n setDocument,\n updateDocument,\n deleteDocument,\n getDocument,\n queryCollection,\n serverTimestamp,\n where,\n orderBy,\n limit,\n} from \"./firestore\";\nexport {\n getStorageInstance,\n uploadFile,\n deleteFile,\n getFileUrl,\n} from \"./storage\";\nexport type { UploadResult, UploadOptions } from \"./storage\";\n","import {\n initializeApp,\n getApps,\n getApp,\n type FirebaseApp,\n type FirebaseOptions,\n} from \"firebase/app\";\n\nlet app: FirebaseApp | null = null;\n\nexport function initFirebase(config: FirebaseOptions): FirebaseApp {\n if (getApps().length > 0) {\n app = getApp();\n return app;\n }\n app = initializeApp(config);\n return app;\n}\n\nexport function getFirebaseApp(): FirebaseApp {\n if (!app) {\n throw new Error(\n \"@codefire/firebase-react: Firebase has not been initialized. Call initFirebase(config) before using Firestore or Storage.\"\n );\n }\n return app;\n}\n","import {\n getFirestore,\n collection,\n doc,\n addDoc,\n setDoc,\n updateDoc,\n deleteDoc,\n getDoc,\n getDocs,\n query,\n where,\n orderBy,\n limit,\n serverTimestamp,\n type DocumentData,\n type QueryConstraint,\n type WithFieldValue,\n type UpdateData,\n type Firestore,\n} from \"firebase/firestore\";\nimport { getFirebaseApp } from \"../core\";\n\nexport function getDb(): Firestore {\n return getFirestore(getFirebaseApp());\n}\n\nexport { serverTimestamp, where, orderBy, limit };\n\nexport async function addDocument<T extends WithFieldValue<DocumentData>>(\n collectionName: string,\n data: T\n): Promise<string> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n const ref = await addDoc(collection(firestore, collectionName), {\n ...data,\n createdAt: serverTimestamp(),\n });\n return ref.id;\n}\n\nexport async function setDocument<T extends WithFieldValue<DocumentData>>(\n collectionName: string,\n docId: string,\n data: T\n): Promise<void> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n await setDoc(doc(firestore, collectionName, docId), {\n ...data,\n updatedAt: serverTimestamp(),\n });\n}\n\nexport async function updateDocument<T extends DocumentData>(\n collectionName: string,\n docId: string,\n data: UpdateData<T>\n): Promise<void> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n await updateDoc(doc(firestore, collectionName, docId), {\n ...data,\n updatedAt: serverTimestamp(),\n });\n}\n\nexport async function deleteDocument(\n collectionName: string,\n docId: string\n): Promise<void> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n await deleteDoc(doc(firestore, collectionName, docId));\n}\n\nexport async function getDocument<T = DocumentData>(\n collectionName: string,\n docId: string\n): Promise<(T & { id: string }) | null> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n const snap = await getDoc(doc(firestore, collectionName, docId));\n if (!snap.exists()) return null;\n return { id: snap.id, ...(snap.data() as T) };\n}\n\nexport async function queryCollection<T = DocumentData>(\n collectionName: string,\n constraints: QueryConstraint[] = []\n): Promise<(T & { id: string })[]> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n const q = query(collection(firestore, collectionName), ...constraints);\n const snap = await getDocs(q);\n return snap.docs.map((d) => ({ id: d.id, ...(d.data() as T) }));\n}\n","import {\n getStorage,\n ref,\n uploadBytesResumable,\n getDownloadURL,\n deleteObject,\n type FirebaseStorage,\n type UploadTaskSnapshot,\n} from \"firebase/storage\";\nimport { getFirebaseApp } from \"../core\";\n\nexport function getStorageInstance(): FirebaseStorage {\n return getStorage(getFirebaseApp());\n}\n\nexport interface UploadResult {\n url: string;\n path: string;\n}\n\nexport interface UploadOptions {\n folder?: string;\n fileName?: string;\n onProgress?: (percent: number) => void;\n}\n\nfunction buildPath(file: File, options: UploadOptions): string {\n const ext = file.name.split(\".\").pop() ?? \"\";\n const name = options.fileName\n ? `${options.fileName}.${ext}`\n : `${crypto.randomUUID()}.${ext}`;\n return options.folder ? `${options.folder}/${name}` : name;\n}\n\nexport function uploadFile(\n file: File,\n options: UploadOptions = {}\n): Promise<UploadResult> {\n const storage = getStorageInstance();\n return new Promise((resolve, reject) => {\n const path = buildPath(file, options);\n const storageRef = ref(storage, path);\n const task = uploadBytesResumable(storageRef, file);\n\n task.on(\n \"state_changed\",\n (snapshot: UploadTaskSnapshot) => {\n if (options.onProgress) {\n const percent = Math.round(\n (snapshot.bytesTransferred / snapshot.totalBytes) * 100\n );\n options.onProgress(percent);\n }\n },\n (error) => reject(error),\n async () => {\n const url = await getDownloadURL(task.snapshot.ref);\n resolve({ url, path });\n }\n );\n });\n}\n\nexport async function deleteFile(path: string): Promise<void> {\n const storage = getStorageInstance();\n await deleteObject(ref(storage, path));\n}\n\nexport async function getFileUrl(path: string): Promise<string> {\n const storage = getStorageInstance();\n return getDownloadURL(ref(storage, path));\n}\n"],"mappings":"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","names":["app","ref"]}
@@ -0,0 +1,10 @@
1
+ import { FirebaseApp, FirebaseOptions } from 'firebase/app';
2
+ export { addDocument, deleteDocument, getDb, getDocument, queryCollection, setDocument, updateDocument } from './firestore/index.cjs';
3
+ export { UploadOptions, UploadResult, deleteFile, getFileUrl, getStorageInstance, uploadFile } from './storage/index.cjs';
4
+ export { limit, orderBy, serverTimestamp, where } from 'firebase/firestore';
5
+ import 'firebase/storage';
6
+
7
+ declare function initFirebase(config: FirebaseOptions): FirebaseApp;
8
+ declare function getFirebaseApp(): FirebaseApp;
9
+
10
+ export { getFirebaseApp, initFirebase };
@@ -0,0 +1,10 @@
1
+ import { FirebaseApp, FirebaseOptions } from 'firebase/app';
2
+ export { addDocument, deleteDocument, getDb, getDocument, queryCollection, setDocument, updateDocument } from './firestore/index.js';
3
+ export { UploadOptions, UploadResult, deleteFile, getFileUrl, getStorageInstance, uploadFile } from './storage/index.js';
4
+ export { limit, orderBy, serverTimestamp, where } from 'firebase/firestore';
5
+ import 'firebase/storage';
6
+
7
+ declare function initFirebase(config: FirebaseOptions): FirebaseApp;
8
+ declare function getFirebaseApp(): FirebaseApp;
9
+
10
+ export { getFirebaseApp, initFirebase };
package/dist/index.js ADDED
@@ -0,0 +1,157 @@
1
+ // src/core.ts
2
+ import {
3
+ initializeApp,
4
+ getApps,
5
+ getApp
6
+ } from "firebase/app";
7
+ var app = null;
8
+ function initFirebase(config) {
9
+ if (getApps().length > 0) {
10
+ app = getApp();
11
+ return app;
12
+ }
13
+ app = initializeApp(config);
14
+ return app;
15
+ }
16
+ function getFirebaseApp() {
17
+ if (!app) {
18
+ throw new Error(
19
+ "@codefire/firebase-react: Firebase has not been initialized. Call initFirebase(config) before using Firestore or Storage."
20
+ );
21
+ }
22
+ return app;
23
+ }
24
+
25
+ // src/firestore/index.ts
26
+ import {
27
+ getFirestore,
28
+ collection,
29
+ doc,
30
+ addDoc,
31
+ setDoc,
32
+ updateDoc,
33
+ deleteDoc,
34
+ getDoc,
35
+ getDocs,
36
+ query,
37
+ where,
38
+ orderBy,
39
+ limit,
40
+ serverTimestamp
41
+ } from "firebase/firestore";
42
+ function getDb() {
43
+ return getFirestore(getFirebaseApp());
44
+ }
45
+ async function addDocument(collectionName, data) {
46
+ const app2 = getFirebaseApp();
47
+ const firestore = getFirestore(app2);
48
+ const ref2 = await addDoc(collection(firestore, collectionName), {
49
+ ...data,
50
+ createdAt: serverTimestamp()
51
+ });
52
+ return ref2.id;
53
+ }
54
+ async function setDocument(collectionName, docId, data) {
55
+ const app2 = getFirebaseApp();
56
+ const firestore = getFirestore(app2);
57
+ await setDoc(doc(firestore, collectionName, docId), {
58
+ ...data,
59
+ updatedAt: serverTimestamp()
60
+ });
61
+ }
62
+ async function updateDocument(collectionName, docId, data) {
63
+ const app2 = getFirebaseApp();
64
+ const firestore = getFirestore(app2);
65
+ await updateDoc(doc(firestore, collectionName, docId), {
66
+ ...data,
67
+ updatedAt: serverTimestamp()
68
+ });
69
+ }
70
+ async function deleteDocument(collectionName, docId) {
71
+ const app2 = getFirebaseApp();
72
+ const firestore = getFirestore(app2);
73
+ await deleteDoc(doc(firestore, collectionName, docId));
74
+ }
75
+ async function getDocument(collectionName, docId) {
76
+ const app2 = getFirebaseApp();
77
+ const firestore = getFirestore(app2);
78
+ const snap = await getDoc(doc(firestore, collectionName, docId));
79
+ if (!snap.exists()) return null;
80
+ return { id: snap.id, ...snap.data() };
81
+ }
82
+ async function queryCollection(collectionName, constraints = []) {
83
+ const app2 = getFirebaseApp();
84
+ const firestore = getFirestore(app2);
85
+ const q = query(collection(firestore, collectionName), ...constraints);
86
+ const snap = await getDocs(q);
87
+ return snap.docs.map((d) => ({ id: d.id, ...d.data() }));
88
+ }
89
+
90
+ // src/storage/index.ts
91
+ import {
92
+ getStorage,
93
+ ref,
94
+ uploadBytesResumable,
95
+ getDownloadURL,
96
+ deleteObject
97
+ } from "firebase/storage";
98
+ function getStorageInstance() {
99
+ return getStorage(getFirebaseApp());
100
+ }
101
+ function buildPath(file, options) {
102
+ const ext = file.name.split(".").pop() ?? "";
103
+ const name = options.fileName ? `${options.fileName}.${ext}` : `${crypto.randomUUID()}.${ext}`;
104
+ return options.folder ? `${options.folder}/${name}` : name;
105
+ }
106
+ function uploadFile(file, options = {}) {
107
+ const storage = getStorageInstance();
108
+ return new Promise((resolve, reject) => {
109
+ const path = buildPath(file, options);
110
+ const storageRef = ref(storage, path);
111
+ const task = uploadBytesResumable(storageRef, file);
112
+ task.on(
113
+ "state_changed",
114
+ (snapshot) => {
115
+ if (options.onProgress) {
116
+ const percent = Math.round(
117
+ snapshot.bytesTransferred / snapshot.totalBytes * 100
118
+ );
119
+ options.onProgress(percent);
120
+ }
121
+ },
122
+ (error) => reject(error),
123
+ async () => {
124
+ const url = await getDownloadURL(task.snapshot.ref);
125
+ resolve({ url, path });
126
+ }
127
+ );
128
+ });
129
+ }
130
+ async function deleteFile(path) {
131
+ const storage = getStorageInstance();
132
+ await deleteObject(ref(storage, path));
133
+ }
134
+ async function getFileUrl(path) {
135
+ const storage = getStorageInstance();
136
+ return getDownloadURL(ref(storage, path));
137
+ }
138
+ export {
139
+ addDocument,
140
+ deleteDocument,
141
+ deleteFile,
142
+ getDb,
143
+ getDocument,
144
+ getFileUrl,
145
+ getFirebaseApp,
146
+ getStorageInstance,
147
+ initFirebase,
148
+ limit,
149
+ orderBy,
150
+ queryCollection,
151
+ serverTimestamp,
152
+ setDocument,
153
+ updateDocument,
154
+ uploadFile,
155
+ where
156
+ };
157
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core.ts","../src/firestore/index.ts","../src/storage/index.ts"],"sourcesContent":["import {\n initializeApp,\n getApps,\n getApp,\n type FirebaseApp,\n type FirebaseOptions,\n} from \"firebase/app\";\n\nlet app: FirebaseApp | null = null;\n\nexport function initFirebase(config: FirebaseOptions): FirebaseApp {\n if (getApps().length > 0) {\n app = getApp();\n return app;\n }\n app = initializeApp(config);\n return app;\n}\n\nexport function getFirebaseApp(): FirebaseApp {\n if (!app) {\n throw new Error(\n \"@codefire/firebase-react: Firebase has not been initialized. Call initFirebase(config) before using Firestore or Storage.\"\n );\n }\n return app;\n}\n","import {\n getFirestore,\n collection,\n doc,\n addDoc,\n setDoc,\n updateDoc,\n deleteDoc,\n getDoc,\n getDocs,\n query,\n where,\n orderBy,\n limit,\n serverTimestamp,\n type DocumentData,\n type QueryConstraint,\n type WithFieldValue,\n type UpdateData,\n type Firestore,\n} from \"firebase/firestore\";\nimport { getFirebaseApp } from \"../core\";\n\nexport function getDb(): Firestore {\n return getFirestore(getFirebaseApp());\n}\n\nexport { serverTimestamp, where, orderBy, limit };\n\nexport async function addDocument<T extends WithFieldValue<DocumentData>>(\n collectionName: string,\n data: T\n): Promise<string> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n const ref = await addDoc(collection(firestore, collectionName), {\n ...data,\n createdAt: serverTimestamp(),\n });\n return ref.id;\n}\n\nexport async function setDocument<T extends WithFieldValue<DocumentData>>(\n collectionName: string,\n docId: string,\n data: T\n): Promise<void> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n await setDoc(doc(firestore, collectionName, docId), {\n ...data,\n updatedAt: serverTimestamp(),\n });\n}\n\nexport async function updateDocument<T extends DocumentData>(\n collectionName: string,\n docId: string,\n data: UpdateData<T>\n): Promise<void> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n await updateDoc(doc(firestore, collectionName, docId), {\n ...data,\n updatedAt: serverTimestamp(),\n });\n}\n\nexport async function deleteDocument(\n collectionName: string,\n docId: string\n): Promise<void> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n await deleteDoc(doc(firestore, collectionName, docId));\n}\n\nexport async function getDocument<T = DocumentData>(\n collectionName: string,\n docId: string\n): Promise<(T & { id: string }) | null> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n const snap = await getDoc(doc(firestore, collectionName, docId));\n if (!snap.exists()) return null;\n return { id: snap.id, ...(snap.data() as T) };\n}\n\nexport async function queryCollection<T = DocumentData>(\n collectionName: string,\n constraints: QueryConstraint[] = []\n): Promise<(T & { id: string })[]> {\n const app = getFirebaseApp();\n const firestore = getFirestore(app);\n const q = query(collection(firestore, collectionName), ...constraints);\n const snap = await getDocs(q);\n return snap.docs.map((d) => ({ id: d.id, ...(d.data() as T) }));\n}\n","import {\n getStorage,\n ref,\n uploadBytesResumable,\n getDownloadURL,\n deleteObject,\n type FirebaseStorage,\n type UploadTaskSnapshot,\n} from \"firebase/storage\";\nimport { getFirebaseApp } from \"../core\";\n\nexport function getStorageInstance(): FirebaseStorage {\n return getStorage(getFirebaseApp());\n}\n\nexport interface UploadResult {\n url: string;\n path: string;\n}\n\nexport interface UploadOptions {\n folder?: string;\n fileName?: string;\n onProgress?: (percent: number) => void;\n}\n\nfunction buildPath(file: File, options: UploadOptions): string {\n const ext = file.name.split(\".\").pop() ?? \"\";\n const name = options.fileName\n ? `${options.fileName}.${ext}`\n : `${crypto.randomUUID()}.${ext}`;\n return options.folder ? `${options.folder}/${name}` : name;\n}\n\nexport function uploadFile(\n file: File,\n options: UploadOptions = {}\n): Promise<UploadResult> {\n const storage = getStorageInstance();\n return new Promise((resolve, reject) => {\n const path = buildPath(file, options);\n const storageRef = ref(storage, path);\n const task = uploadBytesResumable(storageRef, file);\n\n task.on(\n \"state_changed\",\n (snapshot: UploadTaskSnapshot) => {\n if (options.onProgress) {\n const percent = Math.round(\n (snapshot.bytesTransferred / snapshot.totalBytes) * 100\n );\n options.onProgress(percent);\n }\n },\n (error) => reject(error),\n async () => {\n const url = await getDownloadURL(task.snapshot.ref);\n resolve({ url, path });\n }\n );\n });\n}\n\nexport async function deleteFile(path: string): Promise<void> {\n const storage = getStorageInstance();\n await deleteObject(ref(storage, path));\n}\n\nexport async function getFileUrl(path: string): Promise<string> {\n const storage = getStorageInstance();\n return getDownloadURL(ref(storage, path));\n}\n"],"mappings":"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","names":["app","ref"]}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/storage/index.ts
21
+ var storage_exports = {};
22
+ __export(storage_exports, {
23
+ deleteFile: () => deleteFile,
24
+ getFileUrl: () => getFileUrl,
25
+ getStorageInstance: () => getStorageInstance,
26
+ uploadFile: () => uploadFile
27
+ });
28
+ module.exports = __toCommonJS(storage_exports);
29
+ var import_storage = require("firebase/storage");
30
+
31
+ // src/core.ts
32
+ var import_app = require("firebase/app");
33
+ var app = null;
34
+ function getFirebaseApp() {
35
+ if (!app) {
36
+ throw new Error(
37
+ "@codefire/firebase-react: Firebase has not been initialized. Call initFirebase(config) before using Firestore or Storage."
38
+ );
39
+ }
40
+ return app;
41
+ }
42
+
43
+ // src/storage/index.ts
44
+ function getStorageInstance() {
45
+ return (0, import_storage.getStorage)(getFirebaseApp());
46
+ }
47
+ function buildPath(file, options) {
48
+ const ext = file.name.split(".").pop() ?? "";
49
+ const name = options.fileName ? `${options.fileName}.${ext}` : `${crypto.randomUUID()}.${ext}`;
50
+ return options.folder ? `${options.folder}/${name}` : name;
51
+ }
52
+ function uploadFile(file, options = {}) {
53
+ const storage = getStorageInstance();
54
+ return new Promise((resolve, reject) => {
55
+ const path = buildPath(file, options);
56
+ const storageRef = (0, import_storage.ref)(storage, path);
57
+ const task = (0, import_storage.uploadBytesResumable)(storageRef, file);
58
+ task.on(
59
+ "state_changed",
60
+ (snapshot) => {
61
+ if (options.onProgress) {
62
+ const percent = Math.round(
63
+ snapshot.bytesTransferred / snapshot.totalBytes * 100
64
+ );
65
+ options.onProgress(percent);
66
+ }
67
+ },
68
+ (error) => reject(error),
69
+ async () => {
70
+ const url = await (0, import_storage.getDownloadURL)(task.snapshot.ref);
71
+ resolve({ url, path });
72
+ }
73
+ );
74
+ });
75
+ }
76
+ async function deleteFile(path) {
77
+ const storage = getStorageInstance();
78
+ await (0, import_storage.deleteObject)((0, import_storage.ref)(storage, path));
79
+ }
80
+ async function getFileUrl(path) {
81
+ const storage = getStorageInstance();
82
+ return (0, import_storage.getDownloadURL)((0, import_storage.ref)(storage, path));
83
+ }
84
+ // Annotate the CommonJS export names for ESM import in node:
85
+ 0 && (module.exports = {
86
+ deleteFile,
87
+ getFileUrl,
88
+ getStorageInstance,
89
+ uploadFile
90
+ });
91
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/storage/index.ts","../../src/core.ts"],"sourcesContent":["import {\n getStorage,\n ref,\n uploadBytesResumable,\n getDownloadURL,\n deleteObject,\n type FirebaseStorage,\n type UploadTaskSnapshot,\n} from \"firebase/storage\";\nimport { getFirebaseApp } from \"../core\";\n\nexport function getStorageInstance(): FirebaseStorage {\n return getStorage(getFirebaseApp());\n}\n\nexport interface UploadResult {\n url: string;\n path: string;\n}\n\nexport interface UploadOptions {\n folder?: string;\n fileName?: string;\n onProgress?: (percent: number) => void;\n}\n\nfunction buildPath(file: File, options: UploadOptions): string {\n const ext = file.name.split(\".\").pop() ?? \"\";\n const name = options.fileName\n ? `${options.fileName}.${ext}`\n : `${crypto.randomUUID()}.${ext}`;\n return options.folder ? `${options.folder}/${name}` : name;\n}\n\nexport function uploadFile(\n file: File,\n options: UploadOptions = {}\n): Promise<UploadResult> {\n const storage = getStorageInstance();\n return new Promise((resolve, reject) => {\n const path = buildPath(file, options);\n const storageRef = ref(storage, path);\n const task = uploadBytesResumable(storageRef, file);\n\n task.on(\n \"state_changed\",\n (snapshot: UploadTaskSnapshot) => {\n if (options.onProgress) {\n const percent = Math.round(\n (snapshot.bytesTransferred / snapshot.totalBytes) * 100\n );\n options.onProgress(percent);\n }\n },\n (error) => reject(error),\n async () => {\n const url = await getDownloadURL(task.snapshot.ref);\n resolve({ url, path });\n }\n );\n });\n}\n\nexport async function deleteFile(path: string): Promise<void> {\n const storage = getStorageInstance();\n await deleteObject(ref(storage, path));\n}\n\nexport async function getFileUrl(path: string): Promise<string> {\n const storage = getStorageInstance();\n return getDownloadURL(ref(storage, path));\n}\n","import {\n initializeApp,\n getApps,\n getApp,\n type FirebaseApp,\n type FirebaseOptions,\n} from \"firebase/app\";\n\nlet app: FirebaseApp | null = null;\n\nexport function initFirebase(config: FirebaseOptions): FirebaseApp {\n if (getApps().length > 0) {\n app = getApp();\n return app;\n }\n app = initializeApp(config);\n return app;\n}\n\nexport function getFirebaseApp(): FirebaseApp {\n if (!app) {\n throw new Error(\n \"@codefire/firebase-react: Firebase has not been initialized. Call initFirebase(config) before using Firestore or Storage.\"\n );\n }\n return app;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAQO;;;ACRP,iBAMO;AAEP,IAAI,MAA0B;AAWvB,SAAS,iBAA8B;AAC5C,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;ADfO,SAAS,qBAAsC;AACpD,aAAO,2BAAW,eAAe,CAAC;AACpC;AAaA,SAAS,UAAU,MAAY,SAAgC;AAC7D,QAAM,MAAM,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;AAC1C,QAAM,OAAO,QAAQ,WACjB,GAAG,QAAQ,QAAQ,IAAI,GAAG,KAC1B,GAAG,OAAO,WAAW,CAAC,IAAI,GAAG;AACjC,SAAO,QAAQ,SAAS,GAAG,QAAQ,MAAM,IAAI,IAAI,KAAK;AACxD;AAEO,SAAS,WACd,MACA,UAAyB,CAAC,GACH;AACvB,QAAM,UAAU,mBAAmB;AACnC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,OAAO,UAAU,MAAM,OAAO;AACpC,UAAM,iBAAa,oBAAI,SAAS,IAAI;AACpC,UAAM,WAAO,qCAAqB,YAAY,IAAI;AAElD,SAAK;AAAA,MACH;AAAA,MACA,CAAC,aAAiC;AAChC,YAAI,QAAQ,YAAY;AACtB,gBAAM,UAAU,KAAK;AAAA,YAClB,SAAS,mBAAmB,SAAS,aAAc;AAAA,UACtD;AACA,kBAAQ,WAAW,OAAO;AAAA,QAC5B;AAAA,MACF;AAAA,MACA,CAAC,UAAU,OAAO,KAAK;AAAA,MACvB,YAAY;AACV,cAAM,MAAM,UAAM,+BAAe,KAAK,SAAS,GAAG;AAClD,gBAAQ,EAAE,KAAK,KAAK,CAAC;AAAA,MACvB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,WAAW,MAA6B;AAC5D,QAAM,UAAU,mBAAmB;AACnC,YAAM,iCAAa,oBAAI,SAAS,IAAI,CAAC;AACvC;AAEA,eAAsB,WAAW,MAA+B;AAC9D,QAAM,UAAU,mBAAmB;AACnC,aAAO,mCAAe,oBAAI,SAAS,IAAI,CAAC;AAC1C;","names":[]}
@@ -0,0 +1,17 @@
1
+ import { FirebaseStorage } from 'firebase/storage';
2
+
3
+ declare function getStorageInstance(): FirebaseStorage;
4
+ interface UploadResult {
5
+ url: string;
6
+ path: string;
7
+ }
8
+ interface UploadOptions {
9
+ folder?: string;
10
+ fileName?: string;
11
+ onProgress?: (percent: number) => void;
12
+ }
13
+ declare function uploadFile(file: File, options?: UploadOptions): Promise<UploadResult>;
14
+ declare function deleteFile(path: string): Promise<void>;
15
+ declare function getFileUrl(path: string): Promise<string>;
16
+
17
+ export { type UploadOptions, type UploadResult, deleteFile, getFileUrl, getStorageInstance, uploadFile };
@@ -0,0 +1,17 @@
1
+ import { FirebaseStorage } from 'firebase/storage';
2
+
3
+ declare function getStorageInstance(): FirebaseStorage;
4
+ interface UploadResult {
5
+ url: string;
6
+ path: string;
7
+ }
8
+ interface UploadOptions {
9
+ folder?: string;
10
+ fileName?: string;
11
+ onProgress?: (percent: number) => void;
12
+ }
13
+ declare function uploadFile(file: File, options?: UploadOptions): Promise<UploadResult>;
14
+ declare function deleteFile(path: string): Promise<void>;
15
+ declare function getFileUrl(path: string): Promise<string>;
16
+
17
+ export { type UploadOptions, type UploadResult, deleteFile, getFileUrl, getStorageInstance, uploadFile };
@@ -0,0 +1,73 @@
1
+ // src/storage/index.ts
2
+ import {
3
+ getStorage,
4
+ ref,
5
+ uploadBytesResumable,
6
+ getDownloadURL,
7
+ deleteObject
8
+ } from "firebase/storage";
9
+
10
+ // src/core.ts
11
+ import {
12
+ initializeApp,
13
+ getApps,
14
+ getApp
15
+ } from "firebase/app";
16
+ var app = null;
17
+ function getFirebaseApp() {
18
+ if (!app) {
19
+ throw new Error(
20
+ "@codefire/firebase-react: Firebase has not been initialized. Call initFirebase(config) before using Firestore or Storage."
21
+ );
22
+ }
23
+ return app;
24
+ }
25
+
26
+ // src/storage/index.ts
27
+ function getStorageInstance() {
28
+ return getStorage(getFirebaseApp());
29
+ }
30
+ function buildPath(file, options) {
31
+ const ext = file.name.split(".").pop() ?? "";
32
+ const name = options.fileName ? `${options.fileName}.${ext}` : `${crypto.randomUUID()}.${ext}`;
33
+ return options.folder ? `${options.folder}/${name}` : name;
34
+ }
35
+ function uploadFile(file, options = {}) {
36
+ const storage = getStorageInstance();
37
+ return new Promise((resolve, reject) => {
38
+ const path = buildPath(file, options);
39
+ const storageRef = ref(storage, path);
40
+ const task = uploadBytesResumable(storageRef, file);
41
+ task.on(
42
+ "state_changed",
43
+ (snapshot) => {
44
+ if (options.onProgress) {
45
+ const percent = Math.round(
46
+ snapshot.bytesTransferred / snapshot.totalBytes * 100
47
+ );
48
+ options.onProgress(percent);
49
+ }
50
+ },
51
+ (error) => reject(error),
52
+ async () => {
53
+ const url = await getDownloadURL(task.snapshot.ref);
54
+ resolve({ url, path });
55
+ }
56
+ );
57
+ });
58
+ }
59
+ async function deleteFile(path) {
60
+ const storage = getStorageInstance();
61
+ await deleteObject(ref(storage, path));
62
+ }
63
+ async function getFileUrl(path) {
64
+ const storage = getStorageInstance();
65
+ return getDownloadURL(ref(storage, path));
66
+ }
67
+ export {
68
+ deleteFile,
69
+ getFileUrl,
70
+ getStorageInstance,
71
+ uploadFile
72
+ };
73
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/storage/index.ts","../../src/core.ts"],"sourcesContent":["import {\n getStorage,\n ref,\n uploadBytesResumable,\n getDownloadURL,\n deleteObject,\n type FirebaseStorage,\n type UploadTaskSnapshot,\n} from \"firebase/storage\";\nimport { getFirebaseApp } from \"../core\";\n\nexport function getStorageInstance(): FirebaseStorage {\n return getStorage(getFirebaseApp());\n}\n\nexport interface UploadResult {\n url: string;\n path: string;\n}\n\nexport interface UploadOptions {\n folder?: string;\n fileName?: string;\n onProgress?: (percent: number) => void;\n}\n\nfunction buildPath(file: File, options: UploadOptions): string {\n const ext = file.name.split(\".\").pop() ?? \"\";\n const name = options.fileName\n ? `${options.fileName}.${ext}`\n : `${crypto.randomUUID()}.${ext}`;\n return options.folder ? `${options.folder}/${name}` : name;\n}\n\nexport function uploadFile(\n file: File,\n options: UploadOptions = {}\n): Promise<UploadResult> {\n const storage = getStorageInstance();\n return new Promise((resolve, reject) => {\n const path = buildPath(file, options);\n const storageRef = ref(storage, path);\n const task = uploadBytesResumable(storageRef, file);\n\n task.on(\n \"state_changed\",\n (snapshot: UploadTaskSnapshot) => {\n if (options.onProgress) {\n const percent = Math.round(\n (snapshot.bytesTransferred / snapshot.totalBytes) * 100\n );\n options.onProgress(percent);\n }\n },\n (error) => reject(error),\n async () => {\n const url = await getDownloadURL(task.snapshot.ref);\n resolve({ url, path });\n }\n );\n });\n}\n\nexport async function deleteFile(path: string): Promise<void> {\n const storage = getStorageInstance();\n await deleteObject(ref(storage, path));\n}\n\nexport async function getFileUrl(path: string): Promise<string> {\n const storage = getStorageInstance();\n return getDownloadURL(ref(storage, path));\n}\n","import {\n initializeApp,\n getApps,\n getApp,\n type FirebaseApp,\n type FirebaseOptions,\n} from \"firebase/app\";\n\nlet app: FirebaseApp | null = null;\n\nexport function initFirebase(config: FirebaseOptions): FirebaseApp {\n if (getApps().length > 0) {\n app = getApp();\n return app;\n }\n app = initializeApp(config);\n return app;\n}\n\nexport function getFirebaseApp(): FirebaseApp {\n if (!app) {\n throw new Error(\n \"@codefire/firebase-react: Firebase has not been initialized. Call initFirebase(config) before using Firestore or Storage.\"\n );\n }\n return app;\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;;;ACRP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAEP,IAAI,MAA0B;AAWvB,SAAS,iBAA8B;AAC5C,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;ADfO,SAAS,qBAAsC;AACpD,SAAO,WAAW,eAAe,CAAC;AACpC;AAaA,SAAS,UAAU,MAAY,SAAgC;AAC7D,QAAM,MAAM,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;AAC1C,QAAM,OAAO,QAAQ,WACjB,GAAG,QAAQ,QAAQ,IAAI,GAAG,KAC1B,GAAG,OAAO,WAAW,CAAC,IAAI,GAAG;AACjC,SAAO,QAAQ,SAAS,GAAG,QAAQ,MAAM,IAAI,IAAI,KAAK;AACxD;AAEO,SAAS,WACd,MACA,UAAyB,CAAC,GACH;AACvB,QAAM,UAAU,mBAAmB;AACnC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,OAAO,UAAU,MAAM,OAAO;AACpC,UAAM,aAAa,IAAI,SAAS,IAAI;AACpC,UAAM,OAAO,qBAAqB,YAAY,IAAI;AAElD,SAAK;AAAA,MACH;AAAA,MACA,CAAC,aAAiC;AAChC,YAAI,QAAQ,YAAY;AACtB,gBAAM,UAAU,KAAK;AAAA,YAClB,SAAS,mBAAmB,SAAS,aAAc;AAAA,UACtD;AACA,kBAAQ,WAAW,OAAO;AAAA,QAC5B;AAAA,MACF;AAAA,MACA,CAAC,UAAU,OAAO,KAAK;AAAA,MACvB,YAAY;AACV,cAAM,MAAM,MAAM,eAAe,KAAK,SAAS,GAAG;AAClD,gBAAQ,EAAE,KAAK,KAAK,CAAC;AAAA,MACvB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,WAAW,MAA6B;AAC5D,QAAM,UAAU,mBAAmB;AACnC,QAAM,aAAa,IAAI,SAAS,IAAI,CAAC;AACvC;AAEA,eAAsB,WAAW,MAA+B;AAC9D,QAAM,UAAU,mBAAmB;AACnC,SAAO,eAAe,IAAI,SAAS,IAAI,CAAC;AAC1C;","names":[]}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@codefire/firebase-react",
3
+ "version": "1.0.1",
4
+ "description": "Plug-and-play Firebase utilities for Firestore and Storage in React/frontend projects",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./firestore": {
16
+ "types": "./dist/firestore/index.d.ts",
17
+ "import": "./dist/firestore/index.js",
18
+ "require": "./dist/firestore/index.cjs"
19
+ },
20
+ "./storage": {
21
+ "types": "./dist/storage/index.d.ts",
22
+ "import": "./dist/storage/index.js",
23
+ "require": "./dist/storage/index.cjs"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "scripts": {
30
+ "build": "tsup",
31
+ "dev": "tsup --watch"
32
+ },
33
+ "peerDependencies": {
34
+ "firebase": ">=10.0.0"
35
+ },
36
+ "devDependencies": {
37
+ "firebase": "^12.10.0",
38
+ "tsup": "^8.3.5",
39
+ "typescript": "^5.7.2"
40
+ },
41
+ "keywords": [
42
+ "firebase",
43
+ "firestore",
44
+ "storage",
45
+ "react"
46
+ ],
47
+ "license": "MIT"
48
+ }