@donotdev/crud 0.0.2 → 0.0.3

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/useCrud.d.ts CHANGED
@@ -1,9 +1,13 @@
1
- import type { dndevSchema } from '@donotdev/core';
1
+ import type { dndevSchema, FeatureStatus } from '@donotdev/core';
2
2
  import { type BackendType } from './CrudStore';
3
- import type { QueryOptions } from './CrudService';
3
+ import { type QueryOptions } from './CrudService';
4
4
  export interface UseCrudOptions<T> {
5
5
  backend?: BackendType;
6
6
  schema?: dndevSchema<T>;
7
+ /** TanStack Query stale time in ms (default: 5 min) */
8
+ staleTime?: number;
9
+ /** Disable caching (bypass TanStack Query) */
10
+ noCache?: boolean;
7
11
  }
8
12
  /**
9
13
  * Selector type for useCrud hook
@@ -13,27 +17,13 @@ export type CrudSelector = 'isAvailable';
13
17
  * React hook for CRUD operations
14
18
  *
15
19
  * @overload Selector mode - get global CRUD state
16
- * @param selector - 'isAvailable' to check if CRUD service is ready
17
- * @returns Selected value
18
- *
19
- * @example
20
- * ```tsx
21
- * const isAvailable = useCrud('isAvailable');
22
- * ```
23
20
  */
24
21
  export declare function useCrud(selector: 'isAvailable'): boolean;
25
22
  /**
26
23
  * @overload Collection mode - full CRUD operations
27
- * @param collection - Collection name
28
- * @param options - Options including backend type and schema
29
- * @returns CRUD operations and state
30
- *
31
- * @example
32
- * ```tsx
33
- * const { query, update, isAvailable } = useCrud<License>('licenses', { schema });
34
- * ```
35
24
  */
