Skip to content

Commit cea3602

Browse files
committed
main 🧊 add make destructurable
1 parent 032f7ff commit cea3602

182 files changed

Lines changed: 6183 additions & 6251 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,6 @@
4141
"husky": "^9.1.7",
4242
"lint-staged": "^16.4.0",
4343
"prettier-plugin-tailwindcss": "^0.7.2",
44-
"typescript": "^5.9.3"
44+
"typescript": "^6.0.2"
4545
}
4646
}

‎packages/core/src/bundle/helpers/index.js‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ export * from './createEventEmitter/createEventEmitter';
44
export * from './createReactiveContext/createReactiveContext';
55
export * from './createSharedHook/createSharedHook';
66
export * from './createStore/createStore';
7+
export * from './makeDestructurable/makeDestructurable';
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* @name makeDestructurable
3+
* @description - Makes an object also iterable for array-style destructuring
4+
* @category Helpers
5+
* @usage low
6+
*
7+
* @template Object - The object shape
8+
* @template Array - The tuple/array shape for destructuring
9+
* @param {object} obj - Object part of the returned value
10+
* @param {Array} arr - Iterable tuple/array part of the returned value
11+
* @returns {object & Array} Combined object that supports both object and array destructuring
12+
*
13+
* @example
14+
* const result = makeDestructurable({ x: 10, y: 20 }, [10, 20] as const);
15+
*/
16+
export const makeDestructurable = (obj, arr) => {
17+
if (typeof Symbol !== 'undefined') {
18+
const clone = { ...obj };
19+
Object.defineProperty(clone, Symbol.iterator, {
20+
enumerable: false,
21+
value() {
22+
let index = 0;
23+
return {
24+
next: () => ({
25+
value: arr[index++],
26+
done: index > arr.length
27+
})
28+
};
29+
}
30+
});
31+
return clone;
32+
}
33+
return Object.assign([...arr], obj);
34+
};

