hank-zilla 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +209 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.min.js +1 -0
- package/dist/useAppState/appState.d.ts +11 -0
- package/dist/useAppState/index.d.ts +2 -0
- package/dist/useAppState/index.min.js +1 -0
- package/dist/useAppState/init$.d.ts +6 -0
- package/package.json +56 -0
package/README.md
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# ðĶ Hank-Zilla
|
|
2
|
+
|
|
3
|
+
A lightweight React state management library that eliminates the need for Context, Redux, or Providers. Share state across components as easily as `useState` with global accessibility.
|
|
4
|
+
|
|
5
|
+
[](https://badge.fury.io/js/hank-zilla)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
[](https://www.typescriptlang.org/)
|
|
8
|
+
|
|
9
|
+
## âĻ Features
|
|
10
|
+
|
|
11
|
+
- ð **No Provider Required**: Share state globally without wrapping components in Providers
|
|
12
|
+
- ð **Drop-in Replacement**: Replace `useState` with `useAppState` for global state
|
|
13
|
+
- ðŊ **Access Anywhere**: Use the same state in any component, anywhere in your app
|
|
14
|
+
- ðŠķ **Lightweight**: Zero dependencies, minimal bundle size (~2.1KB)
|
|
15
|
+
- ⥠**Fast**: Built on React's `useSyncExternalStore` for optimal performance
|
|
16
|
+
- ðĶ **TypeScript**: Full TypeScript support with type inference
|
|
17
|
+
|
|
18
|
+
## ðĶ Installation
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install hank-zilla
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## ð Quick Start
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
import { useAppState, setAppState, getAppState } from 'hank-zilla'
|
|
28
|
+
|
|
29
|
+
// Parent Component - Set state
|
|
30
|
+
function ParentComponent() {
|
|
31
|
+
const user = useAppState('user', { name: '', email: '' })
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<div>
|
|
35
|
+
<button
|
|
36
|
+
onClick={() => setAppState('user', { name: 'John Doe', email: 'john@example.com' })}
|
|
37
|
+
>
|
|
38
|
+
Set User
|
|
39
|
+
</button>
|
|
40
|
+
<ChildComponent />
|
|
41
|
+
</div>
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Child Component - Access same state (no props needed!)
|
|
46
|
+
function ChildComponent() {
|
|
47
|
+
const user = useAppState('user')
|
|
48
|
+
|
|
49
|
+
return <div>{user ? `Welcome, ${user.name}!` : 'No user logged in'}</div>
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## ð API Reference
|
|
54
|
+
|
|
55
|
+
### `useAppState(key, defaultValue?, removeOnUnmount?)`
|
|
56
|
+
|
|
57
|
+
React hook for managing global state - works exactly like `useState` but globally accessible.
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
// Basic usage
|
|
61
|
+
const count = useAppState('count', 0)
|
|
62
|
+
|
|
63
|
+
// Auto-cleanup when component unmounts
|
|
64
|
+
const tempData = useAppState('tempData', null, true)
|
|
65
|
+
|
|
66
|
+
// TypeScript support
|
|
67
|
+
interface User {
|
|
68
|
+
name: string
|
|
69
|
+
email: string
|
|
70
|
+
}
|
|
71
|
+
const user = useAppState<User>('user', null)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### `setAppState(key, value)`
|
|
75
|
+
|
|
76
|
+
Update state from anywhere in your app - works with values or updater functions.
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
// Set value directly
|
|
80
|
+
setAppState('count', 42)
|
|
81
|
+
|
|
82
|
+
// Update with function (like useState)
|
|
83
|
+
setAppState('count', (prev) => prev + 1)
|
|
84
|
+
|
|
85
|
+
// Update object (shallow merge)
|
|
86
|
+
setAppState('user', { name: 'John' })
|
|
87
|
+
|
|
88
|
+
// Update array
|
|
89
|
+
setAppState('items', (prev) => [...prev, 'new item'])
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### `getAppState(key?)`
|
|
93
|
+
|
|
94
|
+
Get state value without subscribing to changes (no re-renders).
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
// Get specific key
|
|
98
|
+
const currentCount = getAppState('count')
|
|
99
|
+
|
|
100
|
+
// Get all state
|
|
101
|
+
const allState = getAppState()
|
|
102
|
+
|
|
103
|
+
// â ïļ Note: This doesn't trigger re-renders when state changes
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### `$getAppState` (Console Helper)
|
|
107
|
+
|
|
108
|
+
Debug helper available in browser console to inspect your app state.
|
|
109
|
+
|
|
110
|
+
```javascript
|
|
111
|
+
// In browser console
|
|
112
|
+
$getAppState // Returns all state
|
|
113
|
+
$getAppState('key') // Returns specific key
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## ðŊ Advanced Usage
|
|
117
|
+
|
|
118
|
+
### Auto-cleanup with `removeOnUnmount`
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
function TemporaryComponent() {
|
|
122
|
+
// This state will be deleted when component unmounts
|
|
123
|
+
const [data, setData] = useAppState('tempData', [], true)
|
|
124
|
+
|
|
125
|
+
return <div>Temporary data: {data.length} items</div>
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### TypeScript Support
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
interface CartItem {
|
|
133
|
+
id: string
|
|
134
|
+
name: string
|
|
135
|
+
price: number
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Type inference
|
|
139
|
+
const [cart, setCart] = useAppState<CartItem[]>('cart', [])
|
|
140
|
+
|
|
141
|
+
// Add item with type safety
|
|
142
|
+
const addItem = (item: CartItem) => {
|
|
143
|
+
setCart((prev) => [...prev, item])
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Performance: When to use `getAppState`
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
// â
Good: Use useAppState for UI components
|
|
151
|
+
function Counter() {
|
|
152
|
+
const [count, setCount] = useAppState('count', 0)
|
|
153
|
+
return <div>Count: {count}</div> // Re-renders when count changes
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// â
Good: Use getAppState for utilities/callbacks
|
|
157
|
+
function logCurrentState() {
|
|
158
|
+
const count = getAppState('count')
|
|
159
|
+
console.log('Current count:', count) // No re-renders
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## ð Comparison
|
|
164
|
+
|
|
165
|
+
| Feature | Hank-Zilla | Context API | Redux | Zustand |
|
|
166
|
+
| ----------------- | ----------- | ----------------- | ------------------ | ----------- |
|
|
167
|
+
| **Setup** | â None | â
Provider | â
Store + Actions | â
Store |
|
|
168
|
+
| **Bundle Size** | ðĒ ~2.1KB | ðĒ Built-in | ðī ~45KB | ðĄ ~8KB |
|
|
169
|
+
| **Global Access** | â
Anywhere | â Provider scope | â
Anywhere | â
Anywhere |
|
|
170
|
+
| **TypeScript** | ðĒ Full | ðĄ Manual | ðĒ Full | ðĒ Full |
|
|
171
|
+
|
|
172
|
+
## ð§ Migration
|
|
173
|
+
|
|
174
|
+
### From `useState` to `useAppState`
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
// Before: Local state
|
|
178
|
+
const [count, setCount] = useState(0)
|
|
179
|
+
|
|
180
|
+
// After: Global state
|
|
181
|
+
const count = useAppState('count', 0)
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### From Context API
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
// Before: Complex setup
|
|
188
|
+
const UserContext = createContext()
|
|
189
|
+
const { user, setUser } = useContext(UserContext)
|
|
190
|
+
|
|
191
|
+
// After: Direct usage
|
|
192
|
+
const user = useAppState('user', null)
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## ðĪ Contributing
|
|
196
|
+
|
|
197
|
+
Contributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md) for details.
|
|
198
|
+
|
|
199
|
+
## ð License
|
|
200
|
+
|
|
201
|
+
MIT License - see the [LICENSE](LICENSE) file for details.
|
|
202
|
+
|
|
203
|
+
## ð Acknowledgments
|
|
204
|
+
|
|
205
|
+
Built with âĪïļ by [phamdung2209](https://github.com/phamdung2209) âĒ Special thanks to the React team for `useSyncExternalStore`
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
Made with ðĶ by the Hank-Zilla team
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useAppState';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./useAppState";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare const store: {
|
|
2
|
+
state: Record<string, any>;
|
|
3
|
+
getState: () => Record<string, any>;
|
|
4
|
+
subscribe: (callback: () => void) => () => boolean;
|
|
5
|
+
setState: (newState: Record<string, any>, silent?: boolean) => void;
|
|
6
|
+
};
|
|
7
|
+
export declare const useAppState: <T>(key: string, defaultValue?: T, removeOnUnmount?: boolean, silent?: boolean) => T;
|
|
8
|
+
export declare const setAppState: (key: string, newValue: any, silent?: boolean) => void;
|
|
9
|
+
export declare const getAppState: (key?: string) => any;
|
|
10
|
+
export declare const deleteAppState: (key: string) => void;
|
|
11
|
+
export default store;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{useAppState,setAppState,getAppState,deleteAppState}from"./appState";export{default as init$}from"./init$";
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hank-zilla",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A lightweight React state management library with modular architecture",
|
|
5
|
+
"main": "dist/index.min.js",
|
|
6
|
+
"module": "dist/index.min.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.min.js",
|
|
11
|
+
"require": "./dist/index.min.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./useAppState": {
|
|
15
|
+
"import": "./dist/useAppState/index.min.js",
|
|
16
|
+
"require": "./dist/useAppState/index.min.js",
|
|
17
|
+
"types": "./dist/useAppState/index.d.ts"
|
|
18
|
+
},
|
|
19
|
+
"./package.json": "./package.json"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "npm run clean && tsc --project tsconfig.json && npm run minify && npm run cleanup",
|
|
28
|
+
"minify": "terser dist/index.js --compress --mangle --output dist/index.min.js && terser dist/useAppState/index.js --compress --mangle --output dist/useAppState/index.min.js",
|
|
29
|
+
"cleanup": "rimraf dist/index.js dist/useAppState/index.js dist/useAppState/appState.js dist/useAppState/init$.js",
|
|
30
|
+
"dev": "tsc --watch",
|
|
31
|
+
"clean": "rimraf dist",
|
|
32
|
+
"prebuild": "npm run clean",
|
|
33
|
+
"prepublishOnly": "npm run build",
|
|
34
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
35
|
+
},
|
|
36
|
+
"keywords": [
|
|
37
|
+
"react",
|
|
38
|
+
"state-management",
|
|
39
|
+
"hook",
|
|
40
|
+
"useState",
|
|
41
|
+
"global-state",
|
|
42
|
+
"modular",
|
|
43
|
+
"tree-shaking"
|
|
44
|
+
],
|
|
45
|
+
"author": "phamdung2209",
|
|
46
|
+
"license": "MIT",
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"react": ">=16.8.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/react": "^19.1.8",
|
|
52
|
+
"typescript": "^5.8.3",
|
|
53
|
+
"rimraf": "^6.0.1",
|
|
54
|
+
"terser": "^5.36.0"
|
|
55
|
+
}
|
|
56
|
+
}
|