36
25
  export declare function useCrud<T = unknown>(collection: string, options?: UseCrudOptions<T>): {
26
+ status: FeatureStatus;
37
27
  data: T | null;
38
28
  loading: boolean;
39
29
  error: Error | null;
@@ -45,6 +35,8 @@ export declare function useCrud<T = unknown>(collection: string, options?: UseCr
45
35
  query: (options: QueryOptions) => Promise<T[]>;
46
36
  subscribe: (id: string, callback: (data: T | null, error?: Error) => void) => () => void;
47
37
  subscribeToCollection: (options: QueryOptions, callback: (data: T[], error?: Error) => void) => () => void;
38
+ /** Invalidate cache for this collection */
39
+ invalidate: () => Promise<void>;
48
40
  isAvailable: boolean;
49
41
  };
50
42
  //# sourceMappingURL=useCrud.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useCrud.d.ts","sourceRoot":"","sources":["../src/useCrud.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAIlD,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,KAAK,EAAwB,YAAY,EAAE,MAAM,eAAe,CAAC;AASxE,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC;AAEzC;;;;;;;;;;;GAWG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EACjC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAC1B;IACD,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvC,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,KAAK,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/C,SAAS,EAAE,CACT,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,KAC9C,MAAM,IAAI,CAAC;IAChB,qBAAqB,EAAE,CACrB,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,KACzC,MAAM,IAAI,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC"}
1
+ {"version":3,"file":"useCrud.d.ts","sourceRoot":"","sources":["../src/useCrud.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAQjE,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAA6C,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAkC7F,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC;AAEzC;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC;AAE1D;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EACjC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAC1B;IACD,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvC,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,KAAK,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/C,SAAS,EAAE,CACT,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,KAC9C,MAAM,IAAI,CAAC;IAChB,qBAAqB,EAAE,CACrB,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,KACzC,MAAM,IAAI,CAAC;IAChB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC"}
package/dist/useCrud.js CHANGED
@@ -1 +1 @@
1
- "use client";import{useEffect as w}from"react";import{DEGRADED_CRUD_API as D,useFeatureConsent as F}from"@donotdev/core";import{FRAMEWORK_FEATURES as k,handleError as T,isClient as U}from"@donotdev/core";import{useCrudStore as i}from"./CrudStore";let t=null,o=null,u=!1;function q(d,b={}){const l=F(k.CRUD),S=i(e=>e.crudService!==null);if(d==="isAvailable")return l?S:D.isAvailable;const a=d,n=b.backend||"firestore",s=b.schema;w(()=>{if(!U()||!l||!s)return;const{backend:e}=i.getState();if(!(e===n&&t)){if(o){o.then(()=>{});return}o=(async()=>{try{const{getCrudService:r}=await import("./CrudService"),c=r();t=c,c.setStore(i),await c.initialize(n),u=!1}catch(r){u||(T(r,{userMessage:"Failed to initialize CRUD service. Please refresh the page.",context:{backend:n,collection:a},severity:"error"}),u=!0)}finally{o=null}})()}},[l,n,s]);const y=async e=>t?t.get(a,e,s):null,f=async(e,r)=>{t&&await t.set(a,e,r,s)},C=async(e,r)=>{t&&await t.update(a,e,r)},g=async e=>{t&&await t.delete(a,e)},m=async e=>t?t.add(a,e,s):"",p=async e=>t?t.query(a,e,s):[],v=(e,r)=>t?t.subscribe(a,e,r,s):()=>{},A=(e,r)=>t?t.subscribeToCollection(a,e,r,s):()=>{},E=i(e=>e.collections[a]?.data.current||null),R=i(e=>e.collections[a]?.loading||!1),h=i(e=>e.collections[a]?.error||null);return!l||!s||!t?{...D,data:E,loading:R,error:h,get:y,set:f,update:C,delete:g,add:m,query:p,subscribe:v,subscribeToCollection:A,isAvailable:!1}:{data:E,loading:R,error:h,get:y,set:f,update:C,delete:g,add:m,query:p,subscribe:v,subscribeToCollection:A,isAvailable:!0}}export{q as useCrud};
1
+ "use client";import{useEffect as O}from"react";import{DEGRADED_CRUD_API as K,FEATURE_STATUS as b,useFeatureConsent as _}from"@donotdev/core";import{FRAMEWORK_FEATURES as k,handleError as G,isClient as z}from"@donotdev/core";import{useCrudStore as l}from"./CrudStore";import{getCrudService as M}from"./CrudService";let r=null,a=null,m=null,q=!1;const h=1e3*60*5;async function I(){if(a)return a;const{QueryClient:o}=await import("@tanstack/react-query");return a=new o({defaultOptions:{queries:{staleTime:h,gcTime:1e3*60*30,retry:1,refetchOnWindowFocus:!1}}}),a}function x(o,d={}){const c=_(k.CRUD),U=l(e=>e.crudService!==null);if(o==="isAvailable")return c?U:K.isAvailable;const t=o,y=d.backend||"firestore",s=d.schema,g=d.staleTime??h,n=d.noCache??!1;O(()=>{if(!z()||!c||!s)return;const{backend:e}=l.getState();e===y&&r||m||(m=(async()=>{try{const i=M();r=i,i.setStore(l),await i.initialize(y),q=!1}catch(i){q||(G(i,{userMessage:"Failed to initialize CRUD service.",context:{backend:y,collection:t},severity:"error"}),q=!0)}finally{m=null}})())},[c,y,s]);const v=async e=>r?n?r.get(t,e,s):(await I()).fetchQuery({queryKey:["crud",t,"get",e],queryFn:()=>r.get(t,e,s),staleTime:g}):null,A=async(e,i)=>{r&&(await r.set(t,e,i,s),!n&&a&&a.invalidateQueries({queryKey:["crud",t]}))},C=async(e,i)=>{r&&(await r.update(t,e,i),!n&&a&&a.invalidateQueries({queryKey:["crud",t]}))},D=async e=>{r&&(await r.delete(t,e),!n&&a&&a.invalidateQueries({queryKey:["crud",t]}))},E=async e=>{if(!r)return"";const i=await r.add(t,e,s);return!n&&a&&a.invalidateQueries({queryKey:["crud",t]}),i},T=async e=>r?n?r.query(t,e,s):(await I()).fetchQuery({queryKey:["crud",t,"query",JSON.stringify(e)],queryFn:()=>r.query(t,e,s),staleTime:g}):[],p=(e,i)=>r?r.subscribe(t,e,(u,f)=>{!n&&a&&u&&a.setQueryData(["crud",t,"get",e],u),i(u,f)},s):()=>{},w=(e,i)=>r?r.subscribeToCollection(t,e,(u,f)=>{!n&&a&&u&&a.setQueryData(["crud",t,"query",JSON.stringify(e)],u),i(u,f)},s):()=>{},R=async()=>{a&&await a.invalidateQueries({queryKey:["crud",t]})},Q=l(e=>e.collections[t]?.data.current||null),S=l(e=>e.collections[t]?.loading||!1),F=l(e=>e.collections[t]?.error||null),N=c?r?b.READY:b.INITIALIZING:b.DEGRADED;return!c||!s||!r?{...K,status:N,data:Q,loading:S,error:F,get:v,set:A,update:C,delete:D,add:E,query:T,subscribe:p,subscribeToCollection:w,invalidate:R,isAvailable:!1}:{status:b.READY,data:Q,loading:S,error:F,get:v,set:A,update:C,delete:D,add:E,query:T,subscribe:p,subscribeToCollection:w,invalidate:R,isAvailable:!0}}export{x as useCrud};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@donotdev/crud",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -47,11 +47,11 @@
47
47
  "type-check": "tsc --noEmit"
48
48
  },
49
49
  "dependencies": {
50
- "@donotdev/components": "0.0.2",
51
- "@donotdev/core": "0.0.2"
50
+ "@donotdev/components": "0.0.3",
51
+ "@donotdev/core": "0.0.3"
52
52
  },
53
53
  "peerDependencies": {
54
- "@donotdev/firebase": "0.0.2",
54
+ "@donotdev/firebase": "0.0.3",
55
55
  "@hookform/resolvers": "^5.2.2",
56
56
  "firebase": "^12.5.0",
57
57
  "lucide-react": "^0.562.0",