startx 0.1.5 → 0.2.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/.editorconfig +20 -20
- package/.github/workflows/publish.yml +48 -0
- package/LICENSE +21 -21
- package/configs/eslint-config/plugins.d.ts +1 -1
- package/configs/eslint-config/src/rules/no-argument-spread.ts +96 -96
- package/configs/eslint-config/src/rules/no-internal-package-import.ts +40 -40
- package/configs/eslint-config/src/rules/no-interpolation-in-regular-string.ts +32 -32
- package/configs/eslint-config/src/rules/no-skipped-tests.ts +61 -61
- package/configs/eslint-config/src/rules/no-top-level-relative-imports-in-backend-module.ts +27 -27
- package/configs/eslint-config/src/rules/no-type-unsafe-event-emitter.ts +33 -33
- package/configs/eslint-config/src/rules/no-uncaught-json-parse.test.ts +21 -21
- package/configs/eslint-config/src/rules/no-untyped-config-class-field.ts +26 -26
- package/configs/eslint-config/src/rules/no-unused-param-catch-clause.ts +33 -33
- package/configs/eslint-config/src/rules/no-useless-catch-throw.test.ts +34 -34
- package/configs/eslint-config/src/rules/no-useless-catch-throw.ts +47 -47
- package/configs/eslint-config/src/utils/json.ts +21 -21
- package/package.json +34 -35
- package/packages/@repo/constants/src/api.ts +1 -1
- package/packages/@repo/constants/src/time.ts +23 -23
- package/packages/@repo/db/src/schema/index.ts +1 -1
- package/packages/@repo/lib/src/error-handlers-module/index.ts +11 -11
- package/packages/cli/dist/index.mjs +2 -2
- package/packages/cli/tsdown.config.ts +1 -0
- package/packages/ui/src/components/custom/grid-component.tsx +23 -23
- package/packages/ui/src/components/custom/hover-tool.tsx +38 -38
- package/packages/ui/src/components/custom/image-picker.tsx +109 -109
- package/packages/ui/src/components/custom/no-content.tsx +37 -37
- package/packages/ui/src/components/custom/page-container.tsx +24 -24
- package/packages/ui/src/components/custom/simple-popover.tsx +29 -29
- package/packages/ui/src/components/custom/switch-component.tsx +20 -20
- package/packages/ui/src/components/custom/theme-provider.tsx +74 -74
- package/packages/ui/src/components/hooks/event/use-click.tsx +39 -39
- package/packages/ui/src/components/hooks/time/useDebounce.tsx +21 -21
- package/packages/ui/src/components/hooks/time/useInterval.tsx +35 -35
- package/packages/ui/src/components/hooks/time/useTimeout.tsx +19 -19
- package/packages/ui/src/components/hooks/time/useTimer.tsx +51 -51
- package/packages/ui/src/components/hooks/use-media-query.tsx +19 -19
- package/packages/ui/src/components/hooks/use-persistent-storage.tsx +52 -52
- package/packages/ui/src/components/hooks/use-window-dimension.tsx +30 -30
- package/packages/ui/src/components/sonner.tsx +1 -1
- package/packages/ui/src/components/ui/button.tsx +96 -96
- package/packages/ui/src/components/ui/dropdown-menu.tsx +226 -226
- package/packages/ui/src/components/ui/label.tsx +24 -24
- package/packages/ui/src/components/ui/popover.tsx +42 -42
- package/packages/ui/src/components/ui/select.tsx +170 -170
- package/packages/ui/src/components/ui/separator.tsx +28 -28
- package/packages/ui/src/components/ui/sheet.tsx +130 -130
- package/packages/ui/src/components/ui/skeleton.tsx +13 -13
- package/packages/ui/src/components/ui/spinner.tsx +16 -16
- package/packages/ui/src/components/ui/switch.tsx +28 -28
- package/packages/ui/src/components/ui/tabs.tsx +54 -54
- package/packages/ui/src/components/ui/tooltip.tsx +30 -30
- package/packages/ui/src/components/util/n-formattor.ts +22 -22
- package/packages/ui/src/components/util/storage.ts +37 -37
- package/packages/ui/src/globals.css +87 -87
- package/configs/vitest-config/dist/base.mjs +0 -1
- package/configs/vitest-config/dist/frontend.mjs +0 -1
- package/configs/vitest-config/dist/node.mjs +0 -1
- package/packages/@repo/redis/dist/index.d.mts +0 -3
- package/packages/@repo/redis/dist/index.mjs +0 -5
- package/packages/@repo/redis/dist/lib/redis-client.d.mts +0 -7
- package/packages/@repo/redis/dist/lib/redis-client.mjs +0 -25
- package/packages/@repo/redis/dist/lib/redis-client.mjs.map +0 -1
- package/packages/@repo/redis/dist/lib/redis-module.d.mts +0 -5
- package/packages/@repo/redis/dist/lib/redis-module.mjs +0 -6
- package/packages/@repo/redis/dist/lib/redis-module.mjs.map +0 -1
- /package/{apps/core-server/.env.example → .env.example} +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { cn } from "../lib/utils";
|
|
2
|
-
|
|
3
|
-
function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
|
|
4
|
-
return (
|
|
5
|
-
<div
|
|
6
|
-
data-slot="skeleton"
|
|
7
|
-
className={cn("bg-accent animate-pulse rounded-md", className)}
|
|
8
|
-
{...props}
|
|
9
|
-
/>
|
|
10
|
-
);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export { Skeleton };
|
|
1
|
+
import { cn } from "../lib/utils";
|
|
2
|
+
|
|
3
|
+
function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
|
|
4
|
+
return (
|
|
5
|
+
<div
|
|
6
|
+
data-slot="skeleton"
|
|
7
|
+
className={cn("bg-accent animate-pulse rounded-md", className)}
|
|
8
|
+
{...props}
|
|
9
|
+
/>
|
|
10
|
+
);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export { Skeleton };
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { type HTMLProps, forwardRef } from 'react';
|
|
2
|
-
|
|
3
|
-
import { cn } from '../lib/utils';
|
|
4
|
-
|
|
5
|
-
export const Spinner = forwardRef<HTMLDivElement, HTMLProps<HTMLDivElement>>(
|
|
6
|
-
({ className, ...rest }, ref) => {
|
|
7
|
-
const spinnerClass = cn(
|
|
8
|
-
'animate-spin rounded-full border-2 border-current border-t-transparent h-4 w-4',
|
|
9
|
-
className,
|
|
10
|
-
);
|
|
11
|
-
|
|
12
|
-
return <div className={spinnerClass} ref={ref} {...rest} />;
|
|
13
|
-
},
|
|
14
|
-
);
|
|
15
|
-
|
|
16
|
-
Spinner.displayName = 'Spinner';
|
|
1
|
+
import { type HTMLProps, forwardRef } from 'react';
|
|
2
|
+
|
|
3
|
+
import { cn } from '../lib/utils';
|
|
4
|
+
|
|
5
|
+
export const Spinner = forwardRef<HTMLDivElement, HTMLProps<HTMLDivElement>>(
|
|
6
|
+
({ className, ...rest }, ref) => {
|
|
7
|
+
const spinnerClass = cn(
|
|
8
|
+
'animate-spin rounded-full border-2 border-current border-t-transparent h-4 w-4',
|
|
9
|
+
className,
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
return <div className={spinnerClass} ref={ref} {...rest} />;
|
|
13
|
+
},
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
Spinner.displayName = 'Spinner';
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import * as SwitchPrimitive from '@radix-ui/react-switch';
|
|
4
|
-
import type * as React from 'react';
|
|
5
|
-
|
|
6
|
-
import { cn } from '../lib/utils';
|
|
7
|
-
|
|
8
|
-
function Switch({ className, ...props }: React.ComponentProps<typeof SwitchPrimitive.Root>) {
|
|
9
|
-
return (
|
|
10
|
-
<SwitchPrimitive.Root
|
|
11
|
-
data-slot="switch"
|
|
12
|
-
className={cn(
|
|
13
|
-
'peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',
|
|
14
|
-
className,
|
|
15
|
-
)}
|
|
16
|
-
{...props}
|
|
17
|
-
>
|
|
18
|
-
<SwitchPrimitive.Thumb
|
|
19
|
-
data-slot="switch-thumb"
|
|
20
|
-
className={cn(
|
|
21
|
-
'bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0',
|
|
22
|
-
)}
|
|
23
|
-
/>
|
|
24
|
-
</SwitchPrimitive.Root>
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export { Switch };
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import * as SwitchPrimitive from '@radix-ui/react-switch';
|
|
4
|
+
import type * as React from 'react';
|
|
5
|
+
|
|
6
|
+
import { cn } from '../lib/utils';
|
|
7
|
+
|
|
8
|
+
function Switch({ className, ...props }: React.ComponentProps<typeof SwitchPrimitive.Root>) {
|
|
9
|
+
return (
|
|
10
|
+
<SwitchPrimitive.Root
|
|
11
|
+
data-slot="switch"
|
|
12
|
+
className={cn(
|
|
13
|
+
'peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',
|
|
14
|
+
className,
|
|
15
|
+
)}
|
|
16
|
+
{...props}
|
|
17
|
+
>
|
|
18
|
+
<SwitchPrimitive.Thumb
|
|
19
|
+
data-slot="switch-thumb"
|
|
20
|
+
className={cn(
|
|
21
|
+
'bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0',
|
|
22
|
+
)}
|
|
23
|
+
/>
|
|
24
|
+
</SwitchPrimitive.Root>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export { Switch };
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import * as TabsPrimitive from '@radix-ui/react-tabs';
|
|
4
|
-
import type * as React from 'react';
|
|
5
|
-
|
|
6
|
-
import { cn } from '../lib/utils';
|
|
7
|
-
|
|
8
|
-
function Tabs({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Root>) {
|
|
9
|
-
return (
|
|
10
|
-
<TabsPrimitive.Root
|
|
11
|
-
data-slot="tabs"
|
|
12
|
-
className={cn('flex flex-col gap-2', className)}
|
|
13
|
-
{...props}
|
|
14
|
-
/>
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function TabsList({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.List>) {
|
|
19
|
-
return (
|
|
20
|
-
<TabsPrimitive.List
|
|
21
|
-
data-slot="tabs-list"
|
|
22
|
-
className={cn(
|
|
23
|
-
'bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]',
|
|
24
|
-
className,
|
|
25
|
-
)}
|
|
26
|
-
{...props}
|
|
27
|
-
/>
|
|
28
|
-
);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {
|
|
32
|
-
return (
|
|
33
|
-
<TabsPrimitive.Trigger
|
|
34
|
-
data-slot="tabs-trigger"
|
|
35
|
-
className={cn(
|
|
36
|
-
"data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
37
|
-
className,
|
|
38
|
-
)}
|
|
39
|
-
{...props}
|
|
40
|
-
/>
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {
|
|
45
|
-
return (
|
|
46
|
-
<TabsPrimitive.Content
|
|
47
|
-
data-slot="tabs-content"
|
|
48
|
-
className={cn('flex-1 outline-none', className)}
|
|
49
|
-
{...props}
|
|
50
|
-
/>
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export { Tabs, TabsList, TabsTrigger, TabsContent };
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import * as TabsPrimitive from '@radix-ui/react-tabs';
|
|
4
|
+
import type * as React from 'react';
|
|
5
|
+
|
|
6
|
+
import { cn } from '../lib/utils';
|
|
7
|
+
|
|
8
|
+
function Tabs({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Root>) {
|
|
9
|
+
return (
|
|
10
|
+
<TabsPrimitive.Root
|
|
11
|
+
data-slot="tabs"
|
|
12
|
+
className={cn('flex flex-col gap-2', className)}
|
|
13
|
+
{...props}
|
|
14
|
+
/>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function TabsList({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.List>) {
|
|
19
|
+
return (
|
|
20
|
+
<TabsPrimitive.List
|
|
21
|
+
data-slot="tabs-list"
|
|
22
|
+
className={cn(
|
|
23
|
+
'bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]',
|
|
24
|
+
className,
|
|
25
|
+
)}
|
|
26
|
+
{...props}
|
|
27
|
+
/>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {
|
|
32
|
+
return (
|
|
33
|
+
<TabsPrimitive.Trigger
|
|
34
|
+
data-slot="tabs-trigger"
|
|
35
|
+
className={cn(
|
|
36
|
+
"data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
37
|
+
className,
|
|
38
|
+
)}
|
|
39
|
+
{...props}
|
|
40
|
+
/>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {
|
|
45
|
+
return (
|
|
46
|
+
<TabsPrimitive.Content
|
|
47
|
+
data-slot="tabs-content"
|
|
48
|
+
className={cn('flex-1 outline-none', className)}
|
|
49
|
+
{...props}
|
|
50
|
+
/>
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export { Tabs, TabsList, TabsTrigger, TabsContent };
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
|
|
4
|
-
import * as React from 'react';
|
|
5
|
-
|
|
6
|
-
import { cn } from '../lib/utils';
|
|
7
|
-
|
|
8
|
-
const TooltipProvider = TooltipPrimitive.Provider;
|
|
9
|
-
|
|
10
|
-
const Tooltip = TooltipPrimitive.Root;
|
|
11
|
-
|
|
12
|
-
const TooltipTrigger = TooltipPrimitive.Trigger;
|
|
13
|
-
|
|
14
|
-
const TooltipContent = React.forwardRef<
|
|
15
|
-
React.ElementRef<typeof TooltipPrimitive.Content>,
|
|
16
|
-
React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
|
|
17
|
-
>(({ className, sideOffset = 4, ...props }, ref) => (
|
|
18
|
-
<TooltipPrimitive.Content
|
|
19
|
-
ref={ref}
|
|
20
|
-
sideOffset={sideOffset}
|
|
21
|
-
className={cn(
|
|
22
|
-
'z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md 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',
|
|
23
|
-
className,
|
|
24
|
-
)}
|
|
25
|
-
{...props}
|
|
26
|
-
/>
|
|
27
|
-
));
|
|
28
|
-
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
|
29
|
-
|
|
30
|
-
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
|
|
6
|
+
import { cn } from '../lib/utils';
|
|
7
|
+
|
|
8
|
+
const TooltipProvider = TooltipPrimitive.Provider;
|
|
9
|
+
|
|
10
|
+
const Tooltip = TooltipPrimitive.Root;
|
|
11
|
+
|
|
12
|
+
const TooltipTrigger = TooltipPrimitive.Trigger;
|
|
13
|
+
|
|
14
|
+
const TooltipContent = React.forwardRef<
|
|
15
|
+
React.ElementRef<typeof TooltipPrimitive.Content>,
|
|
16
|
+
React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
|
|
17
|
+
>(({ className, sideOffset = 4, ...props }, ref) => (
|
|
18
|
+
<TooltipPrimitive.Content
|
|
19
|
+
ref={ref}
|
|
20
|
+
sideOffset={sideOffset}
|
|
21
|
+
className={cn(
|
|
22
|
+
'z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md 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',
|
|
23
|
+
className,
|
|
24
|
+
)}
|
|
25
|
+
{...props}
|
|
26
|
+
/>
|
|
27
|
+
));
|
|
28
|
+
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
|
29
|
+
|
|
30
|
+
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
export function nFormatter(num: number, digits?: number) {
|
|
2
|
-
if (!num) return "0";
|
|
3
|
-
const lookup = [
|
|
4
|
-
{ value: 1, symbol: "" },
|
|
5
|
-
{ value: 1e3, symbol: "K" },
|
|
6
|
-
{ value: 1e6, symbol: "M" },
|
|
7
|
-
{ value: 1e9, symbol: "B" },
|
|
8
|
-
{ value: 1e12, symbol: "T" },
|
|
9
|
-
{ value: 1e15, symbol: "P" },
|
|
10
|
-
{ value: 1e18, symbol: "E" },
|
|
11
|
-
];
|
|
12
|
-
const rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
|
|
13
|
-
const item = lookup
|
|
14
|
-
.slice()
|
|
15
|
-
.reverse()
|
|
16
|
-
.find(function (item) {
|
|
17
|
-
return num >= item.value;
|
|
18
|
-
});
|
|
19
|
-
return item
|
|
20
|
-
? (num / item.value).toFixed(digits ?? 1).replace(rx, "$1") + item.symbol
|
|
21
|
-
: "0";
|
|
22
|
-
}
|
|
1
|
+
export function nFormatter(num: number, digits?: number) {
|
|
2
|
+
if (!num) return "0";
|
|
3
|
+
const lookup = [
|
|
4
|
+
{ value: 1, symbol: "" },
|
|
5
|
+
{ value: 1e3, symbol: "K" },
|
|
6
|
+
{ value: 1e6, symbol: "M" },
|
|
7
|
+
{ value: 1e9, symbol: "B" },
|
|
8
|
+
{ value: 1e12, symbol: "T" },
|
|
9
|
+
{ value: 1e15, symbol: "P" },
|
|
10
|
+
{ value: 1e18, symbol: "E" },
|
|
11
|
+
];
|
|
12
|
+
const rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
|
|
13
|
+
const item = lookup
|
|
14
|
+
.slice()
|
|
15
|
+
.reverse()
|
|
16
|
+
.find(function (item) {
|
|
17
|
+
return num >= item.value;
|
|
18
|
+
});
|
|
19
|
+
return item
|
|
20
|
+
? (num / item.value).toFixed(digits ?? 1).replace(rx, "$1") + item.symbol
|
|
21
|
+
: "0";
|
|
22
|
+
}
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
2
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
-
export interface Store<T = Record<string, any>> {
|
|
4
|
-
_store: T;
|
|
5
|
-
get(key: string): string | null;
|
|
6
|
-
set(key: string, value: string): void;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export const InMemoryStorage: Store = {
|
|
10
|
-
_store: {},
|
|
11
|
-
get(key: string): string | null {
|
|
12
|
-
return this._store[key];
|
|
13
|
-
},
|
|
14
|
-
set(key: string, value: string): void {
|
|
15
|
-
this._store[key] = value;
|
|
16
|
-
},
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
export const SessionStorageStore: Store = {
|
|
20
|
-
_store: {},
|
|
21
|
-
get(key: string): string | null {
|
|
22
|
-
return sessionStorage.getItem(key);
|
|
23
|
-
},
|
|
24
|
-
set(key: string, value: string): void {
|
|
25
|
-
sessionStorage.setItem(key, value);
|
|
26
|
-
},
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export const LocalStorageStore: Store = {
|
|
30
|
-
_store: {},
|
|
31
|
-
get(key: string): string | null {
|
|
32
|
-
return localStorage.getItem(key);
|
|
33
|
-
},
|
|
34
|
-
set(key: string, value: string): void {
|
|
35
|
-
localStorage.setItem(key, value);
|
|
36
|
-
},
|
|
37
|
-
};
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
export interface Store<T = Record<string, any>> {
|
|
4
|
+
_store: T;
|
|
5
|
+
get(key: string): string | null;
|
|
6
|
+
set(key: string, value: string): void;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const InMemoryStorage: Store = {
|
|
10
|
+
_store: {},
|
|
11
|
+
get(key: string): string | null {
|
|
12
|
+
return this._store[key];
|
|
13
|
+
},
|
|
14
|
+
set(key: string, value: string): void {
|
|
15
|
+
this._store[key] = value;
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const SessionStorageStore: Store = {
|
|
20
|
+
_store: {},
|
|
21
|
+
get(key: string): string | null {
|
|
22
|
+
return sessionStorage.getItem(key);
|
|
23
|
+
},
|
|
24
|
+
set(key: string, value: string): void {
|
|
25
|
+
sessionStorage.setItem(key, value);
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const LocalStorageStore: Store = {
|
|
30
|
+
_store: {},
|
|
31
|
+
get(key: string): string | null {
|
|
32
|
+
return localStorage.getItem(key);
|
|
33
|
+
},
|
|
34
|
+
set(key: string, value: string): void {
|
|
35
|
+
localStorage.setItem(key, value);
|
|
36
|
+
},
|
|
37
|
+
};
|
|
@@ -1,87 +1,87 @@
|
|
|
1
|
-
@import "tailwindcss";
|
|
2
|
-
@config "../tailwind.config.ts";
|
|
3
|
-
@source "../**/*.{ts,tsx}";
|
|
4
|
-
|
|
5
|
-
@custom-variant dark (&:is(.dark *));
|
|
6
|
-
|
|
7
|
-
@layer base {
|
|
8
|
-
:root {
|
|
9
|
-
--background: 0 0% 100%;
|
|
10
|
-
--foreground: 224 71.4% 4.1%;
|
|
11
|
-
--card: 0 0% 100%;
|
|
12
|
-
--card-foreground: 224 71.4% 4.1%;
|
|
13
|
-
--popover: 0 0% 100%;
|
|
14
|
-
--popover-foreground: 224 71.4% 4.1%;
|
|
15
|
-
--primary: 262.1 83.3% 57.8%;
|
|
16
|
-
--primary-foreground: 210 20% 98%;
|
|
17
|
-
--secondary: 220 14.3% 95.9%;
|
|
18
|
-
--secondary-foreground: 220.9 39.3% 11%;
|
|
19
|
-
--muted: 220 14.3% 95.9%;
|
|
20
|
-
--muted-foreground: 220 8.9% 46.1%;
|
|
21
|
-
--accent: 220 14.3% 95.9%;
|
|
22
|
-
--accent-foreground: 220.9 39.3% 11%;
|
|
23
|
-
--destructive: 0 84.2% 60.2%;
|
|
24
|
-
--destructive-foreground: 210 20% 98%;
|
|
25
|
-
--border: 220 13% 91%;
|
|
26
|
-
--input: 220 13% 91%;
|
|
27
|
-
--ring: 262.1 83.3% 57.8%;
|
|
28
|
-
--radius: 0.75rem;
|
|
29
|
-
--chart-1: 173 58% 39%;
|
|
30
|
-
--chart-2: 12 76% 61%;
|
|
31
|
-
--chart-3: 197 37% 24%;
|
|
32
|
-
--chart-4: 43 74% 66%;
|
|
33
|
-
--chart-5: 27 87% 67%;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
.dark {
|
|
37
|
-
--background: 224 71.4% 4.1%;
|
|
38
|
-
--foreground: 210 20% 98%;
|
|
39
|
-
--card: 224 71.4% 4.1%;
|
|
40
|
-
--card-foreground: 210 20% 98%;
|
|
41
|
-
--popover: 224 71.4% 4.1%;
|
|
42
|
-
--popover-foreground: 210 20% 98%;
|
|
43
|
-
--primary: 263.4 70% 50.4%;
|
|
44
|
-
--primary-foreground: 210 20% 98%;
|
|
45
|
-
--secondary: 215 27.9% 16.9%;
|
|
46
|
-
--secondary-foreground: 210 20% 98%;
|
|
47
|
-
--muted: 215 27.9% 16.9%;
|
|
48
|
-
--muted-foreground: 217.9 10.6% 64.9%;
|
|
49
|
-
--accent: 215 27.9% 16.9%;
|
|
50
|
-
--accent-foreground: 210 20% 98%;
|
|
51
|
-
--destructive: 0 62.8% 50.6%;
|
|
52
|
-
--destructive-foreground: 210 20% 98%;
|
|
53
|
-
--border: 215 27.9% 16.9%;
|
|
54
|
-
--input: 215 27.9% 16.9%;
|
|
55
|
-
--ring: 263.4 70% 50.4%;
|
|
56
|
-
--chart-1: 173 58% 39%;
|
|
57
|
-
--chart-2: 12 76% 61%;
|
|
58
|
-
--chart-3: 197 37% 24%;
|
|
59
|
-
--chart-4: 43 74% 66%;
|
|
60
|
-
--chart-5: 27 87% 67%;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
html {
|
|
65
|
-
background-color: var(--background);
|
|
66
|
-
}
|
|
67
|
-
@layer base {
|
|
68
|
-
* {
|
|
69
|
-
font-family: var(--font-openSans);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
@layer utilities {
|
|
74
|
-
/* Chrome, Safari and Opera */
|
|
75
|
-
.no-scrollbar::-webkit-scrollbar {
|
|
76
|
-
display: none;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
.no-scrollbar {
|
|
80
|
-
-ms-overflow-style: none; /* IE and Edge */
|
|
81
|
-
scrollbar-width: none; /* Firefox */
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
html {
|
|
86
|
-
scroll-behavior: smooth;
|
|
87
|
-
}
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
@config "../tailwind.config.ts";
|
|
3
|
+
@source "../**/*.{ts,tsx}";
|
|
4
|
+
|
|
5
|
+
@custom-variant dark (&:is(.dark *));
|
|
6
|
+
|
|
7
|
+
@layer base {
|
|
8
|
+
:root {
|
|
9
|
+
--background: 0 0% 100%;
|
|
10
|
+
--foreground: 224 71.4% 4.1%;
|
|
11
|
+
--card: 0 0% 100%;
|
|
12
|
+
--card-foreground: 224 71.4% 4.1%;
|
|
13
|
+
--popover: 0 0% 100%;
|
|
14
|
+
--popover-foreground: 224 71.4% 4.1%;
|
|
15
|
+
--primary: 262.1 83.3% 57.8%;
|
|
16
|
+
--primary-foreground: 210 20% 98%;
|
|
17
|
+
--secondary: 220 14.3% 95.9%;
|
|
18
|
+
--secondary-foreground: 220.9 39.3% 11%;
|
|
19
|
+
--muted: 220 14.3% 95.9%;
|
|
20
|
+
--muted-foreground: 220 8.9% 46.1%;
|
|
21
|
+
--accent: 220 14.3% 95.9%;
|
|
22
|
+
--accent-foreground: 220.9 39.3% 11%;
|
|
23
|
+
--destructive: 0 84.2% 60.2%;
|
|
24
|
+
--destructive-foreground: 210 20% 98%;
|
|
25
|
+
--border: 220 13% 91%;
|
|
26
|
+
--input: 220 13% 91%;
|
|
27
|
+
--ring: 262.1 83.3% 57.8%;
|
|
28
|
+
--radius: 0.75rem;
|
|
29
|
+
--chart-1: 173 58% 39%;
|
|
30
|
+
--chart-2: 12 76% 61%;
|
|
31
|
+
--chart-3: 197 37% 24%;
|
|
32
|
+
--chart-4: 43 74% 66%;
|
|
33
|
+
--chart-5: 27 87% 67%;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.dark {
|
|
37
|
+
--background: 224 71.4% 4.1%;
|
|
38
|
+
--foreground: 210 20% 98%;
|
|
39
|
+
--card: 224 71.4% 4.1%;
|
|
40
|
+
--card-foreground: 210 20% 98%;
|
|
41
|
+
--popover: 224 71.4% 4.1%;
|
|
42
|
+
--popover-foreground: 210 20% 98%;
|
|
43
|
+
--primary: 263.4 70% 50.4%;
|
|
44
|
+
--primary-foreground: 210 20% 98%;
|
|
45
|
+
--secondary: 215 27.9% 16.9%;
|
|
46
|
+
--secondary-foreground: 210 20% 98%;
|
|
47
|
+
--muted: 215 27.9% 16.9%;
|
|
48
|
+
--muted-foreground: 217.9 10.6% 64.9%;
|
|
49
|
+
--accent: 215 27.9% 16.9%;
|
|
50
|
+
--accent-foreground: 210 20% 98%;
|
|
51
|
+
--destructive: 0 62.8% 50.6%;
|
|
52
|
+
--destructive-foreground: 210 20% 98%;
|
|
53
|
+
--border: 215 27.9% 16.9%;
|
|
54
|
+
--input: 215 27.9% 16.9%;
|
|
55
|
+
--ring: 263.4 70% 50.4%;
|
|
56
|
+
--chart-1: 173 58% 39%;
|
|
57
|
+
--chart-2: 12 76% 61%;
|
|
58
|
+
--chart-3: 197 37% 24%;
|
|
59
|
+
--chart-4: 43 74% 66%;
|
|
60
|
+
--chart-5: 27 87% 67%;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
html {
|
|
65
|
+
background-color: var(--background);
|
|
66
|
+
}
|
|
67
|
+
@layer base {
|
|
68
|
+
* {
|
|
69
|
+
font-family: var(--font-openSans);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@layer utilities {
|
|
74
|
+
/* Chrome, Safari and Opera */
|
|
75
|
+
.no-scrollbar::-webkit-scrollbar {
|
|
76
|
+
display: none;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.no-scrollbar {
|
|
80
|
+
-ms-overflow-style: none; /* IE and Edge */
|
|
81
|
+
scrollbar-width: none; /* Firefox */
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
html {
|
|
86
|
+
scroll-behavior: smooth;
|
|
87
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{defineConfig as e}from"vitest/config";const t=process.env.npm_lifecycle_event===`test:dev`,n=(n={})=>e({test:{silent:!0,globals:!0,include:t?[`src/**/*.{test,spec}.{ts,tsx}`]:[`dist/**/*.{test,spec}.{js,mjs,cjs}`],exclude:t?[`**/node_modules/**`,`**/dist/**`]:[`**/node_modules/**`,`**/src/**`],coverage:process.env.COVERAGE_ENABLED===`true`?{enabled:!0,provider:`v8`,...n.coverage}:{enabled:!1},...n}});export{n as baseVitestConfig};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{baseVitestConfig as e}from"./base.mjs";var t=e({environment:`jsdom`,setupFiles:[`./src/__tests__/setup.ts`],css:{modules:{classNameStrategy:`non-scoped`}},coverage:{reporter:[`text-summary`,`lcov`,`html`]}});export{t as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{baseVitestConfig as e}from"./base.mjs";var t=e({environment:`node`});export{t as default};
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Redis } from "ioredis";
|
|
2
|
-
|
|
3
|
-
//#region src/lib/redis-client.ts
|
|
4
|
-
const redisClient = new Redis({
|
|
5
|
-
host: process.env.REDIS_HOST,
|
|
6
|
-
port: Number(process.env.REDIS_PORT),
|
|
7
|
-
username: process.env.REDIS_USERNAME,
|
|
8
|
-
password: process.env.REDIS_PASSWORD
|
|
9
|
-
});
|
|
10
|
-
function setEventListeners() {
|
|
11
|
-
redisClient.on("error", (error) => {
|
|
12
|
-
console.log("Could not establish a connection with redis. " + error);
|
|
13
|
-
});
|
|
14
|
-
redisClient.on("connect", (error) => {
|
|
15
|
-
if (error) {
|
|
16
|
-
console.log("Could not establish a connection with redis. " + error);
|
|
17
|
-
}
|
|
18
|
-
console.log("Connected to redis successfully");
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
setEventListeners();
|
|
22
|
-
|
|
23
|
-
//#endregion
|
|
24
|
-
export { redisClient };
|
|
25
|
-
//# sourceMappingURL=redis-client.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"redis-client.mjs","names":[],"sources":["../../src/lib/redis-client.ts"],"sourcesContent":["import { Redis } from \"ioredis\";\r\n\r\nexport const redisClient = new Redis({\r\n host: process.env.REDIS_HOST,\r\n port: Number(process.env.REDIS_PORT),\r\n username: process.env.REDIS_USERNAME,\r\n password: process.env.REDIS_PASSWORD,\r\n});\r\n\r\nfunction setEventListeners() {\r\n redisClient.on(\"error\", (error: string) => {\r\n console.log(\"Could not establish a connection with redis. \" + error);\r\n });\r\n redisClient.on(\"connect\", (error: string) => {\r\n if (error) {\r\n console.log(\"Could not establish a connection with redis. \" + error);\r\n }\r\n console.log(\"Connected to redis successfully\");\r\n });\r\n}\r\n\r\nsetEventListeners();\r\n\r\n"],"mappings":";;;AAEA,MAAa,cAAc,IAAI,MAAM;CACnC,MAAM,QAAQ,IAAI;CAClB,MAAM,OAAO,QAAQ,IAAI,WAAW;CACpC,UAAU,QAAQ,IAAI;CACtB,UAAU,QAAQ,IAAI;CACvB,CAAC;AAEF,SAAS,oBAAoB;AAC3B,aAAY,GAAG,UAAU,UAAkB;AACzC,UAAQ,IAAI,kDAAkD,MAAM;GACpE;AACF,aAAY,GAAG,YAAY,UAAkB;AAC3C,MAAI,OAAO;AACT,WAAQ,IAAI,kDAAkD,MAAM;;AAEtE,UAAQ,IAAI,kCAAkC;GAC9C;;AAGJ,mBAAmB"}
|