Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • hive/denser
1 result
Show changes
Commits on Source (74)
Showing
with 433 additions and 111 deletions
......@@ -531,6 +531,7 @@ staging:deploy-auth:
CONTAINER_NAME: denser-auth
TURBO_APP_SCOPE: '@hive/auth'
TURBO_APP_PATH: '/apps/auth'
EXPLORER_DOMAIN: 'https://explore.openhive.network'
environment:
name: staging-auth
action: start
......@@ -551,6 +552,7 @@ staging:deploy-blog:
CONTAINER_NAME: denser-blog
TURBO_APP_SCOPE: '@hive/blog'
TURBO_APP_PATH: '/apps/blog'
EXPLORER_DOMAIN: 'https://explore.openhive.network'
environment:
name: staging-blog
action: start
......@@ -570,6 +572,7 @@ staging:deploy-wallet:
CONTAINER_NAME: denser-wallet
TURBO_APP_SCOPE: '@hive/wallet'
TURBO_APP_PATH: '/apps/wallet'
EXPLORER_DOMAIN: 'https://explore.openhive.network'
environment:
name: staging-wallet
action: start
......@@ -632,6 +635,7 @@ review:deploy-auth:
SITE_DOMAIN: https://auth.fake.openhive.network
LOGGING_BROWSER_ENABLED: false
LOGGING_LOG_LEVEL: info
EXPLORER_DOMAIN: 'https://testexplorer.openhive.network'
environment:
name: review-auth
action: start
......@@ -650,6 +654,7 @@ review:deploy-blog:
BLOG_DOMAIN: https://blog.fake.openhive.network
LOGGING_BROWSER_ENABLED: false
LOGGING_LOG_LEVEL: info
EXPLORER_DOMAIN: 'https://testexplorer.openhive.network'
environment:
name: review-blog
action: start
......@@ -668,6 +673,7 @@ review:deploy-wallet:
BLOG_DOMAIN: https://blog.fake.openhive.network
LOGGING_BROWSER_ENABLED: false
LOGGING_LOG_LEVEL: info
EXPLORER_DOMAIN: 'https://testexplorer.openhive.network'
environment:
name: review-wallet
action: start
......
......@@ -8,6 +8,9 @@ import { useTranslation } from 'next-i18next';
import { useSiteParams } from '@ui/components/hooks/use-site-params';
import { useUser } from '@smart-signer/lib/auth/use-user';
import { getLogger } from '@ui/lib/logging';
import { Avatar, AvatarFallback, AvatarImage } from '@ui/components';
import env from '@beam-australia/react-env';
import Image from 'next/image';
const logger = getLogger('app');
const usernamePattern = /\B@[a-z0-9.-]+/gi;
......@@ -37,17 +40,19 @@ const NotificationListItem = ({ date, msg, score, type, url, lastRead }: IAccoun
default:
icon = <Icons.arrowUpCircle className="h-4 w-4" />;
}
const imageHosterUrl = env('IMAGES_ENDPOINT');
const participants = mentions
? mentions.map((m: string) => (
<a key={m} href={'/' + m} data-testid="notification-account-icon-link">
<img
className="mr-3 h-[40px] w-[40px] rounded-3xl"
height="40"
width="40"
src={`https://images.hive.blog/u/${m.substring(1)}/avatar/small`}
alt={`${m} profile picture`}
/>
<Avatar className="mr-3 h-[40px] w-[40px] rounded-3xl">
<AvatarImage
src={`${imageHosterUrl}u/${m.substring(1)}/avatar/small`}
alt={`${m} profile picture`}
/>
<AvatarFallback className="bg-transparent">
<Image width={40} height={40} alt={`${m} profile picture`} src="/defaultavatar.png" />
</AvatarFallback>
</Avatar>
</a>
))
: null;
......
import { DefaultRenderer } from '@hiveio/content-renderer';
import { DefaultRenderer } from '@hive/renderer';
import { getDoubleSize, proxifyImageUrl } from '@ui/lib/old-profixy';
import env from '@beam-australia/react-env';
import imageUserBlocklist from '@hive/ui/config/lists/image-user-blocklist';
......
const path = require('path');
const withTM = require('next-transpile-modules')(['@hive/smart-signer', '@hive/ui', '@hive/transaction']);
const withTM = require('next-transpile-modules')(['@hive/smart-signer', '@hive/ui', '@hive/transaction', '@hive/renderer']);
const CopyPlugin = require('copy-webpack-plugin');
const removeImports = require('next-remove-imports')();
const withPWA = require('next-pwa')({
......
......@@ -32,7 +32,7 @@
"@hive/transaction": "workspace:*",
"@hive/tsconfig": "workspace:*",
"@hive/ui": "workspace:*",
"@hiveio/content-renderer": "^2.2.0",
"@hive/renderer": "workspace:*",
"@hiveio/wax": "1.27.6-rc6-stable.250109151100",
"@hookform/resolvers": "^3.1.1",
"@next/bundle-analyzer": "^14.2.2",
......
apps/blog/public/defaultavatar.png

1.71 KiB

......@@ -14,6 +14,7 @@ REACT_APP_CHAIN_ID="beeab0de0000000000000000000000000000000000000000000000000000
REACT_APP_IMAGES_ENDPOINT="https://images.hive.blog/"
REACT_APP_SITE_DOMAIN="https://wallet.openhive.network"
REACT_APP_BLOG_DOMAIN="https://blog.openhive.network"
REACT_APP_EXPLORER_DOMAIN='https://explore.openhive.network'
REACT_APP_LOGGING_BROWSER_ENABLED="false"
REACT_APP_LOGGING_LOG_LEVEL="info"
......
import { asset } from '@hiveio/wax';
import { useMutation } from '@tanstack/react-query';
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { transactionService } from '@transaction/index';
import { logger } from '@ui/lib/logger';
......@@ -10,6 +10,8 @@ import { logger } from '@ui/lib/logger';
* @returns
*/
export function useDelegateMutation() {
const queryClient = useQueryClient();
const delegateMutation = useMutation({
mutationFn: async (params: { delegator: string; delegatee: string; vestingShares: asset }) => {
const { delegatee, delegator, vestingShares } = params;
......@@ -24,6 +26,8 @@ export function useDelegateMutation() {
return response;
},
onSuccess: (data) => {
const { delegator } = data;
queryClient.invalidateQueries({ queryKey: ['vestingDelegation', delegator] });
logger.info('useDelegateMutation onSuccess data: %o', data);
}
});
......
import {
Dialog,
DialogTrigger,
Button,
DialogContent,
DialogHeader,
DialogDescription,
Input,
DialogFooter,
Label
} from '@ui/components';
import { useTranslation } from 'next-i18next';
import { useState } from 'react';
interface PasswordDialogProps {
onReveal: (password: string) => void;
keysUploaded: boolean;
}
const PasswordDialog = ({ onReveal, keysUploaded }: PasswordDialogProps) => {
const [password, setPassword] = useState('');
const [open, setOpen] = useState(false);
const { t } = useTranslation('common_wallet');
return keysUploaded ? (
<Button onClick={() => onReveal('password')} className="absolute right-0 mt-0 h-full rounded-l-none p-2">
{t('permissions.reveal')}
</Button>
) : (
<Dialog open={open} onOpenChange={setOpen}>
<DialogTrigger asChild>
<Button className="absolute right-0 mt-0 h-full rounded-l-none p-2">{t('permissions.reveal')}</Button>
</DialogTrigger>
<DialogContent className="sm:max-w-[425px]">
<DialogHeader>
<DialogDescription>Enter your master password to reveal the private key.</DialogDescription>
</DialogHeader>
<div>
<Label htmlFor="password">Master password</Label>
<Input
id="password"
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
</div>
<DialogFooter>
<Button
onClick={() => {
onReveal(password);
setOpen(false);
}}
type="submit"
>
{t('permissions.reveal')}
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
);
};
export default PasswordDialog;
import { Input, Label } from '@ui/components';
import { useQRCode } from 'next-qrcode';
import PasswordDialog from './password-dialog';
const RevealKeyComponent = ({
reveal,
keyValue,
onReveal,
title,
mockValue,
type
}: {
reveal: boolean;
keyValue: string;
onReveal: (password: string) => void;
title: string;
mockValue: string;
type: 'posting' | 'active' | 'owner' | 'memo';
}) => {
const { Canvas } = useQRCode();
return (
<div className="flex flex-col">
<Label htmlFor={type} className="text-lg font-semibold">
{title}
</Label>
<div className="relative h-10">
<Input
className="absolute left-0 h-full"
type={reveal && keyValue !== mockValue ? 'input' : 'password'}
id={type}
value={keyValue}
/>
{reveal ? null : (
<PasswordDialog onReveal={(password) => onReveal(password)} keysUploaded={keyValue !== mockValue} />
)}
</div>
{reveal ? (
<div className="self-end pt-2">
<Canvas
text={keyValue}
options={{
errorCorrectionLevel: 'M',
margin: 3,
scale: 4,
width: 100
}}
/>
</div>
) : null}
</div>
);
};
export default RevealKeyComponent;
import {
Button,
Dialog,
DialogContent,
DialogFooter,
DialogHeader,
DialogTitle,
DialogTrigger,
Input,
Label
} from '@ui/components';
import { useState } from 'react';
import { useDelegateMutation } from './hooks/use-delegate-mutation';
import { getVests } from '../lib/utils';
import { CircleSpinner } from 'react-spinners-kit';
import { toast } from '@ui/components/hooks/use-toast';
const RevokeDialog = ({ delegator, delegatee }: { delegator: string; delegatee: string }) => {
const [open, setOpen] = useState(false);
const delegateMutation = useDelegateMutation();
const onRevoke = async () => {
delegateMutation.mutate({
delegator: delegator,
delegatee: delegatee,
vestingShares: await getVests('0')
});
delegateMutation.isError &&
toast({
variant: 'destructive',
title: 'Error',
description: 'Failed to revoke delegation'
});
delegateMutation.isSuccess && setOpen(false);
};
const loading = delegateMutation.isLoading;
return (
<Dialog open={open} onOpenChange={setOpen}>
<DialogTrigger asChild>
<Button variant="outlineRed">Revoke</Button>
</DialogTrigger>
<DialogContent>
<DialogHeader>
<DialogTitle>Confirm Delegate Vesting Shares</DialogTitle>
</DialogHeader>
<div className="grid gap-4 py-4">
<div className="grid grid-cols-4 items-center gap-4">
<Label className="text-right">Delegator</Label>
<Input disabled value={delegator} className="col-span-3" />
</div>
<div className="grid grid-cols-4 items-center gap-4">
<Label className="text-right">Delegatee</Label>
<Input disabled value={delegatee} className="col-span-3" />
</div>
<div className="grid grid-cols-4 items-center gap-4">
<Label className="text-right">HIVE</Label>
<Input disabled value={0} className="col-span-3" />
</div>
</div>
<DialogFooter>
<Button variant="redHover" className="px-6" onClick={onRevoke} disabled={loading}>
{loading ? <CircleSpinner loading={loading} size={18} color="#dc2626" /> : 'Ok'}
</Button>
<div className="flex-grow" />
<Button variant="link" onClick={() => setOpen(false)} disabled={loading}>
Cancel
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
);
};
export default RevokeDialog;
......@@ -40,6 +40,7 @@
"next": "^14.2.5",
"next-i18next": "^15.1.1",
"next-pwa": "^5.6.0",
"next-qrcode": "^2.5.1",
"next-themes": "^0.2.1",
"next-transpile-modules": "^10.0.1",
"react": "18.3.0",
......
......@@ -6,10 +6,11 @@ import { numberWithCommas } from '@ui/lib/utils';
import { dateToFullRelative } from '@ui/lib/parse-date';
import Loading from '@ui/components/loading';
import ProfileLayout from '@/wallet/components/common/profile-layout';
import { useRouter } from 'next/router';
import { useTranslation } from 'next-i18next';
import WalletMenu from '@/wallet/components/wallet-menu';
import { getTranslations } from '../../lib/get-translations';
import RevokeDialog from '@/wallet/components/revoke-dialog';
import { useUser } from '@smart-signer/lib/auth/use-user';
const convertVestsToSteem = (vests: number, dynamicData: IDynamicGlobalProperties) => {
const totalFund = parseFloat(dynamicData.total_vesting_fund_hive);
......@@ -19,18 +20,14 @@ const convertVestsToSteem = (vests: number, dynamicData: IDynamicGlobalPropertie
function DelegationsPage({ username }: InferGetServerSidePropsType<typeof getServerSideProps>) {
const { t } = useTranslation('common_wallet');
const router = useRouter();
const {
data: vestingData,
isLoading: vestingLoading,
isError: vestingError
} = useQuery(['vestingDelegation', username, '', 50], () => getVestingDelegations(username, '', 50));
const {
data: dynamicData,
isSuccess: dynamicSuccess,
isLoading: dynamicLoading,
isError: dynamicError
} = useQuery(['dynamicGlobalProperties'], () => getDynamicGlobalProperties());
const { user } = useUser();
const accoutOwner = user.isLoggedIn && user.username === username;
const { data: vestingData, isLoading: vestingLoading } = useQuery(['vestingDelegation', username], () =>
getVestingDelegations(username, '', 50)
);
const { data: dynamicData, isLoading: dynamicLoading } = useQuery(['dynamicGlobalProperties'], () =>
getDynamicGlobalProperties()
);
if (dynamicLoading || vestingLoading) {
return <Loading loading={dynamicLoading || vestingLoading} />;
......@@ -50,11 +47,16 @@ function DelegationsPage({ username }: InferGetServerSidePropsType<typeof getSer
className="m-0 p-0 text-sm even:bg-slate-100 dark:even:bg-slate-700"
data-testid="wallet-delegation-item"
>
<td className=" px-4 py-2 ">
<td className="px-1 py-2 sm:px-4">
{numberWithCommas(convertVestsToSteem(parseFloat(element.vesting_shares), dynamicData))} HP
</td>
<td className=" px-4 py-2 ">{element.delegatee}</td>
<td className=" px-4 py-2 ">{dateToFullRelative(element.min_delegation_time, t)}</td>
<td className="px-1 py-2 sm:px-4">{element.delegatee}</td>
<td className="px-1 py-2 sm:px-4">{dateToFullRelative(element.min_delegation_time, t)}</td>
<td className="px-1 py-2 sm:px-4">
{accoutOwner ? (
<RevokeDialog delegator={element.delegator} delegatee={element.delegatee} />
) : null}
</td>
</tr>
))}
</tbody>
......
import { GetServerSideProps, InferGetServerSidePropsType } from 'next';
import ProfileLayout from '@/wallet/components/common/profile-layout';
import WalletMenu from '@/wallet/components/wallet-menu';
import { Button, Card, Input, Label, Separator } from '@ui/components';
import { Card, Separator } from '@ui/components';
import Link from 'next/link';
import { cn } from '@ui/lib/utils';
import { getTranslations } from '../../lib/get-translations';
import { useTranslation } from 'next-i18next';
import { useUser } from '@smart-signer/lib/auth/use-user';
import env from '@beam-australia/react-env';
import { useState } from 'react';
import { getPrivateKeys } from '@transaction/lib/hive';
import { toast } from '@ui/components/hooks/use-toast';
import RevealKeyComponent from '@/wallet/components/reveal-key-component';
interface Key {
type: string;
privateKey: string;
correctKey: boolean;
}
function keyDecoded(keys: Key[], type: 'posting' | 'active' | 'owner' | 'memo') {
const key = keys.find((key) => key.type === type);
return key?.correctKey ? key?.privateKey : undefined;
}
function Permissions({ username }: InferGetServerSidePropsType<typeof getServerSideProps>) {
const { t } = useTranslation('common_wallet');
const { user } = useUser();
const explorerURL = env('EXPLORER_DOMAIN');
const wifLogin = user.isLoggedIn && user.loginType === 'wif';
const [reveal, setReveal] = useState({
posting: false,
active: false,
owner: false,
memo: false
});
const mockValue = Array.from({ length: 50 }, (_, i) => '1')
.toString()
.replace(/,/g, '');
const [keys, setKeys] = useState({
posting: mockValue,
active: mockValue,
owner: mockValue,
memo: mockValue
});
const onReveal = async (password: string, keyType: 'posting' | 'active' | 'owner' | 'memo') => {
if (keys[keyType] !== mockValue) {
setReveal((prev) => ({ ...prev, [keyType]: true }));
return;
}
try {
const keysCheck = await getPrivateKeys(user.username, password);
if (keysCheck.some((key) => key.correctKey !== true)) {
toast({
title: 'Error',
description: 'Password is not including all keys',
variant: 'destructive'
});
} else {
setKeys((prev) => ({
posting: keyDecoded(keysCheck, 'posting') || prev.posting,
active: keyDecoded(keysCheck, 'active') || prev.active,
owner: keyDecoded(keysCheck, 'owner') || prev.owner,
memo: keyDecoded(keysCheck, 'memo') || prev.memo
}));
setReveal((prev) => ({ ...prev, [keyType]: true }));
}
} catch {
toast({
title: 'Error',
description: 'Operation failed',
variant: 'destructive'
});
}
};
return (
<ProfileLayout>
<div className="flex flex-col gap-8 ">
......@@ -33,23 +95,16 @@ function Permissions({ username }: InferGetServerSidePropsType<typeof getServerS
<div className="border-bg-border flex flex-col gap-8 border-none p-4 md:border-r-2 md:border-solid">
<p>{t('permissions.posting_key.info')}</p>
<p>{t('permissions.posting_key.use')}</p>
<div className="flex flex-col">
<Label htmlFor="postingKey" className="text-lg font-semibold">
{t('permissions.posting_key.private')}
</Label>
<div className="md:relative md:h-10">
<Input
className="left-0 h-full md:absolute"
type="password"
id="postingKey"
name="postingKey"
value="wqinufiqwhuifhq783hfuq83hqsadasdasfas9h3q9ruq3h"
/>
<Button className="right-0 mt-4 h-full p-2 md:absolute md:mt-0 md:rounded-l-none">
{t('permissions.reveal')}
</Button>
</div>
</div>
{wifLogin ? (
<RevealKeyComponent
reveal={reveal.posting}
keyValue={keys.posting}
onReveal={(password) => onReveal(password, 'posting')}
title={t('permissions.posting_key.private')}
mockValue={mockValue}
type="posting"
/>
) : null}
</div>
<div className="flex flex-col p-4">
......@@ -74,23 +129,16 @@ function Permissions({ username }: InferGetServerSidePropsType<typeof getServerS
<div className="border-bg-border flex flex-col gap-8 border-none p-4 md:border-r-2 md:border-solid">
<p>{t('permissions.active_key.info')}</p>
<p>{t('permissions.active_key.use')}</p>
<div className="flex flex-col">
<Label htmlFor="activeKey" className="text-lg font-semibold">
{t('permissions.active_key.private')}
</Label>
<div className="relative md:h-10">
<Input
className="left-0 h-full md:absolute"
type="password"
id="activeKey"
name="activeKey"
value="wqinufiqwhuifhq783hfuq83hqsadasdasfas9h3q9ruq3h"
/>
<Button className="right-0 mt-4 h-full p-2 md:absolute md:mt-0 md:rounded-l-none">
{t('permissions.reveal')}
</Button>
</div>
</div>
{wifLogin ? (
<RevealKeyComponent
reveal={reveal.active}
keyValue={keys.active}
onReveal={(password) => onReveal(password, 'active')}
title={t('permissions.active_key.private')}
mockValue={mockValue}
type="active"
/>
) : null}
</div>
<div className="flex flex-col p-4">
<h1 className="text-lg font-semibold">{t('permissions.active_key.permissions')}</h1>
......@@ -114,23 +162,16 @@ function Permissions({ username }: InferGetServerSidePropsType<typeof getServerS
<div className="flex flex-col md:grid md:grid-cols-[1fr_400px]">
<div className="border-bg-border flex flex-col gap-8 border-none p-4 md:border-r-2 md:border-solid">
<p>{t('permissions.owner_key.info')}</p>
<div className="flex flex-col">
<Label htmlFor="ownerKey" className="text-lg font-semibold">
{t('permissions.owner_key.private')}
</Label>
<div className="relative md:h-10">
<Input
className="left-0 h-full md:absolute"
type="password"
id="ownerKey"
name="ownerKey"
value="wqinufiqwhuifhq783hfuq83hqsadasdasfas9h3q9ruq3h"
/>
<Button className="right-0 mt-4 h-full p-2 md:absolute md:mt-0 md:rounded-l-none">
{t('permissions.reveal')}
</Button>
</div>
</div>
{wifLogin ? (
<RevealKeyComponent
reveal={reveal.owner}
keyValue={keys.owner}
onReveal={(password) => onReveal(password, 'owner')}
title={t('permissions.owner_key.private')}
mockValue={mockValue}
type="owner"
/>
) : null}
</div>
<div className="flex flex-col p-4">
<h1 className="text-lg font-semibold">{t('permissions.owner_key.permissions')}</h1>
......@@ -151,23 +192,16 @@ function Permissions({ username }: InferGetServerSidePropsType<typeof getServerS
<div className="border-bg-border flex flex-col gap-8 border-none p-4 md:border-r-2 md:border-solid">
<p>{t('permissions.memo_key.info')}</p>
<div className="flex flex-col">
<Label htmlFor="memoKey" className="text-lg font-semibold">
{t('permissions.memo_key.private')}
</Label>
<div className="relative md:h-10">
<Input
className="left-0 h-full md:absolute"
type="password"
id="memoKey"
name="memoKey"
value="wqinufiqwhuifhq783hfuq83hqsadasdasfas9h3q9ruq3h"
/>
<Button className="right-0 mt-4 h-full p-2 md:absolute md:mt-0 md:rounded-l-none">
{t('permissions.reveal')}
</Button>
</div>
</div>
{wifLogin ? (
<RevealKeyComponent
reveal={reveal.memo}
keyValue={keys.memo}
onReveal={(password) => onReveal(password, 'memo')}
title={t('permissions.memo_key.private')}
mockValue={mockValue}
type="memo"
/>
) : null}
</div>
<div className="flex flex-col p-4">
<h1 className="text-lg font-semibold">{t('permissions.memo_key.permissions')}</h1>
......@@ -186,8 +220,8 @@ function Permissions({ username }: InferGetServerSidePropsType<typeof getServerS
<p>{t('permissions.public_info')}</p>
<div>
<p>{t('permissions.view_public')}</p>
<Link href="hiveblocks.com/@guest4test1" className="font-bold text-red-600">
hiveblocks.com/@guest4test1
<Link href={`${explorerURL}/@${username}`} className="font-bold text-red-600" target="_blank">
{`Block Explorer - ${username}`}
</Link>
</div>
</div>
......
......@@ -38,6 +38,7 @@ import FinancialReport from '@/wallet/components/financial-report';
import { useClaimRewardsMutation } from '@/wallet/components/hooks/use-claim-rewards-mutation';
import { useMemo } from 'react';
import { useCancelPowerDownMutation } from '@/wallet/components/hooks/use-power-hive-mutation';
import env from '@beam-australia/react-env';
import { useCancelTransferFromSavingsMutation } from '@/wallet/components/hooks/use-cancel-transfer-from-savings-mutation';
const initialFilters: TransferFilters = {
......@@ -189,6 +190,7 @@ export type AccountHistoryData = ReturnType<typeof mapToAccountHistoryObject>;
function TransfersPage({ username }: InferGetServerSidePropsType<typeof getServerSideProps>) {
const { t } = useTranslation('common_wallet');
const blogURL = env('BLOG_DOMAIN');
const [rawFilter, filter, setFilter] = useFilters(initialFilters);
const { user } = useUser();
const { data: accountData, isLoading: accountLoading } = useQuery(
......@@ -540,7 +542,9 @@ function TransfersPage({ username }: InferGetServerSidePropsType<typeof getServe
value: getCurrentHpApr(dynamicData).toFixed(2)
})}
<span className="font-semibold text-primary hover:text-destructive">
<Link href="https://hive.blog/faq.html#How_many_new_tokens_are_generated_by_the_blockchain">
<Link
href={`https:/${blogURL}/faq.html#How_many_new_tokens_are_generated_by_the_blockchain`}
>
{t('profil.see_faq_for_details')}
</Link>
</span>
......
Subproject commit b7870f229cc0d45993a648ab9a15b0b4a12e7fe5
Subproject commit 40a77e182a3a00af18479755d5eb43d8b76070d8
......@@ -4,15 +4,15 @@
"scripts": {
"dev": "turbo dev",
"build": "turbo build",
"dev:blog": "./scripts/write-version.sh ./apps/blog/version.json &&turbo dev --filter=@hive/blog",
"dev:3010:blog": "./scripts/write-version.sh ./apps/blog/version.json &&turbo dev:3010 --filter=@hive/blog",
"devssl:blog": "./scripts/write-version.sh ./apps/blog/version.json &&turbo devssl --filter=@hive/blog",
"build:blog": "./scripts/write-version.sh ./apps/blog/version.json &&turbo build --filter=@hive/blog",
"start:blog": "./scripts/write-version.sh ./apps/blog/version.json &&turbo start --filter=@hive/blog",
"dev:wallet": "./scripts/write-version.sh ./apps/wallet/version.json &&turbo dev --filter=@hive/wallet",
"devssl:wallet": "./scripts/write-version.sh ./apps/wallet/version.json &&turbo devssl --filter=@hive/wallet",
"build:wallet": "./scripts/write-version.sh ./apps/wallet/version.json &&turbo build --filter=@hive/wallet",
"start:wallet": "./scripts/write-version.sh ./apps/wallet/version.json &&turbo start --filter=@hive/wallet",
"dev:blog": "./scripts/write-version.sh ./apps/blog/version.json && turbo dev --filter=@hive/blog",
"dev:3010:blog": "./scripts/write-version.sh ./apps/blog/version.json && turbo dev:3010 --filter=@hive/blog",
"devssl:blog": "./scripts/write-version.sh ./apps/blog/version.json && turbo devssl --filter=@hive/blog",
"build:blog": "./scripts/write-version.sh ./apps/blog/version.json && turbo build --filter=@hive/blog",
"start:blog": "./scripts/write-version.sh ./apps/blog/version.json && turbo start --filter=@hive/blog",
"dev:wallet": "./scripts/write-version.sh ./apps/wallet/version.json && turbo dev --filter=@hive/wallet",
"devssl:wallet": "./scripts/write-version.sh ./apps/wallet/version.json && turbo devssl --filter=@hive/wallet",
"build:wallet": "./scripts/write-version.sh ./apps/wallet/version.json && turbo build --filter=@hive/wallet",
"start:wallet": "./scripts/write-version.sh ./apps/wallet/version.json && turbo start --filter=@hive/wallet",
"dev:auth": "./scripts/write-version.sh ./apps/auth/version.json && turbo dev --filter=@hive/auth",
"devssl:auth": "./scripts/write-version.sh ./apps/auth/version.json && turbo devssl --filter=@hive/auth",
"build:auth": "./scripts/write-version.sh ./apps/auth/version.json && turbo build --filter=@hive/auth",
......
{
"extends": "@engrave/eslint-config-engrave",
"parserOptions": {
"project": "./tsconfig.eslint.json"
}
}
\ No newline at end of file
.idea
.vscode
/dist
/.DS_Store
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
# next.js build output
.next
npx --no-install -- commitlint --edit $1
\ No newline at end of file