mirror of
https://github.com/kennethnym/aris.git
synced 2026-03-20 00:51:20 +00:00
Compare commits
1 Commits
fix/feed-i
...
feat/tfl-f
| Author | SHA1 | Date | |
|---|---|---|---|
|
0aa3036459
|
@@ -39,7 +39,7 @@ describe("WeatherKitDataSource", () => {
|
||||
credentials: mockCredentials,
|
||||
})
|
||||
|
||||
expect(dataSource.type).toBe(WeatherFeedItemType.Current)
|
||||
expect(dataSource.type).toBe(WeatherFeedItemType.current)
|
||||
})
|
||||
|
||||
test("throws error if neither client nor credentials provided", () => {
|
||||
@@ -130,9 +130,9 @@ describe("query() with mocked client", () => {
|
||||
const items = await dataSource.query(context)
|
||||
|
||||
expect(items.length).toBeGreaterThan(0)
|
||||
expect(items.some((i) => i.type === WeatherFeedItemType.Current)).toBe(true)
|
||||
expect(items.some((i) => i.type === WeatherFeedItemType.Hourly)).toBe(true)
|
||||
expect(items.some((i) => i.type === WeatherFeedItemType.Daily)).toBe(true)
|
||||
expect(items.some((i) => i.type === WeatherFeedItemType.current)).toBe(true)
|
||||
expect(items.some((i) => i.type === WeatherFeedItemType.hourly)).toBe(true)
|
||||
expect(items.some((i) => i.type === WeatherFeedItemType.daily)).toBe(true)
|
||||
})
|
||||
|
||||
test("applies hourly and daily limits", async () => {
|
||||
@@ -145,8 +145,8 @@ describe("query() with mocked client", () => {
|
||||
|
||||
const items = await dataSource.query(context)
|
||||
|
||||
const hourlyItems = items.filter((i) => i.type === WeatherFeedItemType.Hourly)
|
||||
const dailyItems = items.filter((i) => i.type === WeatherFeedItemType.Daily)
|
||||
const hourlyItems = items.filter((i) => i.type === WeatherFeedItemType.hourly)
|
||||
const dailyItems = items.filter((i) => i.type === WeatherFeedItemType.daily)
|
||||
|
||||
expect(hourlyItems.length).toBe(3)
|
||||
expect(dailyItems.length).toBe(2)
|
||||
@@ -176,8 +176,8 @@ describe("query() with mocked client", () => {
|
||||
units: Units.imperial,
|
||||
})
|
||||
|
||||
const metricCurrent = metricItems.find((i) => i.type === WeatherFeedItemType.Current)
|
||||
const imperialCurrent = imperialItems.find((i) => i.type === WeatherFeedItemType.Current)
|
||||
const metricCurrent = metricItems.find((i) => i.type === WeatherFeedItemType.current)
|
||||
const imperialCurrent = imperialItems.find((i) => i.type === WeatherFeedItemType.current)
|
||||
|
||||
expect(metricCurrent).toBeDefined()
|
||||
expect(imperialCurrent).toBeDefined()
|
||||
@@ -203,7 +203,7 @@ describe("query() with mocked client", () => {
|
||||
expect(item.signals!.timeRelevance).toBeDefined()
|
||||
}
|
||||
|
||||
const currentItem = items.find((i) => i.type === WeatherFeedItemType.Current)
|
||||
const currentItem = items.find((i) => i.type === WeatherFeedItemType.current)
|
||||
expect(currentItem).toBeDefined()
|
||||
expect(currentItem!.signals!.urgency).toBeGreaterThanOrEqual(0.5)
|
||||
})
|
||||
|
||||
@@ -44,7 +44,7 @@ export class WeatherKitDataSource implements DataSource<WeatherFeedItem, Weather
|
||||
private readonly DEFAULT_HOURLY_LIMIT = 12
|
||||
private readonly DEFAULT_DAILY_LIMIT = 7
|
||||
|
||||
readonly type = WeatherFeedItemType.Current
|
||||
readonly type = WeatherFeedItemType.current
|
||||
private readonly client: WeatherKitClient
|
||||
private readonly hourlyLimit: number
|
||||
private readonly dailyLimit: number
|
||||
@@ -228,7 +228,7 @@ function createCurrentWeatherFeedItem(
|
||||
|
||||
return {
|
||||
id: `weather-current-${timestamp.getTime()}`,
|
||||
type: WeatherFeedItemType.Current,
|
||||
type: WeatherFeedItemType.current,
|
||||
timestamp,
|
||||
data: {
|
||||
conditionCode: current.conditionCode,
|
||||
@@ -262,7 +262,7 @@ function createHourlyWeatherFeedItem(
|
||||
|
||||
return {
|
||||
id: `weather-hourly-${timestamp.getTime()}-${index}`,
|
||||
type: WeatherFeedItemType.Hourly,
|
||||
type: WeatherFeedItemType.hourly,
|
||||
timestamp,
|
||||
data: {
|
||||
forecastTime: new Date(hourly.forecastStart),
|
||||
@@ -296,7 +296,7 @@ function createDailyWeatherFeedItem(
|
||||
|
||||
return {
|
||||
id: `weather-daily-${timestamp.getTime()}-${index}`,
|
||||
type: WeatherFeedItemType.Daily,
|
||||
type: WeatherFeedItemType.daily,
|
||||
timestamp,
|
||||
data: {
|
||||
forecastDate: new Date(daily.forecastStart),
|
||||
@@ -323,7 +323,7 @@ function createWeatherAlertFeedItem(alert: WeatherAlert, timestamp: Date): Weath
|
||||
|
||||
return {
|
||||
id: `weather-alert-${alert.id}`,
|
||||
type: WeatherFeedItemType.Alert,
|
||||
type: WeatherFeedItemType.alert,
|
||||
timestamp,
|
||||
data: {
|
||||
alertId: alert.id,
|
||||
|
||||
@@ -3,10 +3,10 @@ import type { FeedItem } from "@aris/core"
|
||||
import type { Certainty, ConditionCode, PrecipitationType, Severity, Urgency } from "./weatherkit"
|
||||
|
||||
export const WeatherFeedItemType = {
|
||||
Current: "weather-current",
|
||||
Hourly: "weather-hourly",
|
||||
Daily: "weather-daily",
|
||||
Alert: "weather-alert",
|
||||
current: "weather-current",
|
||||
hourly: "weather-hourly",
|
||||
daily: "weather-daily",
|
||||
alert: "weather-alert",
|
||||
} as const
|
||||
|
||||
export type WeatherFeedItemType = (typeof WeatherFeedItemType)[keyof typeof WeatherFeedItemType]
|
||||
@@ -28,7 +28,7 @@ export type CurrentWeatherData = {
|
||||
}
|
||||
|
||||
export interface CurrentWeatherFeedItem extends FeedItem<
|
||||
typeof WeatherFeedItemType.Current,
|
||||
typeof WeatherFeedItemType.current,
|
||||
CurrentWeatherData
|
||||
> {}
|
||||
|
||||
@@ -49,7 +49,7 @@ export type HourlyWeatherData = {
|
||||
}
|
||||
|
||||
export interface HourlyWeatherFeedItem extends FeedItem<
|
||||
typeof WeatherFeedItemType.Hourly,
|
||||
typeof WeatherFeedItemType.hourly,
|
||||
HourlyWeatherData
|
||||
> {}
|
||||
|
||||
@@ -68,7 +68,7 @@ export type DailyWeatherData = {
|
||||
}
|
||||
|
||||
export interface DailyWeatherFeedItem extends FeedItem<
|
||||
typeof WeatherFeedItemType.Daily,
|
||||
typeof WeatherFeedItemType.daily,
|
||||
DailyWeatherData
|
||||
> {}
|
||||
|
||||
@@ -86,7 +86,7 @@ export type WeatherAlertData = {
|
||||
}
|
||||
|
||||
export interface WeatherAlertFeedItem extends FeedItem<
|
||||
typeof WeatherFeedItemType.Alert,
|
||||
typeof WeatherFeedItemType.alert,
|
||||
WeatherAlertData
|
||||
> {}
|
||||
|
||||
|
||||
@@ -4,10 +4,10 @@ import { TimeRelevance, UnknownActionError } from "@aris/core"
|
||||
import { DAVClient } from "tsdav"
|
||||
|
||||
import type { CalDavDAVClient, CalDavEventData, CalDavFeedItem } from "./types.ts"
|
||||
import { CalDavEventStatus } from "./types.ts"
|
||||
|
||||
import { CalDavCalendarKey, type CalendarContext } from "./calendar-context.ts"
|
||||
import { parseICalEvents } from "./ical-parser.ts"
|
||||
import { CalDavEventStatus, CalDavFeedItemType } from "./types.ts"
|
||||
|
||||
// -- Source options --
|
||||
|
||||
@@ -340,7 +340,7 @@ export function computeSignals(
|
||||
function createFeedItem(event: CalDavEventData, now: Date, timeZone?: string): CalDavFeedItem {
|
||||
return {
|
||||
id: `caldav-event-${event.uid}${event.recurrenceId ? `-${event.recurrenceId}` : ""}`,
|
||||
type: CalDavFeedItemType.Event,
|
||||
type: "caldav-event",
|
||||
timestamp: now,
|
||||
data: event,
|
||||
signals: computeSignals(event, now, timeZone),
|
||||
|
||||
@@ -5,7 +5,6 @@ export {
|
||||
AttendeeRole,
|
||||
AttendeeStatus,
|
||||
CalDavEventStatus,
|
||||
CalDavFeedItemType,
|
||||
type CalDavAlarm,
|
||||
type CalDavAttendee,
|
||||
type CalDavDAVCalendar,
|
||||
|
||||
@@ -64,17 +64,9 @@ export interface CalDavEventData extends Record<string, unknown> {
|
||||
recurrenceId: string | null
|
||||
}
|
||||
|
||||
// -- Feed item type --
|
||||
|
||||
export const CalDavFeedItemType = {
|
||||
Event: "caldav-event",
|
||||
} as const
|
||||
|
||||
export type CalDavFeedItemType = (typeof CalDavFeedItemType)[keyof typeof CalDavFeedItemType]
|
||||
|
||||
// -- Feed item --
|
||||
|
||||
export type CalDavFeedItem = FeedItem<typeof CalDavFeedItemType.Event, CalDavEventData>
|
||||
export type CalDavFeedItem = FeedItem<"caldav-event", CalDavEventData>
|
||||
|
||||
// -- DAV client interface --
|
||||
|
||||
|
||||
@@ -3,19 +3,19 @@ import type { FeedItem } from "@aris/core"
|
||||
import type { CalendarEventData } from "./types"
|
||||
|
||||
export const CalendarFeedItemType = {
|
||||
Event: "calendar-event",
|
||||
AllDay: "calendar-all-day",
|
||||
event: "calendar-event",
|
||||
allDay: "calendar-all-day",
|
||||
} as const
|
||||
|
||||
export type CalendarFeedItemType = (typeof CalendarFeedItemType)[keyof typeof CalendarFeedItemType]
|
||||
|
||||
export interface CalendarEventFeedItem extends FeedItem<
|
||||
typeof CalendarFeedItemType.Event,
|
||||
typeof CalendarFeedItemType.event,
|
||||
CalendarEventData
|
||||
> {}
|
||||
|
||||
export interface CalendarAllDayFeedItem extends FeedItem<
|
||||
typeof CalendarFeedItemType.AllDay,
|
||||
typeof CalendarFeedItemType.allDay,
|
||||
CalendarEventData
|
||||
> {}
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ describe("GoogleCalendarSource", () => {
|
||||
const source = new GoogleCalendarSource({ client: defaultMockClient() })
|
||||
const items = await source.fetchItems(createContext())
|
||||
|
||||
const timedItems = items.filter((i) => i.type === CalendarFeedItemType.Event)
|
||||
const timedItems = items.filter((i) => i.type === CalendarFeedItemType.event)
|
||||
expect(timedItems.length).toBe(4)
|
||||
})
|
||||
|
||||
@@ -77,7 +77,7 @@ describe("GoogleCalendarSource", () => {
|
||||
const source = new GoogleCalendarSource({ client: defaultMockClient() })
|
||||
const items = await source.fetchItems(createContext())
|
||||
|
||||
const allDayItems = items.filter((i) => i.type === CalendarFeedItemType.AllDay)
|
||||
const allDayItems = items.filter((i) => i.type === CalendarFeedItemType.allDay)
|
||||
expect(allDayItems.length).toBe(1)
|
||||
})
|
||||
|
||||
|
||||
@@ -209,7 +209,7 @@ function createFeedItem(
|
||||
nowMs: number,
|
||||
lookaheadMs: number,
|
||||
): CalendarFeedItem {
|
||||
const itemType = event.isAllDay ? CalendarFeedItemType.AllDay : CalendarFeedItemType.Event
|
||||
const itemType = event.isAllDay ? CalendarFeedItemType.allDay : CalendarFeedItemType.event
|
||||
|
||||
return {
|
||||
id: `calendar-${event.calendarId}-${event.eventId}`,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
export { NextEventKey, type NextEvent } from "./calendar-context"
|
||||
export {
|
||||
CalendarFeedItemType,
|
||||
type CalendarFeedItemType as CalendarFeedItemTypeType,
|
||||
type CalendarAllDayFeedItem,
|
||||
type CalendarEventFeedItem,
|
||||
type CalendarFeedItem,
|
||||
@@ -9,6 +10,7 @@ export { DefaultGoogleCalendarClient } from "./google-calendar-api"
|
||||
export { GoogleCalendarSource, type GoogleCalendarSourceOptions } from "./google-calendar-source"
|
||||
export {
|
||||
EventStatus,
|
||||
type EventStatus as EventStatusType,
|
||||
type ApiCalendarEvent,
|
||||
type ApiEventDateTime,
|
||||
type CalendarEventData,
|
||||
|
||||
@@ -3,10 +3,10 @@ import type { FeedItem } from "@aris/core"
|
||||
import type { Certainty, ConditionCode, PrecipitationType, Severity, Urgency } from "./weatherkit"
|
||||
|
||||
export const WeatherFeedItemType = {
|
||||
Current: "weather-current",
|
||||
Hourly: "weather-hourly",
|
||||
Daily: "weather-daily",
|
||||
Alert: "weather-alert",
|
||||
current: "weather-current",
|
||||
hourly: "weather-hourly",
|
||||
daily: "weather-daily",
|
||||
alert: "weather-alert",
|
||||
} as const
|
||||
|
||||
export type WeatherFeedItemType = (typeof WeatherFeedItemType)[keyof typeof WeatherFeedItemType]
|
||||
@@ -28,7 +28,7 @@ export type CurrentWeatherData = {
|
||||
}
|
||||
|
||||
export interface CurrentWeatherFeedItem extends FeedItem<
|
||||
typeof WeatherFeedItemType.Current,
|
||||
typeof WeatherFeedItemType.current,
|
||||
CurrentWeatherData
|
||||
> {}
|
||||
|
||||
@@ -49,7 +49,7 @@ export type HourlyWeatherData = {
|
||||
}
|
||||
|
||||
export interface HourlyWeatherFeedItem extends FeedItem<
|
||||
typeof WeatherFeedItemType.Hourly,
|
||||
typeof WeatherFeedItemType.hourly,
|
||||
HourlyWeatherData
|
||||
> {}
|
||||
|
||||
@@ -68,7 +68,7 @@ export type DailyWeatherData = {
|
||||
}
|
||||
|
||||
export interface DailyWeatherFeedItem extends FeedItem<
|
||||
typeof WeatherFeedItemType.Daily,
|
||||
typeof WeatherFeedItemType.daily,
|
||||
DailyWeatherData
|
||||
> {}
|
||||
|
||||
@@ -86,7 +86,7 @@ export type WeatherAlertData = {
|
||||
}
|
||||
|
||||
export interface WeatherAlertFeedItem extends FeedItem<
|
||||
typeof WeatherFeedItemType.Alert,
|
||||
typeof WeatherFeedItemType.alert,
|
||||
WeatherAlertData
|
||||
> {}
|
||||
|
||||
|
||||
@@ -1,8 +1,14 @@
|
||||
export { WeatherKey, type Weather } from "./weather-context"
|
||||
export { WeatherSource, Units, type WeatherSourceOptions } from "./weather-source"
|
||||
export {
|
||||
WeatherSource,
|
||||
Units,
|
||||
type Units as UnitsType,
|
||||
type WeatherSourceOptions,
|
||||
} from "./weather-source"
|
||||
|
||||
export {
|
||||
WeatherFeedItemType,
|
||||
type WeatherFeedItemType as WeatherFeedItemTypeType,
|
||||
type WeatherFeedItem,
|
||||
type CurrentWeatherFeedItem,
|
||||
type CurrentWeatherData,
|
||||
@@ -21,6 +27,11 @@ export {
|
||||
Certainty,
|
||||
PrecipitationType,
|
||||
DefaultWeatherKitClient,
|
||||
type ConditionCode as ConditionCodeType,
|
||||
type Severity as SeverityType,
|
||||
type Urgency as UrgencyType,
|
||||
type Certainty as CertaintyType,
|
||||
type PrecipitationType as PrecipitationTypeType,
|
||||
type WeatherKitClient,
|
||||
type WeatherKitCredentials,
|
||||
type WeatherKitQueryOptions,
|
||||
|
||||
@@ -110,9 +110,9 @@ describe("WeatherSource", () => {
|
||||
const items = await source.fetchItems(context)
|
||||
|
||||
expect(items.length).toBeGreaterThan(0)
|
||||
expect(items.some((i) => i.type === WeatherFeedItemType.Current)).toBe(true)
|
||||
expect(items.some((i) => i.type === WeatherFeedItemType.Hourly)).toBe(true)
|
||||
expect(items.some((i) => i.type === WeatherFeedItemType.Daily)).toBe(true)
|
||||
expect(items.some((i) => i.type === WeatherFeedItemType.current)).toBe(true)
|
||||
expect(items.some((i) => i.type === WeatherFeedItemType.hourly)).toBe(true)
|
||||
expect(items.some((i) => i.type === WeatherFeedItemType.daily)).toBe(true)
|
||||
})
|
||||
|
||||
test("applies hourly and daily limits", async () => {
|
||||
@@ -125,8 +125,8 @@ describe("WeatherSource", () => {
|
||||
|
||||
const items = await source.fetchItems(context)
|
||||
|
||||
const hourlyItems = items.filter((i) => i.type === WeatherFeedItemType.Hourly)
|
||||
const dailyItems = items.filter((i) => i.type === WeatherFeedItemType.Daily)
|
||||
const hourlyItems = items.filter((i) => i.type === WeatherFeedItemType.hourly)
|
||||
const dailyItems = items.filter((i) => i.type === WeatherFeedItemType.daily)
|
||||
|
||||
expect(hourlyItems.length).toBe(3)
|
||||
expect(dailyItems.length).toBe(2)
|
||||
@@ -158,7 +158,7 @@ describe("WeatherSource", () => {
|
||||
expect(item.signals!.timeRelevance).toBeDefined()
|
||||
}
|
||||
|
||||
const currentItem = items.find((i) => i.type === WeatherFeedItemType.Current)
|
||||
const currentItem = items.find((i) => i.type === WeatherFeedItemType.current)
|
||||
expect(currentItem).toBeDefined()
|
||||
expect(currentItem!.signals!.urgency).toBeGreaterThanOrEqual(0.5)
|
||||
})
|
||||
|
||||
@@ -291,7 +291,7 @@ function createCurrentWeatherFeedItem(
|
||||
|
||||
return {
|
||||
id: `weather-current-${timestamp.getTime()}`,
|
||||
type: WeatherFeedItemType.Current,
|
||||
type: WeatherFeedItemType.current,
|
||||
timestamp,
|
||||
data: {
|
||||
conditionCode: current.conditionCode,
|
||||
@@ -325,7 +325,7 @@ function createHourlyWeatherFeedItem(
|
||||
|
||||
return {
|
||||
id: `weather-hourly-${timestamp.getTime()}-${index}`,
|
||||
type: WeatherFeedItemType.Hourly,
|
||||
type: WeatherFeedItemType.hourly,
|
||||
timestamp,
|
||||
data: {
|
||||
forecastTime: new Date(hourly.forecastStart),
|
||||
@@ -359,7 +359,7 @@ function createDailyWeatherFeedItem(
|
||||
|
||||
return {
|
||||
id: `weather-daily-${timestamp.getTime()}-${index}`,
|
||||
type: WeatherFeedItemType.Daily,
|
||||
type: WeatherFeedItemType.daily,
|
||||
timestamp,
|
||||
data: {
|
||||
forecastDate: new Date(daily.forecastStart),
|
||||
@@ -386,7 +386,7 @@ function createWeatherAlertFeedItem(alert: WeatherAlert, timestamp: Date): Weath
|
||||
|
||||
return {
|
||||
id: `weather-alert-${alert.id}`,
|
||||
type: WeatherFeedItemType.Alert,
|
||||
type: WeatherFeedItemType.alert,
|
||||
timestamp,
|
||||
data: {
|
||||
alertId: alert.id,
|
||||
|
||||
Reference in New Issue
Block a user