@burdenoff/microfe-proserviceworld 2026.719.1 → 2026.728.1
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/dist/proserviceworld/ProServiceWorldRoot.d.ts.map +1 -1
- package/dist/proserviceworld/ProServiceWorldRoot.js +18 -12
- package/dist/proserviceworld/ProServiceWorldRoot.js.map +1 -1
- package/dist/proserviceworld/ProServiceWorldRoutes.d.ts.map +1 -1
- package/dist/proserviceworld/ProServiceWorldRoutes.js +34 -27
- package/dist/proserviceworld/ProServiceWorldRoutes.js.map +1 -1
- package/dist/proserviceworld/hooks/useProServiceWorldApi.d.ts +77 -0
- package/dist/proserviceworld/hooks/useProServiceWorldApi.d.ts.map +1 -1
- package/dist/proserviceworld/hooks/useProServiceWorldApi.js +243 -141
- package/dist/proserviceworld/hooks/useProServiceWorldApi.js.map +1 -1
- package/dist/proserviceworld/pages/DashboardPage.d.ts.map +1 -1
- package/dist/proserviceworld/pages/DashboardPage.js +94 -82
- package/dist/proserviceworld/pages/DashboardPage.js.map +1 -1
- package/dist/proserviceworld/pages/TrustPage.d.ts +14 -0
- package/dist/proserviceworld/pages/TrustPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/TrustPage.js +603 -0
- package/dist/proserviceworld/pages/TrustPage.js.map +1 -0
- package/package.json +19 -11
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TrustPage.js","names":[],"sources":["../../../src/proserviceworld/pages/TrustPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport {\n Plus,\n Wallet,\n ArrowDownCircle,\n ArrowUpCircle,\n Repeat,\n ClipboardCheck,\n ShieldAlert,\n} from 'lucide-react';\nimport {\n useTrustAccounts,\n useCreateTrustAccount,\n useTrustTransactions,\n useTrustClientBalance,\n useRecordTrustDeposit,\n useRecordTrustWithdrawal,\n useCreateTrustTransfer,\n useReconcileTrustAccount,\n useClients,\n type PswTrustAccount,\n type PswTrustReconciliationReport,\n} from '../hooks/useProServiceWorldApi';\nimport {\n PageHeader,\n SectionCard,\n LoadingBlock,\n ErrorState,\n Empty,\n StatusPill,\n Modal,\n Field,\n TextInput,\n TextArea,\n NativeSelect,\n Banner,\n MetricCard,\n TableWrap,\n Th,\n Td,\n fmtDate,\n fmtMoney,\n} from '../components/ui';\nimport { cn } from '../utils/cn';\n\n/**\n * Trust accounting / IOLTA reconciliation (BOFF-4209).\n *\n * A firm's pooled trust account holds client funds separately from its own\n * operating money. Every client's subsidiary-ledger balance is enforced\n * server-side to never go negative (see `PracticeService.writeTrustLedgerEntry`\n * in wspace-proserviceworld-svc) — this page surfaces that ledger, lets a\n * billing/compliance user record deposits/withdrawals/transfers, and run a\n * three-way reconciliation against a bank statement balance.\n */\nexport const TrustPage: FC = () => {\n const [selectedAccountId, setSelectedAccountId] = useState<string>('');\n const [selectedClientId, setSelectedClientId] = useState<string>('');\n const [modal, setModal] = useState<\n 'account' | 'deposit' | 'withdrawal' | 'transfer' | 'reconcile' | null\n >(null);\n const [banner, setBanner] = useState<{ tone: 'success' | 'danger'; text: string } | null>(null);\n const [report, setReport] = useState<PswTrustReconciliationReport | null>(null);\n\n const accounts = useTrustAccounts();\n const clients = useClients({ pagination: { limit: 100 } });\n const clientName = useMemo(\n () => new Map((clients.data?.items ?? []).map((c) => [c.id, c.name])),\n [clients.data]\n );\n\n const accountId = selectedAccountId || accounts.data?.items[0]?.id || '';\n const transactions = useTrustTransactions({ trustAccountId: accountId || undefined });\n const balance = useTrustClientBalance(accountId || undefined, selectedClientId || undefined);\n\n if (accounts.isLoading) return <LoadingBlock />;\n if (accounts.error)\n return <ErrorState error={accounts.error} onRetry={() => void accounts.refetch()} />;\n\n const account: PswTrustAccount | undefined = accounts.data?.items.find((a) => a.id === accountId);\n\n return (\n <div className=\"space-y-6\">\n <PageHeader\n title=\"Trust Accounting\"\n subtitle=\"IOLTA-style trust ledger — client funds held separately from the firm's operating money, reconciled against the bank statement.\"\n icon={<Wallet className=\"h-6 w-6\" />}\n actions={\n <Button onClick={() => setModal('account')}>\n <Plus className=\"mr-1.5 h-4 w-4\" />\n New trust account\n </Button>\n }\n />\n\n {banner && (\n <Banner tone={banner.tone} onClose={() => setBanner(null)}>\n {banner.text}\n </Banner>\n )}\n\n {!accounts.data || accounts.data.items.length === 0 ? (\n <Empty\n title=\"No trust accounts yet\"\n description=\"Open a trust (IOLTA) account to start holding client funds separately from operating money.\"\n icon={<Wallet className=\"h-8 w-8\" />}\n action={\n <Button onClick={() => setModal('account')}>\n <Plus className=\"mr-1.5 h-4 w-4\" />\n New trust account\n </Button>\n }\n />\n ) : (\n <>\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <NativeSelect\n value={accountId}\n onChange={(e) => setSelectedAccountId(e.target.value)}\n className=\"sm:w-64\"\n >\n {accounts.data.items.map((a) => (\n <option key={a.id} value={a.id}>\n {a.name} {a.status === 'CLOSED' ? '(closed)' : ''}\n </option>\n ))}\n </NativeSelect>\n {account && <StatusPill status={account.status} />}\n <NativeSelect\n value={selectedClientId}\n onChange={(e) => setSelectedClientId(e.target.value)}\n className=\"sm:w-56\"\n >\n <option value=\"\">All clients</option>\n {clients.data?.items.map((c) => (\n <option key={c.id} value={c.id}>\n {c.name}\n </option>\n ))}\n </NativeSelect>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setModal('deposit')}>\n <ArrowDownCircle className=\"mr-1.5 h-4 w-4\" />\n Deposit\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setModal('withdrawal')}>\n <ArrowUpCircle className=\"mr-1.5 h-4 w-4\" />\n Withdrawal\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setModal('transfer')}>\n <Repeat className=\"mr-1.5 h-4 w-4\" />\n Transfer to operating\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setModal('reconcile')}>\n <ClipboardCheck className=\"mr-1.5 h-4 w-4\" />\n Reconcile\n </Button>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <MetricCard\n label=\"Trust accounts\"\n value={accounts.data.totalCount}\n icon={<Wallet className=\"h-4 w-4\" />}\n />\n <MetricCard\n label=\"Currency\"\n value={account?.currency ?? '—'}\n icon={<Wallet className=\"h-4 w-4\" />}\n />\n {selectedClientId ? (\n <MetricCard\n label={`Balance — ${clientName.get(selectedClientId) ?? 'client'}`}\n value={\n balance.isLoading ? '…' : fmtMoney(balance.data?.balance ?? 0, account?.currency)\n }\n icon={<Wallet className=\"h-4 w-4\" />}\n tone={(balance.data?.balance ?? 0) < 0 ? 'danger' : 'success'}\n />\n ) : (\n <MetricCard\n label=\"Ledger entries\"\n value={transactions.data?.totalCount ?? 0}\n icon={<ClipboardCheck className=\"h-4 w-4\" />}\n />\n )}\n </div>\n\n {report && (\n <SectionCard title=\"Reconciliation result\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-4\">\n <MetricCard\n label=\"Book balance\"\n value={fmtMoney(report.bookBalance, account?.currency)}\n icon={<Wallet className=\"h-4 w-4\" />}\n />\n <MetricCard\n label=\"Statement balance\"\n value={\n report.statementBalance != null\n ? fmtMoney(report.statementBalance, account?.currency)\n : '—'\n }\n icon={<ClipboardCheck className=\"h-4 w-4\" />}\n />\n <MetricCard\n label=\"Difference\"\n value={\n report.difference != null ? fmtMoney(report.difference, account?.currency) : '—'\n }\n tone={report.inBalance ? 'success' : 'danger'}\n icon={\n report.inBalance ? (\n <ClipboardCheck className=\"h-4 w-4\" />\n ) : (\n <ShieldAlert className=\"h-4 w-4\" />\n )\n }\n />\n <MetricCard\n label=\"Reconciled entries\"\n value={report.reconciledCount}\n icon={<ClipboardCheck className=\"h-4 w-4\" />}\n />\n </div>\n {!report.inBalance && (\n <div className=\"mt-3\">\n <Banner tone=\"danger\">\n Out of balance — the bank statement does not match the book balance. Investigate\n before closing this reconciliation period.\n </Banner>\n </div>\n )}\n {report.clientBalances.length > 0 && (\n <div className=\"mt-3\">\n <TableWrap>\n <thead>\n <tr>\n <Th>Client</Th>\n <Th>Matter</Th>\n <Th className=\"text-right\">Balance</Th>\n </tr>\n </thead>\n <tbody>\n {report.clientBalances.map((cb, i) => (\n <tr key={`${cb.clientId}-${cb.matterId ?? 'none'}-${i}`}>\n <Td>{clientName.get(cb.clientId) ?? cb.clientId}</Td>\n <Td>{cb.matterId ?? '—'}</Td>\n <Td className=\"text-right font-medium\">\n {fmtMoney(cb.balance, account?.currency)}\n </Td>\n </tr>\n ))}\n </tbody>\n </TableWrap>\n </div>\n )}\n </SectionCard>\n )}\n\n {transactions.isLoading ? (\n <LoadingBlock />\n ) : transactions.error ? (\n <ErrorState error={transactions.error} onRetry={() => void transactions.refetch()} />\n ) : !transactions.data || transactions.data.items.length === 0 ? (\n <Empty title=\"No trust ledger entries yet\" icon={<Wallet className=\"h-8 w-8\" />} />\n ) : (\n <SectionCard title=\"Trust ledger\">\n <TableWrap>\n <thead>\n <tr>\n <Th>Date</Th>\n <Th>Client</Th>\n <Th>Type</Th>\n <Th className=\"text-right\">Amount</Th>\n <Th className=\"text-right\">Balance after</Th>\n <Th>Reference</Th>\n <Th>Reconciled</Th>\n </tr>\n </thead>\n <tbody>\n {transactions.data.items.map((t) => (\n <tr key={t.id} className=\"transition-colors hover:bg-bg-sunken/60\">\n <Td className=\"whitespace-nowrap\">{fmtDate(t.createdAt)}</Td>\n <Td>{clientName.get(t.clientId) ?? t.clientId}</Td>\n <Td>\n <StatusPill status={t.type} />\n </Td>\n <Td\n className={cn(\n 'text-right font-medium whitespace-nowrap',\n t.amount < 0 ? 'text-status-error-text' : 'text-status-success-text'\n )}\n >\n {fmtMoney(t.amount, account?.currency)}\n </Td>\n <Td className=\"text-right whitespace-nowrap\">\n {fmtMoney(t.balanceAfter, account?.currency)}\n </Td>\n <Td>{t.reference ?? '—'}</Td>\n <Td>{t.reconciled ? <StatusPill status=\"RECONCILED\" /> : '—'}</Td>\n </tr>\n ))}\n </tbody>\n </TableWrap>\n </SectionCard>\n )}\n </>\n )}\n\n {modal === 'account' && (\n <TrustAccountModal\n onClose={() => setModal(null)}\n onSaved={(name) => setBanner({ tone: 'success', text: `${name} created.` })}\n />\n )}\n {modal === 'deposit' && accountId && (\n <TrustEntryModal\n kind=\"deposit\"\n trustAccountId={accountId}\n currency={account?.currency}\n onClose={() => setModal(null)}\n onSaved={() => setBanner({ tone: 'success', text: 'Deposit recorded.' })}\n />\n )}\n {modal === 'withdrawal' && accountId && (\n <TrustEntryModal\n kind=\"withdrawal\"\n trustAccountId={accountId}\n currency={account?.currency}\n onClose={() => setModal(null)}\n onSaved={() => setBanner({ tone: 'success', text: 'Withdrawal recorded.' })}\n />\n )}\n {modal === 'transfer' && accountId && (\n <TrustTransferModal\n trustAccountId={accountId}\n currency={account?.currency}\n onClose={() => setModal(null)}\n onSaved={() => setBanner({ tone: 'success', text: 'Transfer to operating recorded.' })}\n />\n )}\n {modal === 'reconcile' && accountId && (\n <TrustReconcileModal\n trustAccountId={accountId}\n onClose={() => setModal(null)}\n onSaved={(r) => {\n setReport(r);\n setBanner({\n tone: r.inBalance ? 'success' : 'danger',\n text: r.inBalance\n ? `Reconciled — ${r.reconciledCount} entries, in balance.`\n : `Reconciled with a difference of ${fmtMoney(r.difference ?? 0, account?.currency)} — review before closing the period.`,\n });\n }}\n />\n )}\n </div>\n );\n};\n\nconst TrustAccountModal: FC<{ onClose: () => void; onSaved: (name: string) => void }> = ({\n onClose,\n onSaved,\n}) => {\n const create = useCreateTrustAccount();\n const [form, setForm] = useState({\n name: '',\n institutionName: '',\n accountNumberLast4: '',\n currency: 'USD',\n });\n const [err, setErr] = useState<string | null>(null);\n const set = (k: keyof typeof form) => (e: { target: { value: string } }) =>\n setForm((f) => ({ ...f, [k]: e.target.value }));\n\n const submit = () => {\n setErr(null);\n if (!form.name.trim()) return setErr('Account name is required.');\n create.mutate(\n {\n name: form.name.trim(),\n institutionName: form.institutionName.trim() || null,\n accountNumberLast4: form.accountNumberLast4.trim() || null,\n currency: form.currency || 'USD',\n },\n {\n onSuccess: () => {\n onSaved(form.name.trim());\n onClose();\n },\n onError: (e) => setErr(e instanceof Error ? e.message : 'Failed.'),\n }\n );\n };\n\n return (\n <Modal\n open\n onClose={onClose}\n title=\"New trust account\"\n footer={\n <>\n <Button variant=\"outline\" onClick={onClose} disabled={create.isPending}>\n Cancel\n </Button>\n <Button onClick={submit} disabled={create.isPending}>\n {create.isPending ? 'Creating…' : 'Create account'}\n </Button>\n </>\n }\n >\n <div className=\"space-y-3\">\n {err && <Banner tone=\"danger\">{err}</Banner>}\n <Field label=\"Name\" required>\n <TextInput value={form.name} onChange={set('name')} placeholder=\"IOLTA Main\" />\n </Field>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Institution (optional)\">\n <TextInput value={form.institutionName} onChange={set('institutionName')} />\n </Field>\n <Field label=\"Currency\">\n <TextInput value={form.currency} onChange={set('currency')} maxLength={3} />\n </Field>\n </div>\n <Field label=\"Last 4 of account number (optional)\">\n <TextInput\n value={form.accountNumberLast4}\n onChange={set('accountNumberLast4')}\n maxLength={4}\n />\n </Field>\n </div>\n </Modal>\n );\n};\n\nconst TrustEntryModal: FC<{\n kind: 'deposit' | 'withdrawal';\n trustAccountId: string;\n currency?: string;\n onClose: () => void;\n onSaved: () => void;\n}> = ({ kind, trustAccountId, currency, onClose, onSaved }) => {\n const deposit = useRecordTrustDeposit();\n const withdrawal = useRecordTrustWithdrawal();\n const mutation = kind === 'deposit' ? deposit : withdrawal;\n const clients = useClients({ pagination: { limit: 100 } });\n const [form, setForm] = useState({\n clientId: '',\n matterId: '',\n amount: '',\n reference: '',\n description: '',\n });\n const [err, setErr] = useState<string | null>(null);\n const set = (k: keyof typeof form) => (e: { target: { value: string } }) =>\n setForm((f) => ({ ...f, [k]: e.target.value }));\n\n const submit = () => {\n setErr(null);\n if (!form.clientId) return setErr('Select a client.');\n const amount = Number(form.amount);\n if (!(amount > 0)) return setErr('Amount must be greater than zero.');\n mutation.mutate(\n {\n trustAccountId,\n clientId: form.clientId,\n matterId: form.matterId || null,\n amount,\n reference: form.reference.trim() || null,\n description: form.description.trim() || null,\n },\n {\n onSuccess: () => {\n onSaved();\n onClose();\n },\n onError: (e) => setErr(e instanceof Error ? e.message : 'Failed.'),\n }\n );\n };\n\n return (\n <Modal\n open\n onClose={onClose}\n title={kind === 'deposit' ? 'Record trust deposit' : 'Record trust withdrawal'}\n footer={\n <>\n <Button variant=\"outline\" onClick={onClose} disabled={mutation.isPending}>\n Cancel\n </Button>\n <Button onClick={submit} disabled={mutation.isPending}>\n {mutation.isPending\n ? 'Saving…'\n : kind === 'deposit'\n ? 'Record deposit'\n : 'Record withdrawal'}\n </Button>\n </>\n }\n >\n <div className=\"space-y-3\">\n {err && <Banner tone=\"danger\">{err}</Banner>}\n {kind === 'withdrawal' && (\n <Banner tone=\"info\">\n A withdrawal that would take this client’s trust balance below zero is rejected — trust\n funds are never allowed to go negative.\n </Banner>\n )}\n <Field label=\"Client\" required>\n <NativeSelect value={form.clientId} onChange={set('clientId')}>\n <option value=\"\">Select…</option>\n {clients.data?.items.map((c) => (\n <option key={c.id} value={c.id}>\n {c.name}\n </option>\n ))}\n </NativeSelect>\n </Field>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Amount\" required>\n <TextInput\n type=\"number\"\n min=\"0.01\"\n step=\"0.01\"\n value={form.amount}\n onChange={set('amount')}\n />\n </Field>\n <Field label=\"Reference (optional)\">\n <TextInput value={form.reference} onChange={set('reference')} placeholder=\"CHK-1042\" />\n </Field>\n </div>\n {form.amount && (\n <div className=\"rounded-lg bg-bg-sunken px-3 py-2 text-sm text-text-secondary\">\n {fmtMoney(Number(form.amount) || 0, currency)}\n </div>\n )}\n <Field label=\"Description (optional)\">\n <TextArea value={form.description} onChange={set('description')} />\n </Field>\n </div>\n </Modal>\n );\n};\n\nconst TrustTransferModal: FC<{\n trustAccountId: string;\n currency?: string;\n onClose: () => void;\n onSaved: () => void;\n}> = ({ trustAccountId, onClose, onSaved }) => {\n const transfer = useCreateTrustTransfer();\n const clients = useClients({ pagination: { limit: 100 } });\n const [form, setForm] = useState({ clientId: '', amount: '', reason: '' });\n const [err, setErr] = useState<string | null>(null);\n const set = (k: keyof typeof form) => (e: { target: { value: string } }) =>\n setForm((f) => ({ ...f, [k]: e.target.value }));\n\n const submit = () => {\n setErr(null);\n if (!form.clientId) return setErr('Select a client.');\n const amount = Number(form.amount);\n if (!(amount > 0)) return setErr('Amount must be greater than zero.');\n transfer.mutate(\n { trustAccountId, clientId: form.clientId, amount, reason: form.reason.trim() || null },\n {\n onSuccess: () => {\n onSaved();\n onClose();\n },\n onError: (e) => setErr(e instanceof Error ? e.message : 'Failed.'),\n }\n );\n };\n\n return (\n <Modal\n open\n onClose={onClose}\n title=\"Transfer to operating\"\n footer={\n <>\n <Button variant=\"outline\" onClick={onClose} disabled={transfer.isPending}>\n Cancel\n </Button>\n <Button onClick={submit} disabled={transfer.isPending}>\n {transfer.isPending ? 'Transferring…' : 'Transfer'}\n </Button>\n </>\n }\n >\n <div className=\"space-y-3\">\n {err && <Banner tone=\"danger\">{err}</Banner>}\n <Banner tone=\"info\">\n Moves earned fees from this client’s trust ledger to the firm’s operating account.\n Rejected if it would take the client’s trust balance below zero.\n </Banner>\n <Field label=\"Client\" required>\n <NativeSelect value={form.clientId} onChange={set('clientId')}>\n <option value=\"\">Select…</option>\n {clients.data?.items.map((c) => (\n <option key={c.id} value={c.id}>\n {c.name}\n </option>\n ))}\n </NativeSelect>\n </Field>\n <Field label=\"Amount\" required>\n <TextInput\n type=\"number\"\n min=\"0.01\"\n step=\"0.01\"\n value={form.amount}\n onChange={set('amount')}\n />\n </Field>\n <Field label=\"Reason (optional)\">\n <TextArea\n value={form.reason}\n onChange={set('reason')}\n placeholder=\"Invoice INV-2026-0001 paid from trust\"\n />\n </Field>\n </div>\n </Modal>\n );\n};\n\nconst TrustReconcileModal: FC<{\n trustAccountId: string;\n onClose: () => void;\n onSaved: (report: PswTrustReconciliationReport) => void;\n}> = ({ trustAccountId, onClose, onSaved }) => {\n const reconcile = useReconcileTrustAccount();\n const [statementBalance, setStatementBalance] = useState('');\n const [err, setErr] = useState<string | null>(null);\n\n const submit = () => {\n setErr(null);\n reconcile.mutate(\n {\n trustAccountId,\n statementBalance: statementBalance.trim() ? Number(statementBalance) : null,\n },\n {\n onSuccess: (r) => {\n onSaved(r as PswTrustReconciliationReport);\n onClose();\n },\n onError: (e) => setErr(e instanceof Error ? e.message : 'Failed.'),\n }\n );\n };\n\n return (\n <Modal\n open\n onClose={onClose}\n title=\"Reconcile trust account\"\n footer={\n <>\n <Button variant=\"outline\" onClick={onClose} disabled={reconcile.isPending}>\n Cancel\n </Button>\n <Button onClick={submit} disabled={reconcile.isPending}>\n {reconcile.isPending ? 'Reconciling…' : 'Reconcile'}\n </Button>\n </>\n }\n >\n <div className=\"space-y-3\">\n {err && <Banner tone=\"danger\">{err}</Banner>}\n <Banner tone=\"info\">\n Computes the book balance and every client’s subsidiary-ledger balance as of now, compares\n it against the bank statement balance below, and marks every not-yet-reconciled entry as\n reconciled.\n </Banner>\n <Field label=\"Bank statement balance (optional)\">\n <TextInput\n type=\"number\"\n step=\"0.01\"\n value={statementBalance}\n onChange={(e) => setStatementBalance(e.target.value)}\n placeholder=\"Leave blank to skip the bank-balance check\"\n />\n </Field>\n </div>\n </Modal>\n );\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@burdenoff/microfe-proserviceworld",
|
|
3
|
-
"version": "2026.
|
|
3
|
+
"version": "2026.728.1",
|
|
4
4
|
"description": "Burdenoff ProServiceWorld Microfrontend",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -27,7 +27,10 @@
|
|
|
27
27
|
"lint:sanity": "if [ \"${CI:-}\" = \"true\" ]; then bun run lint; else bun run lint -- --cache --cache-location .eslintcache; fi",
|
|
28
28
|
"format": "prettier --write \"src/**/*.{ts,tsx}\"",
|
|
29
29
|
"type:check": "tsc --noEmit",
|
|
30
|
-
"
|
|
30
|
+
"test": "vitest run",
|
|
31
|
+
"test:watch": "vitest",
|
|
32
|
+
"test:coverage": "vitest run --coverage",
|
|
33
|
+
"sanity": "bun run codegen && bun run lint:sanity && bun run format && bun run type:check && bun run test && bun run build && bun run build-storybook",
|
|
31
34
|
"schema:pull": "graphql-codegen --project schema-wspace && graphql-codegen --project schema-global",
|
|
32
35
|
"codegen": "graphql-codegen --project wspace && graphql-codegen --project global",
|
|
33
36
|
"codegen:all": "bun run schema:pull && bun run codegen",
|
|
@@ -65,30 +68,35 @@
|
|
|
65
68
|
"@graphql-codegen/typescript": "^4.0.0",
|
|
66
69
|
"@graphql-codegen/typescript-operations": "^4.0.0",
|
|
67
70
|
"@graphql-codegen/typescript-react-apollo": "^4.0.0",
|
|
71
|
+
"@storybook/addon-essentials": "^8.6.0",
|
|
72
|
+
"@storybook/addon-interactions": "^8.6.0",
|
|
73
|
+
"@storybook/react": "^8.6.0",
|
|
74
|
+
"@storybook/react-vite": "^8.6.0",
|
|
75
|
+
"@storybook/test": "^8.6.0",
|
|
76
|
+
"@storybook/test-runner": "0.22.0",
|
|
77
|
+
"@tailwindcss/vite": "^4.3.2",
|
|
78
|
+
"@testing-library/jest-dom": "^6.6.3",
|
|
79
|
+
"@testing-library/react": "^16.1.0",
|
|
68
80
|
"@types/react": "^19.0.2",
|
|
69
81
|
"@types/react-dom": "^19.0.2",
|
|
70
82
|
"@vitejs/plugin-react": "^4.3.4",
|
|
83
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
71
84
|
"autoprefixer": "^10.4.20",
|
|
72
85
|
"eslint": "^9.18.0",
|
|
73
86
|
"eslint-plugin-react": "^7.37.5",
|
|
74
87
|
"eslint-plugin-react-hooks": "^7.0.1",
|
|
75
88
|
"eslint-plugin-react-refresh": "^0.4.26",
|
|
89
|
+
"jsdom": "^25.0.1",
|
|
76
90
|
"lefthook": "^2.1.1",
|
|
77
91
|
"postcss": "^8.4.49",
|
|
78
|
-
"@storybook/addon-essentials": "^8.6.0",
|
|
79
|
-
"@storybook/addon-interactions": "^8.6.0",
|
|
80
|
-
"@storybook/react": "^8.6.0",
|
|
81
|
-
"@storybook/react-vite": "^8.6.0",
|
|
82
|
-
"@storybook/test": "^8.6.0",
|
|
83
|
-
"@storybook/test-runner": "0.22.0",
|
|
84
|
-
"@tailwindcss/vite": "^4.3.2",
|
|
85
|
-
"storybook": "^8.6.0",
|
|
86
92
|
"prettier": "^3.4.2",
|
|
93
|
+
"storybook": "^8.6.0",
|
|
87
94
|
"tailwindcss": "^4.0.0",
|
|
88
95
|
"typescript": "^5.9.0",
|
|
89
96
|
"typescript-eslint": "^8.54.0",
|
|
90
97
|
"vite": "8.1.4",
|
|
91
|
-
"vite-plugin-dts": "3.9.1"
|
|
98
|
+
"vite-plugin-dts": "3.9.1",
|
|
99
|
+
"vitest": "^3.2.4"
|
|
92
100
|
},
|
|
93
101
|
"peerDependencies": {
|
|
94
102
|
"@apollo/client": "^4.0.11",
|