@donotdev/expo 0.0.3 → 0.0.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@donotdev/expo",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "description": "React Native/Expo UI components for DoNotDev framework",
@@ -51,8 +51,8 @@
51
51
  "test:coverage": "jest --coverage"
52
52
  },
53
53
  "dependencies": {
54
- "@donotdev/core": "^0.0.26",
55
- "@donotdev/crud": "^0.0.17",
54
+ "@donotdev/core": "^0.0.27",
55
+ "@donotdev/crud": "^0.0.18",
56
56
  "@expo/vector-icons": "^15.0.0",
57
57
  "@hookform/resolvers": "^5.2.2",
58
58
  "@react-native-async-storage/async-storage": "^2.1.0",
@@ -62,17 +62,18 @@
62
62
  "expo-clipboard": "^8.0.0",
63
63
  "expo-document-picker": "^14.0.0",
64
64
  "expo-router": "^6.0.0",
65
- "react-hook-form": "^7.71.1",
65
+ "react-hook-form": "^7.71.2",
66
66
  "react-native-safe-area-context": "^5.0.0"
67
67
  },
68
68
  "peerDependencies": {
69
- "@donotdev/auth": "^0.0.9",
70
- "@donotdev/billing": "^0.0.8",
71
- "@donotdev/oauth": "^0.0.8",
72
- "@donotdev/ui": "^0.0.15",
69
+ "@donotdev/auth": "^0.0.11",
70
+ "@donotdev/billing": "^0.0.10",
71
+ "@donotdev/oauth": "^0.0.10",
72
+ "@donotdev/ui": "^0.0.17",
73
73
  "@tanstack/react-query": "^5.0.0",
74
74
  "firebase": "^11.0.0",
75
75
  "react": "^19.2.4",
76
+ "react-dom": "^19.2.4",
76
77
  "react-native": "^0.84.0",
77
78
  "zustand": "^5.0.0"
78
79
  },
