@momo-webplatform/mobase 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/README.md +23 -0
- package/package.json +154 -0
- package/publish/cjs/components/ui/button.js +60 -0
- package/publish/cjs/components/utils/SpinerIcon.js +7 -0
- package/publish/cjs/lib/utils.js +9 -0
- package/publish/cjs/src/components/Accordion/Accordion.js +44 -0
- package/publish/cjs/src/components/Accordion/index.js +8 -0
- package/publish/cjs/src/components/Alert/Alert.js +50 -0
- package/publish/cjs/src/components/AlertDialog/AlertDialog.js +62 -0
- package/publish/cjs/src/components/AlertDialog/index.js +14 -0
- package/publish/cjs/src/components/Avatar/Avatar.js +74 -0
- package/publish/cjs/src/components/Avatar/index.js +7 -0
- package/publish/cjs/src/components/Badge/Badge.js +24 -0
- package/publish/cjs/src/components/Button/Button.js +74 -0
- package/publish/cjs/src/components/Button/index.js +5 -0
- package/publish/cjs/src/components/Calendar/calendar.js +39 -0
- package/publish/cjs/src/components/Card/Card.js +47 -0
- package/publish/cjs/src/components/Checkbox/Checkbox.js +67 -0
- package/publish/cjs/src/components/Checkbox/index.js +9 -0
- package/publish/cjs/src/components/Collapsible/collapsible.js +33 -0
- package/publish/cjs/src/components/Command/command.js +62 -0
- package/publish/cjs/src/components/Dialog/dialog.js +57 -0
- package/publish/cjs/src/components/Drawer/drawer.js +57 -0
- package/publish/cjs/src/components/DropdownMenu/dropdownmenu.js +75 -0
- package/publish/cjs/src/components/HoverCard/hover-card.js +38 -0
- package/publish/cjs/src/components/IconButton/IconButton.js +67 -0
- package/publish/cjs/src/components/IconButton/index.js +5 -0
- package/publish/cjs/src/components/Input/input.js +34 -0
- package/publish/cjs/src/components/Label/Label.js +35 -0
- package/publish/cjs/src/components/Menubar/menubar.js +77 -0
- package/publish/cjs/src/components/NavigationMenu/navigation-menu.js +102 -0
- package/publish/cjs/src/components/Pagination/Pagination.js +52 -0
- package/publish/cjs/src/components/Popover/popover.js +37 -0
- package/publish/cjs/src/components/Progress/Progress.js +33 -0
- package/publish/cjs/src/components/RadioGroup/Radio.js +110 -0
- package/publish/cjs/src/components/RadioGroup/RadioGroup.js +53 -0
- package/publish/cjs/src/components/RadioGroup/index.js +6 -0
- package/publish/cjs/src/components/Select/Select.js +61 -0
- package/publish/cjs/src/components/Sheet/sheet.js +71 -0
- package/publish/cjs/src/components/Skeleton/skeleton.js +9 -0
- package/publish/cjs/src/components/Slider/slider.js +33 -0
- package/publish/cjs/src/components/Switch/Switch.js +54 -0
- package/publish/cjs/src/components/Switch/index.js +6 -0
- package/publish/cjs/src/components/Table/Table.js +53 -0
- package/publish/cjs/src/components/Tabs/Tabs.js +42 -0
- package/publish/cjs/src/components/Textarea/Textarea.js +14 -0
- package/publish/cjs/src/components/Toast/Toast.js +65 -0
- package/publish/cjs/src/components/Toast/toaster.js +14 -0
- package/publish/cjs/src/components/Toast/use-toast.js +155 -0
- package/publish/cjs/src/components/Tooltip/Tooltip.js +41 -0
- package/publish/cjs/src/helpers/clone-deep.js +15 -0
- package/publish/cjs/src/helpers/clone-deep.spec.js +22 -0
- package/publish/cjs/src/helpers/generic-forward-ref.js +5 -0
- package/publish/cjs/src/helpers/http.js +10 -0
- package/publish/cjs/src/helpers/is-client.js +7 -0
- package/publish/cjs/src/helpers/is-object.js +12 -0
- package/publish/cjs/src/helpers/is-object.spec.js +24 -0
- package/publish/cjs/src/helpers/merge-deep.js +29 -0
- package/publish/cjs/src/helpers/merge-deep.spec.js +56 -0
- package/publish/cjs/src/helpers/omit.js +16 -0
- package/publish/cjs/src/helpers/omit.spec.js +9 -0
- package/publish/cjs/src/index.js +19 -0
- package/publish/cjs/src/types/index.js +2 -0
- package/publish/cjs/tsconfig.lib.tsbuildinfo +1 -0
- package/publish/esm/components/ui/button.d.ts +11 -0
- package/publish/esm/components/ui/button.js +33 -0
- package/publish/esm/components/utils/SpinerIcon.d.ts +6 -0
- package/publish/esm/components/utils/SpinerIcon.js +5 -0
- package/publish/esm/lib/utils.d.ts +2 -0
- package/publish/esm/lib/utils.js +5 -0
- package/publish/esm/src/components/Accordion/Accordion.d.ts +20 -0
- package/publish/esm/src/components/Accordion/Accordion.js +15 -0
- package/publish/esm/src/components/Accordion/index.d.ts +2 -0
- package/publish/esm/src/components/Accordion/index.js +1 -0
- package/publish/esm/src/components/Alert/Alert.d.ts +8 -0
- package/publish/esm/src/components/Alert/Alert.js +22 -0
- package/publish/esm/src/components/AlertDialog/AlertDialog.d.ts +49 -0
- package/publish/esm/src/components/AlertDialog/AlertDialog.js +26 -0
- package/publish/esm/src/components/AlertDialog/index.d.ts +2 -0
- package/publish/esm/src/components/AlertDialog/index.js +5 -0
- package/publish/esm/src/components/Avatar/Avatar.d.ts +33 -0
- package/publish/esm/src/components/Avatar/Avatar.js +46 -0
- package/publish/esm/src/components/Avatar/index.d.ts +2 -0
- package/publish/esm/src/components/Avatar/index.js +1 -0
- package/publish/esm/src/components/Badge/Badge.d.ts +9 -0
- package/publish/esm/src/components/Badge/Badge.js +20 -0
- package/publish/esm/src/components/Button/Button.d.ts +26 -0
- package/publish/esm/src/components/Button/Button.js +44 -0
- package/publish/esm/src/components/Button/index.d.ts +2 -0
- package/publish/esm/src/components/Button/index.js +1 -0
- package/publish/esm/src/components/Calendar/calendar.d.ts +8 -0
- package/publish/esm/src/components/Calendar/calendar.js +36 -0
- package/publish/esm/src/components/Card/Card.d.ts +8 -0
- package/publish/esm/src/components/Card/Card.js +16 -0
- package/publish/esm/src/components/Checkbox/Checkbox.d.ts +40 -0
- package/publish/esm/src/components/Checkbox/Checkbox.js +36 -0
- package/publish/esm/src/components/Checkbox/index.d.ts +2 -0
- package/publish/esm/src/components/Checkbox/index.js +4 -0
- package/publish/esm/src/components/Collapsible/collapsible.d.ts +5 -0
- package/publish/esm/src/components/Collapsible/collapsible.js +5 -0
- package/publish/esm/src/components/Command/command.d.ts +50 -0
- package/publish/esm/src/components/Command/command.js +28 -0
- package/publish/esm/src/components/Dialog/dialog.d.ts +19 -0
- package/publish/esm/src/components/Dialog/dialog.js +22 -0
- package/publish/esm/src/components/Drawer/drawer.d.ts +24 -0
- package/publish/esm/src/components/Drawer/drawer.js +22 -0
- package/publish/esm/src/components/DropdownMenu/dropdownmenu.d.ts +27 -0
- package/publish/esm/src/components/DropdownMenu/dropdownmenu.js +35 -0
- package/publish/esm/src/components/HoverCard/hover-card.d.ts +6 -0
- package/publish/esm/src/components/HoverCard/hover-card.js +10 -0
- package/publish/esm/src/components/IconButton/IconButton.d.ts +22 -0
- package/publish/esm/src/components/IconButton/IconButton.js +40 -0
- package/publish/esm/src/components/IconButton/index.d.ts +2 -0
- package/publish/esm/src/components/IconButton/index.js +1 -0
- package/publish/esm/src/components/Input/input.d.ts +5 -0
- package/publish/esm/src/components/Input/input.js +8 -0
- package/publish/esm/src/components/Label/Label.d.ts +5 -0
- package/publish/esm/src/components/Label/Label.js +9 -0
- package/publish/esm/src/components/Menubar/menubar.d.ts +31 -0
- package/publish/esm/src/components/Menubar/menubar.js +36 -0
- package/publish/esm/src/components/NavigationMenu/navigation-menu.d.ts +13 -0
- package/publish/esm/src/components/NavigationMenu/navigation-menu.js +64 -0
- package/publish/esm/src/components/Pagination/Pagination.d.ts +19 -0
- package/publish/esm/src/components/Pagination/Pagination.js +20 -0
- package/publish/esm/src/components/Popover/popover.d.ts +6 -0
- package/publish/esm/src/components/Popover/popover.js +9 -0
- package/publish/esm/src/components/Progress/Progress.d.ts +4 -0
- package/publish/esm/src/components/Progress/Progress.js +7 -0
- package/publish/esm/src/components/RadioGroup/Radio.d.ts +22 -0
- package/publish/esm/src/components/RadioGroup/Radio.js +84 -0
- package/publish/esm/src/components/RadioGroup/RadioGroup.d.ts +44 -0
- package/publish/esm/src/components/RadioGroup/RadioGroup.js +25 -0
- package/publish/esm/src/components/RadioGroup/index.d.ts +2 -0
- package/publish/esm/src/components/RadioGroup/index.js +1 -0
- package/publish/esm/src/components/Select/Select.d.ts +13 -0
- package/publish/esm/src/components/Select/Select.js +26 -0
- package/publish/esm/src/components/Sheet/sheet.d.ts +25 -0
- package/publish/esm/src/components/Sheet/sheet.js +36 -0
- package/publish/esm/src/components/Skeleton/skeleton.d.ts +2 -0
- package/publish/esm/src/components/Skeleton/skeleton.js +6 -0
- package/publish/esm/src/components/Slider/slider.d.ts +4 -0
- package/publish/esm/src/components/Slider/slider.js +7 -0
- package/publish/esm/src/components/Switch/Switch.d.ts +37 -0
- package/publish/esm/src/components/Switch/Switch.js +26 -0
- package/publish/esm/src/components/Switch/index.d.ts +2 -0
- package/publish/esm/src/components/Switch/index.js +1 -0
- package/publish/esm/src/components/Table/Table.d.ts +10 -0
- package/publish/esm/src/components/Table/Table.js +20 -0
- package/publish/esm/src/components/Tabs/Tabs.d.ts +7 -0
- package/publish/esm/src/components/Tabs/Tabs.js +13 -0
- package/publish/esm/src/components/Textarea/Textarea.d.ts +5 -0
- package/publish/esm/src/components/Textarea/Textarea.js +8 -0
- package/publish/esm/src/components/Toast/Toast.d.ts +15 -0
- package/publish/esm/src/components/Toast/Toast.js +33 -0
- package/publish/esm/src/components/Toast/toaster.d.ts +1 -0
- package/publish/esm/src/components/Toast/toaster.js +10 -0
- package/publish/esm/src/components/Toast/use-toast.d.ts +44 -0
- package/publish/esm/src/components/Toast/use-toast.js +127 -0
- package/publish/esm/src/components/Tooltip/Tooltip.d.ts +8 -0
- package/publish/esm/src/components/Tooltip/Tooltip.js +11 -0
- package/publish/esm/src/helpers/clone-deep.d.ts +1 -0
- package/publish/esm/src/helpers/clone-deep.js +11 -0
- package/publish/esm/src/helpers/clone-deep.spec.d.ts +1 -0
- package/publish/esm/src/helpers/clone-deep.spec.js +20 -0
- package/publish/esm/src/helpers/generic-forward-ref.d.ts +5 -0
- package/publish/esm/src/helpers/generic-forward-ref.js +3 -0
- package/publish/esm/src/helpers/http.d.ts +1 -0
- package/publish/esm/src/helpers/http.js +6 -0
- package/publish/esm/src/helpers/is-client.d.ts +1 -0
- package/publish/esm/src/helpers/is-client.js +3 -0
- package/publish/esm/src/helpers/is-object.d.ts +6 -0
- package/publish/esm/src/helpers/is-object.js +8 -0
- package/publish/esm/src/helpers/is-object.spec.d.ts +1 -0
- package/publish/esm/src/helpers/is-object.spec.js +22 -0
- package/publish/esm/src/helpers/merge-deep.d.ts +7 -0
- package/publish/esm/src/helpers/merge-deep.js +25 -0
- package/publish/esm/src/helpers/merge-deep.spec.d.ts +1 -0
- package/publish/esm/src/helpers/merge-deep.spec.js +54 -0
- package/publish/esm/src/helpers/omit.d.ts +1 -0
- package/publish/esm/src/helpers/omit.js +12 -0
- package/publish/esm/src/helpers/omit.spec.d.ts +1 -0
- package/publish/esm/src/helpers/omit.spec.js +7 -0
- package/publish/esm/src/index.d.ts +3 -0
- package/publish/esm/src/index.js +3 -0
- package/publish/esm/src/types/index.d.ts +3 -0
- package/publish/esm/src/types/index.js +1 -0
- package/publish/esm/tsconfig.lib.tsbuildinfo +1 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// Inspired by react-hot-toast library
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
const TOAST_LIMIT = 1;
|
|
4
|
+
const TOAST_REMOVE_DELAY = 1000000;
|
|
5
|
+
const actionTypes = {
|
|
6
|
+
ADD_TOAST: "ADD_TOAST",
|
|
7
|
+
UPDATE_TOAST: "UPDATE_TOAST",
|
|
8
|
+
DISMISS_TOAST: "DISMISS_TOAST",
|
|
9
|
+
REMOVE_TOAST: "REMOVE_TOAST",
|
|
10
|
+
};
|
|
11
|
+
let count = 0;
|
|
12
|
+
function genId() {
|
|
13
|
+
count = (count + 1) % Number.MAX_SAFE_INTEGER;
|
|
14
|
+
return count.toString();
|
|
15
|
+
}
|
|
16
|
+
const toastTimeouts = new Map();
|
|
17
|
+
const addToRemoveQueue = (toastId) => {
|
|
18
|
+
if (toastTimeouts.has(toastId)) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const timeout = setTimeout(() => {
|
|
22
|
+
toastTimeouts.delete(toastId);
|
|
23
|
+
dispatch({
|
|
24
|
+
type: "REMOVE_TOAST",
|
|
25
|
+
toastId: toastId,
|
|
26
|
+
});
|
|
27
|
+
}, TOAST_REMOVE_DELAY);
|
|
28
|
+
toastTimeouts.set(toastId, timeout);
|
|
29
|
+
};
|
|
30
|
+
export const reducer = (state, action) => {
|
|
31
|
+
switch (action.type) {
|
|
32
|
+
case "ADD_TOAST":
|
|
33
|
+
return {
|
|
34
|
+
...state,
|
|
35
|
+
toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
|
|
36
|
+
};
|
|
37
|
+
case "UPDATE_TOAST":
|
|
38
|
+
return {
|
|
39
|
+
...state,
|
|
40
|
+
toasts: state.toasts.map((t) => t.id === action.toast.id ? { ...t, ...action.toast } : t),
|
|
41
|
+
};
|
|
42
|
+
case "DISMISS_TOAST": {
|
|
43
|
+
const { toastId } = action;
|
|
44
|
+
// ! Side effects ! - This could be extracted into a dismissToast() action,
|
|
45
|
+
// but I'll keep it here for simplicity
|
|
46
|
+
if (toastId) {
|
|
47
|
+
addToRemoveQueue(toastId);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
state.toasts.forEach((toast) => {
|
|
51
|
+
addToRemoveQueue(toast.id);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
...state,
|
|
56
|
+
toasts: state.toasts.map((t) => t.id === toastId || toastId === undefined
|
|
57
|
+
? {
|
|
58
|
+
...t,
|
|
59
|
+
open: false,
|
|
60
|
+
}
|
|
61
|
+
: t),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
case "REMOVE_TOAST":
|
|
65
|
+
if (action.toastId === undefined) {
|
|
66
|
+
return {
|
|
67
|
+
...state,
|
|
68
|
+
toasts: [],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
...state,
|
|
73
|
+
toasts: state.toasts.filter((t) => t.id !== action.toastId),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
const listeners = [];
|
|
78
|
+
let memoryState = { toasts: [] };
|
|
79
|
+
function dispatch(action) {
|
|
80
|
+
memoryState = reducer(memoryState, action);
|
|
81
|
+
listeners.forEach((listener) => {
|
|
82
|
+
listener(memoryState);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function toast({ ...props }) {
|
|
86
|
+
const id = genId();
|
|
87
|
+
const update = (props) => dispatch({
|
|
88
|
+
type: "UPDATE_TOAST",
|
|
89
|
+
toast: { ...props, id },
|
|
90
|
+
});
|
|
91
|
+
const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id });
|
|
92
|
+
dispatch({
|
|
93
|
+
type: "ADD_TOAST",
|
|
94
|
+
toast: {
|
|
95
|
+
...props,
|
|
96
|
+
id,
|
|
97
|
+
open: true,
|
|
98
|
+
onOpenChange: (open) => {
|
|
99
|
+
if (!open)
|
|
100
|
+
dismiss();
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
return {
|
|
105
|
+
id: id,
|
|
106
|
+
dismiss,
|
|
107
|
+
update,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function useToast() {
|
|
111
|
+
const [state, setState] = React.useState(memoryState);
|
|
112
|
+
React.useEffect(() => {
|
|
113
|
+
listeners.push(setState);
|
|
114
|
+
return () => {
|
|
115
|
+
const index = listeners.indexOf(setState);
|
|
116
|
+
if (index > -1) {
|
|
117
|
+
listeners.splice(index, 1);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}, [state]);
|
|
121
|
+
return {
|
|
122
|
+
...state,
|
|
123
|
+
toast,
|
|
124
|
+
dismiss: (toastId) => dispatch({ type: "DISMISS_TOAST", toastId }),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
export { useToast, toast };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
|
|
3
|
+
declare const TooltipProvider: React.FC<TooltipPrimitive.TooltipProviderProps>;
|
|
4
|
+
declare const Tooltip: React.FC<TooltipPrimitive.TooltipProps>;
|
|
5
|
+
declare const TooltipTrigger: React.ForwardRefExoticComponent<TooltipPrimitive.TooltipTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
6
|
+
declare const TooltipArrow: React.ForwardRefExoticComponent<TooltipPrimitive.TooltipArrowProps & React.RefAttributes<SVGSVGElement>>;
|
|
7
|
+
declare const TooltipContent: React.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
8
|
+
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, TooltipArrow };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
|
|
4
|
+
import { cn } from "@/lib/utils";
|
|
5
|
+
const TooltipProvider = TooltipPrimitive.Provider;
|
|
6
|
+
const Tooltip = TooltipPrimitive.Root;
|
|
7
|
+
const TooltipTrigger = TooltipPrimitive.Trigger;
|
|
8
|
+
const TooltipArrow = TooltipPrimitive.Arrow;
|
|
9
|
+
const TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => (_jsx(TooltipPrimitive.Content, { ref: ref, sideOffset: sideOffset, className: cn("z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", className), ...props })));
|
|
10
|
+
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
|
11
|
+
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, TooltipArrow };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function cloneDeep<T>(source: T): T;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { cloneDeep } from './clone-deep';
|
|
3
|
+
describe('Helpers / cloneDeep', () => {
|
|
4
|
+
it('should clone a simple object', () => {
|
|
5
|
+
const source = { key: 'value' };
|
|
6
|
+
const cloned = cloneDeep(source);
|
|
7
|
+
expect(cloned).toEqual(source); // Check for deep equality
|
|
8
|
+
expect(cloned).not.toBe(source); // Ensure it's a deep clone, not the same reference
|
|
9
|
+
});
|
|
10
|
+
it('should handle null gracefully', () => {
|
|
11
|
+
const source = null;
|
|
12
|
+
const cloned = cloneDeep(source);
|
|
13
|
+
expect(cloned).toBeNull();
|
|
14
|
+
});
|
|
15
|
+
it('should handle undefined gracefully', () => {
|
|
16
|
+
const source = undefined;
|
|
17
|
+
const cloned = cloneDeep(source);
|
|
18
|
+
expect(cloned).toBeUndefined();
|
|
19
|
+
});
|
|
20
|
+
});
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
/** This allow the `forwardRef` to be used with generic components */
|
|
3
|
+
type FixedForwardRef = <T, P = {}>(render: (props: P, ref: React.Ref<T>) => JSX.Element) => (props: P & React.RefAttributes<T>) => JSX.Element;
|
|
4
|
+
declare const genericForwardRef: FixedForwardRef;
|
|
5
|
+
export default genericForwardRef;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const safeResJson: (res: Response) => Promise<any>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isClient: () => boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { isObject } from './is-object';
|
|
3
|
+
describe('isObject function', () => {
|
|
4
|
+
it('should return true for an empty object', () => {
|
|
5
|
+
expect(isObject({})).toBe(true);
|
|
6
|
+
});
|
|
7
|
+
it('should return true for a non-empty object', () => {
|
|
8
|
+
expect(isObject({ key: 'value' })).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
it('should return false for a string', () => {
|
|
11
|
+
expect(isObject('string')).toBe(false);
|
|
12
|
+
});
|
|
13
|
+
it('should return false for an array', () => {
|
|
14
|
+
expect(isObject([1, 2, 3])).toBe(false);
|
|
15
|
+
});
|
|
16
|
+
it('should return false for null', () => {
|
|
17
|
+
expect(isObject(null)).toBe(false);
|
|
18
|
+
});
|
|
19
|
+
it('should return false for undefined', () => {
|
|
20
|
+
expect(isObject(undefined)).toBe(false);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge and deep copy the values of all of the enumerable own properties of target object from source object to a new object
|
|
3
|
+
* @param target The target object to get properties from.
|
|
4
|
+
* @param source The source object from which to copy properties.
|
|
5
|
+
* @return A new merged and deep copied object.
|
|
6
|
+
*/
|
|
7
|
+
export declare function mergeDeep<T extends object, S extends object>(target: T, source: S): T & S;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { cloneDeep } from './clone-deep';
|
|
2
|
+
import { isObject } from './is-object';
|
|
3
|
+
/**
|
|
4
|
+
* Merge and deep copy the values of all of the enumerable own properties of target object from source object to a new object
|
|
5
|
+
* @param target The target object to get properties from.
|
|
6
|
+
* @param source The source object from which to copy properties.
|
|
7
|
+
* @return A new merged and deep copied object.
|
|
8
|
+
*/
|
|
9
|
+
export function mergeDeep(target, source) {
|
|
10
|
+
if (isObject(source) && Object.keys(source).length === 0) {
|
|
11
|
+
return cloneDeep({ ...target, ...source });
|
|
12
|
+
}
|
|
13
|
+
const output = { ...target, ...source };
|
|
14
|
+
if (isObject(source) && isObject(target)) {
|
|
15
|
+
for (const key in source) {
|
|
16
|
+
if (isObject(source[key]) && key in target && isObject(target[key])) {
|
|
17
|
+
output[key] = mergeDeep(target[key], source[key]);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
output[key] = isObject(source[key]) ? cloneDeep(source[key]) : source[key];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return output;
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { mergeDeep } from './merge-deep';
|
|
3
|
+
describe('Helpers / Merge deep', () => {
|
|
4
|
+
it('should merge keys that do not exist in target', () => {
|
|
5
|
+
const target = {};
|
|
6
|
+
const source = { foo: 'bar' };
|
|
7
|
+
const result = mergeDeep(target, source);
|
|
8
|
+
expect(result).to.deep.equal({ foo: 'bar' });
|
|
9
|
+
});
|
|
10
|
+
it('should merge keys that do not exist in source', () => {
|
|
11
|
+
const target = { foo: 'bar' };
|
|
12
|
+
const source = {};
|
|
13
|
+
const result = mergeDeep(target, source);
|
|
14
|
+
expect(result).to.deep.equal({ foo: 'bar' });
|
|
15
|
+
});
|
|
16
|
+
it('should override target key if source key is identical', () => {
|
|
17
|
+
const target = { foo: { bar: 'baz' } };
|
|
18
|
+
const source = { foo: { bar: 'foobar' } };
|
|
19
|
+
const result = mergeDeep(target, source);
|
|
20
|
+
expect(result).to.deep.equal({ foo: { bar: 'foobar' } });
|
|
21
|
+
});
|
|
22
|
+
it('should merge keys and do not mutate target and source', () => {
|
|
23
|
+
const target = {
|
|
24
|
+
foo: { a: 1, b: { c: 2, f: { g: 3 } } },
|
|
25
|
+
baz: 5,
|
|
26
|
+
};
|
|
27
|
+
const source = {
|
|
28
|
+
foo: { b: { c: 3, d: 3 } },
|
|
29
|
+
bar: { a: 1 },
|
|
30
|
+
};
|
|
31
|
+
const result = mergeDeep(target, source);
|
|
32
|
+
expect(result).to.deep.equal({ foo: { a: 1, b: { c: 3, d: 3, f: { g: 3 } } }, baz: 5, bar: { a: 1 } });
|
|
33
|
+
expect(target).to.deep.equal({
|
|
34
|
+
foo: { a: 1, b: { c: 2, f: { g: 3 } } },
|
|
35
|
+
baz: 5,
|
|
36
|
+
});
|
|
37
|
+
expect(source).to.deep.equal({
|
|
38
|
+
foo: { b: { c: 3, d: 3 } },
|
|
39
|
+
bar: { a: 1 },
|
|
40
|
+
});
|
|
41
|
+
result.foo.b.c = 97;
|
|
42
|
+
result.baz = 98;
|
|
43
|
+
result.bar.a = 99;
|
|
44
|
+
expect(result).to.deep.equal({ foo: { a: 1, b: { c: 97, d: 3, f: { g: 3 } } }, baz: 98, bar: { a: 99 } });
|
|
45
|
+
expect(target).to.deep.equal({
|
|
46
|
+
foo: { a: 1, b: { c: 2, f: { g: 3 } } },
|
|
47
|
+
baz: 5,
|
|
48
|
+
});
|
|
49
|
+
expect(source).to.deep.equal({
|
|
50
|
+
foo: { b: { c: 3, d: 3 } },
|
|
51
|
+
bar: { a: 1 },
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const omit: <T extends object, K extends string>(keys: readonly K[]) => (obj: T) => Omit<T, K>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|