管理端修改
This commit is contained in:
1 parent
5fe7f5d476
commit
b652132957
8 files changed
+257
-7
No files matched your search
@@ -22,6 +22,10 @@ interface Stats {
|
||||
|
||||
export default function DashboardPage() {
|
||||
const [stats, setStats] = useState<Stats | null>(null);
|
||||
/** 对外域名,只读展示;值来自服务端 .env,后台改不了 */
|
||||
const [site, setSite] = useState<{ staticBaseUrl: string; apiBaseUrl: string; adminOrigin: string } | null>(
|
||||
null,
|
||||
);
|
||||
const [error, setError] = useState('');
|
||||
|
||||
useEffect(() => {
|
||||
@@ -29,6 +33,12 @@ export default function DashboardPage() {
|
||||
.stats()
|
||||
.then(setStats)
|
||||
.catch((err: { message: string }) => setError(err.message));
|
||||
api
|
||||
.siteInfo()
|
||||
.then(setSite)
|
||||
.catch(() => {
|
||||
// 域名拿不到不影响看板其他内容
|
||||
});
|
||||
}, []);
|
||||
|
||||
const yuan = (fen: number) => (fen / 100).toFixed(2);
|
||||
@@ -102,6 +112,29 @@ export default function DashboardPage() {
|
||||
</p>
|
||||
</Card>
|
||||
)}
|
||||
|
||||
{site && (
|
||||
<Card title="站点信息(只读)">
|
||||
<ul className="space-y-1 text-sm text-gray-600">
|
||||
<li>
|
||||
课程数据域名:<span className="font-mono">{site.staticBaseUrl}</span>
|
||||
<span className="ml-2 text-xs text-gray-400">封面、视频等静态资源</span>
|
||||
</li>
|
||||
<li>
|
||||
服务端 API 域名:<span className="font-mono">{site.apiBaseUrl}</span>
|
||||
</li>
|
||||
<li>
|
||||
管理后台域名:<span className="font-mono">{site.adminOrigin}</span>
|
||||
</li>
|
||||
<li className="pt-1 text-xs text-gray-400">
|
||||
<span className="font-medium text-gray-500">只读,改这里无效,要改去服务器 .env</span>
|
||||
(<span className="font-mono">STATIC_BASE_URL</span> /{' '}
|
||||
<span className="font-mono">API_BASE_URL</span> /{' '}
|
||||
<span className="font-mono">ADMIN_ORIGIN</span>)
|
||||
</li>
|
||||
</ul>
|
||||
</Card>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -16,6 +16,12 @@ function toInputValue(field: FieldDef, raw: unknown): string {
|
||||
const d = new Date(String(raw));
|
||||
return isNaN(d.getTime()) ? '' : d.toISOString().slice(0, 10);
|
||||
}
|
||||
// 金额:库里是分,表单里给元
|
||||
if (field.money) {
|
||||
const fen = Number(raw);
|
||||
if (!Number.isFinite(fen)) return '';
|
||||
return (fen / 100).toFixed(2);
|
||||
}
|
||||
return String(raw);
|
||||
}
|
||||
|
||||
@@ -26,7 +32,10 @@ function buildPayload(fields: FieldDef[], form: FormState): Row {
|
||||
const value = form[field.name];
|
||||
if (value === undefined) continue;
|
||||
if (value === '') {
|
||||
payload[field.name] = field.type === 'number' ? 0 : null;
|
||||
payload[field.name] = field.type === 'number' || field.money ? 0 : null;
|
||||
} else if (field.money) {
|
||||
// 元 → 分,四舍五入到整数分,避免浮点误差(1.2 元 → 120 分)
|
||||
payload[field.name] = Math.round(Number(value) * 100);
|
||||
} else if (field.type === 'number' || field.type === 'select') {
|
||||
payload[field.name] = Number(value);
|
||||
} else {
|
||||
@@ -39,6 +48,7 @@ function buildPayload(fields: FieldDef[], form: FormState): Row {
|
||||
function displayCell(field: FieldDef, row: Row): string {
|
||||
const raw = row[field.name];
|
||||
if (raw === null || raw === undefined || raw === '') return '—';
|
||||
if (field.money) return `${fenToYuan(raw)}`;
|
||||
if (field.type === 'select' && field.options) {
|
||||
const hit = field.options.find((o) => o.value === Number(raw));
|
||||
return hit ? hit.label : String(raw);
|
||||
@@ -47,6 +57,14 @@ function displayCell(field: FieldDef, row: Row): string {
|
||||
return String(raw);
|
||||
}
|
||||
|
||||
/** 分 → 元。金额一律固定两位小数,不省 .00(1 元显示成 1.00 元) */
|
||||
function fenToYuan(fen: unknown): string {
|
||||
if (fen === null || fen === undefined || fen === '') return '—';
|
||||
const n = Number(fen);
|
||||
if (!Number.isFinite(n)) return String(fen);
|
||||
return (n / 100).toFixed(2);
|
||||
}
|
||||
|
||||
export function ResourceTable({ config }: { config: ResourceConfig }) {
|
||||
const [items, setItems] = useState<Row[]>([]);
|
||||
const [total, setTotal] = useState(0);
|
||||
@@ -54,6 +72,8 @@ export function ResourceTable({ config }: { config: ResourceConfig }) {
|
||||
const [keyword, setKeyword] = useState('');
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [error, setError] = useState('');
|
||||
/** 静态资源域名,配了卡片视图时才需要(用来拼封面图地址) */
|
||||
const [staticBase, setStaticBase] = useState('');
|
||||
|
||||
const [formOpen, setFormOpen] = useState(false);
|
||||
const [editing, setEditing] = useState<Row | null>(null);
|
||||
@@ -84,6 +104,16 @@ export function ResourceTable({ config }: { config: ResourceConfig }) {
|
||||
load(1, '');
|
||||
}, [config.key, load]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!config.card) return;
|
||||
api
|
||||
.siteInfo()
|
||||
.then((site) => setStaticBase(site.staticBaseUrl.replace(/\/+$/, '')))
|
||||
.catch(() => {
|
||||
// 取不到就只是不显示封面图,不影响列表本身
|
||||
});
|
||||
}, [config.card]);
|
||||
|
||||
const openCreate = () => {
|
||||
const initial: FormState = {};
|
||||
for (const f of config.fields) {
|
||||
@@ -154,6 +184,96 @@ export function ResourceTable({ config }: { config: ResourceConfig }) {
|
||||
<div className="py-10 text-center text-sm text-gray-400">加载中…</div>
|
||||
) : items.length === 0 ? (
|
||||
<Empty />
|
||||
) : config.card ? (
|
||||
/* 卡片视图:短字段挤一行,长字段按标签-值显示(超过两行截断) */
|
||||
/*
|
||||
两个旋钮:
|
||||
minmax(290px) —— 决定一行放几张:约 1500px 宽时正好 5 张
|
||||
zoom: 0.8 —— 整张卡(文字/图标/内边距一起)等比缩放
|
||||
用 zoom 而不是单独改字号,是因为长宽要一起缩;只改宽度会变成「更窄但一样高」。
|
||||
*/
|
||||
<div className="grid grid-cols-[repeat(auto-fill,minmax(290px,1fr))] gap-3">
|
||||
{items.map((row) => {
|
||||
const card = config.card!;
|
||||
const coverPath = card.cover(row);
|
||||
const coverUrl = coverPath && staticBase ? `${staticBase}/${coverPath}` : '';
|
||||
const allFields: FieldDef[] = [
|
||||
{ name: 'id', label: 'ID', type: 'number' },
|
||||
...config.fields,
|
||||
];
|
||||
const inline = allFields.filter((f) => card.inlineFields.includes(f.name));
|
||||
// 底栏已经单独显示了 footerField,别再在正文里重复一遍
|
||||
const rest = allFields.filter(
|
||||
(f) => !card.inlineFields.includes(f.name) && f.name !== card.footerField?.name,
|
||||
);
|
||||
|
||||
return (
|
||||
<div
|
||||
key={String(row.id)}
|
||||
style={{ zoom: 0.8 }}
|
||||
className="flex flex-col overflow-hidden rounded-lg border border-gray-200 bg-white shadow-sm transition-shadow hover:shadow-md"
|
||||
>
|
||||
{coverUrl && (
|
||||
/* 9:5 与课程封面原始像素(900×500)一致,配合 contain 保证图片完整不裁剪 */
|
||||
<img
|
||||
src={coverUrl}
|
||||
alt=""
|
||||
loading="lazy"
|
||||
className="aspect-[9/5] w-full bg-[#15457b] object-contain"
|
||||
/>
|
||||
)}
|
||||
|
||||
<div className="flex flex-wrap items-center gap-x-3 gap-y-1 border-b border-gray-100 px-3 py-2 text-xs text-gray-700">
|
||||
{inline.map((f) => (
|
||||
<span key={f.name}>
|
||||
<span className="text-gray-400">{f.label} </span>
|
||||
{displayCell(f, row)}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* 值一律单行截断(悬停看全文),换行会让卡片高度不可控 */}
|
||||
<div className="flex-1 space-y-1 px-3 py-2">
|
||||
{rest.map((f) => {
|
||||
const text = displayCell(f, row);
|
||||
return (
|
||||
<div key={f.name} className="flex gap-2 text-xs leading-relaxed">
|
||||
<span className="w-14 shrink-0 text-gray-400">{f.label}</span>
|
||||
<span className="min-w-0 flex-1 truncate text-gray-700" title={text}>
|
||||
{text}
|
||||
</span>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
|
||||
<div className="flex items-center justify-between gap-2 border-t border-gray-100 px-3 py-2">
|
||||
{card.footerField ? (
|
||||
<span className="text-base font-medium text-gray-900">
|
||||
<span className="text-xs text-gray-400">{card.footerField.label} </span>
|
||||
{card.footerField.money
|
||||
? `${fenToYuan(row[card.footerField.name])} 元`
|
||||
: displayCell(
|
||||
{ name: card.footerField.name, label: card.footerField.label, type: 'text' },
|
||||
row,
|
||||
)}
|
||||
</span>
|
||||
) : (
|
||||
<span />
|
||||
)}
|
||||
<div className="flex gap-2">
|
||||
<Button variant="ghost" onClick={() => openEdit(row)}>
|
||||
编辑
|
||||
</Button>
|
||||
<Button variant="danger" onClick={() => remove(row)}>
|
||||
删除
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
) : (
|
||||
<div className="overflow-x-auto">
|
||||
<table className="w-full text-sm">
|
||||
@@ -261,4 +381,3 @@ export function ResourceTable({ config }: { config: ResourceConfig }) {
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -153,6 +153,10 @@ export const api = {
|
||||
listNotifyLogs: (page: number, pageSize: number) =>
|
||||
request<Paged<Record<string, unknown>>>(`/admin/v1/notify-logs${qs({ page, pageSize })}`),
|
||||
|
||||
/** 站点级信息:对外域名。后台只读展示,也用来拼封面图地址 */
|
||||
siteInfo: () =>
|
||||
request<{ staticBaseUrl: string; apiBaseUrl: string; adminOrigin: string }>('/admin/v1/site'),
|
||||
|
||||
refundOrder: (id: number, reason: string, reasonCode: number) =>
|
||||
request<unknown>(`/admin/v1/orders/${id}/refund`, {
|
||||
method: 'POST',
|
||||
|
||||
@@ -11,6 +11,11 @@ export interface FieldDef {
|
||||
name: string;
|
||||
label: string;
|
||||
type: FieldType;
|
||||
/**
|
||||
* 金额字段:库里存的是「分」,列表和编辑表单统一按「元」显示与填写。
|
||||
* 存库时再乘回 100(四舍五入到分),避免把 1.2 元当成 1.2 分存进去。
|
||||
*/
|
||||
money?: boolean;
|
||||
/** 编辑时不可修改(如 courses.code,改动会让视频路径失效) */
|
||||
immutable?: boolean;
|
||||
options?: Array<{ value: number; label: string }>;
|
||||
@@ -27,6 +32,21 @@ export interface ResourceConfig {
|
||||
fields: FieldDef[];
|
||||
/** 额外筛选条件(如按课程筛课时) */
|
||||
filterByCourse?: boolean;
|
||||
/**
|
||||
* 配了就用卡片网格代替表格。
|
||||
* 卡片会把**所有字段**都显示出来(表格里 hideInTable 的也显示),过长的文字截断。
|
||||
*/
|
||||
card?: {
|
||||
/** 封面图在静态资源域名下的相对路径,返回 null 表示这张卡不显示图 */
|
||||
cover: (row: Record<string, unknown>) => string | null;
|
||||
/** 这几个字段挤在一行显示(短值,如 id / 价格 / 状态 / 排序),其余按标签-值逐行显示 */
|
||||
inlineFields: string[];
|
||||
/**
|
||||
* 单独放在卡片底部(编辑/删除按钮左侧)的字段,字号比卡片其他文字大。
|
||||
* money=true 时按「分 → 元」显示。编辑表单里仍然是原始的分,避免填错。
|
||||
*/
|
||||
footerField?: { name: string; label: string; money?: boolean };
|
||||
};
|
||||
}
|
||||
|
||||
const STATUS_FIELD: FieldDef = {
|
||||
@@ -50,11 +70,17 @@ export const RESOURCE_CONFIGS: ResourceConfig[] = [
|
||||
{ name: 'code', label: '课程标识', type: 'text', immutable: true, hint: '64 位哈希,对应视频目录' },
|
||||
{ name: 'title', label: '课程名称', type: 'text' },
|
||||
{ name: 'intro', label: '课程介绍', type: 'text' },
|
||||
{ name: 'price_fen', label: '价格(分)', type: 'number' },
|
||||
{ name: 'price_fen', label: '价格(元)', type: 'number', money: true },
|
||||
{ name: 'cover_image', label: '封面文件', type: 'text', hideInTable: true },
|
||||
STATUS_FIELD,
|
||||
SORT_FIELD,
|
||||
],
|
||||
// 课程封面规则与服务端 staticUrls.courseCover 一致:Course/{code}.png
|
||||
card: {
|
||||
cover: (row) => (row.code ? `Course/${row.code}.png` : null),
|
||||
inlineFields: ['id', 'status', 'sort_order'],
|
||||
footerField: { name: 'price_fen', label: '价格', money: true },
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'lessons',
|
||||
@@ -71,6 +97,11 @@ export const RESOURCE_CONFIGS: ResourceConfig[] = [
|
||||
{ name: 'published_at', label: '发布日期', type: 'date' },
|
||||
SORT_FIELD,
|
||||
],
|
||||
// 课时统一用**所属课程**的封面,避免每个课时各拉一张图
|
||||
card: {
|
||||
cover: (row) => (row.course_code ? `Course/${row.course_code}.png` : null),
|
||||
inlineFields: ['id', 'course_id', 'duration', 'sort_order'],
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'home-courses',
|
||||
@@ -85,6 +116,11 @@ export const RESOURCE_CONFIGS: ResourceConfig[] = [
|
||||
STATUS_FIELD,
|
||||
SORT_FIELD,
|
||||
],
|
||||
// 图片规则与小程序 staticUrls.newCourseCover 一致:Images/NewCourse/{course_name}.png
|
||||
card: {
|
||||
cover: (row) => (row.course_name ? `Images/NewCourse/${row.course_name}.png` : null),
|
||||
inlineFields: ['id', 'course_id', 'status', 'sort_order'],
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'home-free-courses',
|
||||
@@ -97,6 +133,11 @@ export const RESOURCE_CONFIGS: ResourceConfig[] = [
|
||||
STATUS_FIELD,
|
||||
SORT_FIELD,
|
||||
],
|
||||
// 对应小程序 staticUrls.freeCourseCover:Images/FreeCourse/{course_name}.png
|
||||
card: {
|
||||
cover: (row) => (row.course_name ? `Images/FreeCourse/${row.course_name}.png` : null),
|
||||
inlineFields: ['id', 'series_no', 'status', 'sort_order'],
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'banners',
|
||||
@@ -107,6 +148,11 @@ export const RESOURCE_CONFIGS: ResourceConfig[] = [
|
||||
STATUS_FIELD,
|
||||
SORT_FIELD,
|
||||
],
|
||||
// 对应小程序 staticUrls.banner:Images/Banner/{filename},filename 自带扩展名
|
||||
card: {
|
||||
cover: (row) => (row.filename ? `Images/Banner/${row.filename}` : null),
|
||||
inlineFields: ['id', 'status', 'sort_order'],
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'articles',
|
||||
@@ -131,7 +177,7 @@ export const RESOURCE_CONFIGS: ResourceConfig[] = [
|
||||
{ name: 'course_id', label: '课程 ID', type: 'number' },
|
||||
{ name: 'wx_product_id', label: '微信道具 ID', type: 'text' },
|
||||
{ name: 'name', label: '商品名称', type: 'text' },
|
||||
{ name: 'price_fen', label: '价格(分)', type: 'text' },
|
||||
{ name: 'price_fen', label: '价格(元)', type: 'number', money: true },
|
||||
STATUS_FIELD,
|
||||
],
|
||||
},
|
||||
@@ -147,4 +193,3 @@ export const ORDER_STATUS_TEXT: Record<number, string> = {
|
||||
3: '已退款',
|
||||
4: '已关闭',
|
||||
};
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"fileNames":["./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts",".Line truncated
|
||||
{"fileNames":["./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts",".Line truncated
|
||||
Reference in new issue
Block a user