@@ -1,10 +0,0 @@
1
- /**
2
- * @fileoverview Atomic components smoke tests
3
- * @description Basic rendering tests to ensure components work
4
- *
5
- * @version 0.0.1
6
- * @since 0.0.1
7
- * @author AMBROISE PARK Consulting
8
- */
9
- export {};
10
- //# sourceMappingURL=atomic.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"atomic.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/components/atomic.test.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -1 +0,0 @@
1
- import{jsx as n,jsxs as y}from"react/jsx-runtime";import{describe as d,it as o,expect as t,vi as c}from"vitest";import{render as l,fireEvent as h}from"@testing-library/react-native";import T from"../../atomic/Button";import s from"../../atomic/Text";import g from"../../atomic/Card";import a from"../../atomic/Input";import B from"../../atomic/Stack";d("Atomic Components",()=>{d("Button",()=>{o("renders without crashing",()=>{const{getByText:e}=l(n(T,{children:"Test Button"}));t(e("Test Button")).toBeTruthy()}),o("calls onPress when pressed",()=>{const e=c.fn(),{getByText:r}=l(n(T,{onPress:e,children:"Click me"})),i=r("Click me");h.press(i),t(e).toHaveBeenCalledTimes(1)}),o("does not call onPress when disabled",()=>{const e=c.fn(),{getByText:r}=l(n(T,{onPress:e,disabled:!0,children:"Disabled Button"})),i=r("Disabled Button");h.press(i),t(e).not.toHaveBeenCalled()}),o("shows loading state correctly",()=>{const{getByText:e,queryByText:r}=l(n(T,{loading:!0,loadingText:"Loading...",children:"Original Text"}));t(e("Loading...")).toBeTruthy(),t(r("Original Text")).toBeNull()}),o("does not call onPress when loading",()=>{const e=c.fn(),{getByText:r}=l(n(T,{onPress:e,loading:!0,children:"Loading Button"})),i=r("Loading Button");h.press(i),t(e).not.toHaveBeenCalled()})}),d("Text",()=>{o("renders text content",()=>{const{getByText:e}=l(n(s,{children:"Hello World"}));t(e("Hello World")).toBeTruthy()}),o("renders with different levels",()=>{const{getByText:e}=l(n(s,{level:"h1",children:"Heading"}));t(e("Heading")).toBeTruthy()})}),d("Card",()=>{o("renders card with title",()=>{const{getByText:e}=l(n(g,{title:"Card Title",children:"Content"}));t(e("Card Title")).toBeTruthy(),t(e("Content")).toBeTruthy()})}),d("Input",()=>{o("renders input with placeholder",()=>{const{getByPlaceholderText:e}=l(n(a,{placeholder:"Enter text"}));t(e("Enter text")).toBeTruthy()}),o("renders input with label",()=>{const{getByText:e}=l(n(a,{label:"Name"}));t(e("Name")).toBeTruthy()}),o("calls onChangeText when text changes",()=>{const e=c.fn(),{getByPlaceholderText:r}=l(n(a,{placeholder:"Enter text",onChangeText:e})),i=r("Enter text");h.changeText(i,"Hello"),t(e).toHaveBeenCalledWith("Hello"),t(e).toHaveBeenCalledTimes(1)}),o("displays error message when provided",()=>{const{getByText:e}=l(n(a,{label:"Email",error:"Invalid email format"}));t(e("Invalid email format")).toBeTruthy()}),o("shows required indicator when required",()=>{const{getByText:e}=l(n(a,{label:"Name",required:!0})),r=e("Name");t(r).toBeTruthy()}),o("does not call onChangeText when disabled",()=>{const e=c.fn(),{getByPlaceholderText:r}=l(n(a,{placeholder:"Enter text",onChangeText:e,disabled:!0})),i=r("Enter text");h.changeText(i,"Hello"),t(e).not.toHaveBeenCalled()})}),d("Stack",()=>{o("renders children",()=>{const{getByText:e}=l(y(B,{children:[n(s,{children:"Item 1"}),n(s,{children:"Item 2"})]}));t(e("Item 1")).toBeTruthy(),t(e("Item 2")).toBeTruthy()}),o("applies gap spacing correctly",()=>{const{UNSAFE_getByType:e}=l(y(B,{gap:20,children:[n(s,{children:"Item 1"}),n(s,{children:"Item 2"})]})),r=e(B);t(r.props.gap).toBe(20)}),o("handles direction prop correctly",()=>{const{UNSAFE_getByType:e}=l(y(B,{direction:"row",children:[n(s,{children:"Item 1"}),n(s,{children:"Item 2"})]})),r=e(B);t(r.props.direction).toBe("row")})}),d("Card",()=>{o("renders card with title and content",()=>{const{getByText:e}=l(n(g,{title:"Card Title",children:"Card Content"}));t(e("Card Title")).toBeTruthy(),t(e("Card Content")).toBeTruthy()}),o("renders card with subtitle when provided",()=>{const{getByText:e}=l(n(g,{title:"Title",subtitle:"Subtitle",children:"Content"}));t(e("Subtitle")).toBeTruthy()}),o("renders card without title when not provided",()=>{const{getByText:e,queryByText:r}=l(n(g,{children:"Content only"}));t(e("Content only")).toBeTruthy(),t(r(/Title/i)).toBeNull()})}),d("Text",()=>{o("applies correct level styling",()=>{const{UNSAFE_getByType:e}=l(n(s,{level:"h1",children:"Heading"})),r=e(s);t(r.props.level).toBe("h1")}),o("renders with different levels correctly",()=>{["h1","h2","h3","h4","body","small","caption"].forEach(e=>{const{getByText:r,unmount:i}=l(y(s,{level:e,children:["Test ",e]}));t(r(`Test ${e}`)).toBeTruthy(),i()})})})});
@@ -1,10 +0,0 @@
1
- /**
2
- * @fileoverview ExpoAppProviders tests
3
- * @description Tests for ExpoAppProviders to ensure proper setup
4
- *
5
- * @version 0.0.1
6
- * @since 0.0.1
7
- * @author AMBROISE PARK Consulting
8
- */
9
- export {};
10
- //# sourceMappingURL=ExpoAppProviders.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExpoAppProviders.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/providers/ExpoAppProviders.test.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -1 +0,0 @@
1
- import{jsx as s}from"react/jsx-runtime";import{describe as a,it as r,expect as t,beforeEach as c,vi as l}from"vitest";import{render as o}from"@testing-library/react-native";import{ExpoAppProviders as i,getZustandAsyncStorage as m}from"../../providers/ExpoAppProviders";import{getStorageManager as g}from"@donotdev/core";import{Text as n}from"react-native";a("ExpoAppProviders",()=>{c(()=>{l.clearAllMocks(),delete globalThis._DNDEV_CONFIG_}),r("renders children",()=>{const{getByText:e}=o(s(i,{children:s(n,{children:"Test Content"})}));t(e("Test Content")).toBeTruthy()}),r("initializes platform detection",async()=>{o(s(i,{children:s(n,{children:"Test"})})),await new Promise(e=>setTimeout(e,10)),t(globalThis._DNDEV_CONFIG_).toBeDefined(),t(globalThis._DNDEV_CONFIG_.platform).toBe("expo")}),r("sets AsyncStorageStrategy in StorageManager",async()=>{o(s(i,{userId:"user123",children:s(n,{children:"Test"})})),await new Promise(d=>setTimeout(d,10));const e=g();t(e).toBeDefined()}),r("handles userId prop",async()=>{o(s(i,{userId:"user123",children:s(n,{children:"Test"})})),await new Promise(e=>setTimeout(e,10)),t(globalThis._DNDEV_CONFIG_).toBeDefined()})}),a("getZustandAsyncStorage",()=>{r("returns zustandAsyncStorage instance",()=>{const e=m();t(e).toBeDefined(),t(e.getItem).toBeDefined(),t(e.setItem).toBeDefined(),t(e.removeItem).toBeDefined()})});
@@ -1,10 +0,0 @@
1
- /**
2
- * @fileoverview Test setup for Expo package
3
- * @description Mocks React Native APIs and sets up test environment
4
- *
5
- * @version 0.0.2
6
- * @since 0.0.1
7
- * @author AMBROISE PARK Consulting
8
- */
9
- export {};
10
- //# sourceMappingURL=setup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG"}
@@ -1 +0,0 @@
1
- import"react";jest.mock("react-native",()=>{const t=require("react");return{View:t.forwardRef(({children:e,...s},r)=>t.createElement("View",{...s,ref:r},e)),Text:t.forwardRef(({children:e,...s},r)=>t.createElement("Text",{...s,ref:r},e)),TouchableOpacity:t.forwardRef(({children:e,onPress:s,...r},n)=>t.createElement("TouchableOpacity",{...r,ref:n,onPress:s},e)),ScrollView:t.forwardRef(({children:e,...s},r)=>t.createElement("ScrollView",{...s,ref:r},e)),TextInput:t.forwardRef((e,s)=>t.createElement("TextInput",{...e,ref:s})),Modal:({children:e,...s})=>t.createElement("Modal",s,e),ActivityIndicator:e=>t.createElement("ActivityIndicator",e),Switch:e=>t.createElement("Switch",e),Image:t.forwardRef((e,s)=>t.createElement("Image",{...e,ref:s})),Platform:{OS:"ios",select:jest.fn(e=>e.ios||e.default)},Linking:{openURL:jest.fn(()=>Promise.resolve())},Clipboard:{setString:jest.fn(()=>Promise.resolve()),getString:jest.fn(()=>Promise.resolve(""))},StyleSheet:{create:jest.fn(e=>e),absoluteFill:{}},Animated:{View:"Animated.View",Value:jest.fn(()=>({setValue:jest.fn(),addListener:jest.fn(),removeListener:jest.fn()})),timing:jest.fn(()=>({start:jest.fn(e=>e?.())}))}}}),jest.mock("@react-native-async-storage/async-storage",()=>{const t=new Map;return{__esModule:!0,default:{getItem:jest.fn(e=>Promise.resolve(t.get(e)||null)),setItem:jest.fn((e,s)=>(t.set(e,s),Promise.resolve())),removeItem:jest.fn(e=>(t.delete(e),Promise.resolve())),getAllKeys:jest.fn(()=>Promise.resolve(Array.from(t.keys()))),multiRemove:jest.fn(e=>(e.forEach(s=>t.delete(s)),Promise.resolve())),clear:jest.fn(()=>(t.clear(),Promise.resolve()))}}}),jest.mock("expo-router",()=>({useRouter:jest.fn(()=>({push:jest.fn(),replace:jest.fn(),back:jest.fn(),setParams:jest.fn()})),useLocalSearchParams:jest.fn(()=>({})),usePathname:jest.fn(()=>"/"),useSegments:jest.fn(()=>[]),Link:"Link",useNavigation:jest.fn(()=>({navigate:jest.fn(),goBack:jest.fn()}))})),jest.mock("expo-av",()=>({Video:"Video",ResizeMode:{CONTAIN:"contain",COVER:"cover",STRETCH:"stretch"}})),jest.mock("expo-clipboard",()=>({setStringAsync:jest.fn(()=>Promise.resolve()),getStringAsync:jest.fn(()=>Promise.resolve(""))})),jest.mock("expo-document-picker",()=>({getDocumentAsync:jest.fn(()=>Promise.resolve({canceled:!1,assets:[{uri:"file://test.pdf",name:"test.pdf",mimeType:"application/pdf",size:1024}]}))})),jest.mock("@react-native-community/datetimepicker",()=>({default:"DateTimePicker"})),jest.mock("react-native-safe-area-context",()=>({SafeAreaProvider:({children:t})=>t,useSafeAreaInsets:jest.fn(()=>({top:0,bottom:0,left:0,right:0}))})),jest.mock("firebase/auth",()=>({getAuth:jest.fn(()=>({})),initializeAuth:jest.fn(()=>({})),getReactNativePersistence:jest.fn(()=>({}))})),jest.mock("firebase/app",()=>({getApp:jest.fn(()=>({}))})),jest.mock("@tanstack/react-query",()=>({QueryClient:jest.fn(()=>({})),QueryClientProvider:({children:t})=>t})),beforeEach(()=>{delete globalThis._DNDEV_CONFIG_,delete globalThis._DNDEV_STORES_});
@@ -1,22 +0,0 @@
1
- /**
2
- * @fileoverview Test utilities for Expo package
3
- * @description Shared utilities for testing Expo components and utilities
4
- *
5
- * @version 0.0.2
6
- * @since 0.0.1
7
- * @author AMBROISE PARK Consulting
8
- */
9
- import AsyncStorage from '@react-native-async-storage/async-storage';
10
- /**
11
- * Create a mock AsyncStorage with in-memory storage
12
- */
13
- export declare function createMockAsyncStorage(): typeof AsyncStorage;
14
- /**
15
- * Clear all mocks and reset state
16
- */
17
- export declare function resetMocks(): void;
18
- /**
19
- * Wait for async operations
20
- */
21
- export declare function waitFor(ms: number): Promise<unknown>;
22
- //# sourceMappingURL=test-utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../src/__tests__/test-utils.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAEH,OAAO,YAAY,MAAM,2CAA2C,CAAC;AAErE;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,YAAY,CAyB5D;AAED;;GAEG;AACH,wBAAgB,UAAU,SAIzB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,oBAEjC"}
@@ -1 +0,0 @@
1
- import"@react-native-async-storage/async-storage";function c(){const t=new Map;return{getItem:async e=>t.get(e)||null,setItem:async(e,s)=>{t.set(e,s)},removeItem:async e=>{t.delete(e)},getAllKeys:async()=>Array.from(t.keys()),multiRemove:async e=>{e.forEach(s=>t.delete(s))},clear:async()=>{t.clear()},multiGet:async e=>e.map(s=>[s,t.get(s)||null]),multiSet:async e=>{e.forEach(([s,a])=>t.set(s,a))}}}function l(){jest.clearAllMocks(),delete globalThis._DNDEV_CONFIG_,delete globalThis._DNDEV_STORES_}function n(t){return new Promise(e=>setTimeout(e,t))}export{c as createMockAsyncStorage,l as resetMocks,n as waitFor};