Files
newsnow/shared/types.ts
T

111 lines
2.6 KiB
TypeScript

import type { colors } from "unocss/preset-mini"
import type { columns, fixedColumnIds } from "./metadata"
import type { originSources } from "./pre-sources"
export type Color = "primary" | Exclude<keyof typeof colors, "current" | "inherit" | "transparent" | "black" | "white">
type ConstSources = typeof originSources
type MainSourceID = keyof(ConstSources)
export type SourceID = {
[Key in MainSourceID]: ConstSources[Key] extends { disable?: true } ? never :
ConstSources[Key] extends { sub?: infer SubSource } ? {
// @ts-expect-error >_<
[SubKey in keyof SubSource]: SubSource[SubKey] extends { disable?: true } ? never : `${Key}-${SubKey}`
}[keyof SubSource] | Key : Key;
}[MainSourceID]
export type AllSourceID = {
[Key in MainSourceID]: ConstSources[Key] extends { sub?: infer SubSource } ? keyof {
// @ts-expect-error >_<
[SubKey in keyof SubSource as `${Key}-${SubKey}`]: never
} | Key : Key
}[MainSourceID]
// export type DisabledSourceID = Exclude<SourceID, MainSourceID>
export type ColumnID = keyof typeof columns
export type Metadata = Record<ColumnID, Column>
export interface PrimitiveMetadata {
updatedTime: number
data: Record<FixedColumnID, SourceID[]>
action: "init" | "manual" | "sync"
}
export type FixedColumnID = (typeof fixedColumnIds)[number]
export type HiddenColumnID = Exclude<ColumnID, FixedColumnID>
export interface OriginSource extends Partial<Omit<Source, "name" | "redirect">> {
name: string
sub?: Record<string, {
/**
* Subtitle 小标题
*/
title: string
// type?: "hottest" | "realtime"
// desc?: string
// column?: ManualColumnID
// color?: Color
// home?: string
// disable?: boolean
// interval?: number
} & Partial<Omit<Source, "title" | "name" | "redirect">>>
}
export interface Source {
name: string
/**
* 刷新的间隔时间
*/
interval: number
color: Color
/**
* Subtitle 小标题
*/
title?: string
desc?: string
/**
* Default normal timeline
*/
type?: "hottest" | "realtime"
column?: HiddenColumnID
home?: string
/**
* @default false
*/
disable?: boolean | "cf"
redirect?: SourceID
}
export interface Column {
name: string
sources: SourceID[]
}
export interface NewsItem {
id: string | number // unique
title: string
url: string
mobileUrl?: string
pubDate?: number | string
extra?: {
hover?: string
date?: number | string
info?: false | string
diff?: number
icon?: false | string | {
url: string
scale: number
}
}
}
export interface SourceResponse {
status: "success" | "cache"
id: SourceID
updatedTime: number | string
items: NewsItem[]
}