‎packages/core/src/bundle/hooks/useField/useField.js‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,18 @@ export const useField = (initialValue = '', options) => {
5151
if (params.required && !inputRef.current.value) {
5252
return setError(params.required);
5353
}
54-
if (params.minLength && inputRef.current.value.length < params.minLength.value) {
55-
return setError(params.minLength.message);
56-
}
57-
if (params.maxLength && inputRef.current.value.length > params.maxLength.value) {
58-
return setError(params.maxLength.message);
59-
}
6054
if (params.min && Number(inputRef.current.value) < params.min.value) {
6155
return setError(params.min.message);
6256
}
6357
if (params.max && Number(inputRef.current.value) > params.max.value) {
6458
return setError(params.max.message);
6559
}
60+
if (params.minLength && inputRef.current.value.length < params.minLength.value) {
61+
return setError(params.minLength.message);
62+
}
63+
if (params.maxLength && inputRef.current.value.length > params.maxLength.value) {
64+
return setError(params.maxLength.message);
65+
}
6666
if (params.pattern && !params.pattern.value.test(inputRef.current.value)) {
6767
return setError(params.pattern.message);
6868
}
@@ -92,7 +92,7 @@ export const useField = (initialValue = '', options) => {
9292
onChange: async () => {
9393
if (watchingRef.current) return rerender();
9494
if (inputRef.current.value !== initialValue) setDirty(true);
95-
if (dirty && inputRef.current.value === initialValue) setDirty(false);
95+
if (inputRef.current.value === initialValue) setDirty(false);
9696
if (registerParams && options?.validateOnChange) await validate(registerParams);
9797
if (registerParams && options?.validateOnBlur) setError(undefined);
9898
},

‎packages/core/src/bundle/hooks/useWebSocket/useWebSocket.js‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ export const useWebSocket = (url, options) => {
2626
const retryCountRef = useRef(options?.retry ? getRetry(options.retry) : 0);
2727
const explicityCloseRef = useRef(false);
2828
const [status, setStatus] = useState('connecting');
29-
const send = (data) => webSocketRef.current?.send(data);
29+
const send = (data) => {
30+
webSocketRef.current?.send(data);
31+
};
3032
const close = () => {
3133
explicityCloseRef.current = true;
3234
webSocketRef.current?.close();
Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { jsx as _jsx } from "react/jsx-runtime";
1+
import { jsx as _jsx } from 'react/jsx-runtime';
22
import { createContext as createReactContext, useContext, useMemo, useState } from 'react';
33
/**
44
* @name createContext
@@ -15,32 +15,35 @@ import { createContext as createReactContext, useContext, useMemo, useState } fr
1515
* const { useSelect, instance, Provider } = createContext<number>(0);
1616
*/
1717
export const createContext = (defaultValue = undefined, options = {}) => {
18-
const Context = createReactContext({
19-
value: defaultValue,
20-
set: () => { }
21-
});
22-
Context.displayName = options.name;
23-
function useSelect(selector) {
24-
const context = useContext(Context);
25-
if (!context && options.strict) {
26-
throw new Error(`Context hook ${options.name} must be used inside a Provider`);
27-
}
28-
if (!selector) {
29-
return context;
30-
}
31-
return selector(context.value);
18+
const Context = createReactContext({
19+
value: defaultValue,
20+
set: () => {}
21+
});
22+
Context.displayName = options.name;
23+
function useSelect(selector) {
24+
const context = useContext(Context);
25+
if (!context && options.strict) {
26+
throw new Error(`Context hook ${options.name} must be used inside a Provider`);
3227
}
33-
const Provider = ({ children, initialValue }) => {
34-
const [profile, setProfile] = useState(initialValue ?? defaultValue);
35-
const value = useMemo(() => ({
36-
value: profile,
37-
set: setProfile
38-
}), [profile]);
39-
return _jsx(Context, { value: value, children: children });
40-
};
41-
return {
42-
useSelect,
43-
instance: Context,
44-
Provider
45-
};
28+
if (!selector) {
29+
return context;
30+
}
31+
return selector(context.value);
32+
}
33+
const Provider = ({ children, initialValue }) => {
34+
const [profile, setProfile] = useState(initialValue ?? defaultValue);
35+
const value = useMemo(
36+
() => ({
37+
value: profile,
38+
set: setProfile
39+
}),
40+
[profile]
41+
);
42+
return _jsx(Context, { value: value, children: children });
43+
};
44+
return {
45+
useSelect,
46+
instance: Context,
47+
Provider
48+
};
4649
};

‎packages/core/src/bundle/src/helpers/createContextHook/createContextHook.js‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { jsx as _jsx } from "react/jsx-runtime";
1+
import { jsx as _jsx } from 'react/jsx-runtime';
22
import { createContext, useContext } from 'react';
33
/**
44
* @name createContextHook
@@ -19,11 +19,11 @@ import { createContext, useContext } from 'react';
1919
* const matches = use();
2020
*/
2121
export const createContextHook = (useHook) => {
22-
const Context = createContext(null);
23-
const Provider = ({ children, params }) => {
24-
const value = useHook(...params);
25-
return _jsx(Context.Provider, { value: value, children: children });
26-
};
27-
const use = () => useContext(Context);
28-
return { Provider, use };
22+
const Context = createContext(null);
23+
const Provider = ({ children, params }) => {
24+
const value = useHook(...params);
25+
return _jsx(Context.Provider, { value: value, children: children });
26+
};
27+
const use = () => useContext(Context);
28+
return { Provider, use };
2929
};

‎packages/core/src/bundle/src/helpers/createEventEmitter/createEventEmitter.js‎

Lines changed: 42 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -12,50 +12,47 @@ import { useEffect, useRef, useState } from 'react';
1212
* const { push, subscribe, unsubscribe, useSubscribe } = createEventEmitter<{ foo: number }>();
1313
*/
1414
export const createEventEmitter = () => {
15-
const listeners = new Map();
16-
const push = (event, data) => {
17-
const eventListeners = listeners.get(event);
18-
eventListeners?.forEach((listener) => listener(data));
19-
};
20-
const unsubscribe = (event, listener) => {
21-
const eventKey = event;
22-
const eventListeners = listeners.get(eventKey);
23-
if (!eventListeners)
24-
return;
25-
eventListeners.delete(listener);
26-
if (!eventListeners.size)
27-
listeners.delete(eventKey);
28-
};
29-
const subscribe = (event, listener) => {
30-
const eventKey = event;
31-
if (!listeners.has(eventKey))
32-
listeners.set(eventKey, new Set());
33-
const eventListeners = listeners.get(event);
34-
eventListeners.add(listener);
35-
return () => {
36-
unsubscribe(event, listener);
37-
};
38-
};
39-
const useSubscribe = (event, listener) => {
40-
const [data, setData] = useState(undefined);
41-
const listenerRef = useRef(listener);
42-
listenerRef.current = listener;
43-
useEffect(() => {
44-
const onSubscribe = (data) => {
45-
setData(data);
46-
listenerRef.current?.(data);
47-
};
48-
const unsubscribe = subscribe(event, onSubscribe);
49-
return () => {
50-
unsubscribe();
51-
};
52-
}, [event]);
53-
return data;
54-
};
55-
return {
56-
push,
57-
subscribe,
58-
unsubscribe,
59-
useSubscribe
15+
const listeners = new Map();
16+
const push = (event, data) => {
17+
const eventListeners = listeners.get(event);
18+
eventListeners?.forEach((listener) => listener(data));
19+
};
20+
const unsubscribe = (event, listener) => {
21+
const eventKey = event;
22+
const eventListeners = listeners.get(eventKey);
23+
if (!eventListeners) return;
24+
eventListeners.delete(listener);
25+
if (!eventListeners.size) listeners.delete(eventKey);
26+
};
27+
const subscribe = (event, listener) => {
28+
const eventKey = event;
29+
if (!listeners.has(eventKey)) listeners.set(eventKey, new Set());
30+
const eventListeners = listeners.get(event);
31+
eventListeners.add(listener);
32+
return () => {
33+
unsubscribe(event, listener);
6034
};
35+
};
36+
const useSubscribe = (event, listener) => {
37+
const [data, setData] = useState(undefined);
38+
const listenerRef = useRef(listener);
39+
listenerRef.current = listener;
40+
useEffect(() => {
41+
const onSubscribe = (data) => {
42+
setData(data);
43+
listenerRef.current?.(data);
44+
};
45+
const unsubscribe = subscribe(event, onSubscribe);
46+
return () => {
47+
unsubscribe();
48+
};
49+
}, [event]);
50+
return data;
51+
};
52+
return {
53+
push,
54+
subscribe,
55+
unsubscribe,
56+
useSubscribe
57+
};
6158
};

0 commit comments

Comments
 